Finalidade de permissões como 0111 ou 0333

17

Qual é o objetivo das permissões do Linux, como 111 ou 333 (ou seja, o usuário pode executar , mas não pode ler o arquivo), se a capacidade de executar não implica automaticamente a capacidade de ler?

trolley813
fonte
1
Você tem um exemplo para essa configuração? Eu acho que você está certo. Você não pode executar o que não pode ler. Essas combinações são apenas teóricas no espaço de permissões entre 0000 e 0777. Observe que o 0 inicial deve ser adicionado para mostrar a base octal do número.
ikrabbe
6
A menos que seja um script (por exemplo, shell-script), você realmente não precisa de permissão de leitura para executar um comando. Um executável "normal" - por exemplo. su, bash ou vi - basta definir o bit executável para permitir que um usuário o execute. Um arquivo que não pode ser lido, não pode ser copiado . Portanto, ao não permitir que um usuário copie um comando importante de segurança (como su), ele é impedido de fazer sua própria cópia - e também de tentar desmontá-lo. * O BSD possui vários comandos com permissão de execução, mas sem leitura.
Baard Kopperud

Respostas:

25

Eu brinquei com ele e, aparentemente, permissões executivas não implicam permissões de leitura. Os binários podem ser executáveis ​​sem serem legíveis:

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied

Porém, não consigo executar scripts, a menos que tenham os bits de permissão de leitura e execução em:

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied
PSkocik
fonte
4
Isso está correto, pois o segundo exemplo usa o #! para iniciar porque ele perde o cabeçalho ELF e, portanto, exige que o arquivo seja legível para que ele possa adivinhar qual executável usá-lo. Essa é uma situação comum em que você deseja proteger o conteúdo dos arquivos para que não sejam copiados para outros locais. Um gerenciador de licenças é um exemplo comum de onde você veria isso.
hspaans
1
Observe que você ainda pode ler um binário somente executável: unix.stackexchange.com/a/34294
太郎
6
@hspaans: O shebang é tratado pelo kernel, e o kernel não se importa com pequenas coisas como permissões. É o shell (ou intérprete) que precisa de acesso de leitura. O kernel é executado (digamos) /bin/bash hw.she, em seguida, o bash tenta abrir hw.shpara leitura (e falha).
Kevin
2
Eu espero que o kernel se importe com permissões. Nada mais faz. O que a sentença assustadora na postagem de @ Kevin significa é que o kernel requer apenas permissões de execução para executar arquivos, independentemente de eles usarem o shebang.
Emil Jeřábek apoia Monica 07/07
2
@ EmilJeřábek O kernel se preocupa com permissões ao decidir o que um processo de aplicativo pode fazer. Mas, como é o componente que implementa as permissões, ele também pode ignorá-las internamente. Portanto, ele pode ler a linha shebang ao determinar como executar um arquivo interpretado ou ler o conteúdo de um arquivo binário somente de execução na memória.
Barmar 08/07/2015
16

faz sentido para diretórios, por exemplo, se você mantiver executáveis ​​(secretos) em um diretório específico e permitir que os usuários chamem esses arquivos sem poder ver o conteúdo do diretório (mas sabendo que um arquivo específico existe depois que você os informou!). 333 comparado a 111 permite gravar / excluir arquivos de / para esses diretórios sem poder ver o conteúdo do diretório.

Afsin Toparlak
fonte
5
Na minha universidade, essas permissões foram usadas para soltar tarefas em um diretório sem que os alunos vissem os outros trabalharem. O palestrante era velho skool.
DarkHeart 6/07/2015
@DarkHeart Interesting. Espero que você tenha adicionado um componente aleatório aos nomes dos arquivos, porque, caso contrário, se isso não for um incentivo para tentar copiar de seus colegas de classe, não sei o que é.
PSKocik 07/07/2015
5

Obviamente, nem todas as combinações são úteis, mas para usar a que você mencionou especificamente ... Na verdade, você não precisa de readpermissão para executar um arquivo - apenas executepermissão - a menos que o arquivo em questão seja um script (por exemplo, um shell-script ( .sh), script perl ( .pl) e assim por diante). Binários normais podem ser executados apenas com a executepermissão. No * BSD-systmes, vários executáveis ​​dão executepermissão sem permissão read, especialmente em comandos "importantes para a segurança" - por exemplo su.

Então, por que não dar aos usuários readpermissão (e apenas executepermissão)? Como um arquivo que não pode ser lido por um usuário, também não pode ser copiado por esse usuário! A remoção da readpermissão evita que os usuários façam suas próprias cópias "pessoais" de executáveis ​​- que eles poderão mais tarde abusar (por exemplo, obter SUID=root on).

E não ter write-permission, impede que um arquivo seja excluído com precisão.

Lembre-se de que não é permitido conceder nem- readnem- writepermissão ao proprietário, mas às vezes pode ser uma boa idéia impedir que ownerapenas o arquivo seja excluído . É claro que o owner- para não mencionar root- sempre pode contornar essas medidas, se não de outras maneiras, e simplesmente pela chmodpermissão no arquivo.

Baard Kopperud
fonte
"pode ​​ser uma boa idéia impedir que ownerapenas o arquivo seja excluído." - exceto que você não precisa de nenhum tipo de permissão em um arquivo (leitura, gravação ou execução) para excluí-lo.
Celada
Os executáveis ​​prontos para uso podem ser usados, por exemplo, se o executável incorporar uma senha de banco de dados que ele usa quando executado para se conectar a um banco de dados e fazer seu trabalho, mas não deseja necessariamente revelar a senha.
Celada
@ Celada, é uma pergunta antiga, mas essa abordagem não seria suscetível ao despejo de memória pesquisando as compensações da região da memória /proc/${PID}/mapse lendo as seções relevantes da memória /proc/${PID}/mem? Ou restringir as permissões no arquivo do executável também restringe as permissões de leitura em suas seções relevantes na memória durante a execução? (Este último parece improvável, IMO.)
Spencer D