Bạn có tự hỏi làm thế nào Linux quản lý hiệu quả một môi trường nhiều người dùng? Trong bài viết này, Quantrimang.com sẽ giải thích cách Linux lưu trữ và quản lý mật khẩu cũng như thông tin đăng nhập của 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 sẽ kiểm tra mật khẩu đã nhập đối với mục nhập ở một số file trong thư mục “/etc”.
Các file /etc/passwd là một trong những file quan trọng nhất lưu trữ thông tin người dùng.
Mục gần nhất trong file này tương ứng với người dùng “carbon”. Có nhiều trường thông tin được phân tách bằng dấu hai chấm.
carbon
: Tên của người dùng mà mục này tương ứng với.x
: Chỉ ra rằng mật khẩu tồn tại cho người dùng. Tuy nhiên, mật khẩu được lưu trữ trong file “/etc/shadow”. Nếu thay vì x nó hiển thị biểu tượng !, điều này chỉ ra rằng mật khẩu không tồn tại.1000
: User ID của người dùng này.1000
: Group ID của nhóm chứa người dùng này.carbon, , ,
: Biểu thị nhiều trường thông tin bao gồm tên đầy đủ và số điện thoại. Ở đây, không có số điện thoại được cung cấp./home/carbon
: Vị trí của thư mục chính được gán cho người dùng này./bin/bash
: Shell mặc định được gán cho người dùng này.
Hãy tạo một người dùng khác cho số điện thoại đã được lưu trữ. Người dùng “pluto” được thêm vào hệ thống bằng lệnh adduser
.
Hãy nhìn lại file etc/passwd, một lần nữa, ta có thể xem thông tin đầy đủ cho người dùng “pluto”.
Bất cứ khi nào người dùng được tạo, các giá trị của thư mục chính và shell mặc định sẽ được chỉ định trong file /etc/adduser.conf.
User ID cho người dùng đã tạo bắt đầu từ 1000 và chạy lên tới 59999.
Người dùng “carbon” có thể xem các mục trong file /etc/passwd chỉ bằng cách sử dụng lệnh cat
.
Chỉ người dùng root có thể ghi vào file. Những người dùng khác chỉ có thể đọc file. Vì mọi người đều có thể đọc được file này, nên việc lưu trữ mật khẩu ở đây là không lý tưởng. Thay vào đó, mật khẩu được lưu trữ trong một file khác có tên là “/etc/shadow”.
Khám phá file /etc/shadow
Bây giờ, hãy thử xem mật khẩu được lưu trữ cho người dùng “carbon” và “pluto” trong file ”/etc/shadow”.
Nhìn vào các quyền đối với file ”/etc/shadow”, ta có thể thấy rằng chỉ người dùng root mới có thể đọc và ghi vào file. Ngoài ra, chỉ có các thành viên của nhóm “shadow” có thể đọc file. Trong thực tế, nhóm “shadow” trống nhưng được yêu cầu về mặt cú pháp cho file này.
Đăng nhập với tư cách root, ta có thể xem 10 dòng gần nhất của “/etc/shadow”. Mỗi mục trong “/etc/passwd” đều có một mục tương ứng trong file này. Định dạng sẽ như sau:
pluto:$6$JvWfZ9u....:18283:0:99999:7:::
Trong file này cũng vậy, mọi mục nhập có nhiều trường được phân tách bằng dấu hai chấm:
pluto
: Tên của người dùng mà mục này tương ứng với.$6$JvWfZ9u.$yGFIqOJ....
: Mật khẩu người dùng hash được lưu trữ cùng với thông tin về thuật toán hash được sử dụng. Ngoài ra, một giá trị salt được sử dụng cùng với mật khẩu plaintext để tạo ra hash password.
{ plaintext password, salt} -> hashed password
Ký hiệu $
được sử dụng để phân tách 3 trường.
$6 $JvWfZ9u. $yGFIqOJ....
$6
: Thuật toán hash được sử dụng. Dưới đây là danh sách các thuật toán hash tiềm năng.$1
: MD5$2a
: Blowfish$2y
: Eksblowfish$5
: SHA-256$6
: SHA-512
$JvWfZ9u.
: Giá trị salt.$yGFIqOJ....
: Password được hash.
Giá trị hash kết quả được lưu trữ dưới dạng mật khẩu được mã hóa cho người dùng. Giá trị salt là duy nhất cho mỗi người dùng. Ngay cả khi hai người dùng có cùng mật khẩu plaintext, sử dụng một salt duy nhất sẽ tạo ra một giá trị hash duy nhất.
Sau đây là các trường còn lại trong mục này,
18283
: Cho biết số ngày kể từ ngày 1 tháng 1 năm 1970, mật khẩu được thay đổi lần cuối0
: Trường này được sử dụng để chỉ ra số ngày sau đó mật khẩu có thể được thay đổi. Giá trị 0 nghĩa là mật khẩu có thể được thay đổi bất cứ lúc nào.99999
: Trường này cho biết số ngày sau đó mật khẩu phải được thay đổi. Giá trị 99999 cho biết người dùng có thể giữ lại mật khẩu bao lâu tùy ý.7
: Nếu mật khẩu được đặt hết hạn, các trường này cho biết số ngày để cảnh báo người dùng về việc hết hạn mật khẩu.:::
: Ba trường nữa cũng là một phần của mục này, mặc dù ở đây chúng trống. Số đầu tiên cho biết số ngày đợi sau khi hết hạn mật khẩu, sau đó tài khoản sẽ bị vô hiệu hóa. Số thứ hai cho biết số ngày kể từ ngày 1 tháng 1 năm 1970, tài khoản đã bị vô hiệu hóa. Trường thứ ba được dành riêng để sử dụng trong tương lai. Các trường trống cho biết mật khẩu hiện tại của người dùng này chưa hết hạn và không bị thiết lập để sớm hết hạn.
7 trường cuối cùng liên quan đến tính hợp lệ của mật khẩu, được gọi chung là nắm giữ thông tin về “Password Aging Policy”.
Các giá trị mặc định tương ứng với “Password Aging Policy" được chỉ định trong file “/etc/login.defs”. Những giá trị này có thể được thay đổi cho người dùng bằng lệnh change
.
Còn thông tin nhóm thì sao?
Thông tin người dùng và mật khẩu được lưu trữ trong các file “/etc/passwd” và “/etc/shadow”. Tương tự như vậy, thông tin nhóm được lưu trữ trong file “/etc/group”.
Highlight ở trên là các nhóm thuộc về người dùng “carbon” và “pluto”. Khi một người dùng được tạo trong Linux, người dùng đó ngay lập tức được gán cho một nhóm có cùng tên với tên người dùng.
Các thành viên của một nhóm cũng có thể chia sẻ mật khẩu nhóm cho những hoạt động liên quan đến nhóm đó. Giá trị của x chỉ ra rằng thông tin mật khẩu của nhóm đó sẽ nằm trong file “/etc/gshadow”.
Tuy nhiên, quyền truy cập vào “/etc/gshadow” bị hạn chế đối với người dùng root.
Người dùng root có thể xem các mục của “/etc/gshadow”, tương tự với “/etc/shadow”. Nhìn vào mục nhập của nhóm “carbon”, chúng ta có thể thấy rằng trường thứ hai có giá trị là !, cho biết mật khẩu không tồn tại cho nhóm này.
Khi người dùng muốn đăng nhập, hash của mật khẩu đã nhập được tìm thấy bằng cách sử dụng giá trị salt của người dùng đó trong “/etc/shadow”. Sau đó, nó được so sánh với hash được lưu trữ. Nếu các giá trị khớp, người dùng được cấp quyền truy cập.