❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Nếu bạn đang dùng VPS và login bằng tài khoản root cho mọi thứ, thì bài này dành cho bạn. Mình sẽ đi qua toàn bộ chuyện quản lý user, group và sudo trên Linux, từ cơ bản đến thực hành luôn.

User và Group Linux

Tại sao không nên dùng root mãi?

Root là tài khoản có toàn quyền trên hệ thống. Nghe thì tiện, nhưng “toàn quyền” cũng có nghĩa là toàn quyền phá.

Thử tưởng tượng bạn đang làm việc lúc 2h sáng, mắt díp lại, gõ nhầm:

rm -rf / home/deploy

Thấy cái dấu cách thừa trước home không? Lệnh này sẽ xóa toàn bộ hệ thống thay vì xóa thư mục /home/deploy. Với root, Linux không hỏi lại, không cảnh báo, nó cứ thế xóa. Tới lúc nhận ra thì server đã bay mất rồi.

Ngoài chuyện gõ nhầm, dùng root trực tiếp còn có mấy vấn đề khác:

  • Bảo mật: Nếu ai đó brute-force SSH, target đầu tiên luôn là tài khoản root. Nếu bạn tắt root login và dùng user riêng, kẻ tấn công phải đoán cả username lẫn password.
  • Không truy vết được: Khi nhiều người cùng SSH vào server bằng root, bạn không biết ai đã làm gì. Mỗi người có user riêng thì log sẽ ghi rõ ràng.
  • Một ứng dụng bị hack = mất cả server: Nếu web app chạy dưới quyền root bị khai thác lỗ hổng, attacker có ngay quyền cao nhất. Chạy dưới user riêng thì thiệt hại bị giới hạn trong phạm vi quyền của user đó.

Cách làm đúng: tạo một user riêng, cho quyền sudo khi cần chạy lệnh root, và chỉ dùng root khi thật sự cần thiết. Mình sẽ hướng dẫn từng bước ở phía dưới.

User trên Linux

Trên Linux, mọi thứ xoay quanh user. Mỗi tiến trình chạy đều thuộc về một user, mỗi file đều có chủ sở hữu là một user. Hiểu cách Linux quản lý user là nền tảng để quản lý server.

Xem danh sách user

Cách nhanh nhất để xem tất cả user trên hệ thống:

cat /etc/passwd

Output sẽ dài, vì ngoài user thật (con người) thì hệ thống còn tạo rất nhiều user nội bộ. Mỗi dòng có dạng:

thach:x:1000:1000:Thach Pham:/home/thach:/bin/bash

Phân tích từng phần, ngăn cách bởi dấu ::

  • thach, tên user
  • x, password (đã chuyển sang /etc/shadow, nên ở đây chỉ hiện x)
  • 1000, UID (User ID)
  • 1000, GID (Group ID chính)
  • Thach Pham, mô tả (comment/GECOS)
  • /home/thach, thư mục home
  • /bin/bash, shell mặc định

Ngoài cat /etc/passwd, bạn cũng có thể dùng:

getent passwd

Lệnh getent linh hoạt hơn vì nó lấy thông tin từ tất cả nguồn mà hệ thống cấu hình (file local, LDAP, NIS…), không chỉ riêng file /etc/passwd. Với VPS đơn giản thì kết quả giống nhau, nhưng nếu server kết nối với hệ thống xác thực tập trung thì getent sẽ cho kết quả đầy đủ hơn.

System user vs Human user

Không phải user nào trong /etc/passwd cũng là người thật. Linux phân biệt user bằng UID (User ID):

  • UID 0: root, tài khoản quyền lực nhất.
  • UID 1–999: system user, được tạo tự động bởi hệ thống hoặc khi cài phần mềm. Ví dụ: www-data (Nginx/Apache), mysql (MySQL), sshd (SSH daemon). Những user này không có password, không login được, chỉ dùng để chạy service.
  • UID >= 1000: human user, tức là tài khoản dành cho người thật đăng nhập vào hệ thống.

Muốn xem chỉ những user “người thật”? Lọc theo UID:

awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $3}' /etc/passwd

Các file quan trọng

Ba file cốt lõi quản lý user và group trên Linux:

  • /etc/passwd, danh sách tất cả user, thông tin cơ bản (tên, UID, home, shell). Ai cũng đọc được file này.
  • /etc/shadow, password đã mã hoá của từng user, cộng thêm thông tin về hạn password. Chỉ root mới đọc được.
  • /etc/group, danh sách group và thành viên. Cấu trúc đơn giản: groupname:x:GID:member1,member2.

