Permissões de arquivos no Linux

Olá a todos. Estamos ativamente nos integrando ao trabalho e já em janeiro preparamos muitos lançamentos poderosos. Entre outros, estamos anunciando a abertura de novas turmas do curso que todos amaram. Administrador Linux. Na antevéspera do lançamento, tradicionalmente compartilhamos a tradução de material útil.

Permissões de arquivos no Linux

As permissões de arquivo oferecem uma alternativa segura para arquivos executáveis SUID, mas podem parecer um pouco confusas à primeira vista.


Todos nós sabemos que os arquivos binários SUID são são uma solução ruim do ponto de vista da segurança.Felizmente, se seu aplicativo requer algumas permissões limitadas, existe uma maneira mais eficiente chamada permissões de arquivo..

Vou economizar seu tempo se você quiser evitar a leitura detalhada do artigo acima: essencialmente, as permissões de arquivo permitem que processos executados no nome do usuário root, e portanto, têm o direito de fazer qualquer coisa, mantenham certas capacidades restritas a esta lista, quando eles desligam as permissões e rodam como um usuário não privilegiado. Isso significa que, se um invasor conseguir comprometer um processo através de um estouro de buffer ou outro exploit, ele não poderá obter nada além de certas permissões mínimas que são realmente necessárias para o processo.

As permissões são ótimas para serviços que geralmente sempre rodam sob o nome do usuário root, mas e quanto às utilitários de linha de comando? Felizmente, isso também é suportado, desde que você tenha as utilitários adequadas instaladas. Se você estiver usando o Ubuntu, precisará do pacote libcap2-bin.Você também precisará rodar um núcleo não arcaico (a partir da versão 2.6.24).

Essas funções permitem vincular permissões a arquivos executáveis de forma semelhante à configuração do bit SUID, mas apenas para um conjunto específico de permissões. A ferramenta setcap é usada para adicionar e remover permissões de um arquivo.

O primeiro passo é escolher as permissões que você precisa. Para este artigo, suponho que existe uma ferramenta de diagnóstico de rede chamada tracewalk, que deve ser capaz de utilizar sockets brutos.Normalmente, isso requer que o aplicativo seja executado sob o nome do usuário root, mas ao examinar lista descobrimos que só é necessária a permissão CAP_NET_RAW..

Assumindo que você esteja no diretório onde o executável está localizado tracewalk, você pode adicionar essa permissão da seguinte forma:

sudo setcap cap_net_raw=eip tracewalk

Ignore o sufixo por enquanto =eip para a permissão, falarei sobre isso em alguns segundos. Observe que o nome da permissão está em letras minúsculas. Agora você pode verificar se configurou as permissões corretamente com:

setcap -v cap_new_raw=eip tracewalk

Ou você pode listar todas as permissões definidas para o executável:

getcap tracewalk

Para sua informação, você também pode remover todas as permissões do executável usando:

setcap -r tracewalk

Nesse ponto, você deve ser capaz de executar o arquivo executável como um usuário não privilegiado, e ele deve ser capaz de trabalhar com sockets brutos, mas não ter nenhuma outra privilégio que o usuário root possui.

Então, o que significa esse estranho sufixo =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efetivas, herdáveis e permitidas (effective, inheritable e permitted):

  • Efetivas (Effective) as permissões são aquelas que determinam o que o processo pode realmente fazer. Por exemplo, ele não pode lidar com sockets brutos se CAP_NET_RAW. não estiver no conjunto efetivo.
  • Permitidas (Permitted) as permissões são aquelas que o processo está autorizado a ter se as solicitar com a chamada apropriada. Elas não permitem que o processo realmente faça nada, a menos que tenha sido especificamente escrito para solicitar a permissão especificada. Isso permite que os processos sejam escritos para adicionar permissões especialmente importantes ao conjunto efetivo apenas pelo tempo em que realmente são necessárias.
  • Herdáveis (Inheritable) as permissões são aquelas que podem ser herdadas no conjunto disponível do processo filho gerado. Durante a operação fork() ou clone() o processo filho sempre recebe uma cópia das permissões do processo pai, uma vez que nesse momento ele ainda está executando o mesmo executável. O conjunto herdável é usado quando exec() (ou equivalente) é chamado para substituir o executável por outro. Nesse ponto, o conjunto disponível do processo é mascarado pelo conjunto herdável para obter o conjunto disponível que será usado para o novo processo.

