Então, estou tentando criar um usuário que só tenha acesso a uma pasta específica dentro da minha public_html
pasta. Criei o usuário com sucesso e consigo fazer login. Tive alguns problemas para fazer login, no início, porque a pasta precisava pertencer ao root, antes que o usuário do sftp pudesse fazer o sftp.
Então segui este guia:https://serverfault.com/questions/584986/bad-ownership-or-modes-for-chroot-directory-component– me instruindo a mudar a propriedade da pasta para root.
Depois de fazer isso, consigo fazer o login com sucesso, porém, depois de fazer o login, não consigo adicionar arquivos ou fazer qualquer coisa dentro desta pasta, pois ela é de propriedade do root.
Tentei criar um grupo e adicionar o usuário root e o usuário sftp como membros desse grupo, mas também não funcionou.
Minha solução foi criar outro diretório dentro da pasta sftp, usando o usuário root, e depois mudar a propriedade para o usuário sftp, mas isso parece muito hacky para mim e adicionalmente adiciona outra pasta à estrutura em árvore da qual não sou um grande fã de.
Alguma idéia de como permitir que um usuário sftp tenha acesso de gravação a uma pasta, enquanto o root permanece o proprietário?
Responder1
Há muita conversa sobre esse tipo de coisa em alguns sites de troca de pilhas. Mas caso isso não seja uma duplicata ...
No meu CentOS 7, quando você usa ChrootDirectory para restringir um usuário a um diretório, esse diretório deve pertencer ao root e não pode permitir acesso de gravação a qualquer outro usuário por permissões ou FACLs. Você pode configurar um link simbólico, mas o usuário sftp não poderá segui-lo se estiver restrito a um diretório. Então você tem que fazer isso.
Crie um usuário
useradd ftp_user
configurar senha
passwd ftp_user
Configure permissões. Seu diretório residencial será sua prisão.
chown root:root /home/ftp_user
chmod 0755 /home/ftp_user
Restrinja o usuário a essa prisão agora
vi /etc/ssh/sshd_config
Mude isso:
#Subsystem sftp /usr/lib/openssh/sftp-server
para
Subsystem sftp internal-sftp
Adicionar
Match User ftp_user
ChrootDirectory %h
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
Salve e saia do vi.
Não se esqueça:
systemctl restart sshd
Agora nós os enganamos. Digamos que seu cliente tenha um site no qual você permitirá que ele continue brincando em /var/www/corny_website
Certifique-se de que ele tenha permissões nesse diretório
setfacl -m u:ftp_user:rwx /var/www/corny_website
setfacl -d -m u:ftp_user:rwx /var/www/corny_website
Agora você o monta em vez de criar um link simbólico para ele.
mkdir /home/ftp_user/corny_website
mount --bind /var/www/corny_website /home/ftp_user/
Agora, quando o usuário faz o sftps. Ele não receberá aquele erro de pipe quebrado e só poderá ver /home/ftp_user e, além do mais, só poderá fazer upload ou download de /var/www/corny_website que ele vê como / brega_website.