Com um pouco de brincadeira, consegui criar uma solução semi (não perfeita, mas boa o suficiente)
usando a resposta 2707974 e as informações que ganhei mais onde consegui o que preciso.
Primeiro você precisa do vsftp e do PAM instalado
apt-get install vsftpd libpam-pwdfile
Edite /etc/vsftpd.conf
nano /etc/vsftpd.conf
depois, cole o seguinte
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
local_root=/var/www
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES
#virutal user settings
user_config_dir=/etc/vsftpd_user_conf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
nopriv_user=vsftpd
guest_username=vsftpd
Edite para suas necessidades exatas o bit mais importante para os usuários virtuais é tudo após as configurações do usuário virtual comentarem
Criando usuário
Você pode usar um banco de dados ou htpasswd
Achei htpasswd
mais rápido e fácil de usar.
crie um diretório para armazenar seus usuários
mkdir /etc/vsftpd
htpasswd -cd /etc/vsftpd/ftpd.passwd user1
adicionando usuários adicionais, basta omitir o -c
htpasswd -d /etc/vsftpd/ftpd.passwd user2
Eu só consegui fazê-lo funcionar usando o CRYPT, que limita a 8 caracteres para usar mais de 8 caracteres usa o openssl para gerar um hash e um pipe compatíveis diretamente no htpasswd
htpasswd -c -p -b /etc/vsftpd/ftpd.passwd user1 $(openssl passwd -1 -noverify password)
Uma vez que seus usuários são criados, você pode agora alterar o seu arquivo de configuração do PAM
nano /etc/pam.d/vsftpd
e remova tudo dentro desse arquivo e substitua pelo seguinte
auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
Isso ativará o login dos usuários virtuais definidos em /etc/vsftpd/ftpd.passwd
e desativará os usuários locais
Em seguida, precisamos adicionar um usuário para esses usuários virtuais usarem. Esses usuários não terão acesso ao shell e serão chamados vsftpd
useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
o usuário deve corresponder a guest_username=vsftpd
no arquivo conf vsftpd
Definir o acesso ao diretório
A linha importante aqui é a seguinte
user_config_dir=/etc/vsftpd_user_conf
isso significa que quando user1
efetuar login, procurará o seguinte arquivo
/etc/vsftpd_user_conf/user1
este arquivo é igual ao vsftpd.conf
, para que você possa definir um novo local_root
voltando à pergunta que queremos que user1
tenha acesso somente a var/www/website_name1/sub_folder1
, precisamos criar a pasta vsftpd_user_conf
:
mkdir /etc/vsftpd_user_conf
Agora crie o arquivo do usuário:
nano /etc/vsftpd_user_conf/user1
e digite a seguinte linha
local_root=/var/www/website_name1/sub_folder1
Agora reinicie o vsftp
service vsftpd restart
agora você deve conseguir fazer o login como user1, que só poderá ver
var/www/website_name1/sub_folder1
e qualquer pasta e arquivo dentro dele.
É agora que você pode adicionar quantos usuários desejar e limitar o acesso deles à pasta desejada.
importante lembrar que se você não criar um arquivo conf do usuário, o padrão será a pasta var / www como root (no exemplo acima)
Se a subpasta tiver a intenção de ser modificada pelo usuário, pode ser necessário alterar o proprietário da subpasta compartilhada:
chown vsftpd:nogroup /var/www/website_name1/sub_folder1