Sudo là gì trong Linux? Hướng dẫn toàn diện về cách sử dụng, cấu hình, bảo mật và khắc phục sự cố

目次

1. Giới thiệu: sudo là gì?

Ý nghĩa cơ bản và vai trò của sudo

Trong các hệ thống Linux và Unix‑like, sudo là một trong những lệnh quan trọng nhất.
Thuật ngữ sudo viết tắt của “superuser do”, và nó là công cụ cho phép người dùng tạm thời thực thi các lệnh với đặc quyền quản trị (root).

Bình thường, người dùng thường không được phép thực hiện các thao tác ảnh hưởng tới toàn bộ hệ thống, chẳng hạn như cài đặt gói phần mềm hay thay đổi cài đặt hệ thống. Tuy nhiên, bằng cách sử dụng lệnh sudo, những thao tác có đặc quyền này có thể được thực hiện một cách kiểm soát và giới hạn.

Ví dụ, lệnh sau chạy apt với đặc quyền root:

sudo apt update

Như vậy, sudo đóng một vai trò then chốt như một cơ chế bảo mật để sử dụng đặc quyền quản trị, cân bằng giữa an ninh hệ thống và tính tiện dụng.

Sự khác nhau giữa sudo và su

Một lệnh có mục đích tương tự sudosu, nhưng hai lệnh này có những điểm khác biệt rõ ràng.

  • su viết tắt “substitute user” và được dùng để chuyển hoàn toàn sang một người dùng khác (thường là root). Khi bạn dùng su, bạn sẽ hoạt động dưới danh tính của người dùng đó trong suốt phiên làm việc.
  • Ngược lại, sudo cho phép bạn giữ nguyên người dùng hiện tại trong khi tạm thời vay mượn đặc quyền quản trị cho một lệnh duy nhất.

Tóm lại, su chuyển đổi người dùng ở mức phiên, trong khi sudo nâng đặc quyền ở mức lệnh. Từ góc độ bảo mật, sudo giúp dễ dàng theo dõi lịch sử lệnh, vì vậy nó đã trở thành cách tiếp cận tiêu chuẩn trong các bản phân phối Linux hiện đại.

Các bản phân phối Linux thường sử dụng sudo

Lệnh sudo được bật mặc định trên nhiều bản phân phối Linux, đặc biệt là các bản sau:

  • Hệ thống dựa trên Ubuntu (Ubuntu, Linux Mint, …) → Tài khoản root bị vô hiệu hoá theo mặc định, và mọi tác vụ quản trị đều được thực hiện qua sudo.
  • Hệ thống dựa trên Debian → sudo có thể cần được bật thủ công, nhưng thường được khuyến nghị như một thực hành bảo mật tốt.
  • Hệ thống dựa trên Fedora, CentOS và Red Hat → Truy cập root trực tiếp vẫn khả thi, nhưng việc dùng sudo vẫn phổ biến.

Trong Ubuntu nói riêng, tài khoản root bị vô hiệu hoá theo mặc định, và mọi thao tác quản trị phải thực hiện bằng sudo. Vì vậy, hiểu sudo là điều thiết yếu đối với người dùng Ubuntu.

Tại sao mọi người lại tìm kiếm “sudo sudo”?

Từ khóa “sudo sudo” có vẻ dư thừa khi nhìn đầu tiên, nhưng nó thường được tìm kiếm vì các lý do sau:

  • Người mới bắt đầu muốn nhấn mạnh hoặc hiểu rõ hơn về ý nghĩa và cách dùng sudo
  • Người dùng gặp lỗi như sudo: sudo: command not found
  • Sự nhầm lẫn khi thấy các ví dụ trong đó sudo bị lặp lại hai lần trong script hoặc pipeline

Với những mục đích tìm kiếm này, các phần sau sẽ giải thích chi tiết cách sử dụng đúng, cách cấu hình và các kỹ thuật khắc phục lỗi cho sudo.

2. Cách dùng cơ bản của lệnh sudo

Cú pháp cơ bản của sudo

Cú pháp cơ bản của sudo rất đơn giản:

sudo [options] command

Ví dụ, để cập nhật thông tin gói của hệ thống:

sudo apt update

Điều này có nghĩa là lệnh apt update được thực thi với đặc quyền root.

Xác thực mật khẩu và bộ nhớ đệm thông tin đăng nhập

Khi bạn dùng sudo lần đầu, hoặc sau một khoảng thời gian nhất định, hệ thống sẽ yêu cầu bạn nhập mật khẩu người dùng. Cơ chế bảo mật này giúp ngăn ngừa việc sử dụng sai hoặc truy cập trái phép.

Sau khi nhập mật khẩu, thông tin sẽ được lưu trong bộ nhớ đệm trong một khoảng thời gian cố định (mặc định là 5 phút trên Ubuntu). Trong thời gian này, các lệnh sudo tiếp theo không cần nhập lại mật khẩu. Thời gian chờ này có thể được điều chỉnh trong tệp sudoers.