Ngày xưa password lưu trực tiếp trong /etc/passwd (ai cũng đọc được). Sau này Linux tách password ra file /etc/shadow riêng với quyền chỉ root đọc, an toàn hơn nhiều. Đó là lý do bạn thấy chữ x ở cột password trong /etc/passwd.

Tạo user mới

Đây là phần hay bị nhầm lẫn vì Ubuntu và AlmaLinux (hay CentOS/RHEL) dùng lệnh khác nhau.

Trên Ubuntu/Debian

Ubuntu có lệnh adduser, rất tiện vì nó làm hết mọi thứ trong một lần chạy:

sudo adduser thach

Lệnh này sẽ:

  1. Tạo user thach
  2. Tạo group thach (mỗi user có một group riêng)
  3. Tạo thư mục home /home/thach
  4. Copy các file cấu hình mặc định vào home (từ /etc/skel)
  5. Hỏi bạn đặt password
  6. Hỏi thêm thông tin (Full Name, Room Number... bấm Enter bỏ qua hết cũng được)

Một lệnh, xong hết. Rất phù hợp khi tạo user nhanh.

Trên AlmaLinux/CentOS/RHEL

AlmaLinux dùng useradd (không có chữ d ở đầu như adduser). Lệnh này "low-level" hơn, mặc định không tạo home directory và không hỏi password:

sudo useradd -m -s /bin/bash thach
sudo passwd thach

Phải tách làm 2 bước: tạo user rồi set password riêng. Trong đó:

  • -m, tạo thư mục home /home/thach
  • -s /bin/bash, đặt shell mặc định là bash (nếu không có flag này, một số distro sẽ để shell là /bin/sh hoặc /sbin/nologin)

adduser vs useradd: Trên Ubuntu, adduser là script Perl bọc quanh useradd, thêm các bước interactive cho tiện. Trên AlmaLinux, adduser chỉ là symlink tới useradd, nên hai lệnh giống hệt nhau. Vì vậy, nếu muốn viết script chạy được trên cả hai distro, hãy dùng useradd.

Các option hay dùng khi tạo user

Ngoài -m-s, còn vài option hữu ích:

# Tạo user và thêm vào group docker luôn
sudo useradd -m -s /bin/bash -G docker thach

# Tạo user với home directory tuỳ chỉnh sudo useradd -m -d /opt/deploy -s /bin/bash deploy

# Tạo user với comment (mô tả) sudo useradd -m -s /bin/bash -c "Thach Pham - Admin" thach

Tóm lại các flag:

  • -m, tạo home directory
  • -d /path, chỉ định đường dẫn home directory
  • -s /bin/bash, chỉ định shell
  • -G group1,group2, thêm vào các group phụ (supplementary groups)
  • -c "comment", thêm mô tả
  • -e YYYY-MM-DD, đặt ngày hết hạn tài khoản

Xóa user

Khi không còn cần một user nữa:

# Xóa user nhưng GIỮ lại home directory
sudo userdel thach
# Xóa user VÀ xóa luôn home directory + mail spool
sudo userdel -r thach

Thường thì bạn sẽ muốn dùng -r để dọn dẹp luôn, trừ khi cần giữ lại dữ liệu trong home của user đó để kiểm tra.

Không thể xóa user đang login. Nếu cần, hãy kill hết process của user đó trước: sudo pkill -u username, rồi mới chạy userdel.

Group

Group là cách gom nhiều user lại để quản lý quyền chung. Thay vì cấp quyền cho từng user một, bạn cấp quyền cho group rồi thêm user vào group đó.

Xem group

Xem user đang thuộc những group nào:

# Xem groups của user hiện tại
groups

# Xem groups của user cụ thể groups thach

# Xem chi tiết hơn (kèm UID, GID) id thach

Xem toàn bộ group trên hệ thống:

cat /etc/group

Mỗi dòng có dạng: docker:x:998:thach,deploy, nghĩa là group docker có GID 998 và 2 thành viên là thachdeploy.

Tạo group mới

sudo groupadd devops

Thêm user vào group

Đây là lệnh bạn sẽ dùng rất nhiều:

sudo usermod -aG devops thach

Chú ý flag -aG:

  • -a, append, thêm vào danh sách group hiện có
  • -G, chỉ định group

