−25%

sur Windows en paiement annuel, jusqu'au 31/10. Voir les offres

EQVPS
Commencer

Configurer un VPS Alpine Linux : apk, doas, OpenRC et un pare-feu

Les premières étapes sur un VPS Alpine Linux 3.21 tout neuf : mettre à jour et redémarrer, créer un utilisateur doas qui peut vraiment se connecter, couper la connexion SSH de root et par mot de passe, installer ufw, activer cron et les mises à jour quotidiennes. Avec le port Docker que ufw ne bloque pas.

Alpine Linux est la plus petite image que nous proposons. Sur nos serveurs, un Alpine 3.21 neuf occupait au repos 55 Mo de RAM et 153 Mo de disque, contre 313 Mo et 2,7 Go pour Ubuntu 24.04. En échange, vous renoncez aux outils habituels. Alpine utilise apk au lieu de apt, doas au lieu de sudo, OpenRC au lieu de systemd et musl au lieu de glibc.

Les étapes ci-dessous sont les mêmes dix premières minutes que sur Debian ou Ubuntu, transposées à Alpine. Nous avons exécuté chaque commande sur notre image Alpine 3.21 avant publication, et deux d'entre elles nous ont piégés la première fois. Connectez-vous en root avec le mot de passe de votre tableau de bord.

1. Mettre à jour, puis redémarrer une fois

apk update && apk upgrade
uname -r
ls /lib/modules

Votre serveur a déjà installé les mises à jour disponibles à son premier démarrage, donc apk upgrade n'a en général presque plus rien à faire. Regardez plutôt les deux dernières lignes. Si cette première mise à jour a apporté un nouveau noyau, le noyau en cours (uname -r) n'a plus ses modules sur le disque. Tout ce qui charge un module échoue alors jusqu'au redémarrage. Sur notre serveur de test, l'installation du pare-feu a affiché ERROR: Couldn't determine iptables version. Si les deux versions diffèrent, redémarrez maintenant :

reboot

Notre serveur de test est revenu en moins d'une minute.

2. Créer un utilisateur qui peut se connecter

adduser -D deploy
passwd deploy
adduser deploy wheel

Ne sautez pas passwd. adduser -D crée le compte sans mot de passe, Alpine le marque comme verrouillé, et sshd refuse un compte verrouillé même avec la bonne clé. Dans notre test, le seul indice était cette ligne dans /var/log/messages :

User deploy not allowed because account is locked

Le mot de passe servira aussi plus tard : c'est lui que doas demandera.

Si vous avez ajouté une clé SSH en commandant le serveur, elle se trouve dans le authorized_keys de root. Copiez-la pour le nouvel utilisateur :

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys

Pas encore de clé ? Créez-en une sur votre ordinateur et collez la partie publique dans /home/deploy/.ssh/authorized_keys.

3. Faire demander le mot de passe par doas

Alpine utilise doas au lieu de sudo, et notre image l'autorise déjà pour le groupe wheel. La règle de /etc/doas.d/wheel.conf est permit nopass :wheel : tout membre de wheel devient root sans rien taper. Faites-lui demander le mot de passe, puis le retenir quelques minutes :

echo 'permit persist :wheel' > /etc/doas.d/wheel.conf

Désormais, doas apk add nano fonctionne comme sudo apt install nano sous Ubuntu.

4. SSH : clés uniquement, pas de root

sshd lit les fichiers de /etc/ssh/sshd_config.d/ dans l'ordre des noms et garde la première valeur trouvée pour chaque réglage. Sur notre image, le premier fichier est 00-eqvps.conf, qui autorise root et les mots de passe pour que vous puissiez entrer le premier jour. Remplacez son contenu :

cat > /etc/ssh/sshd_config.d/00-eqvps.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && rc-service sshd restart
sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication) '

La troisième ligne compte sous Alpine. L'image utilise la version d'OpenSSH avec PAM, et avec les deux premières lignes seulement, notre serveur de test proposait encore la connexion keyboard-interactive. Avec les trois, une tentative sans clé obtient :

Permission denied (publickey).

Gardez votre session root ouverte. Dans un second terminal, vérifiez que ssh deploy@YOUR.SERVER.IP fonctionne (sur une offre NAT, ajoutez -p et le port personnel du tableau de bord) et que doas id accepte le mot de passe.

5. Pare-feu : ufw

ufw se trouve dans le dépôt community, déjà activé sur notre image :

apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status

limit laisse passer SSH mais ralentit quiconque ouvre beaucoup de connexions d'affilée. rc-update est important ici, car OpenRC ne relance pas le pare-feu après un redémarrage tant qu'il n'est pas ajouté au runlevel. Après un redémarrage, notre serveur est revenu avec Status: active. Sur une offre NAT, laissez SSH sur le port 22 : votre port externe personnel est redirigé vers le 22 du serveur. Sur une offre avec sa propre IPv4, ouvrez les ports web quand vous en avez besoin (ufw allow 80/tcp, ufw allow 443/tcp). Le guide ufw couvre le reste.