Assim, a ferramenta setcap permite-nos adicionar permissões desses três conjuntos de forma independente para este executável. Observe que o valor do grupo é interpretado de forma um pouco diferente para as permissões de arquivos:

  • Fontes de alimentação as permissões de arquivo são aquelas que sempre estão disponíveis para o executável, mesmo que o processo pai que o chamou não as possuísse. Antigamente eram conhecidas como permissões 'forçadas'.
  • Herdadas as permissões de arquivo definem uma máscara adicional que também pode ser usada para remover permissões do conjunto do processo chamador. Elas são aplicadas além do conjunto herdado do processo chamador, portanto, a permissão só é herdada se existir em ambos os conjuntos.
  • Eficazes as permissões de arquivo na verdade representam apenas um bit, e não um conjunto, e se estiver configurado, isso significa que todo o conjunto disponível também é copiado para o conjunto efetivo do novo processo. Isso pode ser usado para adicionar permissões a processos que não foram especificamente escritos para solicitá-las. Como esse é um bit, se você o configurar para alguma permissão, ele deve ser configurado para todas as permissões. Você pode pensar nele como um bit legado, pois é usado para permitir o uso de permissões para aplicativos que não as suportam.

Ao especificar permissões através de setcap três letras e, i e p referem-se a efetivo, herdado e acessível conjuntos, respectivamente. Assim, a especificação anterior:

sudo setcap cap_net_raw=eip tracewalk

indica que a permissão CAP_NET_RAW. deve ser adicionada aos conjuntos disponíveis e herdados e que o bit efetivo deve ser definido. Isso substituirá quaisquer permissões anteriormente estabelecidas no arquivo. Para definir várias permissões ao mesmo tempo, use uma lista separada por vírgulas:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

O guia de permissões discute tudo isso em mais detalhes, mas, espero, esta postagem desmistificou um pouco o que está acontecendo. Resta apenas mencionar algumas advertências e truques.

Primeiro, as capacidades de arquivo não funcionam com links simbólicos — você deve aplicá-las ao próprio arquivo binário (ou seja, ao destino do link simbólico).

Em segundo lugar, eles não funcionam com scripts interpretados. Por exemplo, se você tiver um script Python ao qual deseja atribuir permissões, deve atribuí-las ao próprio interpretador Python. Isso é, evidentemente, um potencial problema de segurança, pois, assim, todos os scripts executados com esse interpretador terão a permissão especificada, embora ainda seja muito melhor do que fazer SUID. A solução mais comum parece ser escrever um executável separado em C ou equivalente, que possa realizar as operações necessárias e chamá-lo a partir do script. Isso é semelhante à abordagem utilizada pelo Wireshark, que utiliza um arquivo binário. /usr/bin/dumpcap para executar operações privilegiadas:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Em terceiro lugar, as permissões de arquivos são desativadas se você usar uma variável de ambiente LD_LIBRARY_PATH por razões de segurança óbvias(1). O mesmo se aplica a LD_PRELOAD, pelo que sei.

1. Como um invasor, evidentemente, pode substituir uma das bibliotecas padrão e usar LD_LIBRARY_PATH, para fazer com que sua biblioteca seja chamada em vez da sistema, e, assim, ter seu próprio código arbitrário executado com os mesmos privilégios que o aplicativo chamador.

Isso é tudo. Detalhes sobre o programa do curso estarão disponíveis no webinar que ocorrerá em 24 de janeiro.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster