Procédure pour créer un serveur FTP sécurisé SSL forcé avec usager virtuels sous Ubuntu Linux avec vsFTPd

Je ne sais pas si vous êtes comme moi mais je n’aime pas laisser non crypté l’accès a un service qui me demande un mot de passe. Je devait monter un serveur cette semaine qui doit avoir les accès FTP.

J’ai pris l’initiative de sécuriser la machine avec du SSL car je crois qu’aujourd’hui c’est notre devoir de faire ce genre de chose. Ce n’est pas la première fois que je configure un serveur FTP over SSL mais je n’avait jamais pris de notes vraiment à ce jour. Je l’ai fait cette fois-ci!

Ce que cette procédure fait…

  1. Pouvoir créer des comptes FTP sans avoir a créer un utilisateur local (donc pas accès shell (SSH)).
  2. Permet les connections FTP over SSL de façon EXPLICITE sur un port non standard  (cet exemple utilisera le port 6123)
  3. Ne permet pas d’utilisateur ni de connexions anonymes
  4. Bannit les hôtes qui tentent de se connecter (LOGIN FAILED) via fail2ban
  5. Utilise le system PAM interne pour l’authentification
  6. Ne requiert pas d’usager local (pas de risque de tentative de connection SSH, usager séparés)
  7. Le serveur FTP roule sur son propre usager

Procédure

  1. Vérifier quelle version de serveur FTP est installé
    # dpkg --list | grep ftp
    ~
    ii  ftp                               0.17-19                      The FTP client
    ii  lftp                              3.7.15-1ubuntu2              Sophisticated command-line FTP/HTTP client p
    ii  vsftpd                            2.2.0-1ubuntu1               lightweight, efficient FTP server written fo

    Note vsftpd est ce qu’on veut. Dans ce cas-ci il est déjà installé (ii).

  2. Assurer que les prérequis sont installés
    # aptitude install vsftpd libpam-pwdfile openssl
  3. Modifier le fichier de config vsftpd.conf.
    Note Modifiez pour ces valeurs (ci-bas) et conservez les autres valeurs par défaut.

    # vi /etc/vsftpd.conf
    ~
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    chroot_local_user=YES
    ftpd_banner=Un nom Quelconque FTP
    nopriv_user=vsftpd
     
    # renoirboulanger.com 2010-04-29 we will force usage on an other port
    #connect_from_port_20=YES
  4. Ajouter ou corriger (étaient pas présents lorsque j’ai crée la procédure)
    # 2010-04-28 accès usager
    virtual_use_local_privs=YES
    guest_enable=YES
    user_sub_token=$USER
    local_root=/home/ibottin/FTP/$USER
    hide_ids=YES

    Note Ajuster le local_root a l’endroit ou envoyer les fichiers.

  5. Activer le SSL
    1. Créer le certificat
      # cd /etc/ssl
      # /usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
    2. Ajouter au /etc/vsftpd.conf
      # vi /etc/vsftpd.conf
      ~
      # renoirboulanger.com 2010-04-30 SSL configuration
      listen_port=6123
      ftp_data_port=6122
      pasv_min_port=6000
      pasv_max_port=6100
       
      ssl_enable=YES
      # Allow anonymous users to use secured SSL connections
      allow_anon_ssl=YES
      # All non-anonymous logins are forced to use a secure SSL connection in order to
      # send and receive data on data connections.
      force_local_data_ssl=NO
      # All non-anonymous logins are forced to use a secure SSL connection in order to send the password.
      force_local_logins_ssl=YES
      ssl_tlsv1=YES
      ssl_sslv2=YES
      ssl_sslv3=YES
      rsa_cert_file=/etc/ssl/vsftpd.pem
  6. Remplacer le contenu du fichier pam.d/vsftpd
    # vi /etc/pam.d/vsftpd
    ~
    auth required pam_pwdfile.so pwdfile /etc/vsftpd.passwd
    account required pam_permit.so

    Note Il est important de remplacer le reste du fichier par ce contenu ci-haut.

  7. Modifier permissions sur le fichier .pem
    # chown vsftpd /etc/ssl/vsftpd.pem
  8. Redémarrer vsftpd
    # /etc/init.d/vsftpd restart
  9. Créer le unix user qui va rouler le démon
    # adduser --system --no-create-home --disabled-login -s /usr/sbin/nologin --home /var/ftp vsftpd
  10. Modifier les permissions pour l’utilisateur qui roule vsftpd (ajuster)
    # chown -R ftp:ftp /var/ftp/
    # chmod -R 740 /var/ftp
  11. Ajouter un utilisateur FTP
  12. Ajuster fail2ban
    Ajuster le bloc [vsftpd]
    # vi /etc/fail2ban/jail.conf
    ~
    [vsftpd]
     
    enabled  = true

    Note par defaut enabled est a false… il faut l’activer.

  13. Redémarrer vsftpd
    # /etc/init.d/vsftpd restart
     * Stopping FTP server: vsftpd
       ...done.
     * Starting FTP server: vsftpd
       ...done.
    # ps aux|grep vsftpd
    vsftpd   18771  0.0  0.0  28904  1300 ?        Ss   17:09   0:00 /usr/sbin/vsftpd
    vsftpd   18772  0.0  0.0  29100  1608 ?        S    17:09   0:00 /usr/sbin/vsftpd
    ftp      18773  0.0  0.0  28928   924 ?        S    17:09   0:00 /usr/sbin/vsftpd
    root     18795  0.0  0.0  22628  1712 ?        S    17:14   0:00 /usr/sbin/vsftpd
    ...

    Note les deux premiers vsftpd est le résultat attendu

  14. Nous allons forcer le FTP over SSL sur le port 6122, pour ça il faut autoriser le Firewall
    # iptables -A INPUT -m state --state ESTABLISHED,RELATED
    # iptables -A INPUT -m tcp -p tcp --dport 6122 -j ACCEPT
    # iptables -A INPUT -m state --state NEW,ESTABLISHED
    # iptables -A INPUT -m tcp -p tcp --dport 6123 -j ACCEPT
    # iptables -A INPUT -p tcp --dport 6000:6100 -j ACCEPT

    Source: vsftpd SSL and iptables

  15. Sauvegarder le Firewall
    # iptables-save > /etc/iptables.rules
  16. Tester de l’extérieur avec un client FTP (Filezilla, etc)

    Voir les options suivantes a la connection

    1. port: 6123
    2. Forcer le SSL

