Tại sao tôi có thể tạo Người dùng có cùng UID?


37

Sự hiểu biết của tôi về UID là một số nguyên dương duy nhất được chỉ định bởi một hệ điều hành giống Unix cho mỗi người dùng. Mỗi người dùng được xác định hệ thống bằng UID của nó và tên người dùng thường chỉ được sử dụng làm giao diện cho con người.

Làm thế nào hai người dùng có thể có cùng UID, đây không phải là xung đột cho hệ thống và gói của tôi?

root@kdc:~# id test12
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~# id test13
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~#

Tôi đã thêm hai người dùng có cùng UID và GID: test12test13

Đầu ra của /etc/passwd:

client@kdc:~$ cat /etc/passwd | grep test12
test12:x:1005:1000::/home/test12:/bin/sh
client@kdc:~$ cat /etc/passwd | grep test13
test13:x:1005:1000::/home/test13:/bin/sh

Tôi đã thêm người dùng bằng cách useradd -ou 1005 -g1000 username.

Tôi đã nhầm lẫn mục đích của việc này là gì và nó có thể ảnh hưởng đến quyền và nhật ký người dùng không. Vậy bây giờ nếu người dùng được thêm uid=0gid=0sẽ có các đặc quyền như tài khoản root?


Không chắc chắn về điều đó, nhưng tôi nghĩ rằng đầu ra đang in UID của người dùng "test10" trong cả hai lệnh. Tại sao làm điều đó, tôi không có ý tưởng, nhưng phải là một số người dùng bạn đã tạo trước đó.
Animaletdesequia

như thể nó nói rằng có một người dùng có id này
nux

OK, tôi đã hiểu nhầm câu hỏi. Tôi nghĩ rằng bạn đã tạo người dùng bình thường và hệ thống đã gán cho họ cùng một UID.
Animaletdesequia

Không có người đàn ông không bình thường, câu hỏi ở đây, làm thế nào hệ thống chấp nhận các uids độc đáo
nux

Hiểu rồi. Câu hỏi hay sau đó, cảm ơn vì lời giải thích :)
Animaletdesequia

Câu trả lời:


40

Câu trả lời ở đây là Linux không bảo vệ bạn khỏi chính bạn.

Nếu bạn thực sự muốn su rootvà đi vào các tệp / etc và cung cấp cho tất cả người dùng cùng một UID, bạn có thể. Nó chỉ là một tập tin văn bản.

Nhưng bạn thực sự không nên và nó sẽ có những hậu quả không lường trước được.


4
Câu hỏi của tôi là tại sao hệ thống chấp nhận điều này?
nux

46
Bạn có ý nghĩa gì "chấp nhận" nó? Làm thế nào nó sẽ KHÔNG chấp nhận nó? điều này giống như là một đầu bếp và hỏi tại sao món súp cho phép bạn bỏ quá nhiều muối vào đó. Về mặt điện toán hiện đại, có lẽ bạn đã quen với tâm lý RDBMS, trong đó những mâu thuẫn đối với những thứ quan trọng như ID khiến bạn không tự bắn vào chân mình. ID người dùng Linux nguyên thủy hơn nhiều và không có kiểm tra hoặc chỉnh sửa nội bộ.
Kỹ thuật số Chris

5
Phải, và bằng cách sử dụng useradd -obạn nhận ra rằng bạn nằm ngoài định mức adduser. Như @psusi đã đề cập, nó tạo ra hai thông tin đăng nhập vào cùng một ID theo quyền truy cập tệp, v.v. Nó cũng có thể tạo ra các vấn đề vì đó không phải là trường hợp sử dụng thông thường và không nghi ngờ gì với nhiều gói.
Kỹ thuật số Chris

2
Trả lời: để có 2 lần đăng nhập trỏ đến các quyền hệ thống tập tin giống hệt nhau.
Kỹ thuật số Chris

5
@ Tất nhiên là có, có những lý do hợp lệ để có nhiều người dùng có cùng UID, hãy xem câu trả lời của tôi cho một ví dụ.
terdon

