동일한 UID로 사용자를 만들 수있는 이유는 무엇입니까?


37

UID에 대한 이해는 유닉스 계열 운영 체제에서 각 사용자에게 할당 한 고유 한 양의 정수입니다. 각 사용자는 UID로 시스템에 식별되며 사용자 이름은 일반적으로 사람을위한 인터페이스로만 사용됩니다.

두 명의 사용자가 동일한 UID를 가질 수있는 방법은 시스템 및 패키지와 충돌하지 않습니까?

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:~#

나는 동일한 UID와 GID를 가진 두 명의 사용자를 추가했습니다 : test12test13

의 출력 /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

에 의해 사용자를 추가 useradd -ou 1005 -g1000 username.

나는 이것의 목적이 무엇인지 혼란있어, 그것은 권한과 이제 사용자가 함께 추가 된 경우 로그 등 사용자에 영향을 미칠 수 uid=0gid=0의지가 루트 계정과 같은 권한이 있습니까?


확실하지 않지만 출력이 두 명령 모두에서 사용자 "test10"의 UID를 인쇄한다고 생각합니다. 그 이유는 무엇인지 모르겠지만 이전에 만든 일부 사용자 여야합니다.
animaletdesequia


좋아, 나는 질문을 오해했다. 사용자를 정상적으로 만들고 시스템에서 동일한 UID를 할당했다고 생각했습니다.
animaletdesequia

시스템이 어떻게 고유 한 uid를 받아들이 는가
nox

알았다. 좋은 질문입니다. 설명해 주셔서 감사합니다 :)
animaletdesequia

답변:


40

여기서 대답은 리눅스가 당신을 자신으로부터 보호하지 못한다는 것입니다.

실제로 su root/ etc 파일로 이동하여 모든 사용자에게 동일한 UID를 제공 하려는 경우 가능합니다. 텍스트 파일 일뿐입니다.

그러나 당신은 정말로해서는 안되며 의도하지 않은 결과를 초래할 것입니다.


4
내 질문은 시스템이 이것을 받아들이는 이유는 무엇입니까?
nux

46
"수락"이란 무엇입니까? 어떻게 받아들이지 않습니까? 이것은 요리사가되고 스프가 왜 소금을 너무 많이 넣었는지 물어 보는 것과 같습니다. 현대 컴퓨팅의 관점에서 보면 ID와 같은 중요한 것들에 대한 금기 사항으로 인해 발을 shooting 지 못하는 RDBMS 사고 방식에 익숙 할 것입니다. Linux 사용자 ID는 훨씬 더 원시적이며 내부 확인이나 수정이 없습니다.
디지털 Chris

5
맞습니다. 그리고 useradd -o당신은 당신이 표준 밖에 있다는 것을 인식합니다 adduser. @psusi가 언급했듯이 파일 권한과 동일한 ID를 가리키는 두 개의 로그인을 만듭니다. 일반적인 사용 사례가 아니기 때문에 많은 패키지에서 테스트되지 않았으므로 문제가 발생할 수 있습니다.
Digital Chris

2
답변 : 2 개의 로그인이 동일한 파일 시스템 권한을 가리 키도록합니다.
Digital Chris

5
@Josh는 물론 동일한 UID를 가진 여러 사용자를 보유 해야하는 유효한 이유가 있습니다. 하나의 예에 대한 내 대답을 참조하십시오.
terdon

38

실제로 유효한 이유가 있습니다. 예를 들어, 저는 각자 각자의 컴퓨터를 가지고 있지만 $HOME서버에서 내 보낸 공유 드라이브 에 있던 랩에서 근무했습니다 . 그래서, 내가 $HOME있었다

/users/terdon

때문에 /users폴더 내 로컬 컴퓨터에 실제로 아니었지만, 내가 부담 실험실의 네트워크에되지 않도록 내 로컬 하드 드라이브에 저장된 데이터를 사용하는 것이 I / O 무거운이었다 어떤 분석을 위해, NFS를 통해 수출했다. 이를 위해 저와 그 밖의 모든 사람들에게는 두 명의 사용자가있었습니다. 한 명은 시스템 전체이고 다른 한 명은 해당 컴퓨터의 로컬이었습니다. 현지 사용자의 집은

/home/localuser

