Tại sao có nhiều tài khoản? Tôi là người dùng duy nhất


13

Tôi đang chạy một hệ thống máy tính để bàn Ubuntu 12.04. Cho đến nay tôi chỉ cài đặt một số chương trình (tôi có quyền sudo).

  1. Khi tôi kiểm tra danh sách người dùng trên hệ thống, tôi thấy một danh sách dài, giống như hơn 20 người dùng, khi những người dùng này được tạo ra (ví dụ: daemon, sys, đồng bộ hóa, trò chơi, xung, v.v.)? Làm thế nào những điều này liên quan đến các chương trình mới đang được cài đặt?

  2. Nếu tôi chạy một chương trình trên hệ thống của mình, nó sẽ chạy với UID của tôi. Nhưng khi thực hiện ps , tôi thấy nhiều chương trình khác chạy với các UID khác nhau (như root, daemon, avahi, syslog, colord, v.v.) - các chương trình này đã bắt đầu với các UID khác nhau như thế nào?


3
Hãy nghĩ về nó theo một cách khác: khi máy tính khởi động lần đầu tiên bạn chưa đăng nhập và các chương trình phải chạy như một ai đó . Tất cả chúng đều có thể chạy bằng root, nhưng điều đó không an toàn, vì hầu hết các chương trình này chỉ chịu trách nhiệm cho một phần nhỏ hoạt động của máy tính. Khi bạn đã đăng nhập, hầu hết các chương trình bạn chạy trực tiếp sẽ được chạy như bạn.
dimo414

Cuối cùng, nó là một hack. Một cái được sử dụng rộng rãi, tuy nhiên một hack. Các bản phân phối UNIX lạm dụng khái niệm "người dùng" để làm việc xung quanh một mô hình bảo mật cũ và không đầy đủ.
Federico Poloni

Câu trả lời:


24

Tài khoản người dùng không chỉ được sử dụng cho người dùng thực tế, mà còn để chạy các dịch vụ hệ thống và đôi khi là chủ sở hữu của các tệp hệ thống. Điều này được thực hiện bởi vì sự tách biệt giữa tài nguyên của người dùng (quy trình, tệp, v.v.) và sự tách biệt giữa tài nguyên của dịch vụ hệ thống đòi hỏi các cơ chế giống nhau trong hệ thống.

Các chương trình mà bạn chạy thường chạy với ID người dùng của bạn. Đó chỉ là trình nền hệ thống chạy dưới tài khoản của chính họ. Tệp cấu hình cho biết khi nào chạy daemon cũng cho biết người dùng nào nên chạy nó hoặc daemon chuyển sang tài khoản không có đặc quyền sau khi bắt đầu. Một số trình nền yêu cầu đặc quyền quản trị đầy đủ, vì vậy chúng chạy dưới tài khoản root . Nhiều trình tiện ích chỉ cần truy cập vào một thiết bị phần cứng cụ thể hoặc các tệp cụ thể, vì vậy chúng chạy dưới một tài khoản người dùng chuyên dụng. Điều này được thực hiện để bảo mật: theo cách đó, ngay cả khi có lỗi hoặc cấu hình sai trong một trong các dịch vụ này, nó không thể dẫn đến một cuộc tấn công toàn hệ thống, bởi vì kẻ tấn công sẽ bị giới hạn trong những gì dịch vụ này có thể làm và sẽ không có thể ghi đè lên các tập tin, gián điệp trên các quy trình, v.v.

Trong Ubuntu, ID người dùng trong phạm vi 0 chàng99 được tạo khi cài đặt hệ thống. 0 là gốc; nhiều trong số những cái trong phạm vi 119999 chỉ tồn tại vì lý do lịch sử và chỉ được giữ để tương thích ngược với một số cài đặt cục bộ sử dụng chúng (một vài mục bổ sung không bị tổn thương). ID người dùng trong phạm vi 100 100999999 được tạo và xóa động khi các dịch vụ cần ID người dùng chuyên dụng được cài đặt hoặc xóa. Phạm vi từ 1000 trở đi là dành cho người dùng hoặc bất kỳ tài khoản nào khác được tạo bởi quản trị viên hệ thống. Các nhóm cũng vậy.


7

Tôi đoán bạn đang tìm danh sách người dùng này bằng cách kiểm tra /etc/passwd? Điều này là hoàn toàn bình thường - 'phục vụ người dùng để mang theo một bộ quyền, hữu ích để khóa không chỉ' người dùng thực tế 'mà còn các chương trình cho các khu vực nhất định trong hệ thống của bạn và theo dõi những gì họ đã thay đổi (cùng khái niệm với các nhóm).

