konsole이 /etc/passwd를 읽는 이유는 무엇입니까?

konsole이 /etc/passwd를 읽는 이유는 무엇입니까?

이 문제에 대해:

패트레이스의 행동을 관찰하던 중, 나는 걱정스러운 점을 발견했습니다. 다음은 "fatrace|grep konsole" 명령의 출력 중 처음 몇 줄입니다.

konsole(4112): O /etc/passwd
konsole(4112): CO /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
konsole(4112): C /etc/passwd
konsole(4112): O /etc/passwd
...

문제는 lsof|grep passwd가 어떤 프로세스에서도 passwd가 열리지 않는다는 것을 보여준다는 것입니다.

그래서 무슨 일이 일어났는지 아세요?

답변1

소스 코드를 읽을 수 있습니다. 제가 당신을 위해 작성한 것 같습니다 ProcessInfo.cpp. 사용자 이름을 가져오는 중입니다. 이것은 귀하의 관심사가 아닐 뿐만 아니라 /etc/passwd누구나 읽을 수 있습니다. 읽으려고 하면 걱정이 될 수 있습니다 /etc/shadow.

답변2

같은 이유로 ls -l/etc/passwd를 읽을 때 UID를 이름과 연결하는 데이터입니다. 파일이 ls호출 되면 stat(2)파일 소유자의 숫자 UID를 가져옵니다. 사람이 읽을 수 있는 이름으로 표시하려면 이러한 연관성이 있는 유일한 위치에 있어야 합니다 /etc/passwd. 예를 들어 일반적인 첫 번째 줄 /etc/passwd은 다음과 같습니다.

root:x:0:0:root:/root:/bin/bash

ls -l /etc/hosts출력을 생성해야 하는 경우

-rw-r--r-- 1 root root 222 Jan 14  2013 /etc/hosts

이와 같은 라이브러리 루틴을 호출하려면 UID 0을 "루트"로 변환해야 합니다.비밀번호 받기/etc/passwd번역을 제공하기 위해 콘텐츠를 읽습니다 . /etc/passwd완전히 평범한 목적을 위해 그러한 번역을 제공하는 것이 존재 이유의 큰 부분입니다 .

사용자 이름을 찾는 것은 전화하는 것보다 보안 문제가 더 이상 발생하지 않습니다.현지 시각그러면 ls파일 수정 시간이 "2013년 1월 14일"임을 알 수 있습니다. ~처럼지속 가능한 개발 관리파일을 열어 둘 이유가 없으므로 내용을 읽은 후에는 닫힙니다.

파일에는 /etc/passwd원래 단순 마침표의 해시된 비밀번호가 포함되어 있었습니다. 비밀번호 해시는 /etc/shadow보안상의 문제로 인해 일반 사용자가 읽을 수 없는 위치 로 이동되었습니다 . 이름은 /etc/passwd동일하게 유지되지만 이제 x이전 비밀번호 해시 필드에 포함되어 있으며 이는 어떤 비밀번호의 유효한 해시도 아닙니다.

답변3

사용하면 무슨 일이 일어나고 있는지 strace확인할 수 있습니다 .konsole

$ strace -s 2000 -o konsole.log
...
...
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2655, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f316d8fc000
read(3, "root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sy
nc\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\ngames:x:12:100:games:/usr/games:/sbin/nologin\nf
tp:x:14:50:FTP User:/var/ftp:/sbin/nologin\nnobody:x:99:99:Nobody:/:/sbin/nologin\ndbus:x:81:81:System message bus:/:/sbin/nologin\nsystemd-journal-gateway:x:191:191:Journal Gateway:/var/log/journal:/usr/sbin/nologin\npolkitd:
x:999:999:User for polkitd:/:/sbin/nologin\nusbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin\ncolord:x:998:997:User for colord:/var/lib/colord:/sbin/nologin\nrpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin\nqemu:x:107:
107:qemu user:/:/sbin/nologin\nrtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin\ntss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin\nradvd:x:75:75:radvd user:/:/sbin/nologin\nabr
t:x:173:173::/etc/abrt:/sbin/nologin\nopenvpn:x:997:996:OpenVPN:/etc/openvpn:/sbin/nologin\nunbound:x:996:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin\nsaslauth:x:995:76:\"Saslauthd user\":/run/saslauthd:/sbin/nologin\n
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin\navahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin\nrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin\nnfsnobody
:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin\nnm-openconnect:x:994:994:NetworkManager user for OpenConnect:/:/sbin/nologin\nmailnull:x:47:47::/var/spool/mqueue:/sbin/nologin\nsmmsp:x:51:51::/var/spool/mqueue:/s
bin/nologin\nsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin\ntcpdump:x:72:72::/:/sbin/nologin\npulse:x:993:993:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin\ngdm:x:42:42::/var/lib/gdm:/sbin/nologin\
ngnome-initial-"..., 4096) = 2655
close(3)                                = 0
...

Konsole은 in 의 내용을 매우 빠르게 읽고 있지만 /etc/passwd에서는 볼 수 없습니다 lsof. 이는 파일을 열고 빠르게 읽은 후 닫을 때 발생하는 일반적인 문제입니다.

걱정해야 할까요?

그건 그렇고, 이것은 걱정할 것이 아닙니다. 나도 gnome-terminal마찬가지다. 프로세스가 다소 혼란스러울 수 있지만 Konsole은 시스템에 정보를 쿼리하고 있습니다. 이 경우 정보는 사용자의 홈 디렉터리와 같습니다.

따라서 시스템은 NSS(Name Service Switching Profile)를 호출합니다.

open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3

파일에는 한 줄, 특히 다음 줄이 있습니다.

passwd:     files

이 줄은 NSS에게 "데이터베이스" "passwd"를 찾을 위치를 알려줍니다. 이 줄은 리소스가 파일에 있음을 NSS에 알려줍니다. 그러면 시스템은 파일을 열어 /etc/passwd사용자의 홈 디렉터리를 찾습니다.

노트:더 자세히 살펴보면 이 동작은 Bash로 인해 발생한 것으로 보입니다. Bash를 실행하면 strace동일한 결과가 표시됩니다.

$ strace -s 2000 -o bash.log bash

추가 읽기

NSS 작동 방식에 정말로 관심이 있다면 매뉴얼 페이지를 확인하세요 nsswitch.conf. nssNSS는 모듈식이며 "데이터베이스"에 대해 다양한 백엔드 기술을 사용할 수 있습니다.

예를 들어:

       /etc/nsswitch.conf       NSS configuration file.
       /lib/libnss_compat.so.X  implements "compat" source.
       /lib/libnss_db.so.X      implements "db" source.
       /lib/libnss_dns.so.X     implements "dns" source.
       /lib/libnss_files.so.X   implements "files" source.
       /lib/libnss_hesiod.so.X  implements "hesiod" source.
       /lib/libnss_nis.so.X     implements "nis" source.
       /lib/libnss_nisplus.so.X implements "nisplus" source.

관련 정보