Lưu trữ mật khẩu trên linux

Nếu bạn là người quản trị hệ thống Linux thường xuyên thì việc login/logout vào hệ thống là điều mặc định hiển nhiên. Trên màn hình đăng nhập, Linux yêu cầu bạn nhập username/password, nếu bạn nhập chính xác thì bạn đăng nhập thành công vào hệ thống. Vậy điều gì đã xảy ra khi bạn nhập username/password, Linux xử lý dữ liệu đó như thế nào? mật khẩu người dùng lưu ở đâu? cơ chế xác thực như thế nào?

Trong bài viết này, tôi tập trung vào tìm hiểu cách linux lưu trữ mật khẩu người dùng.

Trong Linux, file /etc/passwd là file lưu thông tin user của hệ thống, khi bạn tạo một user mới thì linux sẽ add thêm 1 bản ghi mới vào file này. Bạn dùng lệnh để show quyền truy cập file này thì thấy file này có 1 đặc điểm là tất cả người dùng trong hệ thống đều có thể đọc được [‘r’].

[root@localhost ~]# ll /etc/passwd

-rw-r--r-- 1 root root 1373 Apr  1 13:50 /etc/passwd

Điều này khá nhạy cảm vì thông tin user sẽ bị phơi bày trước bất kỳ user nào trong hệ thống. Tuy nhiên thuộc tính ‘r’ là cần thiết vì một số ứng dụng và tool hệ thống cần đọc file này thì mới chạy chính xác. Giả sử, tôi thay đổi quyền truy cập file này để chỉ có ‘root’ mới có quyền đọc.

[root@localhost ~]# chmod 600 /etc/passwd

[root@localhost ~]# ll /etc/passwd

-rw------- 1 root root 1373 Apr  1 13:50 /etc/passwd

Bây giờ, điều gì sẽ xảy ra khi tôi chuyển sang một user thường có sẵn trên hệ thống:

root@localhost ~]# su - mario

id: cannot findname foruser ID 500

id: cannot findname foruser ID 500

[I have no name!@localhost ~]$

Oh, tôi không thể thay đổi chuyển sang tài khoản có tên là mario, bới vì nó sẽ không đọc được file /etc/passwd nên không thể lấy thông tin username, home directory..của mario được lưu trữ trong file /etc/passwd.
Nếu để password lưu trữ trong /etc/passwd thì cũng rất nguy hiểm, mặc dù có thể mã hóa mật khẩu bằng 1 thuật toán băm[Vì tất cả user trong hệ thống đều đọc được].

Vì vậy, cần lưu trữ password người dùng trong 1 file mà chỉ ‘root’ mới đọc được. Giải pháp mà Linux đưa ra là bổ xung 1 file tên là /etc/shadow để lưu trữ mật khẩu người dùng. File /etc/shadow này chỉ truy cập được bởi ‘root’.

[root@localhost ~]# ll /etc/shadow

-r-------- 1 root root 897 Apr  1 13:50 /etc/shadow

Bây giờ, thử xem nội dung file /etc/shadow

[root@localhost ~]# cat /etc/shadow

mario:$1$0XJ4dcSP$wpBqBzQSmIppMPEjeYP8K/:16161:0:99999:7:::

  1. 1. Trường đầu tiên, đó chính là username mario

2. Trường thứ 2 đó là trường password đã được mã hóa $1$0XJ4dcSP$wpBqBzQSmIppMPEjeYP8K/. Đây chính xác là trường tôi cần quan tâm và cần khai thác ở bài post này

Nội dung password đã được mã hóa $1$0XJ4dcSP$wpBqBzQSmIppMPEjeYP8K/ có ý nghĩa gì?

- Trường đầu tiên, cho biết thuật toán sử dụng để băm[trong ví dụ này là 1 – MD5 hashing algorithm]

 $1 = MD5 hashing algorithm.

 $2 = Blowfish Algorithm is in use.

 $2a = eksblowfish Algorithm

 $5 = SHA-256 Algorithm

 $6 = SHA-512 Algorithm

