User, Group và sudo

K
Kai··5 min read

Linux là hệ điều hành đa người dùng từ gốc: nhiều người có thể dùng chung một máy, mỗi người một danh tính và quyền riêng (nhớ Bài 7 — quyền dựa trên user/group). Bài này học cách quản lý user và group, và sudo — cách làm việc với quyền quản trị một cách an toàn.

User được lưu ở đâu: /etc/passwd

Mọi user trên hệ thống nằm trong file /etc/passwd, mỗi dòng một user:

grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

Bảy trường, ngăn bằng dấu ::

root : x : 0 : 0 : root : /root : /bin/bash
 │     │   │   │    │       │         │
tên  pass UID GID GECOS   home      shell
     (x = ở  (số (nhóm  (mô tả)  (thư mục (shell khi
     shadow) ID) chính)          nhà)    đăng nhập)
  • UID 0 là root — siêu người dùng, toàn quyền, bỏ qua mọi kiểm tra quyền. User thường có UID từ 1000 trở lên.
  • Trường password là x — mật khẩu thật (đã hash) không nằm ở đây mà ở /etc/shadow.
  • shell: chương trình chạy khi user đăng nhập. Để ý nhiều user hệ thống có shell /usr/sbin/nologin — nghĩa là chúng không dùng để đăng nhập, chỉ để chạy dịch vụ (ví dụ www-data chạy web server). Đây là một thực hành bảo mật: dịch vụ chạy bằng user riêng, không đăng nhập được.

Mật khẩu: /etc/shadow

Mật khẩu (đã băm) nằm ở /etc/shadow, và file này chỉ root đọc được:

ls -l /etc/shadow
-rw-r----- 1 root shadow 529 ... /etc/shadow

Tách mật khẩu ra file riêng chỉ root đọc là một lớp bảo mật: /etc/passwd ai cũng đọc được (nhiều chương trình cần), nhưng băm mật khẩu thì không. Bạn hiếm khi sửa tay file này — dùng lệnh passwd.

Group: /etc/group

Group gom nhiều user để cấp quyền chung (nhớ Bài 7 — quyền có cột "group"):

grep dev /etc/group
dev:x:1001:alice

Mỗi user có một group chính (gán khi tạo) và có thể thuộc nhiều group phụ. Ví dụ thực tế: thêm user vào group docker để chạy docker không cần sudo (Bài 1 series Docker), hay group sudo để được dùng sudo (dưới đây).

Tạo và quản lý user

groupadd dev                                # tạo group
useradd -m -s /bin/bash -G dev alice         # tạo user alice
passwd alice                                 # đặt mật khẩu cho alice

Các cờ useradd hay dùng:

  • -m — tạo thư mục nhà (/home/alice). Quên -m thì user không có home.
  • -s /bin/bash — đặt shell đăng nhập.
  • -G dev — thêm vào group phụ dev.

Kiểm tra:

id alice
uid=1001(alice) gid=1002(alice) groups=1002(alice),1001(dev)

Các lệnh quản lý khác: usermod (sửa user, ví dụ usermod -aG docker alice thêm group), userdel -r alice (xóa user kèm home), groupadd/groupdel.

Trên một số distro/cấu hình, adduser/addgroup (script thân thiện, hỏi tương tác) được ưa dùng hơn useradd/groupadd (cấp thấp). Kết quả như nhau.

su: chuyển sang user khác

su (switch user) cho bạn trở thành user khác:

su alice -c "whoami"     # chạy một lệnh với danh tính alice
su - alice               # mở một shell đăng nhập đầy đủ với tư cách alice
alice

su không kèm tên thì chuyển sang root (cần mật khẩu root). Dấu - (su - alice) tạo môi trường đăng nhập sạch (đúng PATH, biến môi trường, thư mục home của user đó).

sudo: làm việc quản trị đúng cách

Để chạy một lệnh cần quyền root (cài phần mềm, sửa file hệ thống), bạn không nên đăng nhập thẳng bằng root. Thay vào đó dùng sudo — chạy một lệnh với quyền root:

sudo apt update              # chạy apt update với quyền root
sudo systemctl restart nginx

(Trên Ubuntu mặc định cần cài: apt install sudo, rồi thêm user vào group được phép: usermod -aG sudo alice.)

Vì sao sudo tốt hơn đăng nhập root

Đây là một nguyên tắc bảo mật quan trọng (giống ý "least privilege" trong các series trước):

  • Ghi vết (audit): mỗi lệnh sudo được ghi log (/var/log/auth.log) — biết ai chạy gì, khi nào. Đăng nhập root thì không truy được là ai.
  • Quyền tối thiểu: bạn làm việc thường ngày bằng user thường (ít rủi ro lỡ tay), chỉ "nâng quyền" cho đúng lệnh cần root. Đăng nhập root suốt thì một lệnh gõ nhầm (rm -rf sai chỗ) là thảm họa.
  • Không chia sẻ mật khẩu root: mỗi người dùng mật khẩu của chính họ để sudo (nhập mật khẩu của bạn, không phải của root), nên không ai cần biết mật khẩu root chung. Thu hồi quyền một người chỉ việc gỡ họ khỏi group sudo.

Ai được sudo quy định trong /etc/sudoers (sửa bằng visudo để tránh ghi hỏng). Thường chỉ cần thêm user vào group sudo (Debian/Ubuntu) hoặc wheel (Fedora/RHEL) là đủ.

Quy tắc thực dụng trên server: tạo một user thường cho mình, thêm vào group sudo, rồi tắt đăng nhập trực tiếp bằng root (qua SSH — Bài 14). Mọi việc quản trị làm qua sudo.

🧹 Dọn dẹp

userdel -r alice 2>/dev/null
groupdel dev 2>/dev/null

Tổng kết

Linux đa người dùng: user lưu ở /etc/passwd (7 trường, UID 0 = root), mật khẩu băm ở /etc/shadow (chỉ root đọc), group ở /etc/group. Tạo/sửa bằng useradd/usermod/passwd/groupadd, xem bằng id. su chuyển danh tính; sudo chạy một lệnh với quyền root — và nên dùng sudo thay vì đăng nhập root vì có audit, quyền tối thiểu, không chia sẻ mật khẩu root.

Bạn đã quản lý được người dùng cục bộ. Bài 13 bước ra mạng: các lệnh mạng cơ bản trên Linux — kiểm tra IP, cổng, kết nối, DNS.