Các tùy chọn thường dùng

sudo cung cấp nhiều tùy chọn để làm cho các thao tác linh hoạt và tiện lợi hơn. Dưới đây là một số tùy chọn được sử dụng phổ biến nhất.

-u (Chạy dưới danh tính người dùng khác)

Mặc định, các lệnh được thực thi dưới quyền root, nhưng với tùy chọn -u, bạn có thể chạy một lệnh dưới quyền bất kỳ người dùng nào được chỉ định.

sudo -u www-data whoami

Kết quả sẽ là www-data, xác nhận rằng lệnh đã được thực thi dưới quyền người dùng www-data.

-s (Start a Shell)

Lệnh sau sẽ mở một shell tạm thời với quyền root:

sudo -s

Hãy cẩn thận khi làm việc trong một shell root.

-i (Simulate a Full Root Login)

Tùy chọn này tạo ra một môi trường root đầy đủ hơn. Các biến môi trường được chuyển sang của root, dẫn đến một phiên root tương tự như đăng nhập trực tiếp dưới quyền root.

sudo -i

-l (List Allowed Commands)

Bạn có thể kiểm tra những lệnh nào bạn được phép chạy bằng sudo:

sudo -l

Điều này hữu ích để xác minh cài đặt quyền và các hạn chế bảo mật.

Những điểm quan trọng cho người mới bắt đầu

  • Bạn phải để một dấu cách sau sudo. Ví dụ, sudoapt là không đúng.
  • Khi chạy nhiều lệnh, bạn cần đặt toàn bộ lệnh trong dấu ngoặc kép hoặc tách chúng bằng dấu chấm phẩy.
  • Khởi chạy các ứng dụng GUI bằng sudo có thể làm hỏng các tệp cấu hình, vì vậy thường nên tránh (ví dụ, sudo gedit).

3. Tệp sudoers và Kiểm soát Truy cập

Tệp sudoers là gì?

Tệp cấu hình điều khiển hành vi của lệnh sudo/etc/sudoers. Tệp này xác định ai có thể chạy lệnh nào bằng sudo.

Ví dụ, nó cho phép kiểm soát truy cập chi tiết như cho phép một người dùng chỉ chạy một số lệnh nhất định bằng sudo.
Sự linh hoạt này cho phép tuân thủ nguyên tắc tối thiểu quyền, chỉ cấp cho người dùng những quyền tối thiểu họ cần.

Chỉnh sửa an toàn với lệnh visudo

Bạn không bao giờ nên chỉnh sửa /etc/sudoers trực tiếp bằng trình soạn thảo văn bản.

Một lỗi cú pháp trong tệp này có thể vô hiệu hoá sudo hoàn toàn, khiến việc khôi phục hệ thống trở nên khó khăn. Vì lý do này, bạn nên chỉnh sửa nó bằng lệnh visudo.

sudo visudo

visudo thực hiện kiểm tra cú pháp trước khi lưu, cho phép thay đổi cấu hình một cách an toàn.

Cú pháp cơ bản và các ví dụ cấu hình

Cú pháp cơ bản của tệp sudoers như sau:

username hostname = (run-as user) allowed commands

Ví dụ:

alice ALL=(ALL:ALL) ALL

Cấu hình này cho phép người dùng alice chạy mọi lệnh dưới quyền bất kỳ người dùng nào trên mọi máy chủ.

Một ví dụ hạn chế hơn:

bob ALL=(ALL) /usr/bin/systemctl restart nginx

Điều này cho phép người dùng bob chỉ chạy lệnh khởi động lại nginx bằng sudo.

Kiểm soát dựa trên nhóm: Nhóm sudo

Trên nhiều bản phân phối như Ubuntu, người dùng thuộc nhóm sudo được phép sử dụng sudo.

%sudo ALL=(ALL:ALL) ALL

Sử dụng %sudo cho phép quản lý quyền dựa trên nhóm.

Để thêm người dùng vào nhóm sudo:

sudo usermod -aG sudo username

Tùy chọn NOPASSWD và các cân nhắc bảo mật

Nếu việc nhập mật khẩu mỗi lần là bất tiện, bạn có thể dùng tùy chọn NOPASSWD để bỏ qua xác thực mật khẩu.

alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

Điều này cho phép alice khởi động lại nginx mà không cần nhập mật khẩu.

Tuy nhiên, điều này làm tăng rủi ro bảo mật, vì vậy rất quan trọng để giới hạn việc sử dụng chỉ cho các lệnh cụ thể. Không nên sử dụng NOPASSWD với ALL.

4. Sử dụng sudo nâng cao

Chạy lệnh dưới quyền người dùng cụ thể

Mặc dù sudo thường chạy lệnh dưới quyền root, nó cũng có thể thực thi lệnh dưới quyền người dùng khác.

Ví dụ, để chạy một lệnh dưới quyền người dùng www-data:

sudo -u www-data whoami