Cực kỳ quan trọng: Luôn dùng -aG (có chữ a). Nếu chỉ dùng -G mà quên -a, user sẽ bị XÓA khỏi tất cả group cũ và chỉ còn thuộc group mới. Đây là lỗi rất phổ biến và có thể làm user mất quyền sudo luôn.

Ví dụ thực tế: cho user dùng Docker

Khi cài Docker, nó tạo group docker. Mặc định chỉ root mới chạy được Docker command. Để user thường chạy Docker mà không cần sudo:

sudo usermod -aG docker thach

Sau khi thêm vào group, user cần logout rồi login lại (hoặc chạy newgrp docker) để group mới có hiệu lực. Đây là điểm hay quên nhất.

Xóa group

sudo groupdel devops

Không xóa được group nếu nó là primary group của user nào đó. Phải chuyển primary group của user đó trước.

Sudo: chạy lệnh với quyền root

sudo (viết tắt của superuser do) cho phép user thường chạy một lệnh cụ thể với quyền root, mà không cần biết password root. Đây là cách an toàn hơn nhiều so với login trực tiếp bằng root.

sudo vs su

Hai lệnh này hay bị nhầm:

# Chạy MỘT lệnh với quyền root
sudo apt update

# Chuyển hẳn sang shell root (cần password root) su -

# Chuyển sang shell root bằng sudo (cần password của user hiện tại) sudo -i
  • sudo command, chạy đúng 1 lệnh với quyền root, xong trở về user thường. Dùng password của user hiện tại.
  • su -, chuyển hẳn sang user root, ở đó cho đến khi gõ exit. Cần password root.
  • sudo -i, tương tự su - nhưng dùng password user hiện tại thay vì password root.

Nên dùng sudo thay vì su - vì: không cần chia sẻ password root cho ai, mỗi lệnh sudo được ghi log, và bạn chỉ chạy quyền root khi cần.

Cho user quyền sudo

Đây là phần khác biệt giữa Ubuntu và AlmaLinux. Cả hai đều dùng usermod -aG, nhưng tên group khác nhau:

# Ubuntu/Debian — group sudo
sudo usermod -aG sudo thach
# AlmaLinux/CentOS/RHEL — group wheel
sudo usermod -aG wheel thach

Sau khi thêm, user cần logout rồi login lại. Kiểm tra bằng:

sudo whoami

Nếu kết quả là root thì đã có quyền sudo.

File /etc/sudoers và visudo

File /etc/sudoers là nơi cấu hình ai được dùng sudo, với quyền gì. Nhưng bạn tuyệt đối không nên edit trực tiếp bằng nano hay vim. Lý do: nếu cú pháp sai, sudo sẽ hỏng và bạn không thể sửa lại được (vì cần sudo để sửa sudo!).

Luôn dùng visudo:

sudo visudo

visudo sẽ mở file /etc/sudoers trong editor và kiểm tra cú pháp trước khi lưu. Nếu có lỗi, nó sẽ cảnh báo và cho bạn cơ hội sửa lại, không cho lưu file lỗi.

Trong file này, bạn sẽ thấy dòng tương tự:

# Ubuntu
%sudo   ALL=(ALL:ALL) ALL
# AlmaLinux
%wheel  ALL=(ALL)       ALL

Dòng này có nghĩa: mọi thành viên của group sudo (hoặc wheel) được chạy mọi lệnh với quyền root. Dấu % đầu dòng chỉ ra đây là group chứ không phải user.

Sudo không cần nhập password

Trong một số trường hợp (script tự động, CI/CD...), bạn muốn user chạy sudo mà không bị hỏi password. Mở visudo rồi thêm dòng:

thach ALL=(ALL) NOPASSWD:ALL

Hoặc an toàn hơn, chỉ cho phép chạy vài lệnh cụ thể mà không cần password:

thach ALL=(ALL) NOPASSWD:/usr/bin/systemctl restart nginx, /usr/bin/journalctl

Cẩn thận: NOPASSWD:ALL nghĩa là user đó có thể chạy BẤT CỨ lệnh gì với quyền root mà không cần xác nhận. Nếu tài khoản bị xâm nhập, attacker có ngay full root. Chỉ nên dùng cho account chạy automation, và nên giới hạn đúng lệnh cần thiết thay vì cho ALL.

Một cách tốt hơn là tạo file riêng trong /etc/sudoers.d/ thay vì sửa file chính:

sudo visudo -f /etc/sudoers.d/thach

Nội dung file:

thach ALL=(ALL) NOPASSWD:ALL

