strace를 사용하여 어떤 사용자가 파일에 액세스하고 있는지 어떻게 알 수 있나요?

strace를 사용하여 어떤 사용자가 파일에 액세스하고 있는지 어떻게 알 수 있나요?

내 실제 문제는 권한이 적절하게 설정되었음에도 불구하고 Nginx가 페이지(403 Forbidden)를 렌더링할 수 없다는 것입니다(제 생각에는).

기본 위치의 stackoverflow 디렉터리:

user1@wfe1 ~]$ ls /usr/share/nginx/html/stackoverflow/ -al
total 4
drwxr-xr-x. 2 root root 23 Mar  9 02:59 .
drwxrwxr-x. 4 root www  89 Mar  9 02:59 ..
-rw-r--r--. 1 root root  6 Mar  9 02:59 index.html

사용자 위치에 대한 stackoverflow 디렉터리:

[user1@wfe1 ~]$ ls stackoverflow/ -al
total 4
drwxr-xr-x. 2 root  root  23 Mar  9 02:52 .
drwxr-xr-x. 3 nginx nginx 79 Mar  9 02:51 ..
-rw-r--r--. 1 root  root   6 Mar  9 02:52 index.html

구성 파일:

server{
   listen           80;
   server_name localhost;
   root /usr/share/nginx/html/stackoverflow; #Works
   #root /home/user1/stackoverflow;          #Doesn't work
   index index.html;
}

실패하면 403 Forbidden 오류가 표시됩니다. 문제의 원인을 찾기 위해 다음 명령을 사용하고 브라우저를 사용하여 검색했는데 결과는 다음과 같습니다.

[root@wfe1 user1]# sudo strace -p 9114 -e trace=file
Process 9114 attached
stat("/home/user1/stackoverflow/index.html", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
open("/home/user1/stackoverflow/index.html", O_RDONLY|O_NONBLOCK) = -1 EACCES (Permission denied)
open("/home/user1/stackoverflow/favicon.ico", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)

출력이 Permission Denied로 표시되는 것을 볼 수 있습니다. 파일에 액세스하는 데 어떤 사용자 계정이 사용되는지 알고 싶습니다. 어떻게 더 자세히 알아볼 수 있나요?


새로운 권한으로 질문이 수정되었습니다.

답변1

문제는 출력에서 ​​분명합니다.

[root@wfe1 user1]# ls -al site3
total 8
drwxr-xr-x. 2 nginx nginx   23 Mar  6 06:12 .
drwx------. 5 user1 user1 4096 Mar  6 06:12 ..
-rwxr-xr-x. 1 nginx nginx    6 Mar  6 06:12 index.html

nginx는 파일과 해당 파일이 있는 디렉터리에 모두 액세스할 수 있지만 해당 권한은상위 디렉토리drwx------, 이렇게 하면 이 디렉터리와 모든 하위 디렉터리에 대한 액세스가 차단됩니다.

루트 디렉터리까지 포함하여 각 디렉터리 수준에서 액세스 권한을 확인해야 합니다.

답변2

를 보면 프로세스의 현재 euid를 볼 수 있습니다 /proc/PID/status. euid 또는 uid가 0인 경우 다음을 수행하여 audit.log디렉터리의 selinix 및 POSIX ACL 목록을 확인합니다.getfacl

답변3

list open files 명령을 사용하여 파일에 대한 현재 액세스 권한을 볼 수 있습니다 lsof. 다음은 일부 샘플 출력입니다.

# lsof

COMMAND  PID       USER   FD      TYPE     DEVICE  SIZE/OFF       NODE NAME
init       1       root  cwd       DIR        8,1      4096          2 /
init       1       root  txt       REG        8,1    124704     917562 /sbin/init
init       1       root    0u      CHR        1,3       0t0       4369 /dev/null
init       1       root    1u      CHR        1,3       0t0       4369 /dev/null
init       1       root    2u      CHR        1,3       0t0       4369 /dev/null
init       1       root    3r     FIFO        0,8       0t0       6323 pipe

예시 2 - +D = 재귀적:

# lsof +D /var/log/

COMMAND   PID   USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd  488 syslog   1w   REG    8,1     1151 268940 /var/log/syslog
rsyslogd  488 syslog   2w   REG    8,1     2405 269616 /var/log/auth.log
console-k 144   root   9w   REG    8,1    10871 269369 /var/log/ConsoleKit/history

Man lsof몇 가지 추가 예를 들어보겠습니다.

관련 정보