sudo và nguyên tắc đặc quyền tối thiểu

Đă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:!sh là có ngay shell root. find-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.

Lên đầu trang