38

Có những lý do thực sự hợp lệ cho việc này. Chẳng hạn, tôi từng làm việc trong phòng thí nghiệm nơi mỗi chúng tôi đều có máy tính riêng nhưng chúng tôi $HOMEở trong một ổ đĩa chung được xuất bởi một máy chủ. Vì vậy, tôi $HOMEđã

/users/terdon

/usersthư mục thực sự không có trên máy cục bộ của tôi mà được xuất qua NFS, nên đối với bất kỳ phân tích nào nặng về I / O, tôi sẽ sử dụng dữ liệu được lưu trữ trên ổ cứng cục bộ của mình để không gây gánh nặng cho mạng của phòng thí nghiệm. Cuối cùng, tôi và mọi người khác có hai người dùng: một người dùng toàn hệ thống và một người dùng cục bộ trong máy. Nhà của người dân địa phương là

/home/localuser

Tuy nhiên, tôi cần có quyền truy cập đầy đủ vào các tệp của mình cho dù tôi đã đăng nhập như terdonhoặc theo localusercách mà hệ thống của chúng tôi đã thực hiện bằng cách cung cấp cả hai localuserterdoncùng một UID. Bằng cách đó, tôi có thể tự do thao tác các tệp cục bộ của mình bất kể người dùng nào tôi hiện đang đăng nhập.


6
Để hỗ trợ cho câu trả lời này, đáng chú ý rằng một số thiết lập như lưu trữ email ảo sử dụng điều này rất hiệu quả, tức là một số lượng lớn tài khoản email ảo chia sẻ một UID - tài liệu cho máy chủ thư Dovecot thực sự gợi ý đây là một cách tiếp cận tùy chọn tại wiki2.dovecot.org/UserIds#mailusers
Matt Thomason

sẽ không chmod 666có ảnh hưởng tương tự?
Brian

3
@GIJoe sẽ cho phép cả người dùng đọc / ghi nhưng điều đó sẽ không bảo vệ quyền sở hữu có thể là một vấn đề. Ngoài ra, không phải tất cả các tệp đều có thể được đặt thành các quyền đó (ví dụ: khóa ssh) và không cần thiết phải chơi với quyền mọi lúc.
terdon

12

Hai người dùng có thể có cùng UID vì đây chỉ là một số trong tệp văn bản để bạn có thể đặt nó thành bất cứ thứ gì bạn muốn, bao gồm cả một giá trị đã được sử dụng. Như bạn đã thấy, làm như vậy không phải là một ý tưởng tốt.


Làm thế nào hệ thống đối phó với người dùng sau đó? quyền chia sẻ
nux

12
@nux, cả hai đều là cùng một người dùng. Họ chỉ có thể có một tên người dùng / mật khẩu khác cho mục đích đăng nhập.
psusi

4
@ bigbadonk420, thuật ngữ "được hỗ trợ" khá mơ hồ. Đó chắc chắn là điều bạn luôn có thể thực hiện trên các hệ thống unix và nó từng là một cửa hậu khá phổ biến để thiết lập một người dùng khác có 0 để bạn có thể đăng nhập và thực sự là root, mà không cần biết hoặc thay đổi mật khẩu trên người dùng root bình thường.
psusi

1
@ bigbadonk420 nó được hỗ trợ, có những trường hợp điều này hữu ích, xem câu trả lời của tôi cho một ví dụ.
terdon

11

Thực sự khá phổ biến khi có hai người dùng có cùng một ID. Trên FreeBSD, thường có hai người dùng có UID 0: root và toor. Root sử dụng shell / bin / sh tích hợp và toor sử dụng một shell khác, thường là bash.


11

Các hệ thống Unix & Linux thường không làm gì để cấm các bản sao trong /etc/passwdtệp. Mục đích của tệp này là liên kết UID với tên vật lý có thể được hiển thị bằng các công cụ dòng lệnh, chẳng hạn như lskhi người dùng liệt kê ra các tệp.

