Au coin du Frag
Programmation, jeux et bien plus...

Mémo de post-installation d'un serveur (linux)

Publié le : 24 juin 2020
Mise à jour le : 07 juillet 2026
Temps de lecture : 5 min.

Mémo de post-installation d'un serveur (linux)

Crédit photo : Massimo Botturi on Unsplash

Il est tout beau, il est tout neuf, c'est mon nouveau serveur !

Alors avant de partir révolutionner le monde ou bidouiller n'importe quoi dessus, quelques conseils en vrac pour le préparer au mieux... Les conseils et commandes donnés ici ont été écrits pour une Debian 13 (Trixie) mais la plupart sont facilement adaptables à n'importe quelle autre distribution.

Bien sûr, ils ne sont utiles que si vous installez une machine unique (ou quelques machines). Au delà, il vaut mieux se reposer sur des applis d'automatisation (Chef, Ansible, SaltStack...)

Le nom d'hôte de la machine

Si vous avez personnalisé un DNS pour pointer sur votre serveur, faites-le lui savoir :

hostnamectl set-hostname monserveur.mondomaine.com

et mettez à jour le fichier /etc/hosts en conséquence !

Une remarque en passant, comme le précise la RFC 3330, le bloc d'adresses 127.0.0.0/8 entier peut être utilisé comme adresse de bouclage.

127.0.0.0/8 - This block is assigned for use as the Internet host loopback address. A datagram sent by a higher level protocol to an address anywhere within this block should loop back inside the host. This is ordinarily implemented using only 127.0.0.1/32 for loopback, but no addresses within this block should ever appear on any network anywhere [RFC1700, page 5].

Sur les debian, le fichier /etc/hosts associe l'adresse 127.0.0.1 au nom localhost et l'adresse 127.0.1.1 au nom de la machine. L'explication de ce fonctionnement est documenté ici

Restez à l'heure

Il est très important d'avoir une heure système correcte, ne serait-ce que pour pouvoir lire correctement un fichier de log...

Sur les debian récentes, le package pour avoir un système à l'heure est systemd-timesyncd, normalement installé par défaut.

Pour le paramétrer, éditez le fichier /etc/systemd/timesyncd.conf.d/local.conf :

[Time]
NTP=pool.ntp.org
FallbackNTP=fr.pool.ntp.org

Remarque : si votre serveur est en DHCP et que celui-ci fournit des infos de serveurs NTP, les infos du DHCP seront prioritaires sur votre configuration.

Les utilisateurs

Au delà de la première connexion (à la livraison du serveur), évitez de vous connecter directement en root dessus. Préférez l'ajout d'un utilisateur autorisé à faire des sudo.

useradd mon_user --create-home --shell /bin/bash --user-group --groups adm,cdrom,plugdev,sudo

Puis fixez son mot de passe :

echo mon_user:lemotdepasse | chpasswd
history -c

SSH

Bien sûr, vous accédez à votre serveur en SSH. Voici ce que je conseille dans /etc/ssh/sshd_config pour limiter les risques :

  • Pas d'accès pour le root (PermitRootLogin no)
  • Changer le port d'écoute (Port 222), le port choisi importe peu tant que vous ne prenez pas le port par défaut (tcp/22). Ca limite (un peu) les scripts de scan les plus simples (mais les plus nombreux).
  • Authentification par clés uniquement (PasswordAuthentication no)

Les autres paramètres par défaut sont généralement OK. N'oubliez pas de redémarrer votre serveur SSH et de tester la connexion avant de fermer la session de paramétrage, sinon vous avez fermé la porte avec les clés à l'intérieur !

