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:

/srv/sftp/alice        root:root   755
└── files              alice:alice 755

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.

Terminal do Ubuntu mostrando a instalação do servidor OpenSSH e o serviço SSH em execução.
Verifique se o servidor OpenSSH está instalado e ssh.serviceem execução antes de alterar as regras de acesso.

Instale o pacote do servidor, se necessário:

sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh.service

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.

No terminal do Ubuntu, criamos um grupo sftpusers e adicionamos o usuário alice.
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 terminal do Ubuntu cria o diretório /srv/sftp/alice e um subdiretório de arquivos gravável pelo usuário com propriedade separada.
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.

Crie a hierarquia de diretórios:

sudo mkdir -p /srv/sftp/alice/files
sudo chown root:root /srv/sftp/alice
sudo chmod 755 /srv/sftp/alice
sudo chown alice:alice /srv/sftp/alice/files
sudo chmod 755 /srv/sftp/alice/files

Verificar a propriedade:

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

O editor Nano mostra um bloco Match Group sftpusers com restrições ChrootDirectory e internal-sftp.
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:

sudo nano /etc/ssh/sshd_config.d/90-sftp-restricted.conf

Adicionar:

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.

Terminal do Ubuntu criando um usuário SFTP dedicado e restrito e um diretório no estilo /srv/sftp/uploads
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árioMelhor regraPor que
Vários usuários somente para upload com a mesma estruturaMatch GroupUma única política se aplica a todos os membros.
Um fornecedor precisa de um diretório exclusivo.Match UserO 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.

O editor do Ubuntu mostra um ChrootDirectory e um ForceCommand bloqueando o sftp interno para um usuário com restrições.
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:

sudo sshd -T -C user=alice,host=localhost,addr=127.0.0.1   | grep -E 'chrootdirectory|forcecommand|disableforwarding|permittty'

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.

Terminal do Ubuntu mostrando o serviço ssh ativo e um login SFTP cujo diretório de trabalho remoto é /uploads.
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.

O terminal SFTP está tentando acessar os diretórios pai, /etc e /root, e exibindo a mensagem de acesso negado.
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:

sudo chown root:root /srv/sftp/alice
sudo chmod 755 /srv/sftp/alice
sudo chown alice:alice /srv/sftp/alice/files

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.

Deixar um comentário

Baixe o FlightGear gratuitamente: Guia de Instalação Oficial

Baixe o FlightGear gratuitamente: Guia de Instalação Oficial

Baixe o FlightGear gratuitamente no site oficial. Compare os pacotes para Windows, macOS e Linux, instale os arquivos de dados e inicie seu primeiro voo.

Aplicativo Google Tasks para desktop: como usá-lo no computador

Aplicativo Google Tasks para desktop: como usá-lo no computador

Abra o Google Tasks em um navegador, adicione um atalho do Chrome ou inicie o aplicativo automaticamente e gerencie suas tarefas agendadas pelo Agenda e pelo Gmail.

OKSampler: Um sampler de música gratuito e simples para batidas de teclado.

OKSampler: Um sampler de música gratuito e simples para batidas de teclado.

O OKSampler mapeia trechos de MP3 para teclas do teclado e pode reproduzir áudio em loop. Saiba o que este software gratuito legado faz, onde terminam suas funcionalidades antigas e o que verificar antes de baixar.

Como instalar o Linux Mint Debian Edition 5 “Elsie” a partir de um pendrive USB

Como instalar o Linux Mint Debian Edition 5 “Elsie” a partir de um pendrive USB

Baixe e verifique a ISO arquivada do LMDE 5, crie um USB inicializável e escolha as configurações de instalação segura. O Elsie chegou ao fim de seu suporte; veja a versão atual do LMDE.

Como instalar o Wireshark no Linux: Ubuntu, Fedora, Arch e outras distribuições

Como instalar o Wireshark no Linux: Ubuntu, Fedora, Arch e outras distribuições

Instale o Wireshark no Ubuntu, Debian, Fedora, Arch ou openSUSE com os comandos de pacote atuais e, em seguida, configure a captura de pacotes em tempo real com segurança.

Como jogar Don't Starve Together no Linux

Como jogar Don't Starve Together no Linux

Instale a versão Linux de Don't Starve Together pelo Steam, crie um mundo ou junte-se a amigos seguindo estes passos de configuração e resolução de problemas.

Como jogar Squad no Linux com o Steam Proton

Como jogar Squad no Linux com o Steam Proton

Configure o Squad no Linux com o Steam Play e o Proton, instale o jogo, escolha uma ferramenta de compatibilidade e resolva problemas com o sistema anti-cheat.

Como criar uma unidade USB inicializável do Windows 11 no Linux

Como criar uma unidade USB inicializável do Windows 11 no Linux

Crie um pendrive de instalação do Windows 11 no Linux com o Ventoy: obtenha a ISO oficial, instale o Ventoy com segurança, copie a imagem e inicialize o computador de destino.

Como jogar DiRT Rally no Linux: Configuração do Steam e correções do Proton

Como jogar DiRT Rally no Linux: Configuração do Steam e correções do Proton

Aprenda a jogar DiRT Rally no Linux se você já o possui no Steam: instale a versão nativa, execute-o e use o Proton apenas como alternativa.

Como instalar o Devuan Linux a partir de um USB inicializável

Como instalar o Devuan Linux a partir de um USB inicializável

Instale o Devuan Excalibur a partir da ISO Live para desktop. Verifique o download, crie um USB inicializável, proteja as partições existentes e finalize a instalação com o Refracta Installer.