Ajouter un utilisateur FTP

On utilise le truc simple de htpasswd pour l’authentification. Pas de gossage :-)

Créer un nouveau compte

  1. Créer le premier compte, sinon, passer a la directive suivante! ou Utiliser mon script Script pour créer un compte utilisateur
    # htpasswd -c /etc/vsftpd.passwd ftpuser
    New password:
    Re-type new password:
    Adding password for user ftpuser

    Note l’option -c est pour créer le fichier la première fois.

  2. Voir les directives de *Script pour créer un compte utilisateur

Ajouter ou modifier un utilisateur

  1. Utiliser le script evo-vsftpd-user
    $ sudo evo-vsftpd-user foo
    Création d'un nouvel usager dans /etc/vsftpd.passwd ...
    New password:
    Re-type new password:
    Adding password for user foo
     ... OK
     * Création du dossier /home/ibottin/FTP/foo ...  OK
     * Changement des permissions du dossier ...  OK
    Terminé!

    Voir les directives de Script pour créer un compte utilisateur

Script pour créer un compte utilisateur

  1. Créer le fichier
    # vi /usr/sbin/evo-vsftpd-user
  2. Coller le contenu
    #!/bin/bash
    if [ -z $1 ]; then
      echo "Aucun argument usager fourni"
      echo "usage: sudo evo-vsftpd-user foo"
      exit 1;
    fi
     
    if [ "$(whoami)" != 'root' ]; then
      echo "Vous n'avez pas les permisions utilisateur requises."
      exit 1;
    fi
     
    echo "Création d'un nouvel usager dans /etc/vsftpd.passwd ... "
    htpasswd /etc/vsftpd.passwd $1
    echo " ... OK "
    echo -n " * Création du dossier /home/ibottin/FTP/$1 ... "
    mkdir /home/ibottin/FTP/$1
    echo " OK"
    echo -n " * Changement des permissions du dossier ... "
    chown -R ftp:ftp /home/ibottin/FTP/$1
    chmod -R 740 /home/ibottin/FTP/$1
    echo " OK"
    echo "Terminé!"
  3. Rendre exécutable
    # chmod +x /usr/sbin/evo-vsftpd-user

Tester

  1. Installer le paquet pour tester
    # aptitude install ftp-ssl
  2. Tester
    # ftp-ssl someserver.net 6123
    Connected to someserver.net.
    220 Un nom Quelconque FTP
    Name (someserver.net:renoirboulanger): ftpuser
    234 Proceed with negotiation.
    [SSL Cipher DES-XXXX-SHA]
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp>

    Note [SSL Cipher DES-XXXX-SHA] est ce qu’on attend :-)

Pour déboguer

Le feedback est assez difficile a avoir de la part de vsftpd, mais pour en voir plus:

  1. Pour le debug
    # vi /etc/vsftpd.conf
    ~
    # for debuging
    log_ftp_protocol=YES

Ressources