Por que o setuid é ignorado nos diretórios?

19

Nos sistemas Linux, é possível com êxito chmod u+s $some_directory, mas, em vez de forçar a propriedade de novos subdiretórios e arquivos a ser o proprietário do diretório que contém (e também definir subdiretórios u+s) conforme o esperado, o sistema simplesmente ignora o bit setuid. Os subdiretórios e arquivos continuam a herdar os UIDs de seus processos de criação, e os subdiretórios não são configurados por padrão.

Por que o setuid é ignorado nos diretórios e como posso fazer com que o sistema o reconheça?

Luz Negra brilhando
fonte
Gostaria de saber se a opção de montagem "nosuid" pode afetar isso.
Heptite 9/09/12
O sistema de arquivos em questão não está montado nosuid- embora exista outro (um ramdisk /dev/shm) que / esteja / montado nosuid, e pareça tratar o setuidbit exatamente da mesma maneira. 6_9
Blacklight Shining
11
Veja também: serverfault.com/questions/371541/…
jjlin
2
Quanto à sua implementação, o código fonte do Linux está prontamente disponível, fique à vontade para implementar esse recurso. Como ele já existe no FreeBSD, você pode facilmente copiar o código, tenho certeza. Obviamente, esses bits ainda não teriam sentido no sistema Linux de ninguém.
Mikebabcock #

Respostas:

16

Lembre-se de que os bits setuid e setgid foram inventados para uma finalidade completamente diferente: fazer com que um executável seja executado com o uid ou gid do proprietário, em vez do uid ou gid do usuário que está executando o arquivo. Qualquer outro uso é apenas um recurso extra.

Esses bits não têm função em arquivos comuns que não são executáveis. (E também shell scripts em algumas distros, devido a problemas de segurança.) Originalmente, eles também não tinham função para diretórios. Obviamente alguém decidiu que seria legal usar o setgid não utilizado nos diretórios e usá-lo para reforçar a consistência da propriedade do grupo. Afinal, se você está jogando com a propriedade do grupo, é porque mais de uma pessoa está trabalhando com o arquivo, e provavelmente faz sentido que todos os arquivos em um determinado diretório pertençam ao mesmo grupo, independentemente de quem os criou. Aborrecimentos devido a alguém esquecendo de executar o newgrp são eliminados.

Então, por que não implementar o mesmo recurso para setuid e uid do arquivo? Bem, uid é muito mais básico que gid. Se você implementar isso, geralmente um arquivo não pertencerá ao usuário que o criou! Presumivelmente, o usuário ainda pode modificar o arquivo (supondo que a umask seja algo sensato), mas não pode alterar os bits de permissão. Difícil de ver a utilidade disso.

Isaac Rabinovitch
fonte
Eu gostaria que fosse implementado, mesmo que apenas por uma questão de consistência ... X3 De qualquer forma, uma solução alternativa, como um cronjob, para periodicamente passar e alterar a propriedade, / existe / existe alguma maneira de forçar a propriedade do arquivo?
Blacklight Shining
4
Fico tentado a citar Emerson sobre Consistência tola. Antes de me convencer de que é um recurso desejável, você terá que me mostrar um caso de uso em que faz sentido.
Isaac Rabinovitch
11
O FreeBSD chmod (2) na verdade tem alguma discussão sobre isso, mas menciona apenas que geralmente não deve ser usado devido a "falhas de segurança" não especificadas. Eu suspeito que a maioria dos outros Unixes não adotou esse recurso porque, enquanto ele tem alguns casos de uso, não é que terrivelmente útil.
Jjlin 12/09/12
11
"Difícil de ver a utilidade disso" -> configurada em um diretório pessoal, para que scripts de provisionamento executando como root não se esqueçam de mostrar algo por acidente?
ufotds
11
a execução de scripts de superusuário em seu diretório home é uma péssima idéia
Isaac Rabinovitch
7

Acredito que a resposta a esta pergunta esteja relacionada aos problemas de segurança da "distribuição de arquivos" que resultaram na maioria dos sistemas operacionais semelhantes ao Unix modernos, não permitindo a "distribuição de arquivos". "Distribuição de arquivo" é quando um usuário que não é superusuário altera a propriedade de um arquivo para alguém que não seja esse usuário. Esse recurso oferece muitas oportunidades para travessuras.

Como as doações de arquivos não são permitidas, o setuid nos diretórios, que executariam a mesma função em outro formulário, não é permitido ou será ignorado se definido.

Quanto à alteração do comportamento, você precisaria modificar as bibliotecas e utilitários do SO.

Yedric
fonte
2

Um bom caso de uso para implementá-lo é o seguinte:

Digamos que você tenha um servidor de vários sites com três sites seguros. Você tem 3 grupos criados, um para cada um dos diferentes mantenedores de sites. Todos os arquivos em todos os sites precisam pertencer ao usuário apache, para que o apache possa ler e gravar neles (drupal / wordpress, etc).

Se o setuid, mas funcionou como o bit setgid para permissões de diretórios, seria algo como isto:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

Dessa forma, cada grupo de mantenedores tinha acesso para ver e tocar apenas seu conteúdo, mas o usuário do servidor da Web apache poderia servir todo o conteúdo e não é necessário que os usuários se preocupem em alterar a propriedade dos arquivos enviados.