$ ls -n | head -5
total 986000
drwxrwxr-x.   3 1000 1000      4096 Feb 13 19:51 1_archive_sansa
-rw-rw-r--.   1 1000 1000    760868 Dec 16 08:21 2.18.x Database Scheme.jpg
-rw-rw-r--.   1 1000 1000       972 Oct  6 20:26 abcdefg
drwxrwxr-x.   2 1000 1000      4096 Feb 11 03:34 advanced_linux_programming

Mục đích dự định khác của tệp này là chỉ định shell mà người dùng sẽ nhận được khi họ đăng nhập.

$ getent passwd saml
saml:x:1000:1000:saml:/home/saml:/bin/bash

Một vectơ tấn công phổ biến trên các hệ thống loại Unix là thêm các dòng như những dòng này vào /etc/passwdtệp của hệ thống :

$ getent passwd r00t
r00t:x:0:0:root:/root:/bin/bash

$ getent passwd toor
toor:x:0:0:root:/root:/bin/bash

Vai trò của /etc/passwdtệp KHÔNG có nghĩa là chỉ theo dõi tài khoản người dùng. Vai trò của việc theo dõi tên người dùng và mật khẩu là trách nhiệm của /etc/shadowtệp. Các tệp như /etc/passwd/etc/groupthực sự có nghĩa là cung cấp một tên người có thể đọc được khi hệ thống của bạn liệt kê các tệp từ đĩa.

Hãy nhớ rằng các tệp của bạn được ghi vào đĩa bằng tên thật của UID / GID.

$ stat afile 
  File: ‘afile’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 6560621     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-02-27 15:54:21.852697029 -0500
Modify: 2014-02-27 15:54:21.852697029 -0500
Change: 2014-02-27 15:54:21.852697029 -0500
 Birth: -

Lưu ý Uid:Gid:, những con số là những gì thực sự được ghi vào đĩa!


9

Trong Linux, tất cả người dùng và nhóm thực sự chỉ là những con số. Đó là những gì đầu ra của idlệnh bạn đã đăng cho thấy.

Các /etc/passwdtập tin bản đồ sử dụng tên người sử dụng ID (số) và trong ví dụ bạn có cung cấp, bạn đã chỉ đơn giản là ánh xạ hai tên người dùng với ID người dùng.

Thực tế, bạn đã tạo một người dùng test12, ID 1005, người cũng có tên người dùng thứ hai test13. Tuy nhiên, hệ thống sẽ ánh xạ UID 1005 tới tên người dùng đầu tiên mà nó tìm thấy, đó sẽ làtest12

Linux "cho phép" bạn làm điều này bởi vì không có hệ thống nào ngăn bạn làm điều này. /etc/passwdchỉ là một tệp văn bản, tên người dùng được ánh xạ tới UID được tìm thấy cho mục nhập của họ trong tệp đó, UID được ánh xạ tới tên người dùng đầu tiên được tìm thấy trong tệp đó.

Nhưng những gì bạn đã tạo là một tình huống khó hiểu cho các quản trị viên hệ thống khác; tránh nó bằng cách thay đổi UID củatest13


Đây là người máy thử nghiệm ảo của tôi, câu hỏi của tôi là có một mục đích để ánh xạ hai người dùng cho cùng một uid
nux

1
Mục đích duy nhất tôi có thể nghĩ đến là cung cấp cho UID một tên người dùng thứ hai, bí danh. Nhưng đây là hành vi không xác định và không được khuyến khích. Thực sự đây là một tình huống không mong muốn: bạn tốt hơn với mối quan hệ 1: 1 giữa tên người dùng và UID
Josh

đó là lý do tại sao tôi hỏi câu hỏi này tôi cần biết, tôi cảm thấy rằng đó là một cách khó hiểu
nux

Thật khó hiểu; đó là lý do tại sao bạn không nên làm điều đó Nó không có "mục đích", đó là lạm dụng /etc/passwdtập tin. Nhưng không có cách nào để ngăn bạn làm điều này. Điều đó có ý nghĩa?
Josh