6. Activer cron et les mises à jour quotidiennes

Un Alpine neuf ne fait tourner aucun cron. Activez-le :

rc-update add crond default
rc-service crond start

La crontab de root sous Alpine lance déjà tout ce qui se trouve dans /etc/periodic/daily à 02:00. Déposez-y un script de mise à jour :

cat > /etc/periodic/daily/apk-upgrade <<'EOF'
#!/bin/sh
apk upgrade --update-cache --no-progress >> /var/log/apk-auto.log 2>&1
EOF
chmod +x /etc/periodic/daily/apk-upgrade
run-parts --test /etc/periodic/daily

La dernière commande liste les scripts que cron exécutera, et le vôtre doit y figurer. Vous recevez ainsi les correctifs de la 3.21. Passer à la version suivante d'Alpine est une étape à part, manuelle. Les mises à jour du noyau demandent toujours un redémarrage : refaites de temps en temps la vérification uname -r / ls /lib/modules de l'étape 1.

7. OpenRC en un tableau

Si vous connaissez systemd, voici l'essentiel de ce qui change :

TâchesystemdAlpine (OpenRC)
Démarrer un servicesystemctl start nginxrc-service nginx start
Lancer au démarragesystemctl enable nginxrc-update add nginx default
Étatsystemctl status nginxrc-service nginx status
Ce qui tournesystemctl list-unitsrc-status
Journal systèmejournalctl/var/log/messages

8. Docker, et le port que ufw ne bloque pas

Alpine fait un bon hôte Docker, car le système lui-même ne gêne pas :

apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world

Sur notre serveur, cela a pris 12 secondes téléchargement compris. Avec le démon Docker lancé, la mémoire utilisée est passée de 57 Mo à 124 Mo.

Un piège qui ne concerne pas qu'Alpine : Docker écrit ses propres règles de pare-feu. Alors que ufw n'autorisait que SSH, nous avons lancé nginx avec -p 8080:80 et l'avons atteint depuis l'extérieur du serveur sur le port 8080. ufw ne l'a pas bloqué. Si un conteneur ne doit être joint que via un reverse proxy sur le même serveur, publiez-le sur localhost :

docker run -d -p 127.0.0.1:8080:80 nginx:alpine

Quelle offre

Alpine laisse presque toute la RAM à vos propres logiciels. L'offre Nano (2 vCPU, 1 Go, 15 Go, $3/mois) suffit pour un petit service ou quelques conteneurs. C'est une offre NAT, donc SSH arrive par un port personnel. Si les ports 80 et 443 doivent être ouverts sur Internet, Nano-IP a sa propre IPv4 pour $8/mois. Pour des piles Docker plus lourdes, Micro donne 2 Go pour $5/mois.

Alpine 3.21 figure sur la page Alpine VPS et sur toutes les offres Linux de la section VPS. Le paiement se fait en USDT, USDC ou ETH sur Base, Ethereum ou Polygon, sans pièce d'identité ni carte.

FAQ

Pourquoi Alpine est-il tellement plus petit qu'Ubuntu ou Debian ?

Il utilise musl au lieu de glibc, BusyBox pour les commandes de base et OpenRC au lieu de systemd. Sur nos serveurs, un Alpine 3.21 neuf occupait au repos 55 Mo de RAM et 153 Mo de disque. Ubuntu 24.04 occupait 313 Mo et 2,7 Go.

Pourquoi mon nouvel utilisateur reçoit-il « account is locked » alors que la clé est bonne ?

adduser -D crée le compte sans mot de passe, Alpine le marque comme verrouillé, et sshd refuse alors cet utilisateur même avec une clé valide. La ligne du journal est « User deploy not allowed because account is locked ». Donnez un mot de passe à l'utilisateur avec passwd et la connexion par clé fonctionne.

Pourquoi un tunnel SSH ne marche-t-il pas sous Alpine ?

Le fichier /etc/ssh/sshd_config par défaut d'Alpine contient AllowTcpForwarding no, donc les redirections ssh -L sont refusées. Si vous avez besoin de tunnels, mettez yes dans ce fichier et lancez rc-service sshd restart.

Mon programme tournera-t-il sous Alpine ?

Tout ce qui vient des dépôts Alpine tournera, tout comme les conteneurs Docker construits sur n'importe quelle image de base. Les binaires Linux précompilés pour glibc ne démarrent souvent pas sur musl. Cherchez une version Alpine ou musl, ou lancez le programme dans Docker. Le paquet gcompat aide pour certains binaires glibc simples.

Quelle offre suffit pour Alpine ?

L'offre Nano de 1 Go à $3 par mois laisse beaucoup de marge : le système lui-même utilise environ 55 Mo. Si les ports 80 et 443 doivent être ouverts sur Internet, prenez Nano-IP à $8 par mois, avec sa propre IPv4.

Commentaires

Pas encore de commentaires. Soyez le premier.

Laisser un commentaire

Les commentaires sont modérés avant leur publication.