Bạn có thắc mắc Linux quản lý môi trường đa người dùng hiệu quả như thế nào? Trong bài này chúng tôi giải thích cách Linux lưu trữ và quản lý mật khẩu và đăng nhập người dùng.
Khám phá file /etc/passwd
Khi người dùng nhập tên người dùng và mật khẩu, Linux kiểm tra mật khẩu nhập vào so với một mục trong vài file trong thư mục "/etc".
File "/etc/passwd" là một trong những file quan trọng nhất lưu chi tiết người dùng.

Mục cuối cùng trong file này tương ứng với người dùng "carbon". Có nhiều trường thông tin phân cách bằng dấu hai chấm (:).
carbon: tên người dùng cho mục này.x: chỉ ra mật khẩu tồn tại cho người dùng. Tuy nhiên, mật khẩu lưu trong file "/etc/shadow". Nếu thay vìxnó hiển thị ký hiệu!, điều này chỉ ra không có mật khẩu.1000: User ID của người dùng này.1000: Group ID của nhóm người dùng này thuộc về.carbon, , ,: chỉ ra nhiều trường thông tin bao gồm họ tên và số điện thoại. Ở đây, không có số điện thoại./home/carbon: vị trí thư mục home gán cho người dùng này./bin/bash: shell mặc định gán cho người dùng này.
Hãy tạo người dùng khác có số điện thoại lưu trữ. Người dùng "pluto" được thêm vào hệ thống dùng lệnh adduser.

Xem file "etc/passwd" lại, ta thấy thông tin hoàn chỉnh cho "pluto". Trường có danh sách phân cách dấu phẩy họ tên và số gọi là "GECOS field".

Khi người dùng được tạo, giá trị thư mục home và shell mặc định cần gán được chỉ định trong file "/etc/adduser.conf".

User ID cho người dùng tạo bắt đầu từ 1000 đến 59999.
Người dùng "carbon" xem mục "/etc/passwd" chỉ bằng lệnh cat. Hãy xem quyền của nó.

Chỉ "root" mới ghi được file. Người dùng khác chỉ đọc. Vì file này mọi người đọc được, không lý tưởng lưu mật khẩu ở đây. Thay vào đó lưu trong "/etc/shadow".
Khám phá file /etc/shadow
Bây giờ thử xem mật khẩu lưu cho "carbon" và "pluto" trong "/etc/shadow".

Xem quyền "/etc/shadow", chỉ "root" đọc/ghi được. Chỉ thành viên nhóm "shadow" đọc được. Thực tế nhóm "shadow" rỗng nhưng cần về mặt cú pháp.

Đăng nhập "root", xem 10 dòng cuối "/etc/shadow". Mỗi mục "/etc/passwd" có mục tương ứng. Định dạng như sau:
pluto:$6$JvWfZ9u....:18283:0:99999:7:::

File này cũng có nhiều trường phân cách bằng hai chấm (:). Hãy giải mã mục "pluto".
pluto: tên người dùng.$6$JvWfZ9u.$yGFIqOJ....: Mật khẩu đã hash của người dùng kèm thông tin thuật toán hash. Thêm vào đó, giá trị salt dùng cùng mật khẩu plaintext tạo hash mật khẩu.
{ plaintext password, salt } -> hashed password
Xử lý nội dung trường này. Ký hiệu $ dùng phân cách ba trường.
$6 $JvWfZ9u. $yGFIqOJ....
$6: thuật toán hash. Danh sách thuật toán:- $1 : MD5
- $2a : Blowfish
- $2y : Eksblowfish
- $5 : SHA-256
- $6 : SHA-512
$JvWfZ9u.: giá trị salt.$yGFIqOJ....: mật khẩu đã hash.
Giá trị hash kết quả lưu làm mật khẩu mã hóa cho người dùng. Giá trị salt duy nhất cho mỗi người dùng. Dù hai người dùng có cùng mật khẩu plaintext, salt duy nhất tạo hash duy nhất.
Tiếp tục các trường còn lại:
18283: Số ngày từ 1/1/1970 mật khẩu đổi lần cuối0: số ngày sau đó mới được đổi mật khẩu. 0 = đổi bất kỳ lúc99999: số ngày sau đó bắt buộc đổi mật khẩu. 99999 = giữ bao lâu tùy ý7: nếu mật khẩu hết hạn, trường này cảnh báo trước bao nhiêu ngày: : :Ba trường thêm, rỗng ở đây. Thứ nhất: ngày chờ sau hết hạn mới khóa tài khoản. Thứ hai: ngày từ 1/1/1970 tài khoản bị khóa. Thứ ba: dự trữ. Rỗng nghĩa mật khẩu chưa hết hạn.
Bảy trường cuối về hiệu lực mật khẩu gọi chung là "Password Aging Policy" (Chính sách tuổi mật khẩu).
Giá trị mặc định "Password Aging Policy" chỉ định trong "/etc/login.defs". Giá trị thay đổi cho người dùng bằng lệnh chage.

Thông tin nhóm (Group) thì sao?
Thông tin người dùng và mật khẩu lưu trong "/etc/passwd" và "/etc/shadow". Tương tự, thông tin nhóm lưu trong "/etc/group".

Được highlight là nhóm của "carbon" và "pluto". Khi tạo người dùng Linux, người dùng ngay lập tức gán vào nhóm trùng tên.
Thành viên nhóm có thể chia sẻ mật khẩu nhóm cho hoạt động nhóm. Giá trị x chỉ ra thông tin mật khẩu nhóm ở "/etc/gshadow".
Tuy nhiên, truy cập "/etc/gshadow" hạn chế cho "root".

Người dùng "root" xem mục "/etc/gshadow", tương tự "/etc/shadow". Xem mục nhóm "carbon", trường thứ hai giá trị !, chỉ ra không có mật khẩu cho nhóm này.

Tổng hợp
Khi người dùng muốn đăng nhập, hash của mật khẩu gõ tìm bằng salt của người dùng trong "/etc/shadow". Sau đó so sánh với hash lưu. Nếu khớp, cấp truy cập.
Liên quan:
- Cách đặt lại mật khẩu Root trong Linux
- Cách quản lý mật khẩu người dùng từ Terminal trong Linux