1
một người dùng đã đề cập rằng mục tiêu là có 2 điểm đăng nhập để cấp quyền hệ thống tập tin giống hệt nhau.
nux

5

Lý do mà điều này được cho phép ngày hôm nay, đơn giản là vì hệ thống không ngăn chặn nó.

Nếu điều này thay đổi, thì nó sẽ phá vỡ các hệ thống mà quản trị viên đã sử dụng tính năng này, (xem ví dụ của Terdon). Vì vậy, nó chưa bao giờ được thay đổi, và tôi không nghĩ nó sẽ như vậy.

Ban đầu chỉ có các tập tin passwd và nhóm, và họ phục vụ mục đích của họ. không có lệnh adduser , không có addgroup , các tập tin đã được chỉnh sửa bằng root bằng vi hoặc ed.

Có một vài quirks!

Để ghi nhớ id người dùng tiếp theo sử dụng, thông thường các quản trị viên phải có một người dùng đặc biệt là dòng cuối cùng có tên người dùng !(vì !là tên người dùng không hợp lệ) và mục đó được sử dụng để lưu trữ tiếp theo tên người dùng. Thô, tôi thừa nhận, nhưng nó đã làm việc! Vì vậy, tại sao phá vỡ một ruột làm cho nó phức tạp hơn, giống như sự phát triển nhanh nhẹn ngày nay.

Có những sai sót đã biết. Cái chính là nó phải có thể đọc được trên thế giới, để các tiện ích như lscó thể lập bản đồ user-id => name. Điều này có nghĩa là bất kỳ ai cũng có thể thấy mật khẩu được mã hóa của mọi người và tất cả người dùng và id trong hệ thống.

Một số hệ thống Unix bắt đầu giới thiệu một vài tập lệnh shell adduser addgroup, thường chúng bị bỏ qua, vì chúng không nhất quán giữa các Unix, vì vậy hầu hết mọi người chỉ thực hiện với chỉnh sửa thủ công.

Phải mất vài năm, trước khi shadowtệp mật khẩu được phát minh, điều này cung cấp bảo mật hơn một chút, bằng cách ẩn mật khẩu được mã hóa. Một lần nữa, độ phức tạp vừa đủ được thêm vào, nhưng nó vẫn khá thô sơ và đơn giản. Các tiện ích useraddgroupaddđã được giới thiệu, được giữ shadowshadow-cập nhật. Để bắt đầu, đây thường là các trình bao bọc kịch bản lệnh shell đơn giản xung quanh các tiện ích adduser / addgroup độc quyền của nhà cung cấp . Một lần nữa, nó là đủ để tiếp tục đi.

Mạng máy tính đang phát triển, mọi người đang làm việc nhiều lần để hoàn thành công việc, do đó, quản trị viên của các passwd/grouptệp đã trở thành một cơn ác mộng, đặc biệt là với NFS, do đó, Yellow Pages còn được gọi là NIS để giảm bớt gánh nặng.

Bây giờ nó đã trở nên rõ ràng rằng một cái gì đó linh hoạt hơn một chút là cần thiết, và PAM đã được phát minh. Vì vậy, nếu bạn thực sự tinh vi và muốn có một hệ thống xác thực tập trung, an toàn, độc đáo, tất cả chuông và còi, bạn sẽ gọi đến một máy chủ trung tâm để xác thực, có thể là máy chủ Radius, máy chủ LDAP hoặc thư mục Hoạt động.

Thế giới đã lớn lên. Nhưng các tệp passwd / nhóm / bóng vẫn còn cho chúng tôi người dùng / nhà phát triển / phòng thí nghiệm nhỏ hơn. Chúng tôi vẫn không thực sự yêu cầu tất cả chuông và còi. Tôi đoán rằng triết lý đã thay đổi một chút bây giờ thành, "Nếu bạn sẽ làm cho nó tốt hơn, bạn sẽ không sử dụng nó" , vì vậy đừng lo lắng về nó.

