Linux Permission, User, Group và sudo cho môi trường production
Hướng dẫn quyền Linux rwx, chmod, chown, user, group, sudo, umask, setgid và cách phân quyền thư mục deploy an toàn.
Mục lục bài viết
VPS & Hosting cho dự án của bạn
Khám phá các gói máy chủ và lưu trữ phù hợp từ website cá nhân đến ứng dụng production.
Nhiều lỗi deploy được “sửa” bằng:
chmod -R 777
Ứng dụng có thể chạy lại, nhưng mọi user trên máy đều có thể đọc, ghi hoặc thực thi. Đây là cách giải quyết sai vì che mất vấn đề owner và group thật sự.
Bài viết này giúp bạn hiểu permission Linux để phân quyền production theo nguyên tắc tối thiểu.
User là gì?
Linux xác định process và quyền truy cập theo user ID.
Xem user hiện tại:
whoami
id
Ví dụ:
uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),27(sudo)
User có:
- UID.
- Primary group.
- Supplementary groups.
- Home directory.
- Login shell.
Thông tin user:
getent passwd deploy
Group là gì?
Group gom nhiều user để chia sẻ quyền.
Xem group:
groups
getent group deploy
Ví dụ:
deploy:x:1002:thien,ci
Root là gì?
User root thường có UID 0 và quyền quản trị cao nhất.
Kiểm tra:
id root
Không chạy ứng dụng bằng root nếu không cần. Nếu app bị khai thác, quyền root làm mức ảnh hưởng lớn hơn.
sudo là gì?
sudo cho phép user được phép chạy lệnh với quyền user khác, thường là root.
Ví dụ:
sudo systemctl reload nginx
Kiểm tra quyền sudo:
sudo -l
Không cấp:
ALL=(ALL) NOPASSWD: ALL
cho user CI/CD nếu chỉ cần một vài lệnh.
Tạo user deploy
sudo adduser deploy
Thêm sudo khi thật sự cần:
sudo usermod -aG sudo deploy
Kiểm tra:
id deploy
Không dùng:
usermod -G sudo deploy
thiếu -a, vì có thể thay toàn bộ supplementary groups.
Cấu trúc permission
Xem:
ls -l
Ví dụ:
-rwxr-x--- 1 deploy web 1200 deploy.sh
Tách:
- rwx r-x ---
│ │ └── others
│ └────── group
└────────── owner
Ba quyền:
r = read
w = write
x = execute
Ý nghĩa trên file
r: đọc nội dung.w: sửa nội dung.x: thực thi file.
Ý nghĩa trên directory
r: liệt kê tên file.w: tạo, xóa, đổi tên entry.x: đi vào/traverse directory.
Directory có r nhưng không có x có thể liệt kê tên nhưng không truy cập file như bình thường.
Chmod ký hiệu
Thêm execute cho owner:
chmod u+x deploy.sh
Bỏ write của group:
chmod g-w file
Cho group đọc:
chmod g+r file
Ký hiệu:
u = user/owner
g = group
o = others
a = all
Chmod số
Giá trị:
r = 4
w = 2
x = 1
Cộng lại:
7 = rwx
6 = rw-
5 = r-x
4 = r--
0 = ---
Ví dụ:
chmod 750 deploy.sh
Kết quả:
rwx r-x ---
File env:
chmod 600 .env.production
Kết quả:
rw- --- ---
Directory SSH:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Vì sao 777 nguy hiểm?
chmod 777 file
Cho owner, group và others toàn quyền.
Rủi ro:
- User khác sửa script.
- Web process ghi vào file không nên ghi.
- File upload có thể thực thi.
- Kẻ tấn công thay nội dung.
- Khó biết quyền thực sự cần.
Hãy sửa đúng owner/group thay vì mở quyền toàn bộ.
chown
Đổi owner và group:
sudo chown deploy:web file
Đệ quy:
sudo chown -R deploy:web /var/www/deployeasy
Trước khi -R, xác minh đường dẫn:
realpath /var/www/deployeasy
Không chown rộng /var, /usr hoặc /.
chgrp
Đổi group:
sudo chgrp web /var/www/deployeasy
Mô hình user và group cho deploy
Ví dụ:
deploy → sở hữu source/release
www-data → Nginx hoặc app cần đọc static/upload
ci → chạy deployment
web → group chia sẻ
Tạo group:
sudo groupadd web
Thêm user:
sudo usermod -aG web deploy
sudo usermod -aG web www-data
User cần đăng xuất/đăng nhập lại để group mới có hiệu lực, hoặc dùng:
newgrp web
Permission thư mục ứng dụng
sudo mkdir -p /var/www/deployeasy
sudo chown -R deploy:web /var/www/deployeasy
sudo find /var/www/deployeasy -type d -exec chmod 750 {} \;
sudo find /var/www/deployeasy -type f -exec chmod 640 {} \;
Script cần execute:
chmod 750 /var/www/deployeasy/current/start.sh
Không áp chmod 640 cho mọi file nếu có executable cần chạy.
Thư mục upload
App cần ghi:
sudo mkdir -p /var/www/deployeasy/shared/uploads
sudo chown -R deploy:web /var/www/deployeasy/shared/uploads
sudo chmod 2770 /var/www/deployeasy/shared/uploads
Số 2 đầu là setgid trên directory.
Setgid trên directory
chmod 2770 shared-directory
File và directory mới có xu hướng thừa kế group của directory cha.
Kiểm tra:
ls -ld shared-directory
Kết quả có thể:
drwxrws---
x vị trí group thành s.
Sticky bit
/tmp thường có:
drwxrwxrwt
Sticky bit giúp user chỉ xóa file của mình trong directory dùng chung.
Đặt:
chmod +t shared-dir
Không dùng sticky bit thay thế owner/group phù hợp.
Setuid
Setuid khiến executable chạy với effective UID của owner.
Đây là cơ chế nhạy cảm. Không tự thêm setuid vào script/app nếu không hiểu rủi ro.
Tìm file setuid:
sudo find / -perm -4000 -type f 2>/dev/null
Umask
Umask ảnh hưởng permission mặc định của file mới.
Xem:
umask
Ví dụ 0022 thường tạo:
file: 644
directory: 755
Với group collaboration, có thể dùng 0002 trong phạm vi phù hợp.
Không đổi umask hệ thống toàn cục thiếu đánh giá.
ACL
ACL cho phép cấp quyền chi tiết ngoài owner/group/others.
Xem:
getfacl path
Cấp user ci quyền trên thư mục:
sudo setfacl -m u:ci:rwx /var/www/deployeasy
Default ACL:
sudo setfacl -d -m u:ci:rwx /var/www/deployeasy
ACL hữu ích nhưng làm permission khó quan sát chỉ bằng ls -l. Ghi tài liệu khi dùng.
Quyền Nginx đọc static file
Nginx thường chạy user:
www-data
Kiểm tra:
ps aux | grep nginx
Nginx cần x trên mọi directory cha và r trên file.
Kiểm tra đường dẫn:
namei -l /var/www/deployeasy/current/public/index.html
Không cần cho Nginx quyền write nếu chỉ phục vụ static file.
Quyền app ghi upload
Chỉ thư mục upload/cache cần write.
Không cho app write toàn bộ source:
/var/www/deployeasy/current
Tách:
current/ read-only với app
shared/uploads/ app được write
shared/cache/ app được write khi cần
Quyền file .env
sudo chown deploy:deploy .env.production
chmod 600 .env.production
Nếu service chạy user khác, có thể dùng group riêng và 640:
sudo chown deploy:app .env.production
chmod 640 .env.production
Không dùng 644 nếu secret không nên cho mọi user đọc.
sudoers an toàn
Sửa bằng:
sudo visudo
Hoặc file riêng:
sudo visudo -f /etc/sudoers.d/deployeasy-ci
Ví dụ chỉ cho user ci reload Nginx:
ci ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx
Đường dẫn binary phải chính xác:
command -v systemctl
Cẩn thận: một lệnh tưởng hẹp có thể cho phép thực thi nội dung do user kiểm soát.
Docker group
Thêm user vào Docker group:
sudo usermod -aG docker deploy
User trong Docker group thường có khả năng gần tương đương root vì có thể mount filesystem host hoặc chạy container đặc quyền.
Không xem Docker group là quyền thấp.
Process chạy bằng user nào?
ps -eo user,pid,cmd
Systemd service:
[Service]
User=deploy
Group=deploy
Dockerfile:
USER node
Chạy non-root trong app là lớp bảo vệ quan trọng.
Lỗi permission thường gặp
Permission denied
Kiểm tra:
ls -la
namei -l /full/path/to/file
id
App không ghi được upload
Kiểm tra owner/group của directory, process user và mount Docker.
Nginx 403
Nginx có thể thiếu x trên directory cha hoặc thiếu r trên file.
SSH từ chối authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$USER":"$USER" ~/.ssh
Docker volume permission
Container user UID/GID có thể không khớp host.
Kiểm tra trong container:
docker compose exec api id
Kiểm tra host:
ls -ln ./uploads
Audit permission
Tìm world-writable:
sudo find /var/www \
-xdev \
-perm -0002 \
-print
Tìm file không có owner:
sudo find /var/www \
-xdev \
\( -nouser -o -nogroup \) \
-print
Không tự động chmod hàng loạt trước khi review.
Checklist
[ ] App không chạy root
[ ] Source có owner rõ
[ ] Group chia sẻ rõ
[ ] Không dùng 777
[ ] Secret là 600 hoặc 640
[ ] Upload tách khỏi source
[ ] Nginx chỉ có quyền đọc
[ ] App chỉ write nơi cần
[ ] CI user quyền tối thiểu
[ ] sudoers sửa bằng visudo
[ ] Docker group được xem là quyền cao
[ ] ACL được ghi tài liệu
[ ] Audit world-writable định kỳ
Câu hỏi thường gặp
755 có an toàn không?
Phụ thuộc file/directory và dữ liệu. 755 cho mọi user đọc/traverse, nhưng chỉ owner được ghi.
Khi nào dùng 644?
Thường dùng cho file công khai không chứa secret: owner ghi, mọi user đọc.
Vì sao directory cần x?
x trên directory cho phép traverse để truy cập entry bên trong.
Có nên chown mọi file cho www-data?
Không. Web server thường chỉ cần đọc; app/source nên do deploy user sở hữu.
Kết luận
Permission tốt không phải là làm mọi thứ chạy bằng mọi giá. Mục tiêu là mỗi user và process chỉ có quyền cần thiết.
Nguồn tham khảo
Đọc tiếp
Bài viết liên quan
SSH Key là gì? Đăng nhập VPS an toàn không cần mật khẩu
Hướng dẫn tạo SSH key, thêm public key vào VPS, cấu hình SSH alias, sửa permission và xử lý lỗi publickey trên Windows, Linux.
Đọc bài →Linux File System khi deploy: /etc, /var, /home và /opt
Giải thích cấu trúc thư mục Linux quan trọng khi deploy production: /etc, /var, /home, /opt, /tmp, /usr, log, config và dữ liệu.
Đọc bài →Tạo systemd service cho Node.js: Tự chạy sau khi VPS reboot
Hướng dẫn tạo systemd service cho Node.js/NestJS, cấu hình User, WorkingDirectory, EnvironmentFile, restart, log và graceful shutdown.
Đọc bài →