- Trường thứ 2 là một chuỗi dữ liệu ngẫu nhiên[random data hay còn gọi là salt] được sinh ra để kết hợp với mật khẩu người dùng[user password], để tăng sức mạnh băm[trong ví dụ này là 0XJ4dcSP]

- Trường thứ 3 là giá trị băm của salt + user password[trong ví dụ này là wpBqBzQSmIppMPEjeYP8K/]

Khi bạn login vào hệ thống, bạn nhập user/password. Hệ thống sẽ sử dụng giá trị salt của user + password mà bạn nhập vào để tạo ra 1 chuỗi mã hóa. Nếu chuỗi mã hóa này trùng với chuỗi mã hóa trong file /etc/shadow thì user login thành công.

Nguồn //securitydaily.net/

Đến với bài viết này mình sẽ hướng dẫn việc thay đổi thuật toán sử dụng cho hoạt động băm [hash] thông tin mật khẩu chứa trong file /etc/shadow.

Thuật toán mặc định được dùng để lưu trữ mật khẩu hash trong file /etc/shadow là MD5. Trong trường hợp, bạn muốn hệ thống sử dụng thuật toán băm khác mạnh hơn như SHA để bảo mật thông tin mật khẩu của bạn thì phải làm thế nào ?

Đầu tiên, bạn có thể kiểm tra thông tin mật khẩu bằng cách xem nội dung file /etc/shadow như sau :

# cat /etc/shadow | grep "root"
root:$1$yYOS3VC4$30Vb56f1ipYbRghK.JqM3/:16606:0:99999:7:::

 
Ở cột thứ 2 sau root: là đại diện cho các thông tin liên quan đến mật khẩu được hash.

Trường 1, cho biết thuật toán sử dụng để băm [trong ví dụ này là $1 , tương ứng thuật toán MD5 ‘MD5 hashing algorithm’]

$1 = MD5 hashing algorithm.
$2 = Blowfish Algorithm is in use.
$2a = eksblowfish Algorithm
$5 = SHA-256 Algorithm
$6 = SHA-512 Algorithm

 
Trường 2, là giá trị Salt được tạo ngẫu nhiên nhằm chống các cuộc tấn công Rainbow Table.
Trường 3, là mật khẩu đã được hash md5 + salt ra.

 
Hướng dẫn thay đổi thuật toán hash mật khẩu

Ta sẽ sử dụng chương trình lệnh “authconfig” để cấu hình hệ thống thay đổi thuật toán băm đối với việc lưu trữ mật khẩu đăng nhập.
Tất nhiên ngoài chương trình “authconfig” còn nhiều tiện ích khác, nhưng ở đây mình sẽ chỉ dùng cho mục tiêu của bài viết là thay đổi thuật toán hash mật khẩu.

Bước 1 :
– Kiểm tra thông tin thuật toán hiện được sử dụng.

# authconfig --test | grep hashing
password hashing algorithm is md5


Bước 2
:
– Ra lệnh cho hệ thống cập nhật thay đổi thuật toán hash mật khẩu.

# authconfig --passalgo=sha512 --update


Bước 3
:
– Các user phải thay đổi lại mật khẩu để có tác dụng với thuật toán hash vừa được cập nhật.

# passwd root
Changing password for user root.
New password: *****
Retype new password: *****
passwd: all authentication tokens updated successfully.


Bước 4
:
– Kiểm tra lại file /etc/shadow

# cat /etc/shadow | grep "root"
root:$6$UaWWalU8$4oXvMCo1DSakwxTvqlL0nal.gkESarUEAdZvQ9QqgeDupQ5cCqUQzhcwUW6oYcGpC6jT8UsBJYI.1J6ZTtv3Y/:16606:0:99999:7:::

 
Chúng ta đã thấy giá trị $1 được thay đổi thành $6 của SHA512. Như vậy chúng ta đã xong công việc.

 
Chúc các bạn thành công.

Bài Viết Liên Quan

Chủ Đề