HỌC BẰNG THỰC HÀNH
← Lộ trình học
01 · Linux Administration

User, group và thư mục dùng chung

Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.

Cốt lõi

Vì sao cần học

Trên server thật, nhiều người và nhiều dịch vụ cùng dùng một máy. Phân quyền sai dẫn đến hai kiểu sự cố quen thuộc: dịch vụ báo Permission denied và không chạy được, hoặc ngược lại, ai cũng đọc được file cấu hình chứa mật khẩu. Quản lý user, group và quyền là nền tảng của mọi bài sau, kể cả SecurityContext trong Kubernetes.

Mục tiêu

  • Tạo user, group, thêm user vào group; đọc kết quả bằng id và getent.
  • Đọc và đặt quyền dạng số và dạng ký hiệu, kể cả bit đặc biệt setgid.
  • Giải thích umask quyết định quyền mặc định của file mới.
  • Thiết kế thư mục dùng chung cho một nhóm.

Điều kiện tiên quyết

  • Bài Tạo VM Linux dành riêng cho lab: VM có marker, agent chạy bằng sudo.

Mental model

UID và GID là sự thật, tên chỉ là nhãn. Kernel lưu số UID/GID trên file. /etc/passwd và /etc/group ánh xạ số sang tên. Mỗi user có một group chính (primary) và có thể thuộc thêm nhiều group phụ (supplementary).

Kernel kiểm tra quyền theo thứ tự. Nếu bạn là owner thì dùng quyền owner; nếu không, bạn thuộc group của file thì dùng quyền group; còn lại dùng quyền other. Kernel chỉ chọn một nhóm quyền, không cộng dồn.

Quyền trên thư mục khác quyền trên file. r cho liệt kê tên file, w cho tạo/xóa/đổi tên file bên trong, x cho đi vào thư mục và truy cập file theo tên.

Setgid trên thư mục (bit 2 ở đầu, hiện là s trong rwxrws---): file mới tạo bên trong tự thuộc group của thư mục, thay vì group chính của người tạo. Đây là cách làm thư mục nhóm.

umask là các quyền bị bỏ đi khi tạo file. umask 022 tạo file 644; umask 007 tạo file 660.

Thực hành (Guided Lab)

1. Tạo group và user

sudo groupadd kdc-devs
sudo useradd -m -G kdc-devs kdc-alice
sudo useradd -m -G kdc-devs kdc-bob
sudo useradd -m kdc-guest
id kdc-alice
getent group kdc-devs
Giải thích lệnh và tham số
Lệnh / tùy chọnÝ nghĩa
groupadd kdc-devsTạo group mới tên kdc-devs.
useradd -mTạo user và thư mục home; -m ở đây không nhận giá trị quyền như install -m.
useradd -G kdc-devsĐặt danh sách group phụ của user mới.
id kdc-aliceIn UID, group chính và group phụ của Alice.
getent group kdc-devsTra cứu group qua cơ chế phân giải tài khoản của hệ thống, không chỉ đọc trực tiếp một file.

Ví dụ thêm group cho user đã có: sudo usermod -aG kdc-devs <user>. -a là thêm vào danh sách hiện có, -G là group phụ; thay <user> bằng user thật trước khi chạy.

-G thêm group phụ. Muốn thêm group cho user đã tồn tại, dùng usermod -aG; quên -a sẽ thay toàn bộ group phụ.

2. Tạo thư mục nhóm

sudo install -d -o root -g kdc-devs -m 2770 /srv/kdc-shared
ls -ld /srv/kdc-shared
Giải thích lệnh và tham số

install -d tạo thư mục; -o root đặt owner, -g kdc-devs đặt group, -m 2770 đặt quyền. Chữ số đầu 2 bật setgid, 7 cho owner/group đọc-ghi-truy cập, 0 chặn other. ls -ld gộp -l (chi tiết) với -d (xem chính thư mục, thay vì liệt kê file bên trong).

Kết quả mong đợi: drwxrws--- ... root kdc-devs ... /srv/kdc-shared.

3. Thử với từng user

