Quản lý user và phân quyền sudo an toàn trên Linux

Bạn vừa SSH vào VPS Linux mới, user root đang login trực tiếp. Đây là thói quen nguy hiểm. Mỗi lệnh bạn chạy dưới quyền root đều có thể crash cả server nếu gõ nhầm rm -rf sai chỗ. Bài viết này hướng dẫn sysadmin quy trình tạo user không root, phân quyền sudo tối thiểu, khoá SSH root, và cấu hình sudoers an toàn, các bước thực chiến áp dụng trên Ubuntu 24.04 LTS, Debian 12 và AlmaLinux 9.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 LTS, Debian 12 hoặc AlmaLinux 9, đã cài SSH server.
- Quyền truy cập root hoặc user có quyền sudo.
- Kiến thức cơ bản về dòng lệnh Linux và SSH.
Vì sao không nên dùng root hằng ngày?
User root có toàn quyền, không log, không giới hạn. Sai lầm (gõ nhầm lệnh, script lỗi) gây hậu quả lập tức. Với SSH, brute-force vào root port 22 là mục tiêu hàng đầu của botnet. Dùng user thường + sudo vừa có log (xem ai làm gì qua /var/log/auth.log hoặc journalctl -u sshd), vừa giới hạn quyền cho từng lệnh. Đây là chuẩn bảo mật cơ bản mọi sysadmin phải làm ngay ngày đầu tiên.
Bước 1, Tạo user mới không root
SSH vào VPS với quyền root. Tạo user mới (ví dụ admin1) và đặt password.
# Trên Ubuntu/Debian
adduser admin1
# Trên AlmaLinux/Rocky
adduser admin1
passwd admin1
Dùng adduser (Ubuntu/Debian) sẽ tự tạo home directory và copy skeleton files. Trên AlmaLinux dùng adduser rồi tự set password bằng passwd.
VERIFY:
id admin1
# Output mong đợi: uid=1001(admin1) gid=1001(admin1) groups=1001(admin1)
Lúc này user mới chưa có quyền gì.
Bước 2, Cấp quyền sudo qua nhóm wheel/sudo
Tuỳ dòng họ:
- Ubuntu/Debian: nhóm
sudo(cấu hình mặc định trong/etc/sudoerscho phép nhóm này chạy mọi lệnh). - AlmaLinux/Rocky/CentOS: nhóm
wheel(tương tự).
# Ubuntu/Debian
usermod -aG sudo admin1
# AlmaLinux/Rocky
usermod -aG wheel admin1
Cờ -aG: -a (append) bắt buộc đi cùng -G để thêm vào nhóm phụ, không xoá nhóm cũ. Thiếu -a sẽ kick user ra khỏi nhóm khác.
VERIFY:
# Kiểm tra user thuộc nhóm nào
groups admin1
# Output: admin1 : admin1 sudo (hoặc wheel)
# Kiểm tra quyền sudo thử (chạy từ user đó hoặc sim)
su - admin1 -c 'sudo whoami'
# Output: root
Bước 3, Cấu hình sudoers: hạn chế lệnh cho user
Cho user chạy mọi lệnh với sudo là rộng. Nguyên tắc least privilege: chỉ cấp đúng lệnh user cần.
Không sửa trực tiếp /etc/sudoers, dùng visudo để kiểm tra cú pháp trước khi ghi. Hoặc đặt file riêng trong /etc/sudoers.d/ (an toàn hơn).
# Tạo file riêng cho admin1
visudo -f /etc/sudoers.d/admin1
Nội dung file:
# Cho admin1 chạy systemctl restart và journalctl
admin1 ALL=(ALL) /usr/bin/systemctl restart *, /usr/bin/journalctl
# Chỉ cho chạy lệnh apt update & upgrade (không install)
admin1 ALL=(ALL) /usr/bin/apt update, /usr/bin/apt upgrade
# Cấm chạy shell trống (sudo -s, sudo -i)
admin1 ALL=(ALL) !/usr/bin/su, !/bin/bash, !/bin/sh
Giải thích cú pháp: user HOST=(RUN_AS) COMMANDS. ALL=(ALL) = từ mọi host, chạy với quyền mọi user. Dấu ! phía trước lệnh = cấm lệnh đó.
VERIFY:
# Kiểm tra cú pháp file sudoers
visudo -c -f /etc/sudoers.d/admin1
# Output: /etc/sudoers.d/admin1: parsed OK
# Thử chạy lệnh bị cấm (từ user admin1)
su - admin1 -c 'sudo -s'
# Output: Sorry, user admin1 is not allowed to execute '/bin/bash' as root on ...
Cảnh báo: Nếu bạn cấm shell trống, user không thể dùng sudo -s hay sudo -i, nhưng vẫn có thể chạy từng lệnh. Đây là thiết kế intentionally restrictive, tốt cho production nhưng hơi bất tiện nếu user cần chạy nhiều lệnh nhanh. Cân nhắc.
Bước 4, Vô hiệu hoá SSH root login
Bỏ qua bước này thì tạo user sudo cũng vô ích, vẫn có cửa sau root qua SSH.
# Sửa file cấu hình SSH
nano /etc/ssh/sshd_config
# Tìm và SET các dòng sau:
PermitRootLogin no
# Nếu có dòng #PermitRootLogin yes, bỏ # và đổi thành no
# Nếu có dòng PermitRootLogin prohibit-password, đổi thành no
# Nên thêm (nếu chưa có) để chỉ cho phép user cụ thể SSH vào:
AllowUsers admin1 youruser
Giải thích: PermitRootLogin no cấm hoàn toàn đăng nhập root qua SSH (kể cả key). AllowUsers là danh sách trắng, chỉ user nào được SSH vào, giảm surface tấn công.
# Kiểm tra cú pháp trước khi restart
sshd -t
# Không output = OK
# Restart SSH
systemctl restart sshd
VERIFY: Mở terminal mới, thử SSH bằng root:
ssh root@your-server-ip
# Output: Permission denied (publickey). hoặc Connection closed.
SSH bằng user thường phải hoạt động.
Bước 5, Thêm SSH key cho user sudo (không dùng password)
Dùng key ED25519 (ưu tiên hơn RSA 4096 vì ngắn hơn, nhanh hơn, bảo mật tương đương).
# Trên máy local (KHÔNG phải VPS)
ssh-keygen -t ed25519 -C "admin1-key-$(date +%Y%m%d)"
# Mặc định lưu ~/.ssh/id_ed25519
# Copy key lên VPS
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin1@your-server-ip
Nếu không có ssh-copy-id (Windows PowerShell mới):
# Thủ công
cat ~/.ssh/id_ed25519.pub | ssh admin1@your-server-ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
VERIFY: Đăng nhập bằng key, đảm bảo không hỏi password.
ssh -i ~/.ssh/id_ed25519 admin1@your-server-ip
# Sau khi confirm, vô hiệu hoá password authentication để tăng bảo mật (trong /etc/ssh/sshd_config):
PasswordAuthentication no
# Rồi sshd -t && systemctl restart sshd
Bước 6, Đặt alias và log cho sudo (tuỳ chọn)
Mọi lệnh sudo đều được ghi vào /var/log/auth.log (Debian/Ubuntu) hoặc /var/log/secure (AlmaLinux). Nhưng bạn muốn log riêng cho sudo:
# Tạo file riêng trong /etc/sudoers.d/
visudo -f /etc/sudoers.d/logging
# Nội dung:
Defaults logfile=/var/log/sudo.log
Defaults log_input, log_output
Defaults timestamp_timeout=5 # Session sudo timeout 5 phút, giảm rủi ro khi quên terminal
log_input và log_output sẽ ghi lại toàn bộ stdin/stdout của phiên sudo (rất nặng log, chỉ nên bật cho user audit).
VERIFY: Chạy sudo whoami rồi cat /var/log/sudo.log.
Xử lý lỗi thường gặp
Lỗi: user is not in the sudoers file
Đăng nhập bằng root (hoặc user sudo khác), kiểm tra nhóm:
groups username
# Nếu không thấy sudo/wheel, chạy lại usermod -aG
Lỗi: sudo: unable to resolve host
File /etc/hostname không khớp /etc/hosts. Sửa /etc/hosts thêm dòng 127.0.1.1 YOURHOSTNAME.
Quên mất quyền sudo vì sửa sai /etc/sudoers
Nếu lock mất quyền root và không có user sudo nào: khởi động lại VPS ở rescue mode (hầu hết provider có tính năng này trong control panel), mount hệ thống, sửa /etc/sudoers từ rescue. Với thueVPS, bạn có thể dùng tính năng cài lại OS hoặc mount recovery từ ticket hỗ trợ nhanh. Cách phòng ngừa: luôn giữ một SSH session root mở khi sửa sudoers, thoát ra kiểm tra xong mới đóng session cũ.
Câu hỏi thường gặp
Có nên xoá user root hoàn toàn không?
Không xoá được. User root là tài khoản hệ thống. Bạn chỉ vô hiệu hoá SSH root login và không dùng nó hằng ngày. Vẫn cần root để khôi phục khẩn cấp.
Phân biệt nhóm sudo và wheel?
Cả hai đều cho quyền chạy mọi lệnh qua sudo, chỉ khác tên gọi theo họ OS. Ubuntu dùng nhóm sudo, RHEL-family dùng wheel. Tác dụng như nhau.
Sau khi khoá root SSH, làm sao để copy file lên VPS?
Dùng scp hoặc rsync với user thường, file sẽ được copy vào home của user đó. Nếu cần copy vào thư mục hệ thống, dùng sudo cp sau khi SSH.
Có thể cho phép user chạy sudo mà không cần password không?
Có. Thêm NOPASSWD: vào sudoers (vd: admin1 ALL=(ALL) NOPASSWD: ALL). Tiện lợi nhưng giảm bảo mật, bất kỳ ai có quyền truy cập user đó đều có thể sudo. Không khuyến nghị cho production.
Tôi muốn kiểm tra ai đã dùng sudo gần đây?
Dùng lệnh grep "sudo" /var/log/auth.log | tail -20 (Debian/Ubuntu) hoặc ausearch -m USER_ROLE_CHANGE -i nếu có auditd.
Bài viết liên quan
- Cấu hình fail2ban chống brute-force SSH trên Ubuntu 24.04
- 10 cách tăng cường bảo mật VPS Linux chống tấn công 2026
- Kiểm tra và vá lỗ hổng bảo mật VPS với Lynis


