Uma maneira simples e passo-a-passo de configurar contas somente SFTP "encarceradas"

2

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")

por nucleon 29.08.2017 / 14:50

2 respostas

2

OK, finalmente consegui trabalhar. Havia algumas coisas que eu estava fazendo de errado e, obviamente, minhas tentativas de fazer isso várias vezes estragaram algumas configurações, então acabei de limpar a instância e começar do zero.

O principal problema parece ser que você não pode tornar o diretório Chroot'ed gravável. Portanto, não pode ser o seu diretório web principal. Eu estava pensando sobre isso tudo errado, tentando fazer contas de usuário fora do meu diretório principal do Apache. Isso não está certo - o que você faz é fazer as contas de usuário em um diretório de usuário padrão (/ home / jimmy), fazer uma pasta www (ou public_html ou qualquer outra) dentro desse diretório, fazer o próprio diretório de usuários (neste caso, / home / jimmy /) de propriedade de root, e faça o diretório gravável (/ home / jimmy / www) pertencente a jimmy e o grupo Chrooted (por exemplo, "sftp" em meus exemplos acima). Então você define o ChrootDirectory para% h (neste caso, / home / jimmy). Jimmy não poderá fazer nada dentro do diretório / home / jimmy /, mas ele pode colocar arquivos em / home / jimmy / www. Para tornar isso utilizável, você configura o userdir no Apache e diga para usar essas pastas www como pastas de usuários.

Agora funciona!

    
por 30.08.2017 / 01:01
-1

jail-shell pode atender a esse requisito, eu acho. É fácil de usar.

link

    
por 19.09.2017 / 06:51