Astuce supplémentaire : si vous voulez blinder la connexion SSH avec une authentification à deux facteurs, voici comment procéder :

  • Installez le paquet libpam-google-authenticator.
  • Editez le fichier /etc/pam.d/sshd pour ajouter en haut du fichier la directive auth required pam_google_authenticator.so nullok (nullok indique que l'utilisateur pourra tout de même se connecter si son compte n'a pas d'uahtenticator).
  • Dans /etc/ssh/ssd_config, ajoutez KbdInteractiveAuthentication yes et AuthenticationMethods publickey,keyboard-interactive pour permettre de chaîner la connexion par clé plus le code TOTP.

Pour générer une config d'authenticator, l'utilisateur devra lancer la commande google-authenticator.

Le firewall

Pour des configurations simples, j'utilise ufw. Il est facile à configurer et efficace.

apt-get install ufw

Voici les commandes de base :

  • Autoriser un port : ufw allow port/__proto__ Par exemple : ufw allow 222/tcp
  • Autoriser un port avec des raffinements : ufw allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto protocol] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
  • Activer / désactiver le firewall : ufw enable et ufw disable (attention : quand le pare-feu est désactrivé, vous ne pouvez plus voir les règles)
  • Recharger les règles : ufw reload
  • Configurer la politique par défaut : ufw default allow|deny|reject [incoming|outgoing]
  • Voir les règles définies (numbered permet de voir les règles numérotées, pratique quand on veut en supprimer une) : ufw status numbered

L'écriture des règles ressemble à celles du firewall pf de OpenBSD. Ma config par défaut pour n'autoriser que SSH :

ufw allow 222/tcp       # 222 = le port de votre SSH
ufw default deny        # bloque tout par défaut
ufw enable              # active le pare-feu
ufw logging off         # désactiver le log, peut servir si votre serveur est une petite configuration

et pour contrôler que tout va bien :

ufw status

Un serveur SMTP

Sur un serveur autonome, j'utilise OpenSMTPd. J'ai écrit un autre article sur sa configuration pour remonter les infos d'un serveur, je ne rentrerai donc pas dans les détails ici...

Pour tester l'envoi de mail :

mailx -s Test -r root@monserveur.mondomaine.com monadresse@mondomaine.com

puis saisir un message et terminer par une ligne ne contenant que un point.

Mise à jour automatique

Pour ne pas avoir à faire manuellement les lises à jour du serveur, rien de plus simple, le package unattended-upgrade est là pour ça. Il suffit de l'installer avec apt install unattended-upgrades et de le paramétrer en créant les fichiers suivants :

/etc/apt/apt.conf.d/22auto-upgrades contenant :

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

et /etc/apt/apt.conf.d/52unattended-upgrades.conf (contenu à adapter selon vos besoins) contenant :

Unattended-Upgrade::Mail "monadresse@mondomaine.com";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "false";
Unattended-Upgrade::Automatic-Reboot "true";

En particulier, la dernière ligne indique si le serveur doit rebooter automatiquement en cas de mise à jour, par exemple, du kernel. Personnellement, j'utilise le reboot auto pour tous les serveurs exposés directement sur Internet. Je pars du principe qu'il vaut mieux avoir un serveur indisponible à cause d'un problème de mise à jour qu'un serveur vulnérable accessible.

Un prompt agréable

Pour avoir un prompt joliment coloré, ajoutez dans le .bashrc :

