5.1 Bài 1
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
5 Bảo mật và Quyền trong Tệp |
Mục tiêu: |
5.1 Bảo mật cơ bản và Xác định kiểu Người dùng |
Bài: |
1 trên 1 |
Giới thiệu
Bài học này sẽ tập trung vào thuật ngữ cơ bản về tài khoản, tính năng kiểm soát truy cập và cơ chế bảo mật của các hệ thống Linux cục bộ, các công cụ giao diện dòng lệnh (CLI) trên hệ thống Linux dùng trong kiểm soát truy cập bảo mật cơ bản và các tệp cơ bản để hỗ trợ tài khoản người dùng và nhóm, bao gồm cả các công cụ dùng để nâng cao đặc quyền cơ bản.
Bảo mật cơ bản trong các hệ thống Linux được mô phỏng theo các biện pháp kiểm soát truy cập của Unix; các biện pháp này mặc dù đã gần 50 năm tuổi nhưng vẫn khá hiệu quả so với một số hệ điều hành tiêu dùng phổ biến thuộc các dòng mới hơn hẳn. Ngay cả một số hệ điều hành dựa trên Unix phổ biến khác cũng có xu hướng “tự do thay đổi” để tập trung vào tính “dễ truy cập”, nhưng Linux thì lại không như vậy.
Các giao diện và môi trường máy tính để bàn Linux hiện đại đã đơn giản hóa việc tạo và quản lý người dùng và thường tự động hóa việc chỉ định tính năng kiểm soát truy cập khi người dùng đăng nhập — ví dụ: vào trình hiển thị, âm thanh và các dịch vụ khác — và hầu như không yêu cầu sự can thiệp thủ công của quản trị viên hệ thống. Tuy nhiên, điều quan trọng là ta phải hiểu được các khái niệm cơ bản của một hệ điều hành Linux cơ bản.
Tài khoản
Việc bảo mật liên quan đến nhiều khái niệm; một trong những khái niệm phổ biến nhất là khái niệm chung về tính năng kiểm soát truy cập. Trước khi có thể xử lý các khía cạnh của tính năng kiểm soát truy cập tệp như quyền sở hữu và cấp phép, ta phải hiểu về các khái niệm cơ bản về tài khoản người dùng Linux vốn được chia thành nhiều loại.
Mỗi người dùng trên hệ thống Linux đều có một tài khoản riêng; bên cạnh thông tin đăng nhập (như tên người dùng và mật khẩu), tài khoản này cũng xác định cách thức và vị trí mà người dùng có thể tương tác với hệ thống. Đặc quyền và tính năng kiểm soát truy cập sẽ xác định “ranh giới” mà mỗi người dùng có thể hoạt động trong phạm vi đó.
Mã định danh (UID/GID)
Mã định danh Người dùng và Nhóm (UID/GID) là các tham chiếu cơ bản được kê khai cho các tài khoản. Các triển khai ban đầu là các số nguyên 16 bit bị giới hạn (giá trị từ 0 đến 65535), nhưng các hệ thống của thế kỷ 21 đã hỗ trợ các UID và GID 64 bit. Người dùng và nhóm sẽ được kê khai độc lập; do đó, cùng một ID có thể đại diện cho cả người dùng và nhóm.
Mỗi người dùng không chỉ có một UID mà còn có một GID chính. GID chính của một người dùng có thể là duy nhất cho riêng người dùng đó và có thể sẽ không được sử dụng bởi bất kỳ người dùng nào khác. Tuy nhiên, nó cũng có thể là một nhóm được chia sẻ bởi nhiều người dùng. Ngoài các nhóm chính này, mỗi người dùng cũng có thể là thành viên của các nhóm khác nữa.
Theo mặc định trên các hệ thống Linux, mọi người dùng sẽ được chỉ định vào một nhóm có cùng tên với tên người dùng và có cùng GID với UID của họ. Ví dụ: ta sẽ tạo một người dùng mới có tên newuser
và theo mặc định, nhóm mặc định của nó cũng sẽ là newuser
.
Tài khoản Siêu Người dùng
Trên Linux, tài khoản siêu người dùng là root
(gốc); tài khoản này luôn có UID 0. Tài khoản siêu người dùng đôi khi còn được gọi là quản trị viên hệ thống và sẽ có quyền truy cập và kiểm soát không giới hạn đối với hệ thống, bao gồm cả những người dùng khác.
Nhóm mặc định cho siêu người dùng có GID 0
và cũng được đặt tên là root
. Thư mục chính dành cho siêu người dùng là một thư mục chuyên dụng cấp cao nhất (tức /root
) chỉ có thể được truy cập bởi người dùng root
.
Tài khoản Người dùng Tiêu chuẩn
Tất cả các tài khoản không phải root
đều là tài khoản người dùng thông thường về mặt kỹ thuật; nhưng trên hệ thống Linux, thuật ngữ thông dụng tài khoản người dùng thường có nghĩa là tài khoản người dùng “thông thường” (không mang đặc quyền). Chúng thường có các thuộc tính sau với một số ngoại lệ chọn lọc:
-
UID bắt đầu từ 1000 (4 chữ số), mặc dù một số hệ thống cũ sẽ có thể bắt đầu từ 500.
-
Một thư mục chính được chỉ định, thường là thư mục con của
/home
, tùy thuộc vào cấu hình cục bộ. -
một vỏ đăng nhập được chỉ định. Trong Linux, vỏ mặc định thường là Vỏ Bourne Again (
/bin/bash
), mặc dù cũng có thể có các vỏ khác nữa.
Nếu tài khoản người dùng không có vỏ hợp lệ trong thuộc tính của chúng, người dùng sẽ không thể mở được vỏ tương tác. Thông thường /sbin/nologin
được sử dụng như một vỏ không hợp lệ. Điều này có thể mang một chủ ý nhất định nếu người dùng chỉ được xác thực cho các dịch vụ không phải là quyền truy cập bảng điều khiển hoặc SSH, ví dụ như chỉ có quyền truy cập Giao thức truyền tệp SSH (sftp
).
Note
|
Để tránh nhầm lẫn, thuật ngữ tài khoản người dùng sẽ chỉ áp dụng cho tài khoản người dùng tiêu chuẩn hoặc thông thường từ nay về sau. Ví dụ: tài khoản hệ thống sẽ được sử dụng để giải thích về một tài khoản người dùng Linux thuộc loại tài khoản người dùng hệ thống. |
Tài khoản Hệ thống
Tài khoản hệ thống thường được tạo từ trước khi cài đặt hệ thống. Đây là những cơ sở, chương trình và dịch vụ sẽ không chạy trên tư cách siêu người dùng. Trong một thế giới lý tưởng, tất cả chúng sẽ là tiện ích của hệ điều hành.
Các tài khoản hệ thống không giống nhau nhưng các thuộc tính của chúng thường đều bao gồm:
-
UID thường dưới 100 (2 số) hoặc từ 500-1000 (3 số).
-
Hoặc là không có Thư mục chính chuyên dụng, hoặc là có một thư mục thường không nằm trong
/home
. -
Không có vỏ đăng nhập hợp lệ (thường là
/sbin/nologin
), hiếm có trường hợp ngoại lệ.
Hầu hết các tài khoản hệ thống trên Linux sẽ không bao giờ đăng nhập và không cần vỏ chỉ định trong thuộc tính của chúng. Nhiều quy trình do tài khoản hệ thống sở hữu và thực thi sẽ được trình quản lý hệ thống phân nhánh vào môi trường riêng của chúng, chạy với tài khoản hệ thống được chỉ định. Những tài khoản này thường có các đặc quyền hạn chế, hoặc đa số là không có.
Note
|
Theo LPI Linux Essentials, tài khoản hệ thống là UID <1000, với UID 2 hoặc 3 chữ số (và GID). |
Nói chung, các tài khoản hệ thống không nên có vỏ đăng nhập hợp lệ. Nếu có, nó sẽ trở thành một vấn đề bảo mật trong hầu hết các trường hợp.
Tài khoản Dịch vụ
Tài khoản Dịch vụ thường được tạo khi dịch vụ được cài đặt và định cấu hình. Tương tự như tài khoản hệ thống, chúng dành cho các tiện ích, chương trình và dịch vụ sẽ không chạy dưới dạng siêu người dùng.
Trong nhiều tài liệu, tài khoản hệ thống và dịch vụ sẽ tương tự như nhau và thường được hoán đổi cho nhau. Điều này bao gồm cả vị trí của các thư mục chính thường nằm ngoài /home
nếu được chỉ định (các tài khoản dịch vụ thường có nhiều khả năng có thư mục này hơn so với các tài khoản hệ thống) và không có vỏ đăng nhập hợp lệ. Mặc dù không có một định nghĩa cụ thể nào nhưng sự khác biệt chính về cơ bản giữa tài khoản hệ thống và dịch vụ là UID/GID.
- Tài khoản hệ thống
-
UID/GID <100 (2 số) hoặc <500-1000 (3 số)
- Tài khoản dịch vụ
-
UID/GID >1000 (4+ chữ số), nhưng không phải là tài khoản người dùng “tiêu chuẩn” hoặc “thông thường”, một tài khoản dành cho dịch vụ, có UID/GID >1000 (4+ chữ số)
Một số bản phân phối Linux vẫn có các tài khoản dịch vụ đã đặt sẵn với UID <100 và những tài khoản đó cũng có thể được coi là tài khoản hệ thống mặc dù chúng không được tạo khi cài đặt hệ thống. Ví dụ: trên các bản phân phối Linux dựa trên Fedora (bao gồm cả Red Hat), người dùng cho máy chủ Web Apache có UID (và GID) 48; rõ ràng đó là một tài khoản hệ thống mặc dù nó có thư mục chính (thường tại /usr/share/httpd
hoặc /var/www/html/
).
Note
|
Theo LPI Linux Essentials, tài khoản hệ thống là UID <1000 và tài khoản người dùng thông thường là UID >1000. Vì tài khoản người dùng thông thường >1000 nên những UID này cũng có thể bao gồm cả các tài khoản dịch vụ. |
Vỏ Đăng nhập và Thư mục chính
Một số tài khoản có vỏ đăng nhập trong khi những tài khoản khác không có vì mục đích bảo mật do chúng không yêu cầu quyền truy cập tương tác. Vỏ đăng nhập mặc định trên hầu hết các bản phân phối Linux là Vỏ Bourne Again hoặc bash
; cũng có thể có các vỏ khác như vỏ C (csh
), vỏ Korn (ksh
) hoặc vỏ Z (zsh
) — trên đây chỉ là một vài ví dụ.
Người dùng có thể thay đổi vỏ đăng nhập của mình bằng cách sử dụng lệnh chsh
. Theo mặc định, lệnh sẽ chạy ở chế độ tương tác và hiển thị lời nhắc để hỏi vỏ nào sẽ được sử dụng. Câu trả lời phải là một đường dẫn đầy đủ đến tệp nhị phân vỏ như bên dưới:
$ chsh Changing the login shell for emma Enter the new value, or press ENTER for the default Login Shell [/bin/bash]: /usr/bin/zsh
Ta cũng có thể chạy lệnh ở chế độ không tương tác với tham số -s
và theo sau là đường dẫn đến tệp nhị phân như sau:
$ chsh -s /usr/bin/zsh
Hầu hết các tài khoản đều có một thư mục chính xác định. Trên Linux, đây thường là vị trí duy nhất mà tài khoản người dùng đó có quyền ghi được đảm bảo với một số ngoại lệ (ví dụ: các khu vực hệ thống tệp tạm thời). Tuy nhiên, một số tài khoản được thiết lập có chủ đích để không có bất kỳ quyền ghi nào vào ngay cả thư mục chính của chúng vì mục đích bảo mật.
Nhận Thông tin về Người dùng của bạn
Liệt kê thông tin người dùng cơ bản là một tác vụ phổ biến hàng ngày trên hệ thống Linux. Trong một số trường hợp, người dùng sẽ cần chuyển đổi người dùng và tăng đặc quyền để hoàn thành các tác vụ đặc quyền.
Ngay cả người dùng cũng có khả năng liệt kê các thuộc tính và điểm truy cập từ dòng lệnh bằng cách sử dụng các lệnh bên dưới. Thông tin cơ bản trong một bối cảnh hạn chế không phải là một thao tác đặc quyền.
Việc liệt kê thông tin hiện tại của người dùng tại dòng lệnh chỉ đơn giản là một lệnh gồm hai chữ cái: id
. Đầu ra sẽ thay đổi tuỳ theo ID đăng nhập của bạn:
$ id uid=1024(emma) gid=1024(emma) 1024(emma),20(games),groups=10240(netusers),20480(netadmin) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Trước đó, người dùng (emma
) có các mã định danh có thể được phân tích như sau:
-
1024
= ID người dùng (UID), theo sau là tên người dùng (tên thông thường hay còn gọi là tên đăng nhập) trong ngoặc đơn. -
1024
= ID nhóm chính (GID), theo sau là tên nhóm (tên thông thường) trong ngoặc đơn. -
Danh sách các GID bổ sung (tên nhóm) mà người dùng cũng có thể có.
Việc liệt kê lần cuối người dùng đăng nhập vào hệ thống được thực hiện bằng lệnh last
:
$ last emma pts/3 ::1 Fri Jun 14 04:28 still logged in reboot system boot 5.0.17-300.fc30. Fri Jun 14 04:03 still running reboot system boot 5.0.17-300.fc30. Wed Jun 5 14:32 - 15:19 (00:46) reboot system boot 5.0.17-300.fc30. Sat May 25 18:27 - 19:11 (00:43) reboot system boot 5.0.16-100.fc28. Sat May 25 16:44 - 17:06 (00:21) reboot system boot 5.0.9-100.fc28.x Sun May 12 14:32 - 14:46 (00:14) root tty2 Fri May 10 21:55 - 21:55 (00:00) ...
Thông tin được liệt kê trong các cột có thể khác nhau, nhưng một số mục đáng chú ý trong phần liệt kê ở trên là:
-
Một người dùng (
emma
) đã đăng nhập qua mạng (TTYpts/3
giả) và vẫn đang đăng nhập. -
Thời điểm khởi động hiện tại được liệt kê cùng với nhân. Trong ví dụ trên, khoảng 25 phút trước khi người dùng đăng nhập.
-
Siêu người dùng (
root
) đã đăng nhập qua bảng điều khiển ảo (TTYtty2
), trong khoảng thời gian ngắn, vào giữa tháng Năm.
Một biến thể của lệnh last
là lệnh lastb
, liệt kê tất cả các lần đăng nhập không hợp lệ gần đây nhất.
Các lệnh who
và w
chỉ liệt kê các thông tin đăng nhập đang hoạt động trên hệ thống:
$ who emma pts/3 2019-06-14 04:28 (::1) $ w 05:43:41 up 1:40, 1 user, load average: 0.25, 0.53, 0.51 USER TTY LOGIN@ IDLE JCPU PCPU WHAT emma pts/3 04:28 1:14m 0.04s 0.04s -bash
Cả hai lệnh đều liệt kê một số thông tin giống nhau. Ví dụ: một người dùng (emma
) đã đăng nhập bằng thiết bị TTY giả (pts/3
) và thời gian đăng nhập là 04:28.
Lệnh w
liệt kê nhiều thông tin hơn, bao gồm:
-
Thời gian hiện tại và hệ thống đã hoạt động được bao lâu
-
Có bao nhiêu người dùng được kết nối
-
Trung bình Tải lượng trong 1, 5 và 15 phút qua
Và thông tin bổ sung cho mỗi phiên người dùng đang hoạt động.
-
Chọn, tổng thời gian sử dụng CPU (
IDLE
,JCPU
vàPCPU
) -
Quy trình hiện tại (
-bash
). Tổng thời gian sử dụng CPU của quy trình đó là mục cuối cùng (PCPU
).
Cả hai lệnh đều có các tùy chọn khác để liệt kê các thông tin bổ sung khác nhau.
Chuyển đổi Người dùng và Nâng cao Đặc quyền
Trong một thế giới lý tưởng, người dùng sẽ không bao giờ cần phải nâng đặc quyền để hoàn thành nhiệm vụ của mình. Hệ thống sẽ luôn “tự hoạt động” và mọi thứ sẽ được định cấu hình cho các loại truy cập khác nhau.
Thật may mắn cho chúng ta bởi Linux — theo mặc định — đã hoạt động như vậy đối với hầu hết những người dùng không phải là quản trị viên hệ thống mặc dù nó luôn tuân theo mô hình bảo mật ít đặc quyền nhất.
Tuy nhiên, có những lệnh cho phép nâng đặc quyền khi cần thiết. Hai trong số những lệnh quan trọng nhất là su
và sudo
.
Trên hầu hết các hệ thống Linux ngày nay, lệnh su
chỉ được sử dụng để nâng cấp đặc quyền lên quyền gốc - tức người dùng mặc định - nếu tên người dùng không được chỉ định sau tên lệnh. Mặc dù nó có thể được sử dụng để chuyển sang người dùng khác nhưng đây không phải là cách tốt: người dùng nên đăng nhập từ một hệ thống khác qua mạng, bảng điều khiển vật lý hoặc cửa sổ dòng lệnh trên hệ thống.
emma ~$ su - Password: root ~#
Sau khi nhập mật khẩu siêu người dùng (root
), người dùng sẽ có vỏ siêu người dùng (chú ý dấu #
ở cuối dấu nhắc lệnh) và sẽ là siêu người dùng (root
) trên mọi mặt.
Việc chia sẻ mật khẩu là một hành vi bảo mật rất tồi; vì vậy, lệnh su
sẽ rất ít khi (thậm chí là không bao giờ) cần tới trong một hệ thống Linux hiện đại.
Ký hiệu đô la ($
) sẽ chấm dứt dấu nhắc lệnh cho vỏ người dùng không có đặc quyền, trong khi ký hiệu (#
) sẽ kết thúc dấu nhắc lệnh cho dấu nhắc vỏ siêu người dùng (root
). Bạn không bao giờ nên thay đổi ký tự cuối cùng của bất kỳ dấu nhắc lệnh nào so với tiêu chuẩn “phổ biến toàn cầu” này vì danh pháp này đã được sử dụng trong hầu hết các tài liệu học tập, bao gồm cả những tài liệu này.
Warning
|
Đừng bao giờ chuyển sang tài khoản siêu người dùng ( |
Vấn đề lớn nhất khi sử dụng su
để chuyển sang siêu người dùng (root
) là gì? Nếu phiên của người dùng thông thường bị xâm phạm, mật khẩu siêu người dùng (root
) có thể sẽ bị lấy. Đó là lúc “Switch User Do” (hoặc “Superuser Do”) xuất hiện:
$ cat /sys/devices/virtual/dmi/id/board_serial cat: /sys/devices/virtual/dmi/id/board_serial: Permission denied $ sudo cat /sys/devices/virtual/dmi/id/board_serial [sudo] password for emma: /6789ABC/
Trong phần liệt kê trên, người dùng đang cố tra cứu số sê-ri bo mạch hệ thống của họ. Tuy nhiên, quyền truy cập đã bị từ chối vì thông tin đó được đánh dấu là đặc quyền.
Tuy nhiên, bằng cách sử dụng sudo
, người dùng sẽ nhập mật khẩu của chính mình để xác thực họ là ai. Nếu họ đã được ủy quyền trong cấu hình sudoers
để chạy lệnh đó với đặc quyền với các tùy chọn được cho phép, lệnh đó sẽ hoạt động.
Tip
|
Theo mặc định, lệnh |
Tệp Kiểm soát Truy cập
Gần như tất cả các hệ điều hành đều có một tập hợp các vị trí được sử dụng để lưu trữ kiểm soát về truy cập. Trong Linux, đây thường là các tệp văn bản nằm trong thư mục /etc
, tức nơi lưu trữ các tệp cấu hình hệ thống. Theo mặc định, thư mục này có thể được đọc bởi mọi người dùng trên hệ thống nhưng chỉ có thể được ghi bởi root
.
Các tệp chính liên quan đến tài khoản người dùng, thuộc tính và kiểm soát truy cập là:
/etc/passwd
-
Tệp này lưu trữ thông tin cơ bản về người dùng trên hệ thống, bao gồm UID và GID, thư mục chính, vỏ, v.v. Mặc dù có tên như vậy nhưng không có mật khẩu nào được lưu trữ ở đây.
/etc/group
-
Tệp này lưu trữ thông tin cơ bản về tất cả các nhóm người dùng trên hệ thống như tên nhóm, GID và các thành viên.
/etc/shadow
-
Đây là nơi lưu trữ mật khẩu người dùng. Chúng sẽ được băm nhỏ vì mục đích bảo mật.
/etc/gshadow
-
Tệp này lưu trữ thông tin chi tiết hơn về các nhóm, bao gồm mật khẩu đã băm nhỏ cho phép người dùng tạm thời trở thành thành viên của nhóm, danh sách người dùng có thể trở thành thành viên của nhóm tại bất cứ thời điểm nào và danh sách của người quản trị nhóm.
Warning
|
Các tệp này không được thiết kế để và không bao giờ nên được chỉnh sửa trực tiếp. Bài học này chỉ nói đến các thông tin được lưu trữ trong các tệp này và không nói về việc chỉnh sửa các tệp này. |
Theo mặc định, mọi người dùng đều có thể nhập /etc
và đọc các tệp /etc/passwd
và /etc/group
. Và cũng theo mặc định, không người dùng nào (ngoại trừ root
) có thể đọc các tệp /etc/shadow
hoặc /etc/gshadow
.
Ngoài ra còn có các tệp liên quan đến việc nâng đặc quyền cơ bản trên các hệ thống Linux như trên các lệnh su
và sudo
. Theo mặc định, những lệnh này chỉ có thể được truy cập bởi người dùng root
.
/etc/sudoers
-
Tệp này kiểm soát việc ai có thể sử dụng lệnh
sudo
và bằng cách nào. /etc/sudoers.d
-
Thư mục này có thể chứa các tệp bổ sung cho cài đặt trên tệp
sudoers
.
Theo như kỳ thi LPI Linux Essentials, ta chỉ cần biết đường dẫn và tên tệp của tệp cấu hình sudo mặc định là /etc/sudoers
. Cấu hình của nó nằm ngoài phạm vi của những tài liệu này.
Warning
|
Mặc dù |
/etc/passwd
Tệp /etc/passwd
thường được gọi là “tệp mật khẩu”. Mỗi dòng trong tệp có chứa nhiều trường luôn được phân định bằng dấu hai chấm (:
). Mặc dù có tên như vậy, hiện nay các hàm băm mật khẩu một chiều thực tế không được lưu trữ trong tệp này.
Cú pháp điển hình của một dòng trong tệp này là:
USERNAME:PASSWORD:UID:GID:GECOS:HOMEDIR:SHELL
Và trong đó:
USERNAME
-
Tên người dùng - hay còn gọi là thông tin đăng nhập (tên) - như
root
,nobody
,emma
. PASSWORD
-
Vị trí kế thừa của mật khẩu băm nhỏ. Hầu như luôn luôn là
x
và cho biết rằng mật khẩu được lưu trữ trong tệp/etc/shadow
. UID
-
ID người dùng (UID), như
0
,99
,1024
. GID
-
ID nhóm mặc định (GID), như
0
,99
,1024
. GECOS
-
Một danh sách giá trị phân tách bằng dấu phẩy chứa thông tin người dùng bao gồm tên, vị trí, số điện thoại. Ví dụ:
Emma Smith,42 Douglas St,555.555.5555
HOMEDIR
-
Đường dẫn đến thư mục chính của người dùng, như
/root
,/home/emma
, v.v. SHELL
-
Vỏ mặc định cho người dùng này, như
/bin/bash
,/sbin/nologin
,/bin/ksh
, v.v.
Ví dụ: dòng sau mô tả người dùng emma
:
emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555:/home/emma:/bin/bash
Hiểu về Trường GECOS
Trường GECOS chứa 3 trường trở lên được phân tách bằng dấu phẩy (,
) - hay còn gọi là danh sách Giá trị được phân tách bằng dấu phẩy (CSV). Mặc dù không có tiêu chuẩn bắt buộc, các trường thường đều sẽ tuân theo thứ tự sau:
NAME,LOCATION,CONTACT
Trong đó:
NAME
-
là “Tên đầy đủ” của người dùng hoặc “Tên phần mềm” trong trường hợp là tài khoản dịch vụ.
LOCATION
-
thường là vị trí vật lý của người dùng trong tòa nhà, số phòng hoặc bộ phận hoặc người liên hệ trong trường hợp đó là tài khoản dịch vụ.
CONTACT
-
liệt kê thông tin liên lạc như số điện thoại nhà riêng hoặc cơ quan.
Các trường bổ sung có thể bao gồm thông tin liên hệ bổ sung, chẳng hạn như số nhà hoặc địa chỉ email. Để thay đổi thông tin trên trường GECOS, hãy sử dụng lệnh chfn
và trả lời các câu hỏi như bên dưới. Nếu không có tên người dùng nào được cung cấp sau tên lệnh, bạn sẽ thay đổi thông tin cho người dùng hiện tại:
$ chfn Changing the user information for emma Enter the new value, or press ENTER for the default Full Name: Emma Smith Room Number []: 42 Work Phone []: 555.555.5555 Home Phone []: 555.555.6666
/etc/group
Tệp /etc/group
chứa các trường luôn được phân tách bằng dấu hai chấm (:
) và lưu trữ thông tin cơ bản về các nhóm trên hệ thống. Đôi khi nó còn được gọi là “tệp nhóm”. Cú pháp cho mỗi dòng là:
NAME:PASSWORD:GID:MEMBERS
Trong đó:
NAME
-
là tên nhóm, như
root
,users
,emma
, v.v. PASSWORD
-
vị trí kế thừa của mật khẩu băm nhỏ của nhóm tùy chọn. Hầu như luôn luôn là
x
, cho biết rằng mật khẩu (nếu được xác định) được lưu trữ trong tệp/etc/gshadow
. GID
-
ID nhóm (GID), như
0
,99
,1024
. MEMBERS
-
danh sách được phân tách bằng dấu phẩy của tên những người dùng là thành viên của nhóm, chẳng hạn như
jsmith,emma
.
Ví dụ bên dưới hiển thị một dòng chứa thông tin về nhóm students
:
students:x:1023:jsmith,emma
Người dùng không cần phải được liệt kê trong trường thành viên khi nhóm là nhóm chính cho người dùng. Nếu người dùng được liệt kê thì cũng là thừa — tức là không có thay đổi về chức năng dù có được liệt kê hay không.
Note
|
Việc sử dụng mật khẩu cho các nhóm nằm ngoài phạm vi của phần này; tuy nhiên, nếu được xác định, mật khẩu băm nhỏ sẽ được lưu trữ trong tệp |
/etc/shadow
Bảng sau đây sẽ liệt kê các thuộc tính được lưu trữ trong tệp /etc/shadow
, thường được gọi là “tệp shadow”. Tệp này chứa các trường luôn được phân tách bằng dấu hai chấm (:
). Mặc dù tệp có nhiều trường nhưng ngoại trừ hai trường đầu tiên thì hầu hết chúng đều nằm ngoài phạm vi của bài học này.
Cú pháp cơ bản cho một dòng trong tệp này là:
USERNAME:PASSWORD:LASTCHANGE:MINAGE:MAXAGE:WARN:INACTIVE:EXPDATE
Trong đó:
USERNAME
-
Tên người dùng (giống như
/etc/passwd
), nhưroot
,nobody
,emma
. PASSWORD
-
Phần băm nhỏ một chiều của mật khẩu, bao gồm cả các muối trước đó. Ví dụ:
!!
,!$1$01234567$ABC…
,$6$012345789ABCDEF$012…
. LASTCHANGE
-
Ngày thay đổi mật khẩu cuối cùng tính bằng ngày kể từ điểm “kỷ nguyên”, chẳng hạn như
17909
. MINAGE
-
Tuổi mật khẩu tối thiểu tính bằng ngày.
MAXAGE
-
Tuổi mật khẩu tối đa tính bằng ngày.
WARN
-
Thời gian cảnh báo trước khi hết hạn mật khẩu, tính bằng ngày.
INACTIVE
-
Tuổi mật khẩu tối đa đã hết hạn, tính bằng ngày.
EXPDATE
-
Ngày hết hạn mật khẩu, tính bằng ngày kể từ “kỷ nguyên”.
Trong ví dụ bên dưới, bạn có thể thấy một mục nhập mẫu từ tệp /etc/shadow
. Hãy lưu ý rằng có một số giá trị như INACTIVE
và EXPDATE
sẽ không được xác định.
emma:$6$nP532JDDogQYZF8I$bjFNh9eT1xpb9/n6pmjlIwgu7hGjH/eytSdttbmVv0MlyTMFgBIXESFNUmTo9EGxxH1OT1HGQzR0so4n1npbE0:18064:0:99999:7:::
“Kỷ nguyên” của hệ thống POSIX là nửa đêm (0000), Giờ Tọa độ Quốc tế (UTC), vào Thứ Năm, ngày 1 tháng 1 năm 1970. Hầu hết các ngày và giờ POSIX được tính bằng giây kể từ “kỷ nguyên” hoặc là ngày kể từ “kỷ nguyên” theo trường hợp của tệp /etc/shadow
.
Note
|
Tệp shadow được thiết kế để chỉ có thể được đọc bởi siêu người dùng và các dịch vụ xác thực hệ thống cốt lõi được chọn để kiểm tra hàm băm mật khẩu một chiều khi đăng nhập hoặc thời điểm xác thực khác. |
Mặc dù có tồn tại các giải pháp xác thực khác nhau, phương pháp lưu trữ mật khẩu cơ bản là chức năng băm một chiều. Điều này được thực hiện để mật khẩu không bao giờ được lưu trữ dưới dạng văn bản rõ ràng trên hệ thống, vì hàm băm sẽ không thể bị đảo ngược. Bạn có thể băm mật khẩu nhưng (trên lý tưởng) không thể biến các phần băm đó trở lại thành mật khẩu ban đầu.
Trong trường hợp tối cần, cần có một phương pháp mạnh tay để băm tất cả các tổ hợp mật khẩu cho đến khi một kết hợp khớp. Để giảm thiểu vấn đề mã băm mật khẩu bị hoá giải trên một hệ thống, các hệ thống Linux sử dụng một “muối” ngẫu nhiên trên mỗi mã băm mật khẩu cho người dùng. Vì vậy, hàm băm cho mật khẩu người dùng trên các hệ thống Linux khác nhau sẽ không giống nhau ngay cả khi mật khẩu giống nhau.
Trong tệp /etc/shadow
, mật khẩu có thể sẽ có nhiều dạng. Các hình thức này thường bao gồm các phần sau đây:
!!
-
Điều này có nghĩa là tài khoản “bị vô hiệu hóa” (không thể xác thực), không lưu trữ mật khẩu đã băm.
!$1$01234567$ABC…
-
Tài khoản “bị vô hiệu hóa” (do dấu chấm than ban đầu) với hàm băm, muối băm và chuỗi băm trước đó được lưu trữ.
$1$0123456789ABC$012…
-
Tài khoản “có hiệu lực” với hàm băm, muối băm và chuỗi băm được lưu trữ.
Hàm băm, muối băm và chuỗi băm được đặt trước và phân định bằng ký hiệu đô la ($
). Độ dài muối băm phải từ tám đến mười sáu (8-16) ký tự. Ví dụ về ba muối băm phổ biến nhất là:
$1$01234567$ABC…
-
Hàm băm của MD5 (
1
), với độ dài hàm băm ví dụ là tám. $5$01234567ABCD$012…
-
Hàm băm của SHA256 (
5
), với độ dài hàm băm ví dụ là mười hai. $6$01234567ABCD$012…
-
Hàm băm của SHA512 (
6
), với độ dài hàm băm ví dụ là mười hai.
Note
|
Hàm băm MD5 được coi là không an toàn về mặt mật mã với mức ASIC ngày nay (từ những năm 2010 trở lại đây) và thậm chí là cả hiệu suất SIMD điện toán chung. Ví dụ: Tiêu chuẩn xử lý thông tin liên bang Hoa Kỳ (FIPS) không cho phép sử dụng MD5 cho bất kỳ chức năng mã hóa nào ngoài các khía cạnh xác thực rất hạn chế nhưng không phải tính toàn vẹn của chữ ký số hoặc các mục đích tương tự. |
Từ khía cạnh của các mục tiêu và kỳ thi LPI Linux Essentials, ta chỉ cần hiểu các phần mật khẩu băm nhỏ cho người dùng cục bộ chỉ được lưu trữ trong tệp /etc/shadow
và chỉ có các dịch vụ xác thực được chọn mới có thể đọc hoặc chỉ siêu người dùng mới có thể sửa đổi thông qua các lệnh khác .
Bài tập Hướng dẫn
-
Hãy xem xét đầu ra sau của lệnh
id
:$ id emma uid=1000(emma) gid=1000(emma) groups=1000(emma),4(adm),5(tty),10(uucp),20(dialout),27(sudo),46(plugdev)
Các thuộc tính sau được lưu trữ trong tệp nào?
UID và GID
Nhóm
-
Ngoài ra, mật khẩu người dùng được lưu trong tệp nào?
-
-
Loại mã hóa mật khẩu mặc định được sử dụng để lưu trữ cục bộ mật khẩu trên hệ thống Linux?
-
Asymmetric
-
One-way Hash
-
Symmetric
-
ROT13
-
-
Nếu một tài khoản có User ID (UID) được liệt kê dưới 1000 thì đây là loại tài khoản gì?
-
Làm cách nào để có thể nhận được danh sách các thông tin đăng nhập đang hoạt động trong hệ thống của mình và số lượng các thông tin đăng nhập đó?
-
Hãy sử dụng lệnh
grep
và nhận về kết quả bên dưới với thông tin về người dùngemma
.$ grep emma /etc/passwd emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555,:/home/emma:/bin/ksh
Hãy điền thông tin thích hợp vào chỗ trống của biểu đồ sử dụng đầu ra của lệnh trước đó.
Username
Password
UID
Primary GID
GECOS
Home Directory
Shell
Bài tập Mở rộng
-
Hãy so sánh kết quả của
last
vớiw
vàwho
. Những chi tiết nào bị thiếu trong mỗi lệnh khi so với nhau? -
Hãy thử ra lệnh
who
vàw -his
.-
Thông tin nào đã bị xóa khỏi đầu ra của lệnh
w
với tùy chọn “no header” (-h
) và “short” (-s
)? -
Thông tin nào đã được thêm vào đầu ra của lệnh
w
với tùy chọn “địa chỉ ip” (-i
)?
-
-
Tệp nào là tệp lưu trữ phần băm mật khẩu một chiều của tài khoản người dùng?
-
Tệp nào chứa danh sách các nhóm mà tài khoản người dùng là thành viên trong đó? Logic nào có thể được sử dụng để biên soạn danh sách nhóm mà tài khoản người dùng là thành viên trong đó?
-
Theo mặc định, một hoặc nhiều (1+) các tệp sau đây không thể được đọc bởi người dùng thông thường không có đặc quyền. Đó là những tệp nào sau đây?
-
/etc/group
-
/etc/passwd
-
/etc/shadow
-
/etc/sudoers
-
-
Bạn sẽ thay đổi vỏ đăng nhập của người dùng hiện tại thành Vỏ Korn (
/usr/bin/ksh
) ở chế độ không tương tác như thế nào? -
Tại sao thư mục chính của người dùng
root
không được đặt trong thư mục/home
?
Tóm tắt
Trong bài học này, chúng ta đã khám phá cơ sở dữ liệu nhóm và người dùng Linux. Chúng ta đã biết các thuộc tính quan trọng nhất của người dùng và nhóm, bao gồm tên và ID bằng chữ số của chúng. Chúng ta cũng đã tìm hiểu cách băm mật khẩu hoạt động trên Linux và cách người dùng được chỉ định vào các nhóm.
Tất cả thông tin này đều được lưu trữ trong bốn tệp sau; các tệp này cung cấp việc kiểm soát truy cập bảo mật cục bộ cơ bản nhất trên hệ thống Linux:
/etc/passwd
-
Tất cả các thuộc tính POSIX của tài khoản người dùng cục bộ hệ thống (ngoại trừ băm mật khẩu); có thể được đọc bởi mọi người dùng.
/etc/group
-
Tất cả các thuộc tính POSIX của tài khoản nhóm cục bộ hệ thống; có thể được đọc bởi mọi người dùng.
/etc/shadow
-
Tất cả các phần băm mật khẩu của người dùng cục bộ trên hệ thống (và thông tin hết hạn); không thể được đọc bởi bất kỳ người dùng nào (ngoài các quy trình được chọn).
/etc/sudoers
-
Tất cả các thông tin/ sự cho phép về vấn đề nâng đặc quyền cục bộ hệ thống bằng lệnh
sudo
.
Các lệnh sau đã được thảo luận trong bài học này:
id
-
Liệt kê ID người dùng và nhóm thực (hoặc hiệu quả).
last
-
Liệt kê những người dùng đăng nhập cuối cùng
who
-
Liệt kê những người dùng hiện đang đăng nhập.
w
-
Tương tự như
who
nhưng có ngữ cảnh bổ sung. su
-
Chuyển sang người dùng khác bằng vỏ đăng nhập hoặc chạy các lệnh với tư cách người dùng đó bằng cách chuyển mật khẩu của người dùng đó.
sudo
-
Chuyển đổi Người dùng (hoặc Siêu Người dùng); nếu được phép, người dùng hiện tại nhập mật khẩu của chính họ (nếu được yêu cầu) để nâng cao đặc quyền.
chsh
-
Thay đổi vỏ của người dùng.
chfn
-
Thay đổi thông tin của người dùng trên trường GECOS.
Đáp án Bài tập Hướng dẫn
-
Hãy xem xét đầu ra sau của lệnh `id
$ id emma uid=1000(emma) gid=1000(emma) groups=1000(emma),4(adm),5(tty),10(uucp),20(dialout),27(sudo),46(plugdev)
Các thuộc tính sau được lưu trữ trong tệp nào?
UID và GID
/etc/passwd
Nhóm
/etc/group
-
Ngoài ra, mật khẩu người dùng được lưu trong tệp nào?
Mật khẩu người dùng đã băm được lưu trữ trong
/etc/shadow
.
-
-
Loại mã hóa mật khẩu mặc định được sử dụng để lưu trữ cục bộ mật khẩu trên hệ thống Linux?
Theo mặc định, hàm băm một chiều được sử dụng để lưu trữ mật khẩu.
-
Nếu một tài khoản có User ID (UID) được liệt kê dưới 1000 thì đây là loại tài khoản gì?
Tài khoản có UID thấp hơn 1000 thường là tài khoản hệ thống.
-
Làm cách nào để có thể nhận được danh sách các thông tin đăng nhập đang hoạt động trong hệ thống của mình và số lượng các thông tin đăng nhập đó?
Sử dụng lệnh
w
. Bên cạnh danh sách tất cả các lần đăng nhập đang hoạt động, nó cũng sẽ hiển thị thông tin về số lượng người dùng đã đăng nhập cùng với tải trọng hệ thống và thời gian hoạt động. -
Hãy sử dụng lệnh
grep
và nhận về kết quả bên dưới với thông tin về người dùngemma
.$ grep emma /etc/passwd emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555,:/home/emma:/bin/ksh
Hãy điền thông tin thích hợp vào chỗ trống của biểu đồ sử dụng đầu ra của lệnh trước đó.
Username
emma
Password
x
- phải luôn làx
đối với thông tin đăng nhập của người dùng đang hoạt động và hợp lệUID
1000
Primary GID
1000
GECOS
Emma Smith,42 Douglas St,555.555.5555
Home Directory
/home/emma
Shell
/bin/ksh
Đáp án Bài tập Mở rộng
-
Hãy so sánh kết quả của
last
vớiw
vàwho
. Những chi tiết nào bị thiếu trong mỗi lệnh khi so với nhau?Công cụ
w
vàwho
chỉ liệt kê những người dùng hiện tại đã đăng nhập vào hệ thống, trong khilast
còn liệt kê cả những người dùng đã ngắt kết nối. Lệnhw
sẽ liệt kê việc sử dụng hệ thống, trong khi lệnhwho
thì không. -
Hãy thử ra lệnh
who
vàw -his
.-
Thông tin nào đã bị xóa khỏi đầu ra của lệnh
w
với tùy chọn “no header” (-h
) và “short” (-s
)?Đầu ra sẽ không có chủ đề; điều này hữu ích trong việc phân tích cú pháp; thời gian đăng nhập cũng như thông tin chọn CPU không được liệt kê.
-
Thông tin nào đã được thêm vào đầu ra của lệnh
w
với tùy chọn “ip address” (-i
)?Lệnh này in địa chỉ IP, thay vì thử phân giải DNS, sẽ in tên máy chủ. Tùy chọn này giúp đầu ra của lệnh
w
phù hợp hơn với đầu ra mặc định của lệnhlast
.
-
-
Tệp nào là tệp lưu trữ hàm băm mật khẩu một chiều của tài khoản người dùng?
Tệp
/etc/shadow
lưu trữ hàm băm mật khẩu một chiều của tài khoản người dùng vì nó không thể được đọc bằng tài khoản người dùng thông thường không có đặc quyền, không giống như tệp/etc/passwd
. -
Tệp nào chứa danh sách các nhóm mà tài khoản người dùng là thành viên trong đó? Logic nào có thể được sử dụng để biên soạn danh sách nhóm mà tài khoản người dùng là thành viên trong đó?
Tệp
/etc/group
có danh sách tên người dùng CSV trong trường cuối cùng, tức “thành viên”, của bất kỳ dòng nào cho một nhóm.Bất kỳ dòng nào trong tệp
/etc/group
mà trong đó người dùng được liệt kê trong trường cuối cùng (“members”) đều có nghĩa là người dùng là thành viên của nhóm đó — giả sử nhóm đó được định dạng chính xác (được phân tách bằng CSV). Ngoài ra, tư cách thành viên nhóm chính của người dùng trong tệp/etc/passwd
cũng sẽ có một mục trùng trong tệp/etc/group
cho cả tên nhóm và GID. -
Theo mặc định, một hoặc nhiều (1+) các tệp sau đây không thể được đọc bởi người dùng thông thường không có đặc quyền. Đó là những tệp nào sau đây?
-
/etc/group
-
/etc/passwd
-
/etc/shadow
-
/etc/sudoers
Các tệp
/etc/shadow
và/etc/sudoers
không thể được đọc theo mặc định ngoại trừ bởi các dịch vụ được chọn hoặc siêu người dùng. Những câu trả lời này sẽ được tùy chỉnh dựa trên hệ thống và tên người dùng được sử dụng trong phòng máy.
-
-
Bạn sẽ thay đổi vỏ đăng nhập của người dùng hiện tại thành Vỏ Korn (
/usr/bin/ksh
) ở chế độ không tương tác như thế nào?$ chsh -s /usr/bin/ksh
-
Tại sao thư mục chính của người dùng
root
không được đặt trong thư mục/home
?Bởi vì cần có tài khoản
root
để khắc phục sự cố và sửa lỗi, có thể bao gồm cả các sự cố hệ thống tệp liên quan đến thư mục/home
. Trong những trường hợp như vậy,root
phải hoạt động với đầy đủ chức năng ngay cả khi hệ thống tệp/home
chưa khả dụng.