Mise en production


Je vais vous expliquer comment le mettre en production, nous allons voir les éléments suivants

  • Copier l'exécutable compilé au bon endroit
  • Créer un service systemd pour l'exécution au démarrage
  • Attribution d'un utilisateur pour l'utilisation du service (non root)

Pour ceux qui feraient une mise en production à l'extérieur, je recommande une sécurisation plus stricte via GEOIP et fail2ban et d'utiliser les options du logiciel --ip-whitelist et --ip-blacklist
Geoip pour restreindre l'accès à certains pays
Fail2ban pour bannir les erreurs 404 liées à la recherche d'URL par brute force. Mais aussi avec portsentry pour bannir les scans de port du serveur

Copie de l'exécutable

Copiez l'exécutable dans le dossier /usr/local/bin/ du serveur de production

cp transfersh /usr/local/bin/

/usr/local/bin est le répertoire dédié aux applications qui ne sont pas liées au système

Création d'un service avec systemd

Avant de créer le service, vous allez créer un utilisateur qui servira au lancement du service, le but étant de donner un minimum de droits pour éviter les risques de compromettre le serveur

Entrez la commande suivante

adduser --system --no-create-home --shell /bin/bash --disabled-password --disabled-login transfersh

Créer le fichier log pour le service

touch /var/log/transfersh.log

Vous modifiez les droits du fichier pour que l'utilisateur transfersh puisse écrire dedans

chown transfersh /var/log/transfersh.log

Maintenant, vous allez créer le service systemd

 nano /etc/systemd/system/transfersh.service

1 En extérieur, SSL avec lets encrypt

[Unit]
Description=Transfersh permet l'envoi de fichiers en ligne de commande
After=network-online.target

[Service]
Type=simple
User=transfersh
UMask=077

ExecStart=/usr/local/bin/transfersh --provider=local --basedir=/tmp/ --tls-listener-only --tls-listener 0.0.0.0:443  --tls-private-key /etc/ssl/transfersh/privkey1.pem --tls-cert-file /etc/ssl/transfersh/fullchain1.pem --purge-days 6 --max-upload-size 1000000 --log /var/log/transfersh.log                                                               

Restart=on-failure

# Configures the time to wait before service is stopped forcefully.
TimeoutStopSec=300

[Install]
WantedBy=multi-user.target