그러나, 나는 내가로 로그인되었는지 여부를 내 파일에 대한 전체 액세스 권한이 필요 terdon하거나 localuser등을 모두 제공함으로써이었다 우리의 시스템 관리자가 구현했던 방법 localuserterdon같은 UID를. 이렇게하면 현재 로그인 한 사용자에 관계없이 로컬 파일을 자유롭게 조작 할 수 있습니다.


6
이 답변을 지원하기 위해 가상 전자 메일 호스팅과 같은 일부 설정이 단일 UID를 공유하는 많은 수의 가상 전자 메일 계정을 효과적으로 사용한다는 점에 주목할 가치가 있습니다. at wiki2.dovecot.org/UserIds#mailusers
Matt Thomason

않을 것 chmod 666같은이 영향을 미치는가?
Brian

3
@GIJoe는 두 사용자 모두 읽기 / 쓰기를 허용하지만 문제가 될 수있는 소유권을 보존하지는 않습니다. 또한 모든 파일을 이러한 권한 (예 : SSH 키)으로 설정할 수있는 것은 아니며 권한을 항상 재생해야하는 것은 실용적이지 않습니다.
terdon

12

두 명의 사용자가 텍스트 파일의 숫자이므로 동일한 UID를 가질 수 있으므로 이미 사용 된 값을 포함하여 원하는대로 설정할 수 있습니다. 그러나 당신이 본 것처럼, 그렇게하는 것은 좋은 생각이 아닙니다.


어떻게 시스템이 사용자를 다루는가? 공유 권한
nux

12
@ nux, 그들은 같은 사용자입니다. 로그인 목적으로 다른 사용자 이름 / 암호를 가질 수 있습니다.
psusi

4
@ bigbadonk420, "지원됨"이라는 용어는 다소 모호합니다. 그것은 확실히 당신이 유닉스 시스템에서 항상 할 수 있었고 uid 0을 가진 다른 사용자를 설정하기 위해 상당히 일반적인 백도어였습니다. 일반 루트 사용자
psusi

1
@ bigbadonk420 지원됩니다, 이것이 유용한 경우가 있습니다, 예를 들어 내 대답을 참조하십시오.
terdon

11

실제로 같은 ID를 가진 두 명의 사용자가있는 것이 일반적입니다. FreeBSD에는 일반적으로 UID 0을 가진 두 명의 사용자가 있습니다 : root와 toor. 루트는 내장 / bin / sh 쉘을 사용하고 다른 쉘 (보통 bash)을 사용합니다.


11

유닉스 시스템과 리눅스는 일반적으로 /etc/passwd파일 에서 복제를 금지하지 않습니다 . 이 파일의 목적은 UID를 ls사용자가 파일을 나열 할 때 와 같은 명령 줄 도구로 표시 할 수있는 실제 이름과 연결하는 것입니다.

$ 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

이 파일의 다른 목적은 사용자가 로그인 할 때 얻을 쉘을 지정하는 것입니다.

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

유닉스 타입 시스템의 일반적인 공격 경로는 다음과 같은 행을 시스템 /etc/passwd파일에 추가하는 것입니다.

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

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

/etc/passwd파일 의 역할은 사용자 계정만을 추적하기위한 것이 아닙니다 . 사용자 이름과 비밀번호를 추적하는 역할은 /etc/shadow파일 의 책임입니다 . 같은 파일 /etc/passwd과는 /etc/group정말 시스템이 디스크에서 파일을 나열 할 때 사람이 읽을 수있는 이름을 제공하기위한 것입니다.

파일은 실제 이름이 아닌 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: -

을 주목 Uid:하고 Gid:, 숫자는 실제로 디스크에 기록 무슨이다!


9

Linux에서 모든 사용자와 그룹은 실제로 숫자 일뿐입니다. 그것이 id당신이 게시 한 명령 의 결과가 보여주는 것입니다.

/etc/passwd파일은 사용자 이름 을 사용자 ID (번호)에 매핑하며 제공 한 예에서는 두 사용자 이름을 동일한 사용자 ID에 매핑하기 만하면됩니다.

효과적으로 test12두 번째 사용자 이름을 가진 한 명의 사용자 ID 1005를 만들었습니다 test13. 그러나 시스템은 UID 1005를 찾은 첫 번째 사용자 이름으로 매핑합니다.test12

리눅스는 당신이 이것을 막을 수있는 시스템이 없기 때문에 당신이 이것을 할 수있게한다. /etc/passwd텍스트 파일 일 뿐이며, 사용자 이름은 해당 파일에서 입력 한 UID에 매핑되고 UID는 해당 파일에서 발견 된 첫 번째 사용자 이름에 매핑됩니다.

