Lệnh dạng Ubuntu/Debian, cần sudo. useradd là tool cấp thấp (không tự tạo home nếu thiếu -m), adduser là wrapper hỏi tương tác. Hardening SSH xem SSH hardening.
User và group
| Mục đích | Lệnh |
|---|---|
| Tạo user có home, shell bash, thêm group sudo | useradd -m -s /bin/bash -G sudo -c "Alice Nguyen" alice |
| Tạo user tương tác (Debian/Ubuntu) | adduser alice |
| User hệ thống cho service, không login | useradd -r -s /usr/sbin/nologin -d /var/lib/myapp -M myapp |
| Đặt mật khẩu | passwd alice |
Thêm vào group (giữ group cũ, phải có -a) |
usermod -aG docker alice |
| Gỡ khỏi group | gpasswd -d alice docker |
| Xem uid, gid, các group | id alice |
| Group hiện tại của phiên (chưa logout thì chưa thấy group mới) | groups / newgrp docker |
| Khoá / mở khoá đăng nhập bằng mật khẩu | usermod -L alice / usermod -U alice |
| Hết hạn tài khoản | usermod -e 2026-12-31 alice |
| Xem chính sách mật khẩu / ép đổi lần đầu | chage -l alice / chage -d 0 alice |
| Xoá user kèm home và mail spool | userdel -r alice |
| Tạo group | groupadd netops |
| Ai đang login / lịch sử login | who / last -n 20 |
sudo
| Mục đích | Lệnh |
|---|---|
| Sửa sudoers an toàn (kiểm cú pháp trước khi lưu) | visudo -f /etc/sudoers.d/netops |
| Kiểm tra cú pháp toàn bộ | visudo -c |
| Xem user được phép gì | sudo -l -U alice |
| Chạy với user khác | sudo -u postgres psql |
| Shell root (login) | sudo -i |
| Giữ biến môi trường cụ thể | sudo --preserve-env=HTTPS_PROXY apt update |
# Group netops: chỉ restart/xem trạng thái 2 service, không cần mật khẩu
%netops ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
# User deploy: chạy mọi lệnh nhưng phải nhập mật khẩu
deploy ALL=(ALL:ALL) ALLLuôn sửa bằng visudo: file sudoers lỗi cú pháp làm mọi lệnh sudo hỏng. File trong /etc/sudoers.d/ có dấu . hoặc kết thúc bằng ~ bị bỏ qua; quyền nên là 0440. Cấp NOPASSWD cho lệnh có thể mở shell (vim, less, find, tar...) là cấp root.
Quyền file
| Mục đích | Lệnh |
|---|---|
| Đặt quyền dạng số (rw-r-----) | chmod 640 app.conf |
| Thêm quyền thực thi cho owner | chmod u+x run.sh |
| Thư mục cho group cùng ghi, file mới kế thừa group | chmod 2775 /srv/shared (bit setgid) |
Thư mục kiểu /tmp (chỉ owner xoá được file của mình) |
chmod 1777 /srv/drop (sticky bit) |
| Đổi owner và group, đệ quy | chown -R deploy:www-data /var/www/app |
| Quyền khác nhau cho thư mục và file | find /srv/app -type d -exec chmod 755 {} + và find /srv/app -type f -exec chmod 644 {} + |
| Xem quyền dạng số | stat -c '%a %U:%G %n' /srv/app/* |
| Quyền từng cấp của đường dẫn (lỗi Permission denied) | namei -l /srv/app/data/file.txt |
| Tìm file world-writable | find / -xdev -type f -perm -0002 2>/dev/null |
| Tìm file SUID | find / -xdev -perm -4000 -type f 2>/dev/null |
| umask hiện tại | umask (022 → file 644, thư mục 755) |
ACL (gói acl)
| Mục đích | Lệnh |
|---|---|
| Cho thêm một user quyền đọc/ghi | setfacl -m u:alice:rw report.csv |
| Cho group quyền trên thư mục (X = execute chỉ cho thư mục) | setfacl -R -m g:netops:rwX /srv/configs |
| ACL mặc định cho file tạo mới trong thư mục | setfacl -d -m g:netops:rwX /srv/configs |
| Xem ACL | getfacl /srv/configs |
| Gỡ một entry / gỡ hết | setfacl -x u:alice report.csv / setfacl -b report.csv |
ls -l hiện dấu + sau chuỗi quyền (drwxrwxr-x+) là có ACL. ACL không vượt được mask: getfacl dòng #effective: cho biết quyền thực tế.