Como posso chroot usuários SSH somente para sftp em suas casas?

124

Desejo dar a um cliente acesso ao meu servidor, mas quero limitar esses usuários aos seus diretórios pessoais. Vou montar montagem em todos os arquivos que eu quero que eles possam ver.

Criei um usuário chamado bobe o adicionei a um novo grupo chamado sftponly. Eles têm um diretório inicial em /home/bob. Mudei o shell deles /bin/falsepara parar os logins do SSH. Aqui está a /etc/passwdlinha deles :

bob:x:1001:1002::/home/bob:/bin/false

Também alterei o /etc/ssh/sshd_configpara incluir o seguinte:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Quando tento fazer login como eles, eis o que vejo

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Se eu comentar a ChrootDirectorylinha, posso entrar no SFTP, mas eles terão rédea livre no servidor. Eu descobri que ChrootDirectory /homefunciona, mas ainda dá acesso a qualquer diretório pessoal. Eu tentei explicitamente, ChrootDirectory /home/bobmas isso também não funciona.

O que estou fazendo errado? Como posso limitar boba /home/bob/?

----EDITAR-----

Ok, então eu só dei uma olhada /var/log/auth.loge vi o seguinte:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

Não tenho certeza do que está acontecendo lá, mas sugere que algo está errado com o diretório do usuário. Aqui está a ls -h /homesaída:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob
Oli
fonte
2
Eu acredito que ChrootDirectory /home/%upode ser substituído ChrootDirectory %h.
Franck Dernoncourt

Respostas:

120

Toda essa dor se deve a vários problemas de segurança, conforme descrito aqui . Basicamente, o diretório chroot deve pertencer roote não pode ter acesso de gravação em grupo. Adorável. Então você precisa essencialmente de transformar o seu chroot para uma cela e dentro de que você pode ter seu conteúdo editável.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

E bam, você pode fazer login e escrever /writable.

Oli
fonte
3
Obrigado realmente útil. Dois problemas, no entanto. 1.) Mesmo que eu não possa escrever, ainda posso navegar em todo o sistema de arquivos. 2.) Alterar shell para / bin / false impede o SFTP completamente. Estou fazendo algo errado?
Kim3er
11
Obrigado! Muitos outros artigos sobre esse tópico perdem esse detalhe, e alguns o fazem para que o servidor não possa aceitar conexões ssh (o que é uma droga quando você está no EC2 e ... esse é o único caminho).
Tom Harrison Jr
4
kim3er: isso ocorre porque você precisa definir o shell do usuário como / sbin / nologin - / bin / false desativa qualquer tipo de acesso.
8
Também gostaria de observar que todas as pastas que levam à sua pasta chroot devem pertencer a root. Neste exemplo, /hometambém deve pertencer à raiz.
Shiki
2
Em 14.04, eu também tive que mudar a Subsystem sftp /usr/lib/openssh/sftp-serverlinha para Subsystem sftp internal-sftp -f AUTH -l VERBOSEantes que isso funcionasse.
partofthething
57

Para chroot um diretório SFTP, você deve

  1. Crie um usuário e force a raiz a ser o proprietário

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. Altere o local do subsistema em / etc / ssh / sshd_config:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    e crie uma seção do usuário no final do arquivo (o ssh pode morrer de novo se colocado após a linha do subsistema):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    
josircg
fonte
3
isso não parece funcionar. no seu exemplo, o usuário johnestá bloqueado no /home/johndiretório você concedeu 755permissões ao diretório. então o proprietário leu (4), escreve (2) e executa (1), e o grupo leu (4) e executou (1). você também definiu o proprietário e o grupo como root, então johnpertence a outro. ele também leu e executou (4 + 1 = 5) então. então você bloqueou john em um diretório em que ele não tem privilégios de gravação. Como consertar isto? alterar privilégios 757ou até 777interromper o login. alterar o grupo ou proprietário para john também interrompe o login.
Daniel Daniel
Observe também: em / etc / ssh / sshd_config, as configurações são lidas em ordem. Portanto, se você possui uma regra para usuários em geral e deseja substituir uma delas, basta colocar a regra específica do usuário em cima.
rwenz3l
Quero fazer um chroot de um diretório SFTP na pasta inicial de outro usuário. Eu tenho userx em /home/userx/sftproot/uploadse sftpuser em / home / sftpuse. Eu configurei o chroot /home/usex/sftprootpara pertencer a root: root e chmod 755. Ele /home/usex/sftproot/uploadsé exibido por sftpuser: sftpuser. Eu recebo o mesmo erro da pergunta inicial acima. O chroot e todas as pastas pai precisam pertencer a root: root para que o sftp funcione?
Primoz Rome
6

