DeployEasy
Menu
LinuxCơ bản

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.

· 8 phút đọc · 1.660 từ
Mục lục bài viết

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