Existem 2 soluções usando 2 servidores ftp diferentes
1 - Use o proftpd com o recurso VirtualServer e com uma força de usuário local. Snippet de um arquivo de configuração meu:
ServerType standalone
DefaultServer on
AccessGrantMsg "User %u logged in."
DeferWelcome off
# Use pam to authenticate (default) and be authoritative
AuthPAMConfig proftpd
AuthOrder mod_auth_pam.c* mod_auth_unix.c
<VirtualHost xxx.xxx.xxx.xxx>
ServerAdmin [email protected]
ServerName "FTP"
TransferLog /var/log/proftpd/transfer.log
ExtendedLog /var/log/proftpd/full.log ALL
DefaultRoot /var/www/digitalgoods
User apache
Group apache
AllowOverwrite yes
MaxLoginAttempts 3
RequireValidShell no
</VirtualHost>
Crie os 3 usuários e deixe-os usar o ftp. Eles serão "chrooted" para /var/www/digitalgoods
e qualquer arquivo enviado terá as permissões definidas como apache:apache
2 - Use vsftpd chroot, e crie 3 usuários com o mesmo userid que o apache E o mesmo diretório inicial que será chrooted (sim, é um kludge, mas deve funcionar):
Conteúdo de /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
check_shell=NO
syslog_enable=YES
connect_from_port_20=YES
xferlog_std_format=NO
idle_session_timeout=3600
ftpd_banner=FTP XXX
chroot_local_user=YES
ls_recurse_enable=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=NO
userlist_deny=NO
tcp_wrappers=YES
Como estamos usando menos privilégios, teremos que declarar os logins que acessarão este ftp em /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
#
devel
manuals
Crie 2 usuários ( /etc/passwd
) e use o mesmo userid do usuário apache (novamente, é um kludge maldito, mas pelo menos você terá 2 usuários fazendo o upload para suas casas chrooted com a mesma permissão). Com o check_shell=NO
você não precisa dar um shell válido para esses usuários
[root@]# grep 'apache\|desenv\|man\|' /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
devel:x:48:48::/var/www/digitalgoods:/sbin/nologin
manuals:x:48:48::/var/www/digitalgoods:/sbin/nologin