Início
» LINUX
»
Como restringir usuários SSH a diretórios específicos no Ubuntu 24.04
Como restringir usuários SSH a diretórios específicos no Ubuntu 24.04
A maneira mais segura de restringir usuários SSH a um diretório específico no Ubuntu 24.04 é usar o OpenSSH ChrootDirectorycom o parâmetro `--ssh-dir` ForceCommand internal-sftp. Isso é ideal quando a conta precisa apenas de transferência de arquivos. O parâmetro `--ssh-dir` fornece ao usuário uma visualização SFTP cujo diretório raiz do sistema de arquivos é o diretório escolhido, bloqueando, ao mesmo tempo, o shell interativo e o encaminhamento SSH.
Se o usuário realmente precisa de um shell normal, a decisão é diferente. Um shell interativo em chroot requer seu próprio binário de shell, bibliotecas, nós de dispositivo e arquivos de suporte dentro do ambiente chroot. O OpenSSH documenta isso explicitamente. Para a maioria das contas de upload, backup, agências, fornecedores e hospedagem compartilhada, um chroot somente com SFTP é muito mais simples e menos propenso a erros. Para usuários não confiáveis que precisam de um ambiente de linha de comando completo, um contêiner ou uma máquina virtual dedicada geralmente é mais fácil de manter do que construir um chroot de shell manualmente.
Este guia utiliza o Ubuntu 24.04 LTS e um usuário de exemplo chamado alice. O usuário terá acesso restrito /srv/sftp/alicee poderá escrever apenas dentro de /files. Substitua os nomes e caminhos para adequá-los ao seu servidor.
Antes de começar: entenda a regra de propriedade
A falha mais comum em ambientes chroot é causada por problemas de permissões. O OpenSSH exige que todos os componentes do ChrootDirectorycaminho pertençam ao usuário root e não sejam graváveis por grupos ou outros usuários . Esse requisito é verificado incondicionalmente. Isso significa que você não deve permitir que /srv/sftp/aliceo usuário gravável (por exemplo, `/etc/chroot`) seja especificado alice.
Em vez disso, torne o diretório raiz da jail de propriedade do root e crie um diretório filho gravável:
Este projeto segue o comportamento documentado no manual do Ubuntu 24.04sshd_config(5) . O mesmo manual observa que internal-sftpnão são necessários arquivos de tempo de execução adicionais dentro do chroot, razão pela qual é a melhor opção para uma conta com restrições de transferência de arquivos.
Passo 1: Verifique se o servidor OpenSSH está instalado.
Verifique se o servidor OpenSSH está instalado e ssh.serviceem execução antes de alterar as regras de acesso.
A documentação oficial do OpenSSH do Ubuntu usa `--daemon` openssh-serverpara o pacote `--daemon` e ` ssh.service--service` para o gerenciamento de serviços. Consulte o guia do OpenSSH do Ubuntu Server .
Se esta for uma máquina remota e o SSH for seu único meio de acesso administrativo, mantenha sua sessão de administrador aberta enquanto faz alterações. Uma configuração incorreta do SSH pode bloquear seu acesso.
Passo 2: Crie um grupo e adicione o usuário restrito.
Crie um grupo dedicado para que a restrição possa ser aplicada de forma consistente a uma ou várias contas somente SFTP.
Crie um grupo para usuários restritos. Se alicejá existir um grupo, adicione apenas ela:
sudo groupadd sftpusers
sudo adduser alice
sudo usermod -aG sftpusers alice
id alice
Se você já usa chaves públicas SSH, continue usando. A configuração do chroot controla o que acontece após a autenticação ; ela não exige que você mude da autenticação por chave para senhas.
Uma regra baseada em grupo geralmente é melhor do que um Match Userbloqueio separado para cada conta. Ela mantém a política centralizada. Uma regra por usuário ainda é útil quando diferentes usuários precisam ser restringidos a layouts não relacionados.
Etapa 3: Crie um ambiente isolado (jail) pertencente ao root e um subdiretório gravável.
O diretório raiz (chroot) permanece propriedade do usuário root; apenas os diretórios filhos filespodem ser escritos pelo usuário com restrições.
ls -ld /srv /srv/sftp /srv/sftp/alice /srv/sftp/alice/files
namei -l /srv/sftp/alice
Se o diretório /srv`or` /srv/sftpfor gravável pelo grupo ou pelo usuário, corrija isso também. O OpenSSH verifica todos os componentes do caminho, não apenas o diretório final.
Passo 4: Adicione uma regra de correspondência em sshd_config.d
Um Match Groupbloco aplica a política chroot e somente SFTP apenas aos membros de sftpusers.
A documentação atual do servidor Ubuntu recomenda manter as configurações SSH personalizadas em /etc/ssh/sshd_config.d/vez de misturá-las ao arquivo principal do pacote. Crie um trecho de código:
Match Group sftpusers
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /files
DisableForwarding yes
PermitTTY no
Match all
%uexpande para o nome de usuário autenticado, portanto aliceé colocado em /srv/sftp/alice. O -d /filesargumento instrui o servidor SFTP interno a iniciar dentro do diretório filho gravável. DisableForwarding yesdesabilita o encaminhamento X11, de agente, TCP e StreamLocal em uma única diretiva; está especificamente documentado para simplificar configurações restritas.
O "final" Match allé importante em um trecho de código porque encerra o contexto condicional antes que a configuração posterior seja analisada.
Etapa 5: Decida entre restrições baseadas em grupo e restrições por usuário.
Utilize uma conta dedicada quando um fornecedor, tarefa de backup ou usuário externo não deve ter acesso normal ao shell.
Para vários usuários com o mesmo layout, mantenha a regra de grupo mostrada acima. Para uma única conta excepcional, use um bloco específico do usuário.
Match User vendor1
ChrootDirectory /srv/vendor/vendor1
ForceCommand internal-sftp -d /incoming
DisableForwarding yes
PermitTTY no
Match all
Escolha com base no custo administrativo:
Cenário
Melhor regra
Por que
Vários usuários somente para upload com a mesma estrutura
Match Group
Uma única política se aplica a todos os membros.
Um fornecedor precisa de um diretório exclusivo.
Match User
O percurso e as restrições podem ser diferentes sem afetar os outros.
O usuário precisa de um shell interativo normal.
Não utilize esta receita exclusiva para SFTP.
Um chroot interativo precisa de um ambiente de execução completo.
Usuários não confiáveis precisam de comandos e forte isolamento.
Considere um contêiner ou uma máquina virtual.
Mais fácil definir e atualizar um ambiente de execução completo.
Passo 6: Valide a configuração SSH antes de reiniciar.
Antes de aplicar uma regra chroot, valide tanto a sintaxe quanto as configurações efetivas por usuário.
Nunca reinicie o SSH imediatamente após editar o arquivo. Primeiro, execute o teste de sintaxe recomendado pelo Ubuntu:
sudo sshd -t
A ausência de saída significa que a verificação de sintaxe foi bem-sucedida. Você também pode inspecionar a configuração efetiva para um usuário específico:
Você deverá ver o caminho chroot esperado e o comando SFTP forçado. Isso é especialmente útil no Ubuntu, pois as configurações podem vir de /etc/ssh/sshd_configarquivos .htaccess e .htaccess em / etc /etc/ssh/sshd_config.d//ssh/ssh/config. O Ubuntu observa que o OpenSSH geralmente usa o primeiro valor obtido para a maioria das diretivas, portanto, verificar a configuração efetiva é mais seguro do que presumir qual arquivo prevalece.
Passo 7: Reinicie o SSH e teste com SFTP.
Após um teste de configuração inicial, reinicie o SSH e verifique se a conta só consegue acessar o sistema de arquivos SFTP isolado.
Aplicar a alteração:
sudo systemctl restart ssh.service
sudo systemctl status ssh.service
Em seguida, conecte-se a partir de outro terminal:
sftp alice@server.example.com
Dentro do SFTP, teste:
pwd
ls
put test.txt
ls -l
Com a configuração acima, o diretório SFTP inicial deve ser /files. A barra exibida pelo SFTP é a raiz do chroot, não a raiz real do servidor.
Uma tentativa normal de shell não deve produzir um shell irrestrito:
ssh alice@server.example.com
Como ForceCommand internal-sftpsubstitui a sessão solicitada pelo servidor SFTP em andamento, esta conta destina-se intencionalmente à transferência de arquivos e não à execução de comandos.
Etapa 8: Confirme se o usuário não consegue escapar da prisão.
Teste os limites explicitamente: caminhos como o do host /etcnão /rootdevem ficar visíveis fora do chroot.
Tente ir além da raiz aparente e inspecione os caminhos sensíveis do host:
cd ..
ls /
ls /etc
ls /root
Dentro do chroot, o /sistema representa /srv/sftp/aliceo host. Se você não criou nenhum diretório `/etc/host` ou `/etc etc/ roothost` dentro desse ambiente isolado, o usuário não poderá acessar o `/etc/host` /etcou `/etc /host` reais do host /root.
Teste também um upload para /files. Uma configuração que bloqueia a saída, mas acidentalmente torna toda a jail somente leitura, é segura, mas não útil para uma conta de upload.
Solução de problemas: “propriedade ou modos incorretos para o diretório chroot”
Se o login falhar imediatamente, verifique o log do serviço SSH:
sudo journalctl -fu ssh.service
O guia OpenSSH do Ubuntu recomenda o uso do journal do serviço SSH para solucionar problemas. Se você encontrar um erro de propriedade ou de modo, inspecione todos os diretórios pai:
namei -l /srv/sftp/alice
O diretório chroot deve pertencer ao usuário root e não pode ser gravado por nenhum grupo ou outro usuário. Um erro comum é este:
sudo chown alice:alice /srv/sftp/alice
Não resolva o problema enfraquecendo as verificações do OpenSSH. Em vez disso, coloque a área de escrita do usuário abaixo do diretório raiz do chroot:
E se o usuário precisar de acesso ao shell SSH, e não apenas ao SFTP?
ChrootDirectoryTambém pode ser usado com um shell interativo, mas a configuração é consideravelmente mais complexa. O OpenSSH afirma que um chroot interativo precisa de pelo menos um shell e /devnós básicos, além de quaisquer binários, bibliotecas, arquivos de resolução de nomes e outras dependências exigidas pelos comandos que você permitir.
Para contas de dispositivos com controle rigoroso, a criação de um ambiente isolado (jail) pode ser justificada. Para acesso geral a comandos Linux, isso geralmente gera um ônus de manutenção: atualizações de segurança para ferramentas e bibliotecas também precisam ser refletidas dentro do ambiente isolado. Se sua necessidade real é "permitir que essa pessoa execute comandos, mas isolá-la do host", um contêiner, uma máquina virtual ou um serviço restrito criado especificamente para essa finalidade geralmente é mais fácil de auditar.
Melhorias de segurança que valem a pena adicionar
A restrição de diretórios é apenas uma camada. Para servidores voltados para a internet, considere também:
Utilize autenticação por chave pública SSH para contas humanas e de automação sempre que possível.
Não conceda sudoacesso restrito à transferência de arquivos a usuários que não têm permissão para isso.
Mantenha essa configuração DisableForwarding yesexclusiva para contas SFTP, para que a conexão SSH não possa ser reutilizada para túneis ou encaminhamento de agentes.
Limite os diretórios graváveis à menor área necessária para o fluxo de trabalho.
Revisar journalctl -u ssh.servicee controlar a propriedade dos arquivos após adicionar usuários.
Mantenha uma sessão de administrador aberta enquanto testa alterações remotas na configuração SSH.
Para obter informações precisas sobre o comportamento de ChrootDirectory`openssh`, Match` ForceCommandopenssh-server`, `openssh-server` e ` openssh-server`, consulte DisableForwardingo manual de configuração do servidor OpenSSH do Ubuntu 24.04 . Para obter informações específicas sobre o layout de configuração, validação, comandos de reinicialização e registro de logs do Ubuntu, consulte a documentação oficial do servidor OpenSSH do Ubuntu .
Resumindo
Se o objetivo for "esta conta SSH só pode enviar e receber arquivos dentro de um diretório", use um diretório de propriedade do root ChrootDirectory, coloque conteúdo gravável em um subdiretório de propriedade do usuário e force o acesso internal-sftp. Valide com `chroot` sshd -tantes de reiniciar e, em seguida, teste o caminho de upload permitido e as tentativas de acesso fora do ambiente chroot. Isso fornece um limite de segurança pequeno e compreensível sem a necessidade de construir um ambiente Linux completo dentro do chroot.