Como posso encontrar qual usuário está acessando um arquivo usando strace?

1

Meu problema real é que o Nginx não é capaz de processar páginas (proibido 403), apesar de as permissões estarem configuradas apropriadamente (na minha opinião)

O diretório de stackoverflow no local padrão:

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

O diretório de stackoverflow na localização do usuário:

[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

Arquivo de configuração:

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

O que falha mostra um erro 403 proibido. Para chegar à raiz do problema, Eu estou usando o seguinte comando e navega usando meu navegador, que produz a saída como mostrado abaixo ...

[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)

A saída, como você pode ver, é Permission Denied. Gostaria de saber qual conta de usuário foi usada para acessar o arquivo? Como posso me aprofundar ainda mais?

EDITADO a pergunta com novas permissões.

    
por Rahul Soni 08.03.2016 / 04:55

3 respostas

2

O problema está claro em sua saída:

[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

O arquivo e o diretório contido são acessíveis ao nginx, mas as permissões do diretório pai são drwx------ , e isso bloqueará o acesso a esse diretório e a todos os seus filhos.

Você precisa verificar os privilégios de acesso para cada nível de diretório até e incluindo a raiz.

    
por 16.03.2016 / 11:09
1

Você pode ver o euid atual de um processo Observando /proc/PID/status . Se euid ou uid forem 0, verifique as listas audit.log e POSIX ACL do selinix no diretório via getfacl

    
por 11.03.2016 / 22:32
0

Você pode ver o acesso atual ao arquivo usando o comando list open files, lsof . Abaixo está algum exemplo de saída.

# 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

Exemplo 2 - + D = recursivo:

# 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 lhe dará alguns exemplos adicionais.

    
por 15.03.2016 / 01:29