Quando o chmod falha?

8

Sob que circunstâncias chmodfalhará?

Eu olhei para a página de manual, mas ela apenas especifica o uso e não entra em detalhes sobre em que circunstâncias não funcionará.

Eu diria que chmodfuncionará se:

  • você é raiz
  • você é o proprietário do arquivo de destino (e está definindo um bit de modo mundano, ou seja, não é pegajoso, outros)

Os usuários podem usar chmodpara alterar as permissões em um arquivo ao qual têm acesso de grupo? Está relacionado ao acesso de leitura / gravação?

Wug
fonte
2
Ele falhará se o inode não puder ser modificado, por exemplo, o sistema de arquivos é somente leitura.
Jordanm 22/10

Respostas:

3

Somente o proprietário do arquivo, ou o usuário root, pode alterar as permissões de um arquivo. As permissões atuais no arquivo ou em seu diretório pai são irrelevantes¹. Isso é especificado no POSIX :

O aplicativo deve garantir que o ID do usuário efetivo do processo corresponda ao proprietário do arquivo ou que o processo tenha privilégios apropriados para fazer isso.

Na maioria das unidades, "privilégios apropriados" significa executar como root. Se essas condições não forem atendidas, chmodgeralmente falhará EPERM, embora outros comportamentos, como interromper o programa devido a uma violação de segurança, sejam permitidos.

Além disso, algumas variantes do unix têm maneiras específicas de sistema de autorizar ou proibir chmod. Por exemplo, o Linux possui um recurso ( CAP_FOWNER) que permite que os processos alterem as permissões de um arquivo e outros metadados, independentemente de seu proprietário.

Há outros motivos chmodpara falhar, mesmo que o arquivo exista, esteja acessível e possua o proprietário apropriado. Os mais comuns incluem um sistema de arquivos somente leitura ou um sistema de arquivos que não suporta permissões como o FAT. As menos comuns incluem restrições específicas do sistema, como o atributo imutável no sistema de arquivos ext2 e sucessores do Linux.

¹ Exceto na medida em que o processo em execução chmoddeve poder acessar o arquivo, portanto, ele deve ter permissão de execução no diretório que contém o arquivo e em qualquer outro diretório que ele percorrer para fazê-lo.

Gilles 'SO- parar de ser mau'
fonte
2

Os detalhes que você deseja estão na página de manual da chamada de sistema chmod (). Em vez de man chmodusar man 2 chmod. man chattre man 2 setxattrlhe interessará também; os atributos de arquivo configurados por chattr / setxattr () aumentam o comportamento das permissões tradicionais do Unix definidas pelo chmod.

Kyle Jones
fonte
Vou tentar isso quando sair do trabalho.
Wug
1

De acordo com o padrão UNIX, "O ID do usuário efetivo do processo deve corresponder ao proprietário do arquivo ou o processo deve ter privilégios apropriados para fazer isso".

A parte sobre privilégios apropriados precisa de alguma explicação. Nos sistemas tradicionais, o chmod é permitido em todos os arquivos quando o UID efetivo (no Linux, o UID do sistema de arquivos, mas veja abaixo) do processo é 0 [ou seja, root].

O Linux possui um sistema chamado capacidades , e o CAP_FOWNERbit controla a capacidade de usar chmodem todos os arquivos. Por padrão, todos os recursos são concedidos quando uma execve()chamada cria um processo raiz (executando um binário setuid ou quando o UID real é 0) ou quando o UID efetivo é definido como 0 (e removido quando é definido com um valor diferente de zero) , e um conjunto de recursos, inclusive, CAP_FOWNERé ativado quando o UID do sistema de arquivos é definido como 0 (e desativado quando é definido como um valor diferente de zero). Leia a página de manual para mais detalhes.

Você mencionou o bit fixado, mas omitiu o fato de que os usuários também não podem definir o bit setgid em um arquivo quando não estão no grupo designado ao arquivo. O bit setuid ou setgid também pode ser ignorado em circunstâncias adicionais definidas pela implementação.

Random832
fonte
0

Os usuários podem usar o chmod para alterar as permissões em um arquivo ao qual têm acesso de grupo?

Por que você simplesmente não tenta ver?

$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted
dubiousjim
fonte
Fui cutucando, mas isso está relacionado à segurança e não quero perder acidentalmente um caso de ponta.
Wug
Se você estiver preocupado com um caso extremo, você pode (pelo menos para minimizar os riscos) chmode, em seguida, verificar as permissões nele. Se você estiver se sentindo paranóico, faça um fsyncantes de verificar.
Nanofarad