Mettre en place un accès SFTP en jail chroot pour un groupe spécifique

Lorsque cela est possible, il est préférable d’utiliser le protocole SFTP pour effectuer des transferts de fichiers sur un serveur plutôt que du FTP classique. Je vous propose aujourd’hui un petit mémo pour mettre en place un accès SFTP avec utilisateurs chrootés.

L’exemple de base est de donner un accès au fichiers d’un serveur web qui seront situé sous /var/www, dans mon cas sous CentOS 7.


Configuration du SFTP

  • Créer un groupe pour le SFTP :
    $ sudo groupadd sftp_users
  • Ajouter un utilisateur (ici web) pour le SFTP :
    $ sudo useradd web
  • Ajouter un mot de passe à l’utilisateur web :
    $ sudo passwd web
  • Ajouter l’utilisateur web au groupe pour le SFTP et lui attribuer le répertoire par défaut :
    $ sudo usermod -g sftp_users web
    $ sudo usermod -d /var/www web
  • Éditer le fichier de configuration du daemon SSH sous /etc/ssh/sshd_config.
    • Commenter la ligne suivante :
      #Subsystem sftp /usr/libexec/openssh/sftp-server
    • Ajouter ce qui suit :
      Subsystem sftp internal-sftp
      
      Match Group sftp_users
      	X11Forwarding no
      	AllowTcpForwarding no
      	ChrootDirectory %h
      	ForceCommand internal-sftp
  • Redémarrer le service SSH :
    $ sudo systemctl restart sshd
  • S’assurer que les permissions sont correctes pour le chroot, le répertoire /var/www doit appartenir à root et uniquement éditable par le propriétaire.

Test de l’accès SFTP

On teste l’accès en SFTP :

$ sftp web@mon-serveur
web@mon-serveur's password:
Connected to mon-serveur.
sftp> ls -l
drwxrwxr-x 2 0 48 4096 Oct 19 20:39 cgi-bin
drwxrwxr-x 2 0 48 4096 Mar 29 06:12 html
sftp> pwd
Remote working directory: /
sftp>

Test de l’accès SSH

L’accès ssh quant à lui est bien refusé :

$ ssh web@mon-serveur
web@mon-serveur's password:
This service allows sftp connections only.
Connection to mon-serveur closed.

Sécuriser un site avec une authentification HTTP sous Nginx

Si vous avez besoin d’avoir une zone sécurisée sur un espace web sans vouloir déployer un système de gestion d’utilisateurs, l’authentification HTTP reste un moyen simple et rapide à mettre en place.

Voici la procédure en quelques points pour mettre en place une authentification HTTP avec Nginx sous CentOS 7.


Pour générer un fichier d’utilisateurs .htpasswd propre à une authentification HTTP, il nous faut l’outil du même nom qui est fourni par Apache. On n’a pas besoin d’Apache donc, juste des outils qui vont avec. Sous CentOS :

$ sudo yum install httpd-tools

Ensuite, il suffit de créer un utilisateur dans le répertoire voulu :

$ sudo htpasswd -c /etc/nginx/.htpasswd nom_utilisateur

On renseigne et vérifie le mot de passe.

Pour terminer, dans la configuration Nginx, à l’intérieur d’un server, ajouter :

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

Il suffit de tester puis si tout est ok de redémarrer Nginx :

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl reload nginx

C’est terminé.

Authentification HTTP Nginx
Authentification HTTP Nginx

Créer ou renouveler un certificat Let’s Encrypt avec la méthode DNS challenge

Certbot (Let’s Encrypt) a révolutionné et démocratisé l’utilisation du protocole HTTPS avec ses certificats gratuits. J’en avais déjà parlé notament dans l’article Renouveler un certificat SSL Let’s encrypt avec le plugin Webroot. La méthode utilisée dans l’article possède au moins un inconvénient en ce qui me concerne, si un des domaines ou sous-domaines n’a pas de document root – par exemple c’est un domaine redirigé – alors il n’est pas possible de renouveler le certificat car Certbot doit écrire à la racine de l’hébergement du domaine dans un répertoire .well-known, qui n’existe pas pour ce genre de cas.

La méthode DNS challenge

Pour palier à cela, je me suis penché sur la vérification par DNS que propose Certbot. Voici la syntaxe que j’utilise avec quelques options bien utiles :

certbot \
     --text \
     --agree-tos \
     --email postmaster@domaine.net \
     -d domaine.net \
     -d www.domaine.net \
     -d admin.domaine.net \
     -d outils.domaine.net \
     --manual \
     --preferred-challenges dns \
     --expand \
     --renew-by-default \
     --manual-public-ip-logging-ok \
     certonly

La première fois, Certbot va vous demander d’ajouter un ou plusieurs nouveaux enregistrements DNS de type TXT avec des messages de la sorte :

Please deploy a DNS TXT record under the name
_acme-challenge.www.domaine.net with the following value:

01q03R1jl4gen_8souu4Ki1kbnfEaJJ7JIjP_eG12nU

Before continuing, verify the record is deployed.

Lorsque c’est fait, il suffit d’appuyer sur entrée pour continuer et le renouvellement du certificat va se poursuivre.


Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.domaine.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.domaine.net/privkey.pem
   Your cert will expire on 2018-01-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Gestion des messages sortants de Postfix (queues)

Récemment, j’ai eu des problèmes d’envoi d’emails avec le serveur SMTP Postfix, étant une chose rare, je ne me souviens jamais de certaines commandes de gestion des files d’attente de messages sortants de Postfix. Voici un petit mémo.

Lister les files d’attente Postfix

Postfix possède 2 queues d’envoi d’emails : la liste d’emails en cours d’envoi (pending mails) et la liste d’emails differés (deferred mails). La queue des emails différés sont les messages qui ont été en soft-fail et sont mis en attente pour essayer d’être envoyés plus tard. Leur statut est Temporary failure. Par défaut, Postfix essaie 5 minutes plus tard.

  • Lister les messages en cours d’envoi :
    mailq
  • Lister les messages différés :
    postqueue -p

Supprimer les messages

  • Pour supprimer les messages de la queue :
    postsuper -d ALL
  • Pour supprimer tous les messages dans la queue des emails différés :
    postsuper -d ALL deferred

Envoyer les messages

Si inversement vous voulez envoyer les messages et ainsi vider la file d’attente :

postqueue -f

ou

postfix flush