Déploiement VPS
Sécurisation et Configuration d'un VPS AlmaLinux
Guide de déploiement et sécurisation d'un VPS AlmaLinux chez OVH avec Nginx et site web statique.
Table des matières
- Configuration DNS
- Sécurisation SSH
- Configuration Firewall (nftables)
- Gestion SELinux
- Accès distant avec NoMachine
- Déploiement du site web
- Problèmes rencontrés
Configuration DNS
Chez OVH
Enregistrements DNS de base :
Type Nom Valeur TTL
A @ <IP_VPS> 3600
A www <IP_VPS> 3600
AAAA @ <IPv6_VPS> 3600 (optionnel)
Vérification DNS :
# Vérifier la propagation DNS
dig sanjyasz.pro
dig www.sanjyasz.pro
# Ou avec nslookup
nslookup sanjyasz.pro
Délai de propagation : 0-24h (généralement quelques minutes avec OVH)
Sécurisation SSH
1. Changer le port SSH par défaut
Éditer la configuration SSH :
sudo nano /etc/ssh/sshd_config
Modifications :
# Changer le port (éviter 22)
Port 55555
# Désactiver le login root
PermitRootLogin no
# Désactiver l'authentification par mot de passe (recommandé après setup de clés)
PasswordAuthentication no
# Autoriser uniquement certains utilisateurs
AllowUsers votre_user
# Désactiver les connexions X11 forwarding (si non utilisé)
X11Forwarding no
# Limiter les tentatives
MaxAuthTries 3
MaxSessions 2
Redémarrer SSH :
sudo systemctl restart sshd
⚠️ IMPORTANT : Gardez une session SSH ouverte et testez la connexion sur le nouveau port dans une nouvelle fenêtre avant de fermer la session actuelle !
Tester la nouvelle configuration :
ssh -p 55555 user@sanjyasz.pro
2. Configuration des clés SSH (si pas déjà fait)
Sur votre machine locale :
# Générer une paire de clés (si nécessaire)
ssh-keygen -t rsa
# Copier la clé publique sur le serveur (remarque peut se faire en IHM depuis OVH)
ssh-copy-id -p 55555 user@sanjyasz.pro
Sur le serveur, vérifier les permissions :
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. SELinux et changement de port SSH
Problème courant : SELinux bloque SSH sur un port non-standard (bizarremment j'ai pas eu à le faire au final)
Solution :
# Ajouter le nouveau port à la politique SELinux
sudo semanage port -a -t ssh_port_t -p tcp 55555
# Vérifier
sudo semanage port -l | grep ssh
# Redémarrer SSH
sudo systemctl restart sshd
Configuration Firewall (nftables)
Configuration complète
Fichier : /etc/nftables/ruleset.nft
#!/usr/sbin/nft -f
# Flush des règles existantes
flush ruleset
table inet filter {
# Chaîne INPUT - Trafic entrant
chain input {
type filter hook input priority filter
policy drop
# Loopback
iif "lo" accept comment "Autoriser loopback"
# Connexions établies
ct state established,related accept comment "Autoriser connexions établies"
# SSH sur port custom
tcp dport 55555 accept comment "Autoriser SSH sur port 55555"
# ICMP (ping)
ip protocol icmp accept comment "Autoriser ICMP/ping IPv4"
ip6 nexthdr ipv6-icmp accept comment "Autoriser ICMPv6/ping IPv6"
# DHCP client
udp sport 67 udp dport 68 accept comment "Autoriser DHCP client"
# HTTP/HTTPS
tcp dport 80 ct state established,new accept comment "Accès site web HTTP"
tcp dport 443 ct state established,new accept comment "Accès site web HTTPS"
# NoMachine (optionnel)
tcp dport 4000 accept comment "Connexion avec NoMachine"
}
# Chaîne FORWARD - Pas utilisée pour site statique
chain forward {
type filter hook forward priority filter
policy drop
}
# Chaîne OUTPUT - Trafic sortant
chain output {
type filter hook output priority filter
policy accept
}
}
Gestion du firewall
# Appliquer les règles
sudo nft -f /etc/nftables/ruleset.nft
# Vérifier les règles actives
sudo nft list ruleset
# Activer au démarrage
sudo systemctl enable nftables
sudo systemctl start nftables
# Recharger après modification
sudo systemctl reload nftables
Commandes utiles nftables
# Lister les règles de façon lisible
sudo nft list ruleset
# Vider toutes les règles
sudo nft flush ruleset
# Ajouter une règle temporaire (test)
sudo nft add rule inet filter input tcp dport 8080 accept
# Sauvegarder la config actuelle
sudo nft list ruleset > /etc/nftables/backup-ruleset.nft
Gestion SELinux
Vérifier le statut
# Statut SELinux
sestatus
# Mode actuel
getenforce
Commandes SELinux courantes
# Passer en mode permissif (temporaire)
sudo setenforce 0
# Repasser en mode enforcing
sudo setenforce 1
# Voir les contextes de fichiers
ls -lZ /path/to/file
# Restaurer les contextes par défaut
sudo restorecon -Rv /path/to/directory
# Rendre permanent un contexte
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?"
sudo restorecon -Rv /var/www
Problèmes SELinux courants
1. Nginx ne peut pas accéder aux certificats SSL
sudo restorecon -Rv /etc/letsencrypt
sudo semanage fcontext -a -t httpd_sys_content_t "/etc/letsencrypt(/.*)?"
2. Port non-standard bloqué par défaut sudo restorecon -Rv /path/to/directory
Rendre permanent un contexte
sudo semanage fcontext -a -t httpd_sys_content_t
# Pour SSH
sudo semanage port -a -t ssh_port_t -p tcp 55555
# Pour HTTP/HTTPS custom
sudo semanage port -a -t http_port_t -p tcp 8080
Debug SELinux
# Voir les dernières violations
sudo ausearch -m avc -ts recent
# Avec sealert (plus détaillé)
sudo sealert -a /var/log/audit/audit.log
Accès distant avec NoMachine
Pourquoi NoMachine au lieu de VNC ?
Problème avec VNC sur AlmaLinux :
- TigerVNC et autres solutions VNC ont des problèmes de compatibilité avec AlmaLinux (surtout Wayland)
- Configuration complexe avec SELinux
- Performances médiocres
NoMachine :
- ✅ Installation simple
- ✅ Meilleure performance
- ✅ Compatible AlmaLinux out-of-the-box
- ✅ Chiffrement intégré
- ✅ N'est pas basé sur RDP (RDP de la m il semblerait :p)
Installation NoMachine
1. Télécharger et installer :
# Télécharger la version serveur
wget https://download.nomachine.com/download/9.2/Linux/nomachine_9.2.18_3_x86_64.tar.gz
# Extraire
tar -xzf nomachine_9.2.18_3_x86_64.tar.gz
# Installer
cd NX
sudo ./nxserver --install
# Vérifier le statut
sudo /etc/NX/nxserver --status
2. Configurer le firewall (sur VPS):
# Ajouter le port NoMachine (4000) dans nftables
sudo nft add rule inet filter input tcp dport 4000 accept
# Sauvegarder
sudo nft list ruleset > /etc/nftables/ruleset.nft
3. Configuration SELinux :
# Autoriser NoMachine
sudo semanage port -a -t http_port_t -p tcp 4000
# Ou si problème persistant
sudo setsebool -P nis_enabled on
4. Démarrer le service :
sudo systemctl enable nxserver
sudo systemctl start nxserver
Connexion depuis le client
Sur machine locale :
- Installer le client NoMachine depuis nomachine.com
- Créer une nouvelle connexion :
- Protocole : NX
- Hôte : sanjyasz.pro
- Port : 4000
- Se connecter avec vos identifiants Linux
Configuration avancée NoMachine
Fichier : /usr/NX/etc/server.cfg
# Éditer la config
sudo nano /usr/NX/etc/server.cfg
# Paramètres utiles :
# Changer le port d'écoute
CommandPort 4000
# Limiter les connexions simultanées
SessionLimit 2
# Activer le chiffrement
EnableEncryption 1
Redémarrer après modification :
sudo /etc/NX/nxserver --restart
Déploiement du site web
1. Installation de Nginx
# Installer Nginx
sudo dnf install nginx -y
# Activer et démarrer
sudo systemctl enable nginx
sudo systemctl start nginx
# Vérifier le statut
sudo systemctl status nginx
2. Structure des fichiers
/var/www/sanjyasz.pro/ # Racine du site
├── index.html
├── assets/
│ ├── css/
│ ├── js/
│ └── images/
/etc/nginx/
├── nginx.conf # Config principale
└── conf.d/
└── sanjyasz.pro.conf # Config du site
3. Créer la structure
# Créer le dossier du site
sudo mkdir -p /var/www/sanjyasz.pro
# Définir les permissions
sudo chown -R nginx:nginx /var/www/sanjyasz.pro
sudo chmod -R 755 /var/www/sanjyasz.pro
4. Configuration Nginx
Fichier : /etc/nginx/conf.d/sanjyasz.pro.conf
server {
listen 80;
listen [::]:80;
server_name sanjyasz.pro www.sanjyasz.pro;
# Redirection HTTPS (après installation du certificat)
# return 301 https://$server_name$request_uri;
# Temporaire avant SSL
root /var/www/sanjyasz.pro;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# Configuration HTTPS (à décommenter après installation du certificat)
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name sanjyasz.pro www.sanjyasz.pro;
#
# # Certificats SSL
# ssl_certificate /etc/letsencrypt/live/sanjyasz.pro/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/sanjyasz.pro/privkey.pem;
#
# # Configuration SSL moderne
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
# ssl_prefer_server_ciphers off;
#
# # Headers de sécurité
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# add_header X-Frame-Options "SAMEORIGIN" always;
# add_header X-Content-Type-Options "nosniff" always;
# add_header X-XSS-Protection "1; mode=block" always;
#
# # Racine du site
# root /var/www/sanjyasz.pro;
# index index.html index.htm;
#
# location / {
# try_files $uri $uri/ =404;
# }
#
# # Optimisations pour fichiers statiques
# location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf)$ {
# expires 1y;
# add_header Cache-Control "public, immutable";
# }
# }
Tester et recharger :
# Tester la config
sudo nginx -t
# Recharger
sudo systemctl reload nginx
5. Déployer le site
Exemple de fichier index.html :
sudo nano /var/www/sanjyasz.pro/index.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mon Site</title>
</head>
<body>
<h1>Bienvenue sur sanjyasz.pro</h1>
<p>Site en construction...</p>
</body>
</html>
Ou upload depuis votre machine locale :
# Depuis votre machine
scp -P 55555 -r /path/to/site/* user@sanjyasz.pro:/tmp/
# Sur le serveur
sudo mv /tmp/* /var/www/sanjyasz.pro/
sudo chown -R nginx:nginx /var/www/sanjyasz.pro
sudo restorecon -Rv /var/www/sanjyasz.pro
6. Certificats SSL avec Let's Encrypt
# Installer Certbot
sudo dnf install certbot python3-certbot-nginx -y
# Obtenir un certificat
sudo certbot --nginx -d sanjyasz.pro -d www.sanjyasz.pro
# Vérifier le renouvellement automatique
sudo certbot renew --dry-run
# Le renouvellement auto est configuré via systemd timer
sudo systemctl status certbot-renew.timer
Fix SELinux pour les certificats :
# Permettre à Nginx de lire les certificats
sudo restorecon -Rv /etc/letsencrypt
sudo semanage fcontext -a -t httpd_sys_content_t "/etc/letsencrypt(/.*)?"
sudo restorecon -Rv /etc/letsencrypt
Après installation du certificat :
- Décommentez la section HTTPS dans
/etc/nginx/conf.d/sanjyasz.pro.conf - Activez la redirection HTTP → HTTPS
- Testez et rechargez :
sudo nginx -t && sudo systemctl reload nginx
Problèmes rencontrés
1. VNC impossible à configurer sur AlmaLinux
Problème : TigerVNC et autres solutions VNC ne fonctionnent pas correctement avec AlmaLinux, particulièrement avec Wayland.
Symptômes :
- Écran noir lors de la connexion
- Erreurs de permissions SELinux
- Incompatibilité avec Wayland
Solution : Migration vers NoMachine qui fonctionne out-of-the-box.
2. Nginx ne démarre pas après installation de certificats
Problème :
nginx: [emerg] cannot load certificate: Permission denied
Cause : Contexte SELinux incorrect sur les certificats Let's Encrypt.
Solution :
sudo restorecon -Rv /etc/letsencrypt
sudo semanage fcontext -a -t httpd_sys_content_t "/etc/letsencrypt(/.*)?"
sudo systemctl restart nginx
3. Certbot fail après renouvellement
Problème : Certificats renouvelés mais Nginx continue d'utiliser les anciens.
Cause : Nginx non rechargé après renouvellement.
Solution :
# Créer un hook de renouvellement
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Commandes de maintenance
Mises à jour système
# Mettre à jour AlmaLinux
sudo dnf update -y
# Vérifier les updates de sécurité
sudo dnf updateinfo list security
# Installer uniquement les updates de sécurité
sudo dnf update --security
Monitoring
# Vérifier les connexions SSH actives
who
w
# Voir les tentatives de connexion SSH échouées
sudo journalctl -u sshd | grep Failed
# Logs du firewall
sudo journalctl -k | grep nft
# Logs Nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
# Statut des services
sudo systemctl status nginx
sudo systemctl status nftables
sudo systemctl status nxserver
Backup
# Backup de la configuration
sudo tar -czf /backup/config-$(date +%Y%m%d).tar.gz \
/etc/nginx/ \
/etc/nftables/ \
/etc/ssh/sshd_config \
/etc/letsencrypt/
# Backup du site
sudo tar -czf /backup/website-$(date +%Y%m%d).tar.gz \
/var/www/sanjyasz.pro/
Checklist de sécurité
- SSH sur port non-standard (55555)
- Authentification par clé SSH uniquement
- Root login désactivé
- Firewall nftables configuré (policy drop par défaut)
- SELinux en mode enforcing
- Certificats SSL Let's Encrypt
- Headers de sécurité HTTP configurés
- Mises à jour automatiques de sécurité
- Monitoring des logs
- Backups réguliers