Passei o dia inteiro tentando obter um compartilhamento de rede na minha framboesa. Eu queria bloquear o usuário para que ele não pudesse navegar por todo o sistema de arquivos, sem acesso de login ssh e queria ter acesso de gravação ao compartilhamento de rede.

E aqui está como eu consegui:

Primeiro, criei um usuário:

sudo useradd netdrive

Em seguida, editei /etc/passwde verifiquei que ele possui /bin/falsepara o usuário, para que a linha fosse:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

Eu editei /etc/ssh/sshd_configpara incluir:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Proprietário e permissões do diretório inicial alterados:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Ok, então, depois de tudo isso, consegui conectar usando o sshfsmodo somente leitura. O que eu tive que fazer para obter uma pasta gravável:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Foi isso, funcionou sem mais alterações. Observe que eu tenho apenas permissões graváveis ​​para o usuário , não para o grupo, como muitas outras soluções online. Consegui criar / excluir / editar / renomear arquivos / pastas sem problemas.

Ao acessar usando sshfscom o usuário netdrive por causa da configuração do chroot, eu veria apenas as coisas armazenadas no /home/netdrive/diretório do servidor , perfeitas. A /home/netdrive/home/netdrive/estrutura de diretórios repetida foi o que fez com que eu trabalhasse com uma solução gravável chroot ssh limpa .

Agora vou explicar abaixo os problemas que tive:

Você provavelmente não deve executar os seguintes parágrafos :

Depois de analisar as soluções acima (e muitas outras na rede que até usavam o acl (listas de controle de acesso)), eu ainda não conseguia fazê-lo funcionar, porque o que fiz a seguir foi:

O seguinte NÃO funcionou para mim:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Porque o usuário netdrive ainda não conseguiu escrever nesse /home/netdrive/writable/diretório, apesar de possuir a pasta e ter as permissões. Então fiz: sudo chmod 775 / home / netdrive / writable / E agora eu podia criar um diretório e excluí-lo, mas não consegui editá-lo porque estava sendo criado sem permissões de gravação de grupo. Aqui, pelo que vi na internet, as pessoas usam aclpara consertar. Mas não fiquei satisfeito com isso, pois tinha que instalar acl, configurar pontos de montagem etc. Também não tenho idéia de por que precisaria de permissão de grupo para gravar em uma pasta pertencente ao mesmo usuário.

Parece que, por algum motivo, ao criar /home/netdrive/home/netdrivee dar propriedade à última netdrivepasta, pude fazer tudo funcionar sem mexer nas permissões de grupo .

mihai.ile
fonte
1

Eu segui este artigo, mas não funcionou. Começou a funcionar depois que eu fiz essa alteração (sugerida nas respostas acima):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Além disso, criei o diretório pessoal proprietário raiz, no qual eu tinha o subdiretório gravável pelo usuário (como descrito acima).

A coisa nova e útil que desejo adicionar com esta resposta é que você pode simplificar a configuração simplesmente especificando% h como diretório inicial do usuário:

ChrootDirectory %h

Eu descobri isso graças a este link.

user109764
fonte