Je vais vous expliquer comment le mettre en production, nous allons voir les éléments suivants
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
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
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
[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
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
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
[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
chown -R transfersh:root /etc/ssl/transfersh/
chmod 700 /etc/ssl/transfersh/
chmod 400 /etc/ssl/transfersh/transfersh.key
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
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