그러나 당신이 만든 것은 다른 시스템 관리자에게 혼란스러운 상황입니다. UID를 변경하여 피하십시오test13


이것은 내 테스트 가상 머신입니다. 내 질문은 동일한 uid에 대해 두 명의 사용자를 매핑하는 목적이 있다는 것입니다
nux

1
내가 생각할 수있는 유일한 목적은 UID에 별칭을 가진 두 번째 사용자 이름을 제공하는 것입니다. 그러나 이것은 정의되지 않은 동작이므로 권장하지 않습니다. 실제로 이것은 바람직하지 않은 상황입니다. 사용자 이름과 UID 사이의 1 : 1 관계를 유지하는 것이 좋습니다
Josh

그것이 내가 알아야 할이 질문을 한 이유입니다. 혼란스러운 방식이라고 느꼈습니다
nux

그건 헷갈 린다; 그렇기 때문에하지 말아야합니다. "목적"이 없으며 /etc/passwd파일 의 오용입니다 . 그러나이를 방지 할 방법이 없습니다. 말이 돼?
Josh

1
사용자는 2 개의 로그인이 동일한 파일 시스템 권한을 가리 키도록하는 것이 목표라고 언급했습니다.
nux

5

이것이 오늘날 허용되는 이유는 단순히 시스템이이를 막지 않기 때문입니다.

이것이 변경되면 관리자가이 기능을 사용했던 시스템이 중단됩니다 (Terdon의 예 참조). 따라서 변경되지 않았으며 앞으로도 그렇게 될 것이라고 생각하지 않습니다.

원래 암호 파일과 그룹 파일 만 있었으며 목적을 달성했습니다. adduser 명령이없고 addgroup 이 없었으며 , vi 또는 ed를 사용하여 루트로 파일을 편집했습니다.

몇 가지 단점이있었습니다!

다음에 사용할 사용자 ID를 기억하기 위해 관리자는 사용자 이름이 유효하지 않은 (최종 사용자 이름 !이었기 때문에) 마지막 행으로 특수 사용자 !를 보유하고 다음 항목을 저장하는 데 해당 항목을 사용하는 것이 일반적이었습니다. 사용자 ID. 원유, 인정하지만 그것은 효과가 있었다! 그렇다면 오늘날 개발을 민첩하게 만드는 것과 비슷한 방식으로 장을 더 복잡하게 만드는 이유는 무엇입니까?

알려진 결함이있었습니다. 주요한 것은, 세계적으로 읽을 수 있어야했기 때문에 유틸리티 ls가 매핑 될 수있었습니다 user-id => name. 이는 누구나 모든 사람의 암호화 된 암호와 시스템의 모든 사용자와 ID를 볼 수 있음을 의미했습니다.

일부 유닉스 시스템은 두 개의 쉘 스크립트를 도입하기 시작 adduser addgroup했는데, 유닉스간에 불일치했기 때문에 종종 무시 되었기 때문에 대부분의 사람들은 수동 편집을 계속했습니다.

shadow암호 파일이 발명 되기까지는 몇 년이 걸렸으며 암호화 된 암호를 숨겨 보안을 강화했습니다. 다시 말하지만, 충분한 복잡성이 추가되었지만 여전히 상당히 단순하고 단순했습니다. 유틸리티 useraddgroupadd보관 도입, shadowshadow-업데이트되었습니다. 우선 벤더 소유의 adduser / addgroup 유틸리티를 둘러싼 간단한 쉘 스크립트 래퍼 였습니다. 다시는 계속 진행하기에 충분했습니다.

컴퓨터의 네트워크가 성장하고 사람들이 한 번에 여러 작업을 수행하여 작업을 완료하고 있었기 때문에 passwd/group파일 관리가 특히 NFS의 악몽이되어 NIS로 알려진 옐로우 페이지가 부담을 덜어줍니다.

조금 더 유연한 무언가가 필요하다는 것이 명백 해졌고, PAM이 발명되었습니다. 따라서 정말 정교하고 중앙 집중식의 안전한 고유 ID의 모든 종소리와 휘파람 인증 시스템을 원한다면 중앙 서버에 전화하여 Radius 서버, LDAP 서버 또는 Active Directory를 인증해야합니다.

