Trong hệ điều hành Linux – một hệ thống đa người dùng (Multi-user) và đa nhiệm (Multi-tasking), cơ chế bảo mật và an toàn dữ liệu được xây dựng hoàn toàn dựa trên nền tảng: Ai là người sở hữu tiến trình? và Người đó có quyền làm gì trên tài nguyên này?
Hiểu rõ cấu trúc tài khoản, mã định danh và cơ chế leo thang đặc quyền là kiến thức nền tảng bắt buộc của mọi kỹ sư Quản trị hệ thống, SRE và DevOps.
1. Mã Định Danh: UID và GID
Trong mắt con người, chúng ta nhận diện tài khoản bằng tên (Username) như root, ubuntu, nginx. Nhưng đối với Linux Kernel, hệ điều hành hoàn toàn không hiểu chữ cái mà chỉ quản lý người dùng bằng các số nguyên duy nhất (Integer IDs):
- UID (User Identifier): Mã số định danh duy nhất cho từng người dùng.
- GID (Group Identifier): Mã số định danh duy nhất cho từng nhóm người dùng.
graph TD
User["Tên Tài Khoản: nginx"] --> Kernel["Linux Kernel"]
Kernel --> UID["UID: 101"]
Kernel --> GID["GID: 101 (nginx)"]
Kernel --> PermCheck{"Kiểm Tra Quyền File / Socket"}
1.1. Bảng Phân Bổ Dải UID Chuẩn Trong Linux
| Dải UID | Loại tài khoản | Đặc điểm & Mục đích sử dụng | Ví dụ tiêu biểu |
|---|---|---|---|
0 | Superuser (Root) | Quyền lực tuyệt đối, vượt qua mọi rào cản phân quyền tập tin của Kernel | root |
1 – 999 (hoặc 1 – 499) | System Accounts | Tài khoản hệ thống dùng để chạy các dịch vụ nền (Daemons), không có shell đăng nhập | daemon, bin, sshd, nginx, www-data, redis |
1000 – 60000+ | Standard Users | Người dùng tiêu chuẩn (người thật đăng nhập vào hệ thống làm việc) | ubuntu (UID 1000), developer (UID 1001) |
65534 | Nobody / Nogroup | Tài khoản có đặc quyền thấp nhất, thường dùng cho dịch vụ NFS hoặc container không đặc quyền | nobody |
1.2. Tập Tin Lưu Trữ Thông Tin Tài Khoản: /etc/passwd
Thông tin của toàn bộ người dùng trên hệ thống được lưu trữ công khai (ai cũng có thể đọc) trong file /etc/passwd.
Mỗi dòng đại diện cho một người dùng với 7 trường dữ liệu phân tách bằng dấu hai chấm (:):
root:x:0:0:root:/root:/bin/bash
nginx:x:101:101:nginx user:/var/cache/nginx:/usr/sbin/nologin
darktuan:x:1000:1000:Bach Dang Tuan:/home/darktuan:/bin/bash
[1] username : [2] password : [3] UID : [4] GID : [5] Comment : [6] Home Directory : [7] Login Shell
username: Tên đăng nhập của người dùng.x: Mật khẩu đã được mã hóa an toàn và chuyển sang lưu tại file bí mật/etc/shadow(chỉ root mới đọc được).UID: Mã định danh người dùng.GID: Mã nhóm chính (Primary Group ID).Comment / GECOS: Tên đầy đủ hoặc mô tả thông tin người dùng.Home Directory: Thư mục cá nhân của người dùng khi đăng nhập.Login Shell: Trình thông dịch lệnh mặc định khi mở terminal (/bin/bash,/bin/zsh, hoặc/usr/sbin/nologinnếu bị cấm đăng nhập).
🔍 Các Lệnh Tra Cứu Danh Tính Nhanh
# Xem UID, GID và tất cả các nhóm của tài khoản hiện tại
id
# Kết quả mẫu:
# uid=1000(darktuan) gid=1000(darktuan) groups=1000(darktuan),4(adm),27(sudo),998(docker)
# Xem nhanh tên tài khoản đang thao tác
whoami
# Xem danh sách các nhóm mà người dùng thuộc về
groups
2. Ba Loại Tài Khoản Cốt Lõi Trong Linux
graph LR
subgraph RootAcc ["👑 1. Siêu Người Dùng (Root)"]
R1["UID = 0"]
R2["Toàn quyền can thiệp phần cứng, kernel, files"]
end
subgraph StandardAcc ["👤 2. Người Dùng Tiêu Chuẩn"]
S1["UID >= 1000"]
S2["Có thư mục /home, quyền bị cô lập an toàn"]
end
subgraph SystemAcc ["⚙️ 3. Tài Khoản Hệ Thống"]
SY1["UID: 1 - 999"]
SY2["Không thể đăng nhập (/nologin)"]
SY3["Chạy dịch vụ ngầm (Nginx, Redis, Systemd)"]
end
2.1. Tài Khoản Siêu Người Dùng (Superuser / Root)
- Đặc điểm: Luôn có
UID = 0. - Quyền hạn: Không chịu bất kỳ giới hạn phân quyền nào. Root có thể đọc, sửa, xóa bất kỳ tập tin nào trên ổ đĩa, can thiệp bộ nhớ RAM, cấu hình tường lửa, tắt máy chủ hoặc nạp module vào nhân Linux.
- Rủi ro: Một sai lầm nhỏ khi đăng nhập dưới quyền root (như gõ nhầm
rm -rf / tmp/filethay vìrm -rf /tmp/file) sẽ xóa sạch toàn bộ hệ điều hành ngay tức khắc mà không có cảnh báo nào cứu vãn được.
2.2. Tài Khoản Người Dùng Tiêu Chuẩn (Standard / Regular Users)
- Đặc điểm: Có
UID >= 1000, có mật khẩu đăng nhập và thư mục làm việc riêng tại/home/<username>. - Quyền hạn: Bị giới hạn nghiêm ngặt. Chỉ có toàn quyền đọc/ghi trên thư mục cá nhân của mình và các file công khai.
- Bảo vệ hệ thống: Người dùng tiêu chuẩn không thể tự ý sửa file cấu hình hệ thống (
/etc), không thể cài đặt gói phần mềm mới vào thư mục nhị phân (/usr/bin), và không thể dừng/bật các dịch vụ (systemd).
2.3. Tài Khoản Hệ Thống (System Accounts)
- Đặc điểm: Có
UIDnằm trong khoảng1 – 999, không có mật khẩu đăng nhập và shell thường trỏ về/usr/sbin/nologinhoặc/bin/false. - Mục đích: Được tạo tự động khi bạn cài đặt các phần mềm dịch vụ (như
nginx,redis,mysql,postgres,prometheus).
[!IMPORTANT] 🛡️ Nguyên Tắc Đặc Quyền Tối Thiểu (Principle of Least Privilege): Tại sao Nginx không chạy trực tiếp dưới quyền
rootmà phải tạo riêng userwww-datahoặcnginx(UID 101)?
- Nếu ứng dụng web bị tin tặc tấn công thông qua lỗ hổng thực thi mã từ xa (RCE), mã độc chỉ có đặc quyền của user
nginx.- Tin tặc không thể sửa file hệ thống
/etc/shadow, không thể cài rootkit vào kernel, và không thể can thiệp vào dữ liệu của các dịch vụ khác (như Redis hay PostgreSQL) đang chạy cùng máy chủ!
3. Chuyển Đổi Người Dùng & Nâng Cao Đặc Quyền
Để vừa đảm bảo an toàn vừa có thể thực hiện các tác vụ quản trị, Linux cung cấp hai cơ chế: su và sudo.
3.1. Lệnh su (Switch User)
Lệnh su cho phép bạn chuyển đổi danh tính phiên làm việc sang một người dùng khác (mặc định là root nếu không truyền tên user).
# ❌ Cách dùng KHÔNG khuyến nghị: Chuyển sang root nhưng giữ nguyên biến môi trường cũ
su
# ✅ Cách dùng CHUẨN: Dấu gạch ngang (-) kích hoạt Login Shell hoàn toàn sạch
su -
# Chuyển sang một tài khoản khác với môi trường đầy đủ của tài khoản đó
su - developer
[!WARNING] ⚠️ Sự khác biệt cực kỳ quan trọng giữa
suvàsu -:
su: Chỉ đổi UID sang người dùng mới nhưng vẫn giữ nguyên các biến môi trường ($PATH,$HOME, working directory) của người dùng cũ. Rất dễ gây lỗi tìm sai file nhị phân.su -: Khởi tạo một Login Shell thực sự, nạp lại sạch sẽ toàn bộ file cấu hình môi trường (.bash_profile,.bashrc,$HOME = /root,$PATHcủa root).
Nhược điểm lớn nhất của su: Bạn bắt buộc phải biết mật khẩu của tài khoản đích (mật khẩu của root). Trong môi trường doanh nghiệp có nhiều kỹ sư, việc chia sẻ mật khẩu root dùng chung là một cơn ác mộng về bảo mật và kiểm toán!
3.2. Lệnh sudo (Superuser Do) – Tiêu Chuẩn Vàng Của Quản Trị Hiện Đại
Khác với su, lệnh sudo cho phép người dùng tiêu chuẩn thực thi các câu lệnh quản trị với đặc quyền root bằng cách nhập mật khẩu của chính mình (thay vì mật khẩu của root).
graph LR
User["👨💻 Dev: darktuan (UID 1000)"] -- Gõ: sudo systemctl restart nginx --> CheckSudoers{"Kiểm tra /etc/sudoers"}
CheckSudoers -- "Không có quyền" --> Denied["❌ Báo lỗi & Ghi log vi phạm"]
CheckSudoers -- "Hợp lệ -> Hỏi mật khẩu của darktuan" --> Exec["⚡ Thực thi lệnh với UID = 0 (Root)"]
Exec --> Log["📝 Ghi nhận Audit Log vào /var/log/auth.log"]
⚡ Bảng So Sánh Các Kiểu Leo Thang Quyền
| Lệnh | Ý nghĩa kỹ thuật | Biến môi trường ($PATH, $HOME) | Mật khẩu cần nhập |
|---|---|---|---|
sudo <cmd> | Thực thi duy nhất 1 câu lệnh dưới quyền root | Kế thừa có chọn lọc, reset các biến nguy hiểm | Mật khẩu của chính user |
sudo -i | Mở một interactive root login shell | Nạp lại sạch sẽ 100% môi trường của root ($HOME = /root) | Mật khẩu của chính user |
sudo -s | Mở một root shell nhưng giữ môi trường hiện tại | Giữ lại thư mục đứng hiện tại và một số biến | Mật khẩu của chính user |
su - | Đăng nhập trực tiếp sang tài khoản root | Môi trường đầy đủ của root | Mật khẩu của root |
3.3. Cấu Hình Quyền Hạn Trong File /etc/sudoers
Quyền thực thi sudo được quy định chặt chẽ trong file cấu hình /etc/sudoers.
[!CAUTION] 🚨 Quy tắc bất di bất dịch: TUYỆT ĐỐI KHÔNG mở file
/etc/sudoersbằngnanohoặcvimthông thường! Luôn luôn sử dụng lệnh:sudo visudo
visudosẽ khóa file để chống xung đột ghi đè đồng thời và tự động kiểm tra lỗi cú pháp (Syntax Check) trước khi lưu. Nếu bạn gõ sai dù chỉ 1 dấu cách trong file/etc/sudoersbằng vim thường, toàn bộ hệ thống sudo sẽ bị hỏng và không ai có thể lấy lại quyền root được nữa!
Cú Pháp Chuẩn Trong File /etc/sudoers:
# Cú pháp: [Ai] [Ở đâu] = ([Thay mặt ai]) [Lệnh nào]
darktuan ALL=(ALL:ALL) ALL
darktuan: Tài khoản người dùng được cấp quyền.ALL(đầu tiên): Áp dụng trên tất cả các máy chủ / terminal.(ALL:ALL): Có thể chạy dưới danh nghĩa bất kỳ user nào và group nào.ALL(cuối cùng): Được phép chạy mọi câu lệnh.
Các Mẫu Cấu Hình Thực Tế Thường Gặp:
# 1. Cấp quyền root đầy đủ cho cả nhóm 'sudo' hoặc 'wheel' (Dấu % đại diện cho Group)
%sudo ALL=(ALL:ALL) ALL
# 2. Cấp quyền sudo KHÔNG cần hỏi mật khẩu (Thường dùng cho CI/CD runner hoặc cloud-init automation)
deployer ALL=(ALL) NOPASSWD: ALL
# 3. Nguyên tắc Least Privilege: Chỉ cho phép restart dịch vụ Nginx, không cho chạy lệnh khác
developer ALL=(ALL) /bin/systemctl restart nginx, /bin/systemctl status nginx
4. Thực Tiễn Vận Hành & An Ninh Bảo Mật Chuẩn SRE
- Khóa đăng nhập SSH trực tiếp của root:
- Trong file cấu hình SSH
/etc/ssh/sshd_config, luôn cấu hình:PermitRootLogin no - Bắt buộc mọi kỹ sư phải đăng nhập bằng tài khoản cá nhân thông qua SSH Key, sau đó mới dùng
sudođể thao tác. Nhờ đó, lịch sử hành động luôn gắn liền với danh tính từng người.
- Trong file cấu hình SSH
- Kiểm tra vết kiểm toán (Audit Logs):
- Mọi câu lệnh chạy qua
sudođều được ghi nhận vào nhật ký hệ thống:# Trên Ubuntu / Debian: sudo tail -f /var/log/auth.log | grep sudo # Xem qua Systemd Journal: sudo journalctl _COMM=sudo -f
- Mọi câu lệnh chạy qua
- Khóa tài khoản hệ thống khi không sử dụng:
- Đảm bảo các tài khoản dịch vụ luôn có shell là
/usr/sbin/nologin:sudo usermod -s /usr/sbin/nologin baduser
- Đảm bảo các tài khoản dịch vụ luôn có shell là
Bài tiếp theo đề xuất: Tạo User & Quản Lý Nhóm Trong Linux – Hướng dẫn thực hành chi tiết các lệnh useradd, usermod, userdel, groupadd và kỹ thuật quản lý thành viên nhóm.