Table des matières
Installer ProFTPD
Au début
# apt-get install proftpd
BUGS
Ajouter: “UseSendfile off”
Parce que parfois, ca ne fonctionne pas comme on voudrait? ( “UseSendFile” dislike “mount” ? )
SSL
Liens:
Key
# cd /etc/proftpd # mkdir keys # chmod 0750 keys # chown proftpd:root keys # su -s /bin/bash proftpd $ cd keys $ openssl req -new -x509 -days 3650 -nodes -out proftpd-rsa.pem -keyout proftpd-key.pem Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:Creteil Locality Name (eg, city) []:Creteil Organization Name (eg, company) [Internet Widgits Pty Ltd]:tj-corp Organizational Unit Name (eg, section) []:web Common Name (eg, YOUR name) []:www.thierry-jaouen.fr Email Address []:pem@thierry-jaouen.fr
On a alors:
-rw-r--r-- 1 proftpd nogroup 1233 déc 25 14:31 proftpd-rsa.pem -rw-r--r-- 1 proftpd nogroup 887 déc 25 14:31 proftpd-key.pem
L'important, c'est “Common Name” qui doit correspondre à:
$ hostname -f www.thierry-jaouen.fr
tls.conf
Dans le fichier /etc/proftpd/tls.conf
, faire en sorte d'avoir:
# egrep -v "^(#|$)" tls.conf <IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSRSACertificateFile /etc/proftpd/keys/proftpd-rsa.pem TLSRSACertificateKeyFile /etc/proftpd/keys/proftpd-key.pem TLSOptions NoCertRequest TLSVerifyClient off TLSRequired off </IfModule>
proftpd.conf
Autoriser “tls” en ayant en faisant en sorte d'ajouter:
... <snip> ... Include /etc/proftpd/tls.conf ... <snip> ...
PassivePorts 50000 59999 UseSendFile off
“PassivePorts” : pour simplifier les règles de firewall.
“UseSendFile off” : parce qu'il y a un bug quelque part avec le “passive mode”.
Restreindre les droits comme j'aime
Le principe que j'aime:
Autoriser uniquement les utilisateurs que j'ai choisit a acceder a leur propre répertoire. Pour cela, je limite l'accès (presque en totalité) aux utilisateurs appartenant au groupe que j'ai nommé ftpuser
Donc, d'abord creer le groupe:
addgroup ftpuser
Dans le fichier de config de proftpd.conf, avoir une config Global approchant ça:
LogFormat traff "%b %u" SystemLog /var/log/proftpd.log <Global> DefaultRoot ~ <del># Afin que même ceux qui n'ont pas de Shell puisse avoir accès: (point important pour la suite)</del> <del>RequireValidShell off</del> RequireValidShell on # trés préférable, et n'empeche pas le FTP anonyme de fonctionner DeferWelcome off TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200 DisplayLogin welcome.msg DisplayFirstChdir .message DenyFilter \*.*/ PassivePorts 50000 60000 # Plage de ports que le serveur pourra utiliser pour les connexions passives. User nobody Group nogroup Umask 022 022 # =============================== # Les groupes et les utilisateurs autorisés sur l'ensemble du serveur # A savoir que sans 'AllowUser ftp', l'acces anonymous est impossible <Limit LOGIN> Order Allow,Deny AllowUser ftp AllowGroup ftpuser Deny from all </Limit> </Global>
Les lignes importantes sont en rouge.
Recharger la config:
# /etc/init.d/proftpd reload
Ensuite, creer les utilisateurs autorisés comme suit:
# adduser monuser
(Remplir les informations)
Si l'on ne souhaite pas que ces utilisateurs puissent se connecter via le shell (et ssh), editer le fichier /etc/passwd et changer '/bin/bash' par '/bin/false' pour utilisateurs concernés.
Ajouter ces utilisateurs au groupe ftpuser
# adduser monuser ftpuser
Et c'est fini, les utilisateurs appartenant au groupe ftpuser peuvent se connecter, et uniquement ceux là.
Remarqué quand même que j'autorise l'utilisateur ftp malgré qu'il n'appartient pas au groupe ftpuser, parce qu'il le faut sinon l'accès Anonymous (non décrit ici) ne serait impossible.
Autres vues pour d'autres **users**
Une manière parmi d'autres sans doute: Creer un groupe special, par exemple, uuusers:
addgroup uuusers
Faire appartenir les user qu'on veut a ce groupe:
adduser le_user uuusers
Puis editer /etc/proftpd.conf pour avoir quelques choses ressemblant à ça (par exemple):
DefaultChDir /home/uuuser uuusers DefaultRoot /home/uuuser uuusers
DefaultChDir / DefaultRoot ~
Tous les utilisateurs appartenant au groupe uuusers seront envoyé dans un repertoire pré-determiné rien que pour tous ceux là. Les autres seront dans leur répertoire propre.
Rotate des logs
Lien: rotating-linux-log-files
Dans /etc/logrotate.d , mettre un fichier nommé proftpd contenant:
/var/log/proftpd.log { weekly rotate 52 compress delaycompress missingok notifempty create 640 root adm }
En se basant sur le fait que le log est là : /var/log/proftpd.log
Ainsi, chaque semaine, il y aura compression des logs. C'est bien.
On peut tester (sans executer) en faisant:
# logrotate -d proftpd
Et on voit…
On peut aussi executer de suite la rotation de log, en faisant:
# logrotate -f proftpd
n'oublions pas: man logrotate est notre ami.
Des droits trés limités
Voici comment j'ai créé un compte qui ne peut que voir le repertoire que je lui ai assigné, et qui ne peut ecrire que dans le repertoire designé. Il s'agit d'un compte nommé recup :
Dans /etc/proftpd.conf
<Global> ... snip ... DefaultChDir / recup # cd a la racine DefaultRoot /home/recup/ftproot recup # on chroot dans /home/recup/ftproot (qui contient un répertoire RecupBox) ... snip ... # on rejette toutes ecritures partout <Directory /home/recup/ftproot/*> <Limit WRITE STOR RNFR DELE> DenyAll </Limit> </Directory> # on peut quand même ecrire dans le répertoire 'RecupBox' <Directory /home/recup/ftproot/RecupBox/*> <Limit WRITE STOR RNFR DELE> AllowAll </Limit> </Directory> ... snip ... </Global>
Au final, l'utilisateur recup a accès en lecture uniquement dans son ~/ftproot et ne peut ecrire/lire que dans ~/ftproot/RecupBox.
Droits limités, sauf pour un...
C'est la même chose que si ci-dessus, sauf que:
- l'utilisateur autorecup (qui a pour groupe: recup) a droit de ecrire/lire/effacer les fichiers.
- l'utilisateur recup peut ecrire mais sans ecraser un fichier existant, ni le lire.
Dans /etc/proftpd.conf
<Directory /home/recup/ftproot> AllowOverwrite off # on interdit d'ecraser un fichier # Umask 002 002 <Limit WRITE STOR RNFR RETR DELE> Order Allow,Deny AllowUser autorecup # **autorecup** peut ecrire et plus, mais pas les autres Deny from all </Limit> </Directory> <Directory /home/recup/ftproot/RecupBox/*> <Limit WRITE STOR RNFR> AllowAll # tous le monde retrouve quelques droits d'ecriture </Limit> </Directory>
RequireValidShell et /etc/shells
Si RequireValidShell on, alors il faut s'assurer que le fichier /etc/shells contient ceci:
... snip ... /bin/false
Cela permet a proftpd (entre autres) de voir /bin/false comme un shell valide, (ce qui techniquement est vrai): ce qui autorise un acces FTP sans accès au shell (puisque que /bin/false).
tweak
Proftpd lent
Lien: http://www.grafactory.net/blog/post/2005/11/18/104-proftp-trop-lent-a-se-connecter
Si on a une impression de lenteur, notamment simplement a la connexion, alors il faut ajouter dans proftpd.conf
:
IdentLookups off UseReverseDNS off
Et re-demarrer.
mod_rewrite
Lien: http://www.castaglia.org/proftpd/modules/mod_rewrite.html
Une webcam qui ecrit dans un repertoire, dans un format non souhaité:
/incoming/AAAAMMJJ/nom_du_fichier_horodaté.jpg
New method
On va changer cela avec “mod_rewrite”, exemple (dans proftpd.conf
) :
<IfModule mod_rewrite.c> RewriteEngine on #RewriteLog /var/log/proftpd/rewrite.log RewriteLog none </IfModule> <Anonymous ~webcam> # transformer la creation d'un repertoire "de chiffre" en "capture" RewriteCondition %m MKD RewriteCondition %f "^\/incoming\/201[0123456789]+$" RewriteRule ^(\/incoming\/)([0123456789]+)$ $1capture # transformer le changement de chemin d'un repertoire "de chiffre" en "capture" RewriteCondition %m CWD RewriteCondition %f "^\/incoming\/201[0123456789]+$" RewriteRule ^(\/incoming\/)([0123456789]+)$ $1capture # transformer le nom du fichier en "cap.jpg" RewriteCondition %m STOR RewriteCondition %f "\/incoming\/201[0123456789]+\/.*\.jpg$" RewriteRule ^(\/incoming\/)(.*)$ $1capture/cap.jpg etc... </Anonymous>
Suite a une mise à jour du firmware de la cam, ca ne fonctionnait plus…
J'ai corrigé les règles, mais elles me semblent plus compliqués maintenant… mais ca marche.
Old fashion
les règles sont pas bien rédigées… |
On va changer cela avec “mod_rewrite”, exemple (dans proftpd.conf
) :
<IfModule mod_rewrite.c> RewriteEngine on #RewriteLog /var/log/proftpd/rewrite.log RewriteLog none # ----------------------------- # pour le compte "webcam" # transformer la creation d'un repertoire "de chiffre" en "capture" RewriteCondition %U webcam RewriteCondition %m MKD RewriteCondition %f "[0123456789]+$" RewriteRule ^(.*) capture # transformer le changement de chemin d'un repertoire "de chiffre" en "capture" RewriteCondition %U webcam RewriteCondition %m CWD RewriteCondition %f "[0123456789]+$" RewriteRule ^(.*) capture # transformer le nom du fichier en "cap.jpg" RewriteCondition %U webcam RewriteCondition %m STOR RewriteCondition %f ".*\.jpg$" RewriteRule ^(.*) cap.jpg # ----------------------------- </IfModule>
Au final, le fichier “image” est créé comme cela:
/capture/cap.jpg
(Y a juste un petit relicat de “cap.jpg” en racine… po grave)