Người Dùng & Quyền Truy Cập Trong Linux

Cẩm nang toàn diện về mô hình người dùng Linux: Phân biệt UID/GID, tài khoản Superuser (root), System User, Standard User, kỹ thuật chuyển đổi su vs sudo và nâng cao đặc quyền chuẩn SRE.

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 UIDLoại tài khoảnĐặc điểm & Mục đích sử dụngVí dụ tiêu biểu
0Superuser (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 Kernelroot
1 – 999 (hoặc 1 – 499)System AccountsTài khoản hệ thống dùng để chạy các dịch vụ nền (Daemons), không có shell đăng nhậpdaemon, bin, sshd, nginx, www-data, redis
1000 – 60000+Standard UsersNgườ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)
65534Nobody / NogroupTà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ềnnobody

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
  1. username: Tên đăng nhập của người dùng.
  2. 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).
  3. UID: Mã định danh người dùng.
  4. GID: Mã nhóm chính (Primary Group ID).
  5. Comment / GECOS: Tên đầy đủ hoặc mô tả thông tin người dùng.
  6. Home Directory: Thư mục cá nhân của người dùng khi đăng nhập.
  7. Login Shell: Trình thông dịch lệnh mặc định khi mở terminal (/bin/bash, /bin/zsh, hoặc /usr/sbin/nologin nế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/file thay 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ó UID nằm trong khoảng 1 – 999, không có mật khẩu đăng nhập và shell thường trỏ về /usr/sbin/nologin hoặ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 root mà phải tạo riêng user www-data hoặc nginx (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 su và 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, $PATH củ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ậtBiế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 rootKế thừa có chọn lọc, reset các biến nguy hiểmMật khẩu của chính user
sudo -iMở một interactive root login shellNạ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 -sMở một root shell nhưng giữ môi trường hiện tạiGiữ lại thư mục đứng hiện tại và một số biếnMật khẩu của chính user
su -Đăng nhập trực tiếp sang tài khoản rootMôi trường đầy đủ của rootMậ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/sudoers bằng nano hoặc vim thông thường! Luôn luôn sử dụng lệnh:

sudo visudo

visudo sẽ 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/sudoers bằ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

  1. 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.
  2. 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
      
  3. 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
      

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.