![为什么 konsole 读取 /etc/passwd?](https://linux22.com/image/53256/%E4%B8%BA%E4%BB%80%E4%B9%88%20konsole%20%E8%AF%BB%E5%8F%96%20%2Fetc%2Fpasswd%EF%BC%9F.png)
关于这个问题:
在观察 fatrace 的行为时,我注意到一些令我担心的事情。以下是命令“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 转换为“root”,以便调用像这样的库例程获取pwuid其读取内容/etc/passwd
是为了提供翻译。这是存在的很大一部分原因/etc/passwd
:为了完全平凡的目的提供这样的翻译。
查找用户名并不比调用用户名带来更多的安全问题当地时间这样就ls
可以告诉你文件的修改时间是“Jan 14 2013”。作为可持续发展管理请注意,没有理由保持文件打开,因此一旦读取其内容就会将其关闭。
该文件/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(名称服务切换配置文件):
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
该文件中有一行,特别是这一行:
passwd: files
这一行告诉 NSS 在哪里可以找到“数据库”“passwd”。这一行告诉 NSS 该资源位于文件中。因此系统随后打开该/etc/passwd
文件来查找用户的主目录。
笔记:进一步挖掘,这种行为似乎是由 Bash 引起的。执行strace
Bash 会显示同样的结果。
$ strace -s 2000 -o bash.log bash
进一步阅读
如果您确实对 NSS 的工作原理感兴趣,请查阅手册页nsswitch.conf
和nss
. NSS 是模块化的,可以为其“数据库”使用不同的后端技术。
例如:
/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.