Outro caso de uso é para uploads anônimos de ftp / http ou mesmo sftp / ssh. O grupo e o GID no diretório de upload seriam raiz, assim como o proprietário e o UID. As outras permissões seriam -wx. Isso permitiria que todos escrevessem acesso ao diretório de upload, mas não poderiam ler nada depois que o upload fosse feito e o root possuiria todos os arquivos recém-criados.

Portanto, existem dois casos de uso válidos e perfeitamente bons para habilitar a funcionalidade UID nos diretórios para corresponder ao bit GID.

Steven Mercurio

user297422
fonte
11
Isso não parece abordar a pergunta que foi feita.
22614 Kevin Panko
2
@KevinPanko Não, não responde à minha pergunta. Pode até ser fora de tópico para o site (“para que serve um caso de uso <nonexistent feature X>?”). No entanto, pertence à minha pergunta, e eu, como solicitante, acho útil.
Blacklight Shining
0

Um pouco atrasado para a festa, mas no caso de futuros leitores tropeçarem nisso;) Como afirmado por outros, em um sistema de arquivos OS-X padrão, o setUID para diretórios é ignorado - e não parece haver uma maneira fácil de contornar isso ( mount -o.... ou o que não). Como tantas vezes, a página de manual na verdade não está em conformidade com o comportamento do OS-X, literalmente:

4000 (o bit set-user-ID-on-Execution) [...] Diretórios com o set-user-id bit definido forçarão todos os arquivos e subdiretórios criados neles a pertencer ao proprietário do diretório e não a o uid do processo de criação [...]

mas também lista a possibilidade de obter o mesmo efeito sem abrir mão da propriedade original. O Linux usa '[g /] setfacls' para efeitos semelhantes (são permissões que não são realmente visíveis à primeira vista, portanto, às vezes, pode ser um incômodo).

Quanto ao 'como posso obter efeitos semelhantes', leia a página de manual inteira e brinque com:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

você pode verificar via

ls -le

se tudo parece bem. Outras opções incluem inserir regras em posições específicas, remover ou substituir regras específicas. As duas opções dignas de nota aqui são " file_inherite directory_inherit" permitindo que as regras sejam anexadas a um novo diretório / arquivo.

Eu não gosto muito de usar o setUID, mas o setGID é muito útil em servidores de arquivos, onde simplesmente definir o grupo 'principal' não funciona ou os clientes têm máscaras de arquivos que não permitem a gravação em grupo. Isso seria resolvido por:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup
Keith
fonte
Bem-vindo ao Stack Exchange! Essa é uma boa resposta, embora, no que se refere ao OS X, e não às distribuições Linux (que, como você mencionou, use um sistema ACL diferente), não pareça tão relevante aqui. Definitivamente, seria uma boa opção para uma pergunta sobre como fazer com que o OS X honre diretórios setuid; talvez você deva postar uma ?
Blacklight Shining
A propósito, o pouco que você deixou de fora da página de manual do OS X chownparece realmente muito importante! “[…] Se o sistema de arquivos subjacente suportar esse recurso: consulte chmod (2) e a opção suiddir para montar (8).” Na verdade, eu nunca tinha notado isso antes. Se o HFS for implementado suiddir, você poderá fazer isso acontecer em um sistema OS X comum.
Blacklight Shining
(E as ACLs do OS X são "tão pouco visíveis à primeira vista" quanto as ACLs do Linux.)
Blacklight Shining
0

Bem, deve respeitar o padrão. Posso pensar em alguns cenários com o sftp - apenas que isso me salvaria de muitos problemas, tanto com o acl quanto com o conjunto de máscaras acl que o sshd faz, e a redefinição que devo fazer com essa máscara.

A segurança por padrão é bastante útil, mas se você não a fizer, está apenas criando um pesadelo.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

De qualquer forma, é como o Linux funciona agora, então use apenas ACLs para solucionar esses problemas.

user576407
fonte
-1

De acordo com http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories, o bit setuid é ignorado para diretórios nos sistemas UNIX e Linux. É possível fazê-lo agir como você espera no FreeBSD.

mikebabcock
fonte
Inútil - perguntei por setuidque os diretórios foram ignorados e se era possível reconhecê-lo no Linux.
Blacklight Shining
Parece óbvio que ele é ignorado no Linux porque é ignorado no Unix, o que torna o comportamento correto para o Linux se encaixar no real * nix. Sinta-se livre para ler o artigo em questão. Mesma resposta em greenend.org.uk/rjk/tech/perms.html partir de 2004, também uma duplicata de serverfault.com/questions/371541/...
mikebabcock
Então, por que isso é ignorado no Unix?
Isaac Rabinovitch
@IsaacRabinovitch desde que o Blacklight deixou claro que a questão é sobre Linux, isso não é relevante, mas suspeito que seja um comportamento simplesmente indefinido, em que vários Unixes fizeram coisas diferentes com ele e não fazer nada é uma suposição mais segura.
Mikebabcock # 10/12
A pergunta / é / marcada linux, sim, mas isso não significa que eu prefiro uma resposta vaga: “É feita dessa maneira porque outros sistemas fazem dessa maneira”, para uma resposta que explica por que é feita dessa maneira em outros sistemas. (Talvez a linuxtag deve simplesmente ser removido?)
Blacklight Brilhante