export PS1="\[\033[38;5;11m\]\u\[$(tput sgr0)\]\[\033[38;5;15m\]@\h:\[$(tput sgr0)\]
\[\033[38;5;6m\][\[$(tput sgr0)\]\[\033[38;5;6m\]\w\[$(tput sgr0)\]\[\033[38;5;6m\]]:
\[$(tput sgr0)\]\[\033[38;5;15m\] \[$(tput sgr0)\]"

Il existe quantité de générateurs de prompts, ou de site pour comprendre la syntaxe.

Petit ménage final

Pour supprimer tous les paquets inutiles : apt autoremove

Et voilà, c'est fini, amusez-vous bien !

Bonus : le script

Comme j'en avait marre de tout faire à la main, j'ai fait un script bash qui regroupe toutes mes configs de base. Le voici :

# Nom du serveur
server_name="ici mettre le fqdn"
# Clé publique SSH
ssh_key="ici mettre la clé publique"
# Port pour le daemon SSH
sshd_port=222
# Activer les logs du firewall : on|off
ufw_log="off"
# Email de l'administrateur
email_admin="monemail@chezmoi"
# Serveur de relai SMTP
serveur_relai_smtp="mon serveur SMTP"
# Email d'authentification
relai_smtp="un login"
# Mot de passe du relai
relai_smtp_pass="le mot de passe"
# Utilisateur standard
user_standard="nom d'utilisateur"
user_standard_pass="le mot de passe"

if [[ $EUID -ne 0 ]]; then
    echo "Ce script doit être exécuté en root."
    exit 1
fi

apt-get update
apt-get install -y \
    sudo \
    ufw \
    less \
    unattended-upgrades \
    opensmtpd

# Fixer le hostname
hostnamectl set-hostname "$server_name"

# Utilisateur standard et sudo
useradd "$user_standard" --create-home --shell /bin/bash --user-group --groups adm,cdrom,plugdev,sudo
echo "$user_standard:$user_standard_pass" | chpasswd

# SSH
mkdir "/home/$user_standard/.ssh"
chmod 700 "/home/$user_standard/.ssh"
touch "/home/$user_standard/.ssh/authorized_keys"
chmod 600 "/home/$user_standard/.ssh/authorized_keys"
chown -R $user_standard:$user_standard "/home/$user_standard/.ssh"
echo  $ssh_key >> "/home/$user_standard/.ssh/authorized_keys"
sed -i -E "s/^#? *Port.*/Port $sshd_port/g" /etc/ssh/sshd_config
sed -i -E "s/^#? *PermitRootLogin.*/PermitRootLogin no/g" /etc/ssh/sshd_config
sed -i -E "s/^#? *PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
sed -i -E "s/^#? *X11Forwarding.*/X11Forwarding no/g" /etc/ssh/sshd_config
systemctl restart sshd

# firewall
ufw allow "$sshd_port"/tcp
ufw default deny
ufw logging "$ufw_log"
ufw enable

# Environnement de travail de l'utilisateur standard
echo "export LS_OPTIONS='--color=auto -la'" >> "/home/$user_standard/.bashrc"
echo "eval \"\`dircolors\`\""  >> "/home/$user_standard/.bashrc"
echo "alias ls='ls \$LS_OPTIONS'"  >> "/home/$user_standard/.bashrc"
echo 'export PS1="\[\\033[38;5;11m\\]\\u\\[$(tput sgr0)\\]\\[\\033[38;5;15m\\]@\\h:\\[$(tput sgr0)\\]\\[\\033[38;5;6m\\][\\[$(tput sgr0)\\]\\[\\033[38;5;6m\\]\\w\\[$(tput sgr0)\\]\\[\\033[38;5;6m\\]]:\\[$(tput sgr0)\\]\\[\\033[38;5;15m\\] \\[$(tput sgr0)\\]"' >> "/home/$user_standard/.bashrc"

# Environnement de travail de root
echo "export LS_OPTIONS='--color=auto -la'" >> "/root/.bashrc"
echo "eval \"\`dircolors\`\""  >> "/root/.bashrc"
echo "alias ls='ls \$LS_OPTIONS'"  >> "/root/.bashrc"
echo 'export PS1="\[\\033[38;5;11m\\]\\u\\[$(tput sgr0)\\]\\[\\033[38;5;15m\\]@\\h:\\[$(tput sgr0)\\]\\[\\033[38;5;6m\\][\\[$(tput sgr0)\\]\\[\\033[38;5;6m\\]\\w\\[$(tput sgr0)\\]\\[\\033[38;5;6m\\]]:\\[$(tput sgr0)\\]\\[\\033[38;5;15m\\] \\[$(tput sgr0)\\]"' >> "/root/.bashrc"

# Mises à jour auto
echo "Unattended-Upgrade::Origins-Pattern { \"origin=Debian,codename=\${distro_codename},label=Debian-Security\"; }; Unattended-Upgrade::Mail \"$email_admin\"; Unattended-Upgrade::Remove-Unused-Kernel-Packages \"true\"; Unattended-Upgrade::Remove-New-Unused-Dependencies \"true\"; Unattended-Upgrade::Remove-Unused-Dependencies \"false\"; Unattended-Upgrade::Automatic-Reboot \"true\";" > /etc/apt/apt.conf.d/52unattended-upgrades

# Relai email
echo "table aliases file:/etc/aliases table smtp_secrets file:/etc/smtp_secrets listen on lo accept for local alias <aliases> deliver to mbox accept for any relay via tls+auth://label@$serveur_relai_smtp auth <smtp_secrets>" > /etc/smtpd.conf
echo "label $relai_smtp:$relai_smtp_pass" > /etc/smtp_secrets
chown root:opensmtpd /etc/smtp_secrets
chmod 600 /etc/smtp_secrets
sed -i -E "s/^#? *root:.*/root: $email_admin/g" /etc/aliases
systemctl restart opensmtpd