Estou administrando um servidor RedHat onde os usuários fazem login através de SSH com autenticação baseada em chave privada/pub.
Eu gostaria de evitar que eles alterem/excluam/chmoding acidentalmente o conteúdo de suas pastas ~/.ssh . Alguns deles já modificaram recursivamente 777-chmode toda a sua própria pasta pessoal porque “era mais fácil compartilhar arquivos com colegas dessa maneira” e se esfaquearam no pé.
Alguma ideia de como posso conseguir isso? De preferência com sistema de permissão Linux padrão.
A resposta curta é que você não pode.
O SSH é muito exigente quanto às permissões e não brinca com arquivos que não lhe agradam. Além disso, os usuários
ssh_config
são analisados antes da configuração de todo o sistema.Dito isto, pode ser possível colocar os arquivos em outro lugar e montar o diretório como um sistema de arquivos somente leitura
$HOME/.ssh
para cada usuário. (É possível - mas não sei como o ssh e as ferramentas associadas tratariam isso).Então você tem problemas muito maiores de SEGURANÇA e treinamento.
É difícil proteger os usuários de sua própria ignorância e incompetência.
Mas dependendo de quanto você precisa permitir que seus usuários gerenciem a si mesmos e quanto você gerencia para eles: você pode configurar o sshd para procurar chaves em um local alternativo fora de seu diretório inicial e em outro lugar que não seja
~/.ssh/authorized_keys
.Comando de Chaves Autorizadas
Uma solução relativamente complexa é a diretiva que, em vez de depender de arquivos autorizados_keys, especifica um programa a ser usado para pesquisar as chaves públicas do usuário, por exemplo:
/etc/ssh/sshd_config
AuthorizedKeysCommand
um diretório LDAP
um banco de dados
um serviço web (trivial)
ou quando seus nomes de usuário são idênticos aos nomes de usuário do Github, você pode permitir que os usuários se autentiquem com os pares de chaves que eles carregaram lá:
Conforme mencionado nesta resposta ; você precisará criar uma política SELinux adequada para AuthorizedKeysCommand, pois ela será bloqueada pelas políticas padrão.
Adoro essa abordagem, pois ela pode resolver muitos problemas relacionados ao gerenciamento de chaves autorizadas: adiciona gerenciamento centralizado, elimina o problema do ovo e da galinha de obter chaves autorizadas para servidores quando você deseja desabilitar a autenticação de senha no ssh e muito mais.
Ele aproveita o fato de que as chaves públicas não são particularmente sensíveis (ao contrário das chaves privadas associadas), portanto centralizar seu gerenciamento não adiciona risco IMHO e provavelmente até melhora seus recursos de controle e relatórios.
Arquivo de chaves autorizadas
Um pouco menos complexo é armazenar chaves em um diretório fora de seu diretório inicial. Por exemplo, use
/etc/ssh/<username>
(substituindo<username>
pelo nome de usuário real). Este diretório deve ter 755 permissões e pertencer ao usuário. Mova oauthorized_keys
arquivo para ele. O arquivoauthorized_keys ainda deve ter permissões 644 e pertencer ao usuário.Em
/etc/ssh/sshd_config
ajustar aAuthorizedKeysFile
configuraçãoE reinicie o daemon ssh
A melhor solução que consigo pensar é criar
.ssh
e serauthorized_keys
de propriedade do root..ssh/authorized_keys de propriedade da raiz
O SSH é exigente com permissões, mas não sem razão. Primeiro, requer que o próprio usuário tenha acesso de leitura
authorized_keys
(o que requer acesso de leitura a todos os diretórios pai). Em segundo lugar, ele nega acesso se qualquer usuário que não seja o próprio usuário ou root tiver acesso de gravação a/home
,.ssh
ouauthorized_keys
. Isso não permiteo+w
eg+w
para um grupo que contém outros usuários.Esta configuração funciona para mim, o usuário pode fazer login:
Como
.ssh
eauthorized_keys
são de propriedade do root, o usuário não pode alterar as permissões deles ou removê-los. Eles também não podem editar seu próprioauthorized_keys
arquivo.Se quiser permitir que o usuário edite seus arquivos
authorized_keys
, você pode adicionar permissões de gravação em grupo. Isso requer que otest
grupo não tenha outros membros alémtest
dele mesmo:Com qualquer abordagem, o usuário não poderá mais criar seus próprios arquivos em
.ssh
, portanto, você também pode fornecer alguns arquivos extras para eles. Alguns que vêm à mente são:known_hosts
,config
e/id_rsa{.pub,}
ou outros tipos de chave.Alternativa: chattr
Alguns sistemas de arquivos Linux suportam atributos de arquivo , notadamente um sinalizador imutável . Arquivos/diretórios com o sinalizador imutável definido não podem ser excluídos, modificados ou ter suas permissões alteradas. Somente o root pode definir/desmarcar este sinalizador.
Este comando resolveria o problema, mesmo com a propriedade/permissões padrão:
Agora
.ssh
eauthorized_keys
não pode ser modificado de forma alguma, nem mesmo por root. Se o root precisar atualizar esses arquivos, você precisará deleschattr -i
primeiro. Uselsattr
para verificar atributos.Essa abordagem é mais simples, mas menos flexível. Também precisa de suporte ao sistema de arquivos; Acredito que seja compatível com pelo menos ext2/3/4, XFS e btrfs.
ACLs Posix?
Há também Posix ACLs (listas de controle de acesso), que permitem um controle um pouco mais refinado. Não estou muito familiarizado com eles e não tenho certeza se eles ajudam aqui.
Modos Estritos
Nota: altamente desencorajado, mas previsto para ser completo.
O servidor OpenSSH possui uma diretiva de configuração chamada
StrictModes
, que determina o quão exigente é o SSH com permissões:Se você desabilitar essa opção, terá mais liberdade para configurar propriedade e permissões. No entanto, o SSH é rigoroso por padrão por boas razões. Um usuário 777-chmodding em seus arquivos SSH é um risco à segurança.
Execute um cron job para corrigir permissões todas as noites.
Excluir arquivos é um pouco mais difícil. Você também pode restaurar arquivos ausentes do backup do cron. Mas parece que você pode entrar em casos estranhos com isso ... pode precisar de mais inteligência do que um script pode fornecer. Eu começaria aos poucos e adicionaria recursos com cautela a uma função de restauração.