Tóm tắt điều hành: "root" là tên thật của tài khoản quản trị viên. "sudo" là một lệnh cho phép người dùng thông thường thực hiện các tác vụ quản trị. "Sudo" không phải là người dùng.
Câu trả lời dài:
"root" (còn gọi là "superuser") là tên của tài khoản quản trị viên hệ thống. Nguồn gốc của cái tên hơi cổ xưa, nhưng điều đó không thành vấn đề.
Người dùng root có id người dùng 0 và trên danh nghĩa có đặc quyền không giới hạn. Root có thể truy cập bất kỳ tệp nào, chạy bất kỳ chương trình nào, thực hiện bất kỳ cuộc gọi hệ thống nào và sửa đổi bất kỳ cài đặt nào. (Nhưng xem bên dưới¹).
Trước khi phát minh ra lệnh "sudo", nếu bạn muốn thực hiện các tác vụ quản trị, bạn phải đăng nhập bằng root, bằng cách nào đó nhận được dấu nhắc đăng nhập bằng cách nào đó hoặc bằng su
lệnh ("su" viết tắt cho người dùng thay thế.))
Đó là một chút rắc rối và cũng không cho phép bạn cung cấp cho người dùng quyền quản trị một phần. Vì vậy, lệnh "sudo" (viết tắt của "người dùng thay thế") đã được phát minh.
Lệnh "sudo" cho phép bạn thực thi các lệnh với đặc quyền siêu người dùng miễn là id người dùng của bạn nằm trong tệp sudoers, cung cấp cho bạn ủy quyền cần thiết.
Vì vậy, ví dụ sudo vi /etc/hosts
sẽ cho phép bạn chỉnh sửa tệp máy chủ như thể bạn đang chạy bằng root. Bạn thậm chí không cần mật khẩu root, chỉ cần mật khẩu đăng nhập của riêng bạn.
Và tất nhiên, sudo su
sẽ cho phép bạn đơn giản trở thành root. Kết quả giống như khi bạn đã đăng nhập bằng root hoặc thực thi su
lệnh, ngoại trừ việc bạn không cần biết mật khẩu gốc nhưng bạn cần phải có trong tệp sudoers.
Tệp sudoers xác định ai có thể sử dụng lệnh sudo và họ có thể làm gì với nó.
Tệp sudoers là thứ cung cấp cho bạn nhiều quản trị viên⁴. Thực tế, quản trị viên của bạn đã root, cộng với tất cả mọi người được liệt kê trong tệp sudoers. Không có tệp sudoers, quản trị viên duy nhất là root.
Trên thực tế, trong các tổ chức nơi người khác quản lý máy tính của bạn cho bạn, việc bạn không biết mật khẩu gốc của máy tính của mình là điều khá phổ biến - miễn là bạn đang ở trong tệp sudoers, điều đó không thành vấn đề.
Tại một công ty tôi làm việc, với một trang trại máy chủ ginormous, chỉ có một số rất rất ít người biết mật khẩu gốc. Thay vào đó, có một cơ sở dữ liệu về những người được phép làm việc trên máy chủ nào. Một quy trình tự động sẽ thêm bạn vào các tệp sudoers của những máy chủ mà bạn được ủy quyền truy cập và xóa bạn khi ủy quyền của bạn hết hạn.
Một điều nữa: các phiên bản Unix hiện đại giờ đây có thể hạn chế ngay cả những gì người dùng root có thể làm.
Trong SELinux (Linux được tăng cường bảo mật), thực sự có một danh sách kiểm soát truy cập để xác định chương trình nào có thể làm gì và thậm chí root không thể vượt qua những hạn chế đó.
Trong hệ thống Bảo vệ toàn vẹn hệ thống (SIP) của Apple (còn gọi là "rootless"), một số tệp và thư mục nhất định bị khóa để chỉ các ứng dụng trong danh sách trắng thích hợp mới có thể truy cập chúng.
Các hệ thống này tồn tại để bảo vệ một hệ thống khỏi trường hợp người dùng độc hại quản lý để có quyền truy cập root. (Hoặc trong một số trường hợp, để ngăn người dùng bẻ khóa các thiết bị nhúng của họ.) Vì những lý do rõ ràng, rất khó để vượt qua những hạn chế này, ngay cả với quyền truy cập root.
² Dấu nhắc "đăng nhập:" là một phần cổ xưa khác của lịch sử Unix, có từ khi tất cả chúng ta sử dụng các thiết bị đầu cuối ascii trên các dòng nối tiếp, thay vì các hệ thống cửa sổ. Bạn vẫn có thể nhận được lời nhắc "đăng nhập:" bằng cách nhập login
bất kỳ cửa sổ đầu cuối nào hoặc bằng cách mở kết nối ssh (hoặc telnet hoặc rsh) với máy tính của bạn từ nơi khác. Bạn có thể đăng nhập như một người dùng khác từ đó nếu bạn muốn. (Và nếu máy tính của bạn có cổng nối tiếp, bạn vẫn có thể định cấu hình để cho phép đăng nhập vào chúng.)
Cũng có thể các chương trình riêng lẻ được cấp quyền truy cập root. Các chương trình này có thể làm bất cứ điều gì mà người dùng có quyền truy cập root có thể làm, ngay cả khi được chạy bởi người dùng thông thường. Chúng thường được giới hạn trong các nhiệm vụ cụ thể. Ví dụ, chương trình crontab có quyền root để nó có thể chỉnh sửa các bảng cron. Rõ ràng, "sudo" có quyền root để nó có thể làm những gì nó làm.
Tôi sẽ đề cập đến một điểm nữa mà tôi đã nhấn mạnh trước đó. Tôi đã sử dụng "quản trị viên" và "root" thay thế cho nhau, nhưng có những loại quản trị viên khác. Chúng thường được gọi là "tài khoản vai trò", nghĩa là những tài khoản này không thuộc về con người thực tế, mà thay vào đó tồn tại để thực hiện một số vai trò cụ thể trên hệ thống. Nếu bạn xem /etc/passwd
tệp trên hệ thống của mình, bạn sẽ tìm thấy hàng chục và hàng chục tài khoản như vậy.
Ví dụ: nếu mysql được cài đặt trên hệ thống của bạn, sẽ có người dùng "mysql" và tất cả các tệp cơ sở dữ liệu, tệp cấu hình, v.v ... tất cả sẽ thuộc quyền sở hữu của người dùng đó. Chỉ người dùng đó mới có quyền cần thiết để truy cập các tệp và chạy máy chủ mysql. Theo một nghĩa nào đó, người dùng đó sẽ là một tài khoản quản trị viên, nhưng chỉ dành cho mysql.
Nếu bạn cần thực hiện các tác vụ quản trị cơ sở dữ liệu, bạn sẽ trở thành "mysql" bằng su mysql
lệnh hoặc sử dụng sudo
nơi tệp sudoers cung cấp cho bạn đặc quyền mysql cho các lệnh cụ thể đó.