当我尝试访问以该用户身份运行的 nginx 工作进程的符号链接时,遇到“权限被拒绝”错误adg
。
类似问题:Owner can't read /proc/$pid/io,但略有不同。我的问题是无法访问符号链接,并且 的输出ls -l
包含“Permission denied”错误(来自 stderr)和正常结果(来自 stdout)。具体输出如下:
- 打印nginx worker进程及它的fd信息:
root# ps -fp 2728114
UID PID PPID C STIME TTY TIME CMD
adg 2728114 2723696 0 21:11 ? 00:00:00 nginx: worker process
root# stat /proc/2728114/fd/0
File: /proc/2728114/fd/0 -> /dev/null
Size: 64 Blocks: 0 IO Block: 1024 symbolic link
Device: 0,21 Inode: 204114580 Links: 1
Access: (0700/lrwx------) Uid: ( 948/ adg) Gid: ( 948/ adg)
ls -l
与adg
用户和用户一起执行root
:
root# sudo -uadg ls -l /proc/2728114/fd/0
ls: cannot read symbolic link '/proc/2728114/fd/0': Permission denied
lrwx------ 1 adg adg 64 Aug 20 21:12 /proc/2728114/fd/0
root# sudo -uadg -gadg /bin/sh -c 'ls -l /proc/2728114/fd/0'
ls: cannot read symbolic link '/proc/2728114/fd/0': Permission denied
lrwx------ 1 adg adg 64 Aug 20 21:12 /proc/2728114/fd/0
root# ls -l /proc/2728114/fd/0
lrwx------ 1 adg adg 64 Aug 20 21:12 /proc/2728114/fd/0 -> /dev/null
- 检查用户和组:
root# grep adg /etc/passwd
adg:x:948:948::/home/adg:/sbin/nologin
root# id -nu 948; id -ng 948
adg
adg
- 检查状态
selinux
root# sestatus
SELinux status: disabled
root
用户可以正常访问 fd,但所有者不能,有人可以帮助我解决这个问题吗?
如果某个进程曾经以提升的权限运行,则其下的很多文件
/proc/<pid>
将只有 root 才能访问。即使该进程放弃所有提升的权限,情况仍然如此。这是一种安全措施:该进程可能有权访问其用户不应访问的额外信息。例如,进程可能打开了目录中用户无法读取的文件,并在放弃提升的权限的同时保持该文件打开。用户不应访问该文件的名称,因为这将违反目录上缺少读取权限的规定。
我猜测在你的系统上,nginx 是以提升的权限启动的 — — 大概是
CAP_NET_BIND_SERVICE
为了允许它绑定低于 1024 的端口。由于 nginx 是以提升的权限启动的,所以只有 root 可以访问该进程的大多数内省接口,比如/proc/<pid>/fd
列表。(您可能会争辩说,如果授予程序的唯一权限是
CAP_NET_BIND_SERVICE
,那么它就不可能获得文件系统的任何额外权限,因此可以安全地公开其打开的文件路径。但跟踪这一点需要大量额外的工作和微妙的安全规则,而好处却很少,所以内核不会试图那么复杂。)