Hướng dẫn hiểu và cấu hình sudo – cho phép user thường chạy lệnh với đặc quyền root, kiểm soát chi tiết lệnh được phép.
sudo là gì?
sudo (superuser do) cho phép admin cấp quyền root cho user/nhóm cụ thể, giới hạn theo lệnh, host, không cần chia sẻ mật khẩu root. Ubuntu mặc định khóa root, dùng sudo cho admin.
Cấu hình với visudo (BẮT BUỘC)
# visudo
- Mở
/etc/sudoersan toàn: kiểm tra cú pháp, khóa file tránh edit trùng. - Editor mặc định:
EDITOR=vim visudohoặcEDITOR=nano visudo.
Cú pháp sudoers
user host=(runas) commands
- user: User hoặc
%group(group). - host: Hostname (ALL = mọi host).
- (runas): User/group chạy lệnh (ALL = bất kỳ, thường root).
- commands: Lệnh được phép (ALL = mọi lệnh, hoặc danh sách cách nhau dấu phẩy).
Ví dụ cấp quyền
Quyền root đầy đủ (như user admin Ubuntu)
calvin ALL=(ALL) ALL
Chỉ cho phép restart Apache
calvin ALL=(ALL) /etc/init.d/httpd restart
Cho phép nhiều lệnh cụ thể
calvin ALL=(ALL) /etc/init.d/httpd restart, /etc/init.d/httpd stop, /usr/bin/systemctl reload nginx
Chạy lệnh cụ thể KHÔNG cần mật khẩu
calvin ALL=(ALL) NOPASSWD: /etc/init.d/httpd restart
Nhóm admin toàn quyền không cần mật khẩu (NHƯ UBUNTU DEFAULT)
%sudo ALL=(ALL) NOPASSWD: ALL
Kiểm tra quyền sudo của user hiện tại
$ sudo -l
Matching Defaults entries for calvin on host:
env_reset, mail_badpass, secure_path=...
User calvin may run the following commands on host:
(ALL) ALL
Thực thi lệnh với user khác
# sudo -u www-data whoami
www-data
# sudo -u postgres psql
Bảo mật & Best Practices
- Luôn dùng
visudo– không edit trực tiếp/etc/sudoers. - Tạo file riêng trong
/etc/sudoers.d/cho mỗi app/user – dễ quản lý, không hỏng file chính:
# echo 'calvin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx' > /etc/sudoers.d/calvin-nginx
# chmod 440 /etc/sudoers.d/calvin-nginx
- Giới hạn lệnh cụ thể – tránh
ALLkhi có thể. - Không dùng NOPASSWD trừ script tự động hóa (cron, CI/CD) – và phải hạn chế lệnh.
- Log sudo: Mặc định log vào
/var/log/auth.log(Debian) hoặc/var/log/secure(RHEL). - Timestamp timeout: Mặc định 15 phút không nhập lại pass. Tùy chỉnh:
Defaults timestamp_timeout=5(phút).
Khắc phục sự cố thường gặp
- Syntax error trong sudoers: Dùng
pkexec visudo(nếu polkit cho phép) hoặc boot single-user mode / live USB sửa. - User không trong sudoers: Root thêm user vào group
wheel(RHEL) hoặcsudo(Debian):usermod -aG sudo calvin.