Tôi đã chèn một trong các /etc/passwdtệp Raspberry Pi bên dưới để bạn tham khảo; bạn sẽ nhận thấy người dùng ntopở cuối tệp này, được tạo bởi chương trình ntop(giám sát mạng). Tương tự sshd, gnatsbáo cáo lỗi , vv

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
pi:x:1000:1000:,,,:/home/pi:/bin/bash
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
ntp:x:102:104::/home/ntp:/bin/false
statd:x:103:65534::/var/lib/nfs:/bin/false
messagebus:x:104:106::/var/run/dbus:/bin/false
usbmux:x:105:46:usbmux daemon,,,:/home/usbmux:/bin/false
lightdm:x:106:109:Light Display Manager:/var/lib/lightdm:/bin/false
smmta:x:107:110:Mail Transfer Agent,,,:/var/lib/sendmail:/bin/false
smmsp:x:108:111:Mail Submission Program,,,:/var/lib/sendmail:/bin/false
Debian-exim:x:109:113::/var/spool/exim4:/bin/false
ntop:x:110:115::/var/lib/ntop:/bin/false

Khi tôi cài đặt một chương trình mới trên Ubuntu, nó có tạo người dùng mới không? Nếu không, tại sao nhiều chương trình đang chạy với UID khác với tôi? Ý tôi là làm thế nào các chương trình này chạy với diff UID?
Jake

Bạn có thể chạy dpkg --get-selections | grep -v deinstallvà so sánh nó với danh sách người dùng / etc / passwd của bạn nếu bạn muốn. Đối với câu hỏi của bạn: "... các chương trình này chạy với diff UID như thế nào", bạn có thể tự mình thử điều này. Viết một tập lệnh bash ngẫu nhiên test_filecó chứa một cái gì đó vô hại ( echo "Test"). Sau đó sudo chmod 755 test_file(do bất kỳ ai cũng có thể đọc và thực thi được bởi chủ sở hữu và có thể đọc, có thể ghi và thực thi được), sau sudo chown nobodyđó sẽ gán nó cho người dùng nobody. Sau đó chạy nó. 'Chương trình' test_filevừa chạy với UID nobody.
toxefa

2
@ py4on Không hoàn toàn ... nó chạy từ một tệp có nobodyUID, nhưng nó chạy với UID của bạn; bạn cần phải biến nó thành một tệp SUID để làm điều đó, nhưng bit SUID bị hủy nếu tệp được chạy với một trình thông dịch.
Đạp xe

Ok vì tôi không thể chỉnh sửa nhận xét của mình ở trên nhưng dpkgbit vẫn hữu ích (hy vọng) vui lòng bỏ qua phần về việc chạy nó như chính bạn! Hoặc là đi với SUID hoặc đăng nhập như một người dùng khác để điều này có ý nghĩa
toxefa

3

Những người dùng này được tạo ra khi nào?

Trong trường hợp của những cái mà bạn đề cập, chúng được tạo khi cài đặt hệ thống. Những tài khoản người dùng này là thông thường, một số có niên đại hàng thập kỷ. Họ cũng được tiêu chuẩn hóa. Cơ sở tiêu chuẩn Linux chia chúng thành:

  • các yêu cầu người dùng chuẩn chiếm, root, bin, và daemon; và
  • các tùy chọn người dùng chuẩn chiếm adm, lp, sync, shutdown, halt, mail, news, uucp, operator, man, vànobody

Tài khoản người dùng khác được đề cập ở đây - pulse, avahi, colord, và Debian-exim(để chọn một từ tập tin mật khẩu py4on của) - đưa chúng ta đến câu hỏi tiếp theo của bạn.

Làm thế nào những điều này liên quan đến các chương trình mới đang được cài đặt?

Các tài khoản người dùng không chuẩn được tạo và hủy bởi "tập lệnh bảo trì" cho các gói khác nhau, vì các gói đó được cài đặt và thanh lọc. Tài khoản người dùng sẽ được tạo bởi postinsttập lệnh được gọi là duy trì của gói , chạy getentđể xem tài khoản người dùng đã tồn tại chưa và useraddliệu nó có tồn tại không. Về lý thuyết, nó sẽ bị xóa bởi cái gọi là postrmtập lệnh duy trì, đang chạy userdel.