After=network-online.target démarre après le service indiqué, dans notre cas après le lancement de l'interface ethernet
UMask=077 Indique le masque des fichiers créés, ça sera 700 car on indique le masque d'annulation, donc 777 - 077 = 700
ExecStart= La commande à exécuter
Restart=on-failure redémarre en ça d'échec du lancement
TimeoutStopSec=300 temps avant arrêt forcé du service (cas de l'arrêt du serveur par exemple)
WantedBy=multi-user.target fonctionne que lors du démarrage du système en mode multiuser

Donner les droits au fichier de certificat

Nous allons déplacer les certificats lets encrypt pour permettre à l'utilisateur transfersh d'y accéder

cp /etc/letsencrypt/archive/dependancenum.fr/{fullchain1.pem,privkey1.pem} /etc/ssl/transfersh/

Puis nous modifions les droits de l'utilisateur pour que transfersh puisse accéder aux clés

chown -R transfersh /etc/ssl/transfersh

Vous allez attribuer les droits d'écriture et lecture et d'exécution au dossier transfersh

chmod 700 /etc/ssl/transfersh/

Nous donnons les droits minimums à la clé privés

chmod 400 /etc/ssl/transfersh/privkey1.pem

Automatiser le renouvèlement

Ajouter la ligne suivante dans /etc/cron.d/certbot, cette ligne va vérifier le checksum des certificats public (celui de lets encrypt et celui copié), et s'il y a une différence, c'est que le certificat a changé. Ainsi il copie les nouveaux et modifier les droits utilisateurs sur les certificats copiés

5 */12 * * * root if [ $(md5sum /etc/letsencrypt/archive/dependancenum.fr/fullchain1.pem|awk -F " " '{print $1}') = $(md5sum /etc/ssl/transfersh/fullchain1.pem|awk -F " " '{print $1}') ]; then echo "certificats vérifié et à jour" >> /var/log/transfersh.log; else systemctl stop transfersh && cp -f /etc/letsencrypt/archive/dependancenum.fr/{fullchain1.pem,privkey1.pem} /etc/ssl/transfersh/ && chown -R transfersh /etc/ssl/transfersh && chmod 400 /etc/ssl/transfersh/{fullchain1.pem,privkey1.pem} && systemctl start transfersh && echo "certificat remplacé" >> /var/log/transfersh.log; fi

2 En intérieur, avec ou sans SSL sur le port 80 ou 443 en modifiant la ligne à exécuter

[Unit]
Description=Transfersh permet l'envoi de fichiers en ligne de commande
After=network-online.target

[Service]
Type=simple
User=transfersh
UMask=077

ExecStart=/usr/local/bin/transfersh --provider=local --basedir=/tmp/ --listener 0.0.0.0:80 --purge-days 6 --max-upload-size 1000000 --log /var/log/transfersh.log                                                               
OU
ExecStart=/usr/local/bin/transfersh --provider=local --basedir=/tmp/ --tls-listener-only --tls-listener 0.0.0.0:443   --tls-private-key /etc/ssl/transfersh/transfersh.key --tls-cert-file /etc/ssl/transfersh/transfersh.crt

Restart=on-failure
TimeoutStopSec=300

[Install]
WantedBy=multi-user.target     

Modifier les droits des certificats

chown -R transfersh:root /etc/ssl/transfersh/
chmod 700 /etc/ssl/transfersh/
chmod 400 /etc/ssl/transfersh/transfersh.key
  • chown transfersh Va permettre à l'utilisateur transfersh d'utiliser les clés pour la mise en production
  • -R veut dire récursif, il va donc modifier les droits des sous-dossiers du dossier indiqué
  • chmod 700 Permet à transfersh de pouvoir écrire, lire et exécuter dans le dossier
  • chmod 400 donne le droit de lecture à transfersh uniquement

Automatiser le renouvèlement de certificat

Pour automatiser le renouvellement du certificat, nous allons vérifier la validité de celui-ci, si il n'est plus valide alors il crée un nouveau certificat

Ajouter cela à /etc/crontab

5 */12 * * * root if true | openssl s_client -connect 127.0.0.1:443 2>/dev/null |  openssl x509 -noout -checkend 0; then echo "Certificat encore valide" >> /var/log/transfersh.log; else echo "Certificat expiré, actualisation du certificat le $(date '+%d/%m/%Y %r') pour 1 an" >> /var/log/transfersh.log &&  systemctl stop transfersh && rm /etc/ssl/transfersh/transfersh.crt && openssl x509 -req -days 365 -in /etc/ssl/transfersh/transfersh.csr -signkey /etc/ssl/transfersh/transfersh.key -out /etc/ssl/transfersh/transfersh.crt && systemctl start transfersh; fi

Ouverture de port CAPABILITIES

Comme vous allez lancer votre service avec un utilisateur système sur le port 443 ou 80. Il va falloir l'autoriser à écouter sur l'un de ces ports

Seul root a le droit d'écouter sur les ports jusqu'à 1024, il va donc falloir modifier les capabilities sur votre exécutable pour que l'utilisateur transfersh ait le droit d'écoute sans être root. C'est une alternative à setuid. Au lieu de donner les droits root de façon générale, il les donne sur une partie des accès à UN programme. Dans notre cas l'ouverture de ports inférieur à 1024 qui nécessite les droits root

Vous allez donner les droits à l'application transfersh uniquement sur la partie ouverture de port, cela à tous les utilisateurs (cela peut être appliqué à un utilisateur si besoin)

setcap cap_net_bind_service=pe `which transfersh`

On affiche les droits capabilities appliqués à transfersh, vous devriez avoir la ligne suivante : /usr/local/bin/transfersh = cap_net_bind_service+ep

getcap `which transfersh`

Activez le service

systemctl enable transfersh

On lance le service

systemctl start transfersh