Kết quả sẽ là www-data.

Điều này hữu ích để xác minh quyền và sự khác biệt môi trường giữa các người dùng.

Sử dụng sudo với chuyển hướng và pipe

Một điểm gây nhầm lẫn phổ biến cho người mới là kết hợp sudo với chuyển hướng (>) hoặc pipe (|).

Lệnh sau trông có vẻ đúng nhưng không hoạt động như mong đợi:

.

sudo echo "test" > /etc/test.conf

Trong khi echo chạy với sudo, việc chuyển hướng được xử lý bởi shell như một người dùng bình thường.

Cách tiếp cận đúng là sử dụng tee:

echo "test" | sudo tee /etc/test.conf

Sử dụng sudo trong Script

Khi script yêu cầu quyền quản trị, chỉ thêm sudo vào các lệnh cần thiết.

Ví dụ (install.sh):

#!/bin/bash

echo "Installing package..."
sudo apt install -y nginx

Một mẫu phổ biến khác là kiểm tra xem script có được chạy dưới quyền root hay không:

if [ "$EUID" -ne 0 ]; then
  echo "This script must be run as root"
  exit 1
fi

Các phím tắt hữu ích của sudo

  • sudo !! Chạy lại lệnh trước đó với sudo.
    apt update
    sudo !!
    
  • sudo -k Xóa bộ nhớ đệm thông tin xác thực sudo.
  • sudo -v Gia hạn phiên sudo hiện tại.

5. Bảo mật và Thực hành tốt

Tuân thủ Nguyên tắc Quyền tối thiểu

Mục tiêu chính của việc sử dụng sudo là vận hành hệ thống với các quyền tối thiểu cần thiết.

  • Chỉ cho phép các lệnh cụ thể qua sudo
  • Hạn chế việc sử dụng NOPASSWD
  • Quản lý các quản trị viên thông qua các nhóm

Ghi nhật ký và Kiểm toán

sudo ghi lại tất cả các lệnh đã thực thi.

  • /var/log/auth.log (Ubuntu/Debian)
  • journalctl (hệ thống dựa trên systemd)
    grep 'sudo' /var/log/auth.log
    
    journalctl _COMM=sudo
    

Lỗ hổng sudo trong thực tế (CVE-2021-3156)

Mặc dù sudo rất đáng tin cậy, nhưng đã có những lỗ hổng nghiêm trọng được phát hiện trong quá khứ.

Một ví dụ đáng chú ý là CVE-2021-3156 (Baron Samedit), cho phép người dùng cục bộ có được quyền root trong một số điều kiện nhất định.

  • Giữ sudo luôn được cập nhật
  • Theo dõi các thông báo bảo mật

Thay thế sudo: doas

Một số môi trường tập trung vào bảo mật sử dụng doas như một lựa chọn thay thế đơn giản hơn cho sudo.

doas apt update

Ví dụ cấu hình:

permit nopass :wheel

6. Các lỗi thường gặp và Khắc phục

Người dùng không có trong tệp sudoers

username is not in the sudoers file. This incident will be reported.

Điều này có nghĩa là người dùng không có quyền sudo.

sudo usermod -aG sudo username

Từ chối quyền với chuyển hướng

echo "test" | sudo tee /etc/test.conf

Tệp sudoers bị hỏng

pkexec visudo

sudo: không tìm thấy lệnh

apt update
apt install sudo

7. Câu hỏi thường gặp

Câu 1. Sự khác nhau giữa sudo và su là gì?

A: sudo nâng quyền các lệnh riêng lẻ, trong khi su chuyển đổi toàn bộ người dùng.

Câu 2. Mật khẩu root có cần thiết cho sudo không?

A: Không. Bạn nhập mật khẩu người dùng của mình.

Câu 3. Các nhật ký sudo được lưu ở đâu?

  • /var/log/auth.log
  • /var/log/secure
  • journalctl _COMM=sudo

Câu 4. Tôi đã làm hỏng tệp sudoers. Tôi nên làm gì?

Sử dụng chế độ khôi phục hoặc pkexec visudo.

Câu 5. Tôi có thể có quyền root mà không dùng sudo không?

Có, nhưng không được khuyến nghị.

Câu 6. Có an toàn khi chạy các ứng dụng GUI với sudo không?

Không. Hãy dùng pkexec thay thế.

8. Tóm tắt

Hiểu đúng sudo

sudo là một cơ chế kiểm soát truy cập quan trọng, không chỉ là một lệnh tiện lợi.

Sử dụng đúng ngăn ngừa vấn đề

  • Sử dụng quyền tối thiểu
  • Chỉnh sửa bằng visudo
  • Xem lại nhật ký

Chọn phong cách vận hành phù hợp

Chọn các công cụ như sudo hoặc doas dựa trên chính sách bảo mật của bạn.

Lưu ý cuối cùng

Hiểu sudo là một bước nền tảng để thành thạo quản trị hệ thống Linux.

年収訴求