Đây là lý do tại sao tôi không nghĩ rằng tệp passwd đơn giản sẽ thay đổi. Không còn điểm nào nữa, và thật tuyệt vời cho những chiếc Raspberry Pi trị giá 30 bảng với 2 nhiệt độ theo dõi của 2 người dùng và nguồn cấp dữ liệu twitter. OK, bạn chỉ cần cẩn thận một chút với id người dùng nếu bạn muốn chúng là duy nhất và không có gì ngăn người đam mê gói useradd trong tập lệnh trước tiên chọn id duy nhất tiếp theo từ cơ sở dữ liệu (tệp) để đặt id duy nhất, nếu đó là những gì bạn muốn. Nó là nguồn mở sau tất cả.


2

Các /etc/passwdtập tin chỉ bản đồ tên người dùng mang tính biểu tượng với userID thực. Nếu bạn cố tình tạo hai tên tượng trưng ánh xạ tới một userID thì nó sẽ cho phép bạn.

Điều đó không có nghĩa là thực sự nên làm điều đó. Một số người có thể đã tìm thấy các trường hợp sử dụng rất cụ thể nơi họ có thể tận dụng tính năng này, nhưng nói chung bạn không nên làm điều đó.

Linux (và các UNIX khác) đưa ra ý kiến ​​rằng quản trị viên biết họ đang làm gì. Nếu bạn bảo nó làm điều gì đó ngu ngốc thì đó là lỗi của chính bạn, theo cách tương tự như nếu bạn bảo chiếc xe của bạn lái qua một vách đá, bạn không thể đến nhà sản xuất và hỏi tại sao chiếc xe cho phép bạn làm điều này.


Tại sao nó được đề cập như một lỗi?
nux

1

Có những định danh mà hệ điều hành mong đợi là duy nhất, nhưng chúng được sử dụng để theo dõi phần cứng. Kiến thức mà một IDentifier toàn cầu cụ thể tương ứng với một ổ cứng chứa các tệp hệ thống có thể giúp nó tiếp tục hoạt động nếu cấu hình phần cứng thay đổi. Microsoft gọi các IDentifier duy nhất toàn cầu này và sử dụng chúng để theo dõi tất cả phần mềm Windows. Trớ trêu thay, những từ viết tắt này được lựa chọn kém.

Từ quan điểm của HĐH, hầu hết số nhận dạng người dùng và nhóm thay đổi số lượng để thay đổi giao diện bên ngoài. Nó có thể hoạt động bình thường mặc dù va chạm; chủ yếu những gì được yêu cầu của người dùng và các nhóm hệ thống là chúng tồn tại. Nó không thể biết những gì người dùng yêu cầu. Trong những tình huống như thế này, triết lý của Unix là HĐH nên cho rằng các quản trị viên biết họ đang làm gì và sẽ giúp họ làm điều đó một cách nhanh chóng.


0

Tôi tìm thấy một số bằng chứng ủng hộ câu trả lời của @ andybalholm.

Từ APUE , §8.15:

Bất kỳ quá trình nào cũng có thể tìm ra ID người dùng và ID nhóm thực sự và hiệu quả của nó. Tuy nhiên, đôi khi, chúng tôi muốn tìm ra tên đăng nhập của người dùng đang chạy chương trình. Chúng ta có thể gọi getpwuid( getuid()), nhưng nếu một người dùng có nhiều tên đăng nhập, mỗi tên có cùng một ID người dùng thì sao? ( Một người có thể có nhiều mục nhập trong tệp mật khẩu có cùng ID người dùng để có vỏ đăng nhập khác nhau cho mỗi mục nhập .) Hệ thống thường theo dõi tên chúng tôi đăng nhập trong (Mục 6.8) và getloginchức năng cung cấp một cách để lấy tên đăng nhập đó.

....

Đặt tên đăng nhập, sau đó chúng ta có thể sử dụng nó để tra cứu người dùng trong tệp mật khẩu - để xác định vỏ đăng nhập, ví dụ như sử dụng getpwnam.

Btw, tôi muốn biết nếu một người có thể chuyển sang một vỏ khác trong khi đăng nhập.

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.