UID là số nhận dạng duy nhất được gán cho mọi người dùng có trong hệ thống Linux. Nó được sử dụng để quản lý tài nguyên mà người dùng có quyền truy cập trong hệ thống.
File /etc/passwd chứa tất cả các thuộc tính cần thiết hoặc thông tin cơ bản về mọi người dùng trong hệ thống. Dữ liệu được hiển thị trong 7 cột, như được liệt kê dưới đây. Các trường này được phân tách bằng dấu hai chấm (:). File này cũng chứa các tài khoản và nhóm do hệ thống xác định cần thiết để cài đặt, chạy và cập nhật hệ thống thích hợp.
Hệ điều hành Linux dành 500 UID đầu tiên cho người dùng hệ thống. Những người dùng khác thêm bằng lệnh useradd
được gán UID từ 500 trở đi. Trong các hệ thống Ubuntu và Fedora, một người dùng mới, hay thậm chí một người dùng được tạo trong quá trình cài đặt, được cấp UID từ 1000 trở lên. Ví dụ:
(Hình 1: Bảng thông tin user)
Mặt khác, nếu có hai người dùng được liệt kê với cùng một UID, thì cả hai đều có thể có quyền truy cập vào tài nguyên dành cho người kia.Ví dụ:
Dùng root vào /etc/passwd chỉnh sửa số UID của user gau thành 0 (tức bằng root) rồi lưu lại. Lúc này user gau tự động được nâng lên quyền root
(Hình 2: Thay đổi UID của user bằng 0. User này sẽ có quyền root)
Trên các hệ điều hành tương tự UNIX có chia ra nhiều user để nhiều người dùng chung một máy tính, người dùng có mã định danh người dùng (UID - User Identifier) bằng 0 sẽ là siêu người dùng, bất kể tên tài khoản đó là gì. Trong đó, mọi máy tính luôn có user root
– user (UID = 0) có quyền năng tối thượng, thường được gọi là quyền admin hay superuser, có thể thực hiện bất kỳ thay đổi gì trên máy tính, chẳng hạn như thay đổi các quyền sở hữu tệp (ownership) và gán các port dưới 1024 (Well-known Port Number - IANA). Do có quyền năng vô hạn như vậy, nên khi thực hiện việc gì cũng ẩn chứa nguy hiểm, một câu lệnh gõ nhầm cũng có thể phá huỷ hệ thống, và nếu như ai cũng là root thì hệ thống sẽ loạn, người dùng không hiểu biết có thể cài đặt các loại virus/malware lên máy tính. Vì vậy, thường sẽ dùng tài khoản user bình thường.
Lệnh su (switch user) hiểu đơn giản là một công cụ để chuyển đổi người dùng. Với su, ta có thể chuyển đổi bất kể user nào, chỉ cần sử dụng su - username và nhập mật khẩu của user đó vào, riêng root (và những user được trao quyền) thì không cần nhập mật khẩu khi chuyển sang user khác. Ví dụ:
(Hình 3: Chuyển từ user root xuống user thường không cần mật khẩu của user thường)
(Hình 4: meo là một tài khoản được trao quyền su không cần mật khẩu. Nên meo có quyền chuyển mọi user không cần mật khẩu su
(Hình5: Nếu su mà không chỉ rõ user nào thì nó sẽ mặc định là root)
Thực tế, nếu chúng ta đăng nhập với tư cách là một người dùng bình thường, nhưng để chạy các tác vụ cho user, chúng ta không có đủ thẩm quyền và quyền này chính xác thuộc sở hữu của root. Có 2 giải pháp:
Dùng cách thứ hai su rõ ràng tiện hơn. Nhưng lưu ý là người dùng bình thường cần xác thực mật khẩu để thực hiện chuyển đổi sang bất kỳ user nào khác. Tức khi su đến root cần phải biết mật khẩu root. Có hai loại cách dùng su là:
su username: chuyển đổi user, thư mục làm việc của user ban đầu và các thư mục biến môi trường khác không thay đổi.
(Hình 6: Su theo cách su username)
su - username sau khi chuyển đổi user, cũng đồng thời chuyển sang môi trường làm việc của user mới. Ví dụ:
(Hình 7: su theo cách su – username)
Lúc này nảy sinh một vấn đề, nếu user thường muốn thực hiện các lệnh chỉ root thực hiện được. Thì phải nhập mật khẩu. Như vậy rất bất tiện cho người nắm giữ root pass. Để giải quyết bài toán này ta dùng sudo.
Nói đến sudo ta phải nói đến file mà lệnh này phụ thuộc vào đó là sudoers.
Sudoers là một file văn bản có đường dẫn là “/etc/sudoers”. Chỉ có root mới được quyền đọc file này.
(Hình 8: Đường dẫn của sudoers và quyền của nó)
File này kiểm soát đến các cấp sâu nhất trong hệ thống quyền. Nó quy định việc cho phép hoặc từ chối người dùng có được quyền truy cập superuser (root) và cách sudo hoạt động.
Khi cài đặt Linux (hoặc hệ unix) lần đầu, user đầu tiên root (UID = 0) mặc định được tự động thêm vào file sudoers để root có thể chạy các tác vụ quản trị bằng lệnh sudo. Tuy nhiên, nếu tạo một tài khoản người dùng mới, nó sẽ không có quyền root theo mặc định (dĩ nhiên). Nếu cần cấp cho nó các quyền mà root có, ta cần chỉnh sửa file sudoers và thêm tài khoản người dùng này vào nó (đọc kỹ phần dưới).
(Hình 9: Nội dung file sudoers)
Như ta thấy ở file trên. Nó yêu cầu file này chỉ được chỉnh sửa bởi root bằng visudo. Không nên thêm nội dung vào file này. Nếu muốn có thể thêm vào file: /etc/sudoers.d/
Mọi file sudoers sẽ có dòng sau:
root ALL=(ALL:ALL) ALL
root
ALL=(ALL:ALL) ALL
root ALL=(
ALL:ALL) ALL
root ALL=(ALL:
ALL) ALL
root ALL=(ALL:ALL)
ALLNếu muốn thêm người dùng khác làm root, chỉ cần sao chép dòng root và thay đổi người dùng như sau:
ALL=(ALL:ALL) ALL
Để kiểm soát nhiều hơn, chúng ta có thể thêm một dòng như sau, dòng này sẽ chỉ cho phép người dùng “meo” chạy apt-get update.
meo ALL=(ALL:ALL) /usr/bin/apt-get update
Đặt “%” sẽ xác định một nhóm. Dòng dưới đây sẽ cho phép mọi người dùng trong nhóm "admin" có quyền root. Đây sẽ là nhóm được xác định bởi các nhóm quyền hệ điều hành.
%admin ALL=(ALL:ALL) ALL
(Hình 10: Xem file sudoers bằng user thường. Bị hạn chế quyền)
(Hình 11: Xem file sudoers.d bằng user thường)
Lệnh sudo (superuser do) là một cơ chế quản lý quyền, phụ thuộc vào /etc/sudoers. Nó xác định người dùng nào được phép thực hiện loại lệnh quản lý nào. Hay nói đơn giản hơn nó giúp root trao quyền và user được phép leo thang quyền.
Theo mặc định, chỉ người dùng root mới có thể thực thi lệnh sudo. Người dùng root cần chỉnh sửa file cấu hình sudo /etc/sudoers. bằng cách sử dụng lệnh visudo để cho phép những người dùng bình thường khác thực thi lệnh sudo. Có thể gán cụ thể user đó được phép thực hiện quyền gì của root (đơn giản là thực hiện lệnh gì của root)
Sudo chạy như sau:
1) Khi người dùng chạy sudo, hệ thống sẽ tìm trong file /etc/sudoers và /etc/sudoers.d để xem người dùng có quyền chạy sudo hay không.
2) Nếu người dùng có quyền chạy sudo, thì việc tiếp theo cần làm là nhập mật khẩu của chính user đó.
Phần trên là lý thuyết, nhưng chẳng có gì xảy ra nếu linux không có quá nhiều distro. Và mỗi distro lại có cơ chế khác nhau. Vì vậy, phần lý thuyết trên là đúng nhưng trong một số trường hợp sẽ khiến người dùng bối rối. Hiện thực có rất rất nhiều người dùng khi họ muốn thực hiện lệnh mà chỉ có root mới được dùng. Có hai cách là:
Cách đầu tiên:
Thật sự là nguy hiểm. Một trong những điều tối ưu nhất của linux là có một cơ chế phân quyền rõ ràng và root là user quan trọng nhất (rõ ràng). Để đảm bảo được sự an toàn của hệ thống root càng ít được dùng càng tốt. Khi người quản trị cần họ dùng sudo.
Cách thứ 2:
Dùng sudo. Nhưng liệu họ có hiểu được trọn vẹn sudo là gì không. Hay phổ biến nhất khi cài một gói không được. Thì họ cứ sudo là được. Vậy liệu có hiểu được tại sao user đó có thể dùng sudo còn user khác thì không. Có một đoạn hội thoại như thế này:
Bỏ qua vấn đề pip (mặc định họ hiểu). Đó là những câu hỏi và trả lời thường xuất hiện, khi người ta nói về pip. Đây là vấn đề chung với những người dùng không hiểu về phân quyền trên hệ tương tự UNIX và thường sẽ làm mọi thứ trở nên rắc rối thêm bằng cách chạy sudo.
Sau đây người viết sẽ lấy ví dụ cụ thể trên distro Unbuntu (GUI)
Khi khởi tạo một hệ thống dùng Unbuntu (GUI). Nó sẽ yêu cầu tạo một user. Ở đây người viết đặt là “meo”.
(Hình 12: Xem những thông tin đi kèm với user meo)
Ta sẽ xem cụ thể meo đang trong group nào. Xem file /etc/gshadow nơi chứa thông tin mật khẩu của groups. Khi khởi tạo một user bất kì, cũng có một group được tạo ra với số gid bằng với số uid. Các thông tin được ngăn cách nhay bởi dấu :
(Hình 13: Nội dung file /etc/gshadow)
Cái mà chúng ta quan tâm là tại group sudo, user meo đã được ubuntu mặc định thêm vào. Mà group sudo lại được file sudoers mặc định tự thêm vào.
(Hình 14: Nội dung file sudoers, group sudo đã được mặc định thêm vào)
Nên đối với unbuntu (GUI), user khởi tạo đầu tiên khi cài đặt luôn có quyền sudo. Các user khác được tạo sau sẽ không thể sudo. Nếu muốn thì có thể add user đó vào group sudo.
Nó lý giải việc tại sao user tạo đầu tiên có thể đặt pass cho root với lệnh
(Hình 15: Đặt pass cho root bằng user thường)
Tại sao Ubuntu không yêu cầu đặt trực tiếp tài khoản root như distro centos7 hoặc các distro khác. Câu trả lời là:
Đối tượng sử dụng Ubuntu có thể chia làm 2:
(Hình 16: Tạo user thứ 2 và chi tiết các group user này được thêm vào)
Bên trên là tạo một user mới bằng user meo với quyền sudo. Và meo được trao quyền để su mà ko cần biết mật khẩu của chit. Chit cũng không được tự động add vào group sudo.
(Hình 17: Thông báo khi user chit cố tình dùng quyền sudo trái phép)
Như vậy, chit không có quyền sudo. Muốn thực hiện thì phải add vào sudoers hoặc thêm chit vào group sudo.
Nó lại phát sinh một câu hỏi, liệu có thể giới hạn user có quyền sudo cụ thể nào không. Vì đâu thể trao toàn quyền. Câu trả lời là được và các bạn tự tìm hiểu thêm do phạm vi bài này chỉ giới hạn đến đây.
Trường hợp nếu một user thường không có quyền sudo. Họ chỉ muốn tác động đến các thư mục của họ thôi. Ví dụ như chỉ cần cài đặt một gói lên chính $HOME của họ, mà không cần tác động lên toàn bộ hệ thống. Họ phải làm cách nào? Câu trả lời là Virtual Environment. Đây là một phần mềm viết bằng Python. Giúp tạo các môi trường ảo.
» Tin mới nhất:
» Các tin khác: