Trong Linux, phương châm cốt lõi là "Everything is a file" (Mọi thứ đều là tập tin). Do đó, hệ thống bảo mật của Linux phụ thuộc phần lớn vào cơ chế phân quyền truy cập tập tin và thư mục: Ai được phép đọc (Read), ghi (Write) và thực thi (Execute)?
Bài viết này giúp bạn làm chủ từ bảng mã quyền cơ bản đến các kỹ thuật phân quyền nâng cao trong môi trường Production.
1. Cấu Trúc Quyền Cơ Bản: rwx
Khi chạy lệnh ls -l, mỗi dòng tập tin hiển thị chuỗi 10 ký tự quyền ở đầu:
- rwx r-x r-- 1 darktuan developers 4096 Oct 11 10:00 script.sh
drwxr-xr-x 2 darktuan developers 4096 Oct 11 10:00 my_folder/
graph LR
P["Chuỗi 10 ký tự: - rwx r-x r--"]
P --> T["Ký tự 1: Loại file (-: File thường, d: Thư mục, l: Link)"]
P --> U["Ký tự 2-4: Owner / User (rwx)"]
P --> G["Ký tự 5-7: Group (r-x)"]
P --> O["Ký tự 8-10: Others (r--)"]
1.1. Ý Nghĩa Của 3 Quyền: Read, Write, Execute
| Quyền | Ký tự | Giá trị số (Octal) | Ý nghĩa trên Tập Tin (File) | Ý nghĩa trên Thư Mục (Directory) |
|---|---|---|---|---|
| Read | r | 4 | Đọc/xem nội dung file (cat, less) | Liệt kê danh sách file bên trong (ls) |
| Write | w | 2 | Chỉnh sửa, ghi đè nội dung file | Thêm, xóa, đổi tên file bên trong thư mục |
| Execute | x | 1 | Chạy file như chương trình (./script.sh) | Truy cập vào thư mục (cd /path/to/folder) |
[!WARNING] ⚠️ Lưu ý quan trọng về quyền
xtrên thư mục: Nếu một thư mục có quyềnrnhưng thiếu quyềnx, bạn có thể thấy tên file bên trong nhưng không thểcdvào và cũng không thể đọc nội dung của các file đó!
2. Thay Đổi Quyền Bằng Lệnh chmod
Có hai cách để phân quyền bằng lệnh chmod (Change Mode):
2.1. Phân Quyền Dạng Số (Octal Notation - Khuyến Nghị)
Mỗi nhóm quyền (User, Group, Others) là tổng điểm của các quyền thành phần:
r = 4,w = 2,x = 1,- = 0
Ví dụ: rwxr-xr-- $
ightarrow$ User: $4+2+1=7$, Group: $4+0+1=5$, Others: $4+0+0=4$ $
ightarrow$ 754.
⚡ Các Bộ Quyền Chuẩn Kinh Điển Cần Nhớ:
755(rwxr-xr-x): Chuẩn mực cho thư mục và các file thực thi (Script, Binary). Chủ sở hữu toàn quyền, người khác chỉ đọc và vào xem.644(rw-r--r--): Chuẩn mực cho tập tin cấu hình và dữ liệu thông thường. Chủ sở hữu sửa được, người khác chỉ xem.700(rwx------): Riêng tư tuyệt đối cho thư mục cá nhân (như~/.ssh/).600(rw-------): Chuẩn bảo mật bắt buộc cho SSH Private Key (id_ed25519) và chứng chỉ SSL.777(rwxrwxrwx): ❌ CẤM DÙNG TRÊN PRODUCTION! Mọi người trên hệ thống đều có thể sửa/xóa/chạy file.
# Phân quyền 755 cho file script
chmod 755 deploy.sh
# Phân quyền bảo mật 600 cho SSH Private Key
chmod 600 ~/.ssh/id_rsa
# Phân quyền đệ quy cho toàn bộ thư mục và file con bên trong (-R)
chmod -R 755 /var/www/html
2.2. Phân Quyền Dạng Ký Tự (Symbolic Notation)
- Đối tượng:
u(User/Owner),g(Group),o(Others),a(All). - Toán tử:
+(Thêm quyền),-(Bớt quyền),=(Gán chính xác).
# Thêm quyền thực thi cho chủ sở hữu
chmod u+x run.sh
# Bỏ quyền ghi của nhóm và người ngoài
chmod go-w sensitive.txt
# Thêm quyền thực thi cho tất cả mọi người
chmod +x start.sh
3. Đổi Chủ Sở Hữu: chown & chgrp
# 1. Đổi chủ sở hữu (Owner) của file
sudo chown nginx /var/log/nginx/access.log
# 2. Đổi CẢ chủ sở hữu VÀ nhóm sở hữu cùng lúc (cú pháp: user:group)
sudo chown -R www-data:www-data /var/www/my-app
# 3. Chỉ đổi nhóm sở hữu
sudo chgrp developers project_docs/
# (hoặc dùng chown với dấu hai chấm ở đầu: sudo chown :developers project_docs/)
4. Quyền Đặc Biệt: SUID, SGID và Sticky Bit
Ngoài rwx, Linux còn trang bị 3 bit quyền đặc biệt cực kỳ mạnh mẽ:
| Quyền đặc biệt | Giá trị số | Ký hiệu hiển thị | Áp dụng trên | Tác dụng | Ví dụ thực tế |
|---|---|---|---|---|---|
| SUID (Set UID) | 4000 | s ở vị trí User (rwsr-xr-x) | File thực thi | Tiến trình chạy với quyền của Owner của file (thường là root) thay vì quyền của người gọi lệnh | /usr/bin/passwd (user thường đổi pass ghi vào /etc/shadow) |
| SGID (Set GID) | 2000 | s ở vị trí Group (rwxrwsr-x) | Thư mục | Mọi file mới tạo trong thư mục sẽ tự động thừa kế Group của thư mục cha | Thư mục dùng chung cho nhóm Dev (/data/shared) |
| Sticky Bit | 1000 | t ở vị trí Others (rwxrwxrwt) | Thư mục | Mọi người đều ghi được, nhưng chỉ ai tạo ra file mới được xóa file đó | Thư mục tạm /tmp |
# Thiết lập SGID cho thư mục làm việc chung của nhóm
sudo chmod 2775 /data/shared-team/
# Thiết lập Sticky Bit cho thư mục chia sẻ
sudo chmod 1777 /public_uploads/
5. Giá Trị umask (Mặt Nạ Quyền Mặc Định)
umask quyết định quyền mặc định của một tập tin hoặc thư mục ngay khi vừa được tạo ra:
- Quyền tối đa của Thư mục:
777 - Quyền tối đa của Tập tin:
666(mặc định không có quyềnx) - Công thức tính:
Quyền thực tế = Quyền tối đa - umask
# Xem umask hiện tại (mặc định thường là 0022 hoặc 0002)
umask
# 0022
# Với umask 022:
# - Thư mục mới tạo: 777 - 022 = 755 (drwxr-xr-x)
# - Tập tin mới tạo: 666 - 022 = 644 (-rw-r--r--)
Bài tiếp theo đề xuất: Ngôn Ngữ Kịch Bản Bash & Shell Scripting – Làm chủ biến, câu lệnh điều kiện if-else, vòng lặp for/while và tự động hóa tác vụ hệ thống bằng Shell Script.