Đăng nhập thẳng bằng root cho nhanh — và một lệnh gõ nhầm là xóa sạch máy chủ, không có gì ngăn lại. sudo tồn tại để giữa bạn và thảm họa luôn có một bước dừng.
Vì sao không dùng root trực tiếp
- Không có lớp xác nhận nào cho lệnh nguy hiểm.
- Log chỉ ghi “root”, không biết ai đã làm gì.
- Một phần mềm lỗi chạy dưới root có toàn quyền trên hệ thống.
- Không thể thu hồi quyền của một người mà không đổi mật khẩu chung.
Dùng sudo hằng ngày
sudo systemctl restart nginx
sudo -u www-data ls /var/www # chạy dưới danh nghĩa người dùng khác
sudo -i # mở shell root (dùng khi thật cần)
sudo !! # chạy lại lệnh vừa rồi kèm sudo
Cấp quyền cho người dùng
# Ubuntu/Debian
sudo usermod -aG sudo an
# RHEL/Rocky
sudo usermod -aG wheel an
Luôn sửa sudoers bằng visudo
sudo visudo # file chính
sudo visudo -f /etc/sudoers.d/trienkhai # file riêng, gọn hơn
visudo kiểm tra cú pháp trước khi lưu. Sửa thẳng /etc/sudoers bằng nano rồi gõ sai một dấu là hỏng sudo trên toàn hệ thống — và bạn không còn quyền để sửa lại.
Chỉ cho phép đúng vài lệnh
# /etc/sudoers.d/trienkhai
# Người triển khai chỉ được restart dịch vụ và xem log
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp, \
/bin/systemctl status myapp, \
/usr/bin/journalctl -u myapp *
Đây chính là đặc quyền tối thiểu: đủ để làm việc, không đủ để gây hại.
Cạm bẫy khi giới hạn lệnh
# NGUY HIỂM — cho phép này là cho luôn quyền root
deploy ALL=(ALL) NOPASSWD: /usr/bin/vim
deploy ALL=(ALL) NOPASSWD: /bin/find
Từ trong vim gõ :!sh là có ngay shell root. find có -exec. Bất kỳ lệnh nào chạy được lệnh khác đều tương đương cấp toàn quyền.
Kiểm tra và theo dõi
sudo -l # xem mình được phép làm gì
sudo -l -U deploy # xem quyền của người khác
grep sudo /var/log/auth.log # Debian/Ubuntu
journalctl _COMM=sudo # systemd
Vài thiết lập nên có
# /etc/sudoers.d/anninh
Defaults timestamp_timeout=5 # nhớ mật khẩu 5 phút thay vì 15
Defaults logfile=/var/log/sudo.log
Defaults passwd_tries=3
Defaults lecture=always
Hạn chế tối đa NOPASSWD — chỉ dùng cho script tự động, và luôn kèm danh sách lệnh cụ thể. deploy ALL=(ALL) NOPASSWD: ALL chẳng khác gì đưa thẳng mật khẩu root.