Trong thực tế, tài khoản người dùng cho các gói không bị xóa. Fedora wiki (qv) giải thích rằng điều này sẽ đầy khó khăn. Xem lỗi Debian # 646175 để biết ví dụ về hoạt động hợp lý này, trong đó quyết định đơn giản là không xóa rabbitmqtài khoản người dùng khi gói bị xóa, để giải quyết vấn đề với một dmon tiếp tục chạy dưới tài khoản của tài khoản đó.

Làm thế nào những chương trình này bắt đầu với các UID khác nhau?

Trong Unix và Linux, một quy trình chạy dưới sự hỗ trợ của siêu người dùng có thể thay đổi tài khoản người dùng của nó thành một thứ khác và tiếp tục chạy cùng một chương trình, nhưng không được phép ngược lại. (Người ta phải sử dụng cơ chế set-UID.)

Hệ thống quản lý dmon chạy như siêu người dùng. Dữ liệu cấu hình của nó xác định rằng các dons cụ thể chạy dưới sự hỗ trợ của các tài khoản người dùng cụ thể:

  • Với Hệ thống 5 rc, tập lệnh /etc/init.dsử dụng một công cụ trợ giúp như start-stop-daemon--chuidtùy chọn của nó .
  • Với một người quản lý dịch vụ daemontools gia đình, các runcuộc gọi kịch bản setuidgid, s6-setuidgid, chpst, hoặc runuidvới tên tài khoản người dùng. Có những ví dụ về điều này trong /unix//a/179798/5132 đã thiết lập nagiostài khoản người dùng.
  • Với sự khởi đầu có một khổ setuidthơ trong một tệp công việc, chỉ định tài khoản người dùng. Điều này không đặc biệt tốt, và đôi khi người ta muốn những gì được mô tả tại /superuser//a/723333/38062 .
  • Với systemd có một User=cài đặt trong tệp đơn vị dịch vụ, chỉ định tài khoản người dùng.

Khi hệ thống quản lý dmon sinh ra một quy trình để trở thành dmon, các cơ chế này sẽ bỏ các đặc quyền siêu người dùng để quá trình dmon tiếp tục chạy dưới sự bảo trợ của tài khoản người dùng không được ưu tiên.

Có một lời giải thích khá dài tại sao việc quản lý tốt được thực hiện theo cách này. Nhưng bạn đã không hỏi tại sao; chỉ khi nào, như thế nào, và từ đâu. Một précis rất ngắn, do đó:

Các hệ điều hành Unix và Linux cách ly các quy trình chạy dưới sự hỗ trợ của các tài khoản người dùng khác nhau. Trong lịch sử, nếu một người có thể chiếm lấy một con cá mập chạy như siêu người dùng, người ta có thể làm bất cứ điều gì mình thích. Mặt khác, một tài khoản chạy dưới tài khoản không có đặc quyền, mặt khác, chỉ có thể truy cập các tệp, thư mục, thiết bị và các quy trình mà tài khoản không có đặc quyền đó có thể. Do đó, một hệ thống các chương trình dmon không đáng tin cậy đều chạy dưới sự hỗ trợ của các tài khoản người dùng khác nhau và không thể truy cập / kiểm soát các tệp / thư mục / quy trình / thiết bị (nội bộ, đáng tin cậy) của nhau, do đó khó bị bẻ khóa hơn.

đọc thêm


1

Trên Linux khi chúng tôi cài đặt một dịch vụ, nó tạo ra một người dùng tên dịch vụ của nó hoặc tương tự như vậy để nó không thể truy cập các tệp khác.


1
Đây là một quy ước, nhưng hoàn toàn không bắt buộc và chắc chắn không phải là phổ quát. Trong thực tế, nó thực sự không chung nữa ...
HalosGhost

1
@HalosGhost Uh? Không, đó là một quy ước rất phổ biến, vẫn còn mạnh mẽ. Câu trả lời này không đầy đủ nhưng hoàn toàn chính xác.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles, tôi đã không nói (hoặc thậm chí ngụ ý) rằng nó không chính xác. Nhưng nó chủ yếu là lỗi thời. Một phần lớn các dịch vụ ngày nay (với sự ra đời của systemd) chỉ là các tệp dịch vụ. Bây giờ không có nghĩa là tài khoản người dùng trên mỗi dịch vụ không còn tồn tại nữa; họ chắc chắn làm. Nhưng, ví dụ, chỉ có 24 tài khoản trên toàn bộ hệ thống của tôi, nơi tôi có nhiều dịch vụ hơn.
HalosGhost

@Gilles Tôi có cùng hoàn cảnh với HalosGhost - nhiều dịch vụ hơn tài khoản. Vì vậy, điều đó có nghĩa là tất cả họ chạy như root?
lonix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.