この問題について:
パトレースの行動を観察している間、私は心配な点を見つけました。以下は、「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」に変換する必要があります。パスワードを取得/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
ファイルには1行、特に次の行があります。
passwd: files
この行はNSSに「データベース」「passwd」を見つける場所を伝えます。この行は、リソースがファイルにあることをNSSに伝えます。その後、システムはファイルを開き、/etc/passwd
ユーザーのホームディレクトリを見つけます。
メモ:もっと詳しく見ると、この動作はBashによって引き起こされたようです。 Bashを実行すると、strace
同じ結果が表示されます。
$ 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.