sudo -u kdc-alice bash -c 'umask 007; echo "# Sổ tay nhóm" > /srv/kdc-shared/handbook.md'
ls -l /srv/kdc-shared/handbook.md
sudo -u kdc-bob bash -c 'echo "- Bob đã đọc" >> /srv/kdc-shared/handbook.md'
sudo -u kdc-guest cat /srv/kdc-shared/handbook.md
Giải thích lệnh và tham số

sudo -u kdc-alice chạy lệnh bằng user Alice thay vì root. bash -c '...' cho Bash chạy cả chuỗi lệnh trong dấu nháy; dấu ; phân tách các lệnh. umask 007 bỏ quyền của other khi tạo file, nên file mới có quyền 660 nếu chương trình yêu cầu 666. Dấu >> thêm vào cuối file; dấu > ghi đè. Lệnh của Guest cố ý cần trả Permission denied để chứng minh quyền đang chặn truy cập.

  • File thuộc kdc-alice:kdc-devs dù group chính của Alice là kdc-alice, nhờ setgid.
  • Bob ghi được vì nhóm có quyền rw.
  • Guest nhận Permission denied ngay ở thư mục, vì other không có x trên /srv/kdc-shared.

Nếu bạn quên umask 007, file sẽ là 644 và Bob không ghi được. Sửa bằng sudo chmod 660 /srv/kdc-shared/handbook.md.

4. Mở rộng: ACL (stretch, không chấm)

Cho riêng Guest quyền đọc sổ tay mà không thêm vào group:

sudo setfacl -m u:kdc-guest:x /srv/kdc-shared
sudo setfacl -m u:kdc-guest:r /srv/kdc-shared/handbook.md
getfacl /srv/kdc-shared/handbook.md
Giải thích lệnh và tham số

setfacl -m thêm hoặc sửa mục ACL. u:kdc-guest:x cấp cho user Guest quyền đi qua thư mục; u:kdc-guest:r cấp quyền đọc file. getfacl in toàn bộ ACL, bao gồm mask giới hạn quyền hiệu lực của các mục thuộc lớp group.

Dấu + ở cuối chuỗi quyền trong ls -l cho biết file có ACL.

Tự kiểm tra (Verification)

id kdc-alice; id kdc-bob
stat -c '%A %U:%G %n' /srv/kdc-shared /srv/kdc-shared/handbook.md
Giải thích lệnh và tham số

stat -c chọn định dạng đầu ra: %A là quyền dạng chữ, %U là owner, %G là group, %n là tên file. Dấu nháy giữ cả chuỗi định dạng thành một đối số. Đây là tùy chọn của GNU stat trên VM Linux; stat trên macOS dùng cú pháp khác.

Chọn server và bấm Kiểm tra kết quả.

Lỗi thường gặp

  • usermod -G kdc-devs user không có -a làm user mất các group phụ khác.
  • User vừa được thêm vào group nhưng phiên đăng nhập cũ chưa nhận group mới. Đăng nhập lại hoặc dùng newgrp.
  • chmod 2770 khi chưa đổi group của thư mục: setgid vẫn bật nhưng file mới thuộc group sai.
  • chmod -R 777 để "chữa cháy": dịch vụ chạy được nhưng mọi tài khoản đều ghi được.

Ghi chú production

  • Không chia sẻ tài khoản. Mỗi người một user, quyền cấp qua group, dễ thu hồi khi người đó rời nhóm.
  • Dịch vụ chạy bằng system user riêng, không có shell đăng nhập; bạn sẽ làm việc này ở bài systemd.

Dọn dẹp (sau khi đã kiểm tra)

Chỉ dùng userdel -r với các user lab vừa tạo: lệnh xóa cả home và mail spool của user.

sudo rm -rf /srv/kdc-shared
sudo userdel -r kdc-alice; sudo userdel -r kdc-bob; sudo userdel -r kdc-guest
sudo groupdel kdc-devs
Giải thích lệnh và tham số

userdel xóa tài khoản; -r xóa thêm home và mail spool của user, vì vậy chỉ dùng với các user lab vừa tạo. groupdel xóa group. Các dấu ; cho shell chạy lần lượt các lệnh dù lệnh trước có thất bại.

Tài liệu chính thức