세계는 자랐습니다. 그러나 passwd / group / shadow 파일은 소규모 사용자 / 개발자 / 실험 실용으로 남아있었습니다. 우리는 여전히 모든 종과 휘파람을 요구하지 않았습니다. 나는 철학에 지금 약간 변경했다 생각 "당신이 더 나은, 당신은 전혀 사용하지 않을 만들려고한다면" 그래서 그것에 대해 걱정하지 마십시오.

이것이 단순한 암호 파일이 변경되지 않을 것이라고 생각하는 이유입니다. 더 이상 의미가 없으며 2 ~ 3 명의 사용자가 모니터링하는 온도와 트위터 피드를 가진 30 파운드의 라즈베리 파이에 적합합니다. 좋아, 당신은 당신이 그것을 원한다면 user-id에 약간주의를 기울여야하며 열광 자가 데이터베이스 (파일)에서 다음 고유 ID를 먼저 선택하는 스크립트에서 useradd 를 래핑하는 것을 막을 방법이 없습니다 . 원하는 경우 고유 ID입니다. 결국 오픈 소스입니다.


2

/etc/passwd파일은 실제 사용자 ID에 대한 기호 사용자 이름을 매핑합니다. 하나의 userID에 매핑되는 두 개의 기호 이름을 의도적으로 만들면 허용됩니다.

그렇다고 실제로하는 것이 좋은 생각은 아닙니다. 일부 사람들은이 기능을 활용할 수있는 매우 구체적인 사용 사례를 발견했을 수도 있지만 일반적으로 사용하지 않아야합니다.

Linux (및 기타 UNIX)는 관리자가 자신이하는 일을 알고 있다고 생각합니다. 만약 당신이 멍청한 짓을하도록 지시한다면 그것은 당신 자신의 잘못입니다. 당신이 당신의 차를 절벽 위로 운전하라고 말하면 제조업체에 갈 수없고 차가 왜 당신이 이것을 할 수 있었는지 물어 보는 것과 같은 방식입니다.


왜 버그로 언급 되었습니까?
nux

1

운영 체제가 고유 할 것으로 예상되는 식별자가 있지만 하드웨어 추적에 사용됩니다. 특정 Universally Unique IDentifier 가 시스템 파일을 포함하는 하드 드라이브에 해당 한다는 지식 은 하드웨어 구성이 변경되는 경우 계속 작동하는 데 도움이 될 수 있습니다. Microsoft는 이러한 글로벌 고유 식별자를 호출하여 모든 Windows 소프트웨어를 추적합니다. 아이러니하게도,이 두문자어는 잘못 선택되었습니다.

OS의 관점에서 볼 때 대부분의 사용자 및 그룹 식별자 변경은 외부 인터페이스 변경에 따라 다릅니다. 충돌에도 불구하고 정상적으로 작동 할 수 있습니다. 주로 시스템 사용자와 그룹에 필요한 것은 이들이 존재한다는 것입니다. 사용자가 요구하는 것을 알 수 없습니다. 이와 같은 상황에서 유닉스 철학은 운영 체제가 관리자가 자신이하는 일을 알고 가정하여 신속하게 수행 할 수 있도록해야한다는 것입니다.


0

@andybalholm의 답변을 뒷받침하는 증거를 찾았습니다.

에서 APUE , §8.15 :

모든 프로세스는 실제적이고 효과적인 사용자 ID 및 그룹 ID를 찾을 수 있습니다. 그러나 때로는 프로그램을 실행하는 사용자의 로그인 이름을 찾으려고합니다. 우리는 getpwuid( getuid())을 호출 할 수 있지만, 단일 사용자가 각각 동일한 사용자 ID를 가진 여러 로그인 이름을 가지고 있다면 어떻게해야합니까? ( 사람은 각 항목에 대해 다른 로그인 쉘을 가지고 동일한 사용자 ID와 암호 파일에 여러 항목이있을 수 있습니다 시스템은 일반적으로 우리가 (6.8 절)에서 로그인 이름을 추적합니다.), 그리고 getlogin함수는 방법을 제공합니다 해당 로그인 이름을 가져옵니다.

....

로그인 이름이 주어지면이를 사용하여 비밀번호 파일에서 사용자를 찾아서 (예 :를 사용하여 로그인 셸을 결정) 사용할 수 getpwnam있습니다.

Btw, 로그인 한 상태에서 다른 쉘로 전환 할 수 있는지 알고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.