Cách này gọn hơn, dễ quản lý, và không sợ làm hỏng file sudoers chính.

Đổi password

# User tự đổi password của mình
passwd
# Root đổi password cho user khác
sudo passwd thach

Khi tự đổi, hệ thống sẽ hỏi password hiện tại trước rồi mới cho nhập password mới. Root đổi cho user khác thì không cần nhập password cũ.

Kiểm tra thông tin password của user:

sudo chage -l thach

Lệnh chage hiện thông tin như ngày đổi password cuối, ngày hết hạn, số ngày tối đa giữa 2 lần đổi...

Lock và Unlock user

Khi cần tạm khoá tài khoản user (ví dụ nhân viên nghỉ việc, tài khoản bị nghi bị xâm nhập) mà chưa muốn xóa hẳn:

# Lock user — không login được nữa
sudo usermod -L thach
# Unlock user — cho login lại
sudo usermod -U thach

Khi lock, hệ thống thêm dấu ! vào trước password hash trong /etc/shadow, khiến password không khớp được nữa. Unlock thì gỡ dấu ! ra. Dữ liệu, home directory, cấu hình của user không bị ảnh hưởng.

usermod -L chỉ khoá xác thực bằng password. Nếu user đã cấu hình SSH key, họ vẫn login được. Để khoá hoàn toàn, bạn cần kết hợp thêm: đổi shell sang /sbin/nologin hoặc set ngày hết hạn tài khoản bằng sudo usermod -e 1 thach (ngày 1 = 1 Jan 1970 = hết hạn ngay).

Quy trình tạo user admin cho VPS

Đây là workflow mình khuyến khích bạn làm ngay sau khi nhận VPS mới. Mình sẽ hướng dẫn theo từng bước, cover cả Ubuntu và AlmaLinux.

Bước 1: Tạo user mới

SSH vào VPS bằng root, rồi tạo user:

# Ubuntu
adduser thach
# AlmaLinux
useradd -m -s /bin/bash thach
passwd thach

Bước 2: Thêm vào group sudo/wheel

# Ubuntu
usermod -aG sudo thach
# AlmaLinux
usermod -aG wheel thach

Bước 3: Copy SSH key cho user mới

Nếu bạn đang dùng SSH key để login root (khuyến khích!), cần copy key đó sang user mới:

# Vẫn đang login bằng root
mkdir -p /home/thach/.ssh
cp /root/.ssh/authorized_keys /home/thach/.ssh/
chown -R thach:thach /home/thach/.ssh
chmod 700 /home/thach/.ssh
chmod 600 /home/thach/.ssh/authorized_keys

Các lệnh chownchmod rất quan trọng. SSH sẽ từ chối key nếu quyền file không đúng. Thư mục .ssh phải là 700 (chỉ chủ sở hữu được truy cập), file authorized_keys phải là 600 (chỉ chủ sở hữu đọc/ghi được).

Bước 4: Test login với user mới

Mở một terminal mới (giữ session root cũ để phòng trường hợp cần sửa) và thử SSH bằng user vừa tạo:

ssh thach@your-server-ip

Login thành công rồi thì test sudo:

sudo whoami
# Kết quả phải là: root

Quan trọng: Luôn giữ session root mở cho đến khi chắc chắn user mới login và sudo được. Nếu vội đóng session root mà user mới không login được, bạn sẽ bị khoá khỏi server.

Bước 5: Disable root login

Sau khi đã test thành công, bước cuối là tắt login bằng root qua SSH. Mình sẽ hướng dẫn chi tiết ở bài về bảo mật SSH trong serie này. Bây giờ, biết là cần làm và quy trình là như vậy.

Checkpoint

Tới đây, bạn đã hiểu cách quản lý user, group và sudo trên Linux. Hãy thực hành ngay trên VPS của bạn:

  1. Tạo một user mới
  2. Cho user đó quyền sudo
  3. Logout, login lại bằng user mới
  4. Chạy thử lệnh với sudo:
# Ubuntu
sudo apt update
# AlmaLinux
sudo dnf update

Nếu cả 4 bước trên đều chạy ngon thì bạn đã sẵn sàng cho bài tiếp theo. Từ giờ trở đi, hãy dùng user này thay vì root cho mọi thao tác trên server.

Bài tiếp theo mình sẽ nói về File Permission, cách Linux kiểm soát ai được đọc/ghi/chạy file nào, và tại sao hiểu permission là kỹ năng sống còn khi quản lý VPS.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

Trần Thắng

Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI