Eu sinto que já passei por todos os tutoriais do SFTP / Chroot na Internet e não encontrei o que estou procurando (ou, pelo menos, nenhum deles produziu os resultados corretos). Aqui estão os meus detalhes:
- Eu criarei muitas contas de usuários individuais via script. Portanto, qualquer solução que requer que eu edite os arquivos com muita facilidade, usuário por usuário, não é boa.
- Cada um desses usuários receberá um diretório na pasta / var / www / html / USER, onde USER é seu nome de usuário. Eles devem ter acesso total de gravação a esse diretório e ser capazes de criar e editar subdiretórios, mas devem ser totalmente bloqueados de quaisquer diretórios que estejam mais altos na árvore de arquivos (eles não devem poder listar, muito menos editar , / var / www / html / ou / var / www / ou / var /, etc.)
É isso. Parece simples, certo? E, no entanto, a maioria dos exemplos que vi são sobre o bloqueio de todos os usuários SFTP em um único diretório compartilhado ou exigem que você "encaminhe" seu usuário ao diretório / home / USER (que não funcionará para o serviço da web). Eu não quero isso.
Estou fazendo isso no Ubuntu 16.04, em uma nova instância do AWS EC-2.
As duas abordagens que tentei em vão:
-
Configurando o HOME do usuário para / var / www / html / USER, Chroot os prendendo para HOME. Por alguma razão, isso não parece funcionar - resulta em SFTP apenas se recusando a se conectar.
-
Configurando um diretório padrão do HOME para o usuário (por exemplo, com adduser), criando o diretório da Web do usuário, Chroot fazendo com que eles fiquem no diretório da web. Eu só não consegui fazer isso funcionar apesar dos dias de tentativas - as contas SFTP ainda acabam tunelando para o diretório HOME e isso muitas vezes significa que elas são rejeitadas pela cadeia Chroot.
O que acabou acontecendo é que os usuários têm muita liberdade, ou estão totalmente bloqueados. Eu nunca consegui colocá-lo em uma situação onde o usuário só pode ver o diretório correto, e é capaz de editá-lo. Eu tentei todas as configurações de chown no diretório (por exemplo, usuário: usuário, usuário: sftp, root: root) e configuração de permissão, e parece que ele teve efeito zero. Estou sentindo falta de algo aqui que é óbvio ou profundo.
Alguns detalhes adicionados - eis uma das minhas tentativas.
Aqui estão as partes relevantes de / etc / ssh / sshd_config:
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Que corresponde ao que a maioria dos guias diz que você deve fazer.
Eu crio um novo usuário:
adduser --disabled-password -gecos "" --ingroup sftp --shell /usr/sbin/nologin --home /var/www/html/testuser testuser
O que diz:
Adding user 'testuser' ...
Adding new user 'testuser' (1001) with group 'sftp' ...
Creating home directory '/var/www/html/testuser' ...
Copying files from '/etc/skel' ...
E então eu lhes dou uma senha com o passwd.
Eu então tento fazer o login:
sftp testuser@myserver
testuser@myserver's password:
packet_write_wait: Connection to myserver_ip: Broken pipe
Connection closed
O que parece ser devido à configuração do Chroot jail e não está relacionado a nenhuma outra configuração de servidor óbvia. Se eu comentar o ChrootDirectory, ele se conectará bem:
sftp testuser@myserver
testuser@myserver's password:
Connected to myserver.
sftp> pwd
Remote working directory: /var/www/html/testuser
Mas eu faço isso, o usuário sftp pode sair do seu diretório e passear por todo o servidor, fazendo o que quiserem. Não é bom!
Eu também tentei definir
ChrootDirectory /var/www/html/%u
E isso não muda nada que eu possa ver (o mesmo erro "Broken pipe" de antes). (E sim, estou reiniciando o servidor ssh toda vez que faço uma alteração).
Estas são as configurações atuais da pasta do usuário:
drwxr-xr-x 4 testuser sftp 4096 Aug 29 15:00 testuser
Algumas instruções dizem que o Chroot funcione, você precisa
chown root:root /var/www/html/testuser
Mas ainda recebo o erro "Broken pipe" com o conjunto ChrootDirectory. Alterar as permissões para o 777 também não altera isso. (/ var / www / html é de propriedade de root: root, como é / var / www / e / var /)
Outras coisas que eu tentei com / etc / ssh / sshd_config:
-
alterando para subsistema sftp / usr / lib / openssh / sftp-server e comentando o ForceCommand interno-sftp (sem alteração perceptível)
-
Comente o UsePAM yes (alguém relatou que isso ajudou, mas faz com que o servidor sftp rejeite todas as conexões imediatamente - "fechado pelo host remoto")