Ceph est un système de stockage distribué puissant, mais les paramètres par défaut laissent des failles qu'un attaquant peut exploiter. Ce guide vous accompagne dans le durcissement d'un cluster Ceph par étapes petites et vérifiables — authentification, secrets, exposition réseau, chiffrement du transport, accès au tableau de bord et rotation des identifiants — avec un projet pilote local que vous pouvez exécuter avant un déploiement à l'échelle du cluster.
Vue d'ensemble du workflow
Appliquez chaque étape, vérifiez, puis passez à la suivante. Le workflow est conçu pour la sécurité en production et la clarté.
1. Inventaire et ligne de base
Capturez l'état actuel afin de pouvoir tracer les modifications et revenir en arrière si nécessaire.
# Lister les versions et l'état de santé
ceph versions
ceph -s
ceph health detail
# Instantané de la configuration effective pour la traçabilité
ceph config dump -f json-pretty > ceph-config-baseline.json
2. Verrouiller l'authentification et l'autorisation (cephx)
Désactivez le comportement insécurisé de récupération globale d'ID — requis pour la messagerie sécurisée Messenger v2.
ceph config get mon auth_allow_insecure_global_id_reclaim
ceph config set mon auth_allow_insecure_global_id_reclaim false
Créez un client aux privilèges minimaux pour l'accès RBD à un seul pool (exemple de pool : vms).
sudo ceph auth get-or-create client.rbduser \
mon 'profile rbd' \
osd 'profile rbd pool=vms' \
mgr 'allow r' \
-o /etc/ceph/ceph.client.rbduser.keyring
Durcissez les caps d'un client existant sur place :
ceph auth caps client.rbduser \
mon 'profile rbd' \
osd 'profile rbd pool=vms' \
mgr 'allow r'
Pour CephFS, utilisez des caps basés sur les chemins. Cet exemple accorde un accès en lecture seule à /var/www :
ceph fs authorize cephfs client.webuser /var/www r
3. Secrets au repos : protéger les trousseaux de clés et le matériel d'administration
Restreignez les permissions du système de fichiers pour que seul l'utilisateur ceph puisse lire les trousseaux de clés.
sudo chown ceph:ceph /etc/ceph/ceph.client.rbduser.keyring
sudo chmod 600 /etc/ceph/ceph.client.rbduser.keyring
Gardez les trousseaux d'administration hors des hôtes d'application. Déployez uniquement l'identité client restreinte sur les nœuds d'application.
4. Réduire l'exposition réseau
Séparez les réseaux public et cluster dans ceph.conf et liez Messenger v2.
# /etc/ceph/ceph.conf
[global]
public_network = 10.10.0.0/24
cluster_network = 10.20.0.0/24
ms_bind_msgr2 = true
auth_allow_insecure_global_id_reclaim = false
Appliquez des règles de pare-feu hôte. N'autorisez que les ports requis depuis les sous-réseaux de confiance. Cet exemple iptables suppose les sous-réseaux ci-dessus ; adaptez-le à votre topologie.
# Autoriser les moniteurs sur le réseau public (msgr2 3300, legacy 6789) depuis le sous-réseau de confiance
sudo iptables -A INPUT -p tcp -s 10.10.0.0/24 --dport 3300 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.10.0.0/24 --dport 6789 -j ACCEPT
# Autoriser la plage OSD uniquement sur le réseau cluster
sudo iptables -A INPUT -p tcp -s 10.20.0.0/24 --dport 6800:7300 -j ACCEPT
# Bloquer le trafic non sollicité vers les ports Ceph (placer après les règles ACCEPT explicites)
sudo iptables -A INPUT -p tcp --dport 3300 -j DROP
sudo iptables -A INPUT -p tcp --dport 6789 -j DROP
sudo iptables -A INPUT -p tcp --dport 6800:7300 -j DROP
Rendez les règles persistantes avec l'outillage de votre distribution (iptables-save, nftables, firewalld ou ufw).
5. Activer le transport chiffré (Messenger v2)
Assurez-vous que msgr2 est lié sur le port 3300 et que le msgr1 legacy n'est pas requis par vos clients.
# Vérifier que la récupération insécurisée est désactivée
ceph config get mon auth_allow_insecure_global_id_reclaim
# Confirmer que les clients et démons annoncent des points de terminaison v2
ceph mon dump | grep v2:
ceph osd dump | grep v2:
Si un démon ne liste encore que des adresses v1:, vérifiez ms_bind_msgr2 et les versions de la bibliothèque cliente.
6. Restreindre et chiffrer le tableau de bord Ceph
Activez HTTPS avec votre propre certificat et clé.
ceph dashboard set-ssl-certificate -i dashboard.crt
ceph dashboard set-ssl-private-key -i dashboard.key
ceph config set mgr mgr/dashboard/ssl true
Créez un rôle d'administration dédié pour les opérations courantes au lieu de surutiliser l'utilisateur intégré admin.
ceph dashboard ac-user-create secadmin 'StrongP4ssw0rd!' administrator
Exposez le tableau de bord uniquement sur les interfaces de confiance ; placez un proxy inverse (nginx, HAProxy) devant si vous avez besoin d'authentification supplémentaire ou de limitation de débit.
7. Rotation des identifiants sans temps d'arrêt
Faites tourner les clés avec une coupure côte à côte : créez un nouveau principal, basculez les applications, puis retirez l'ancien.
# Créer un nouveau client avec des caps identiques
sudo ceph auth get-or-create client.rbduser_v2 \
mon 'profile rbd' \
osd 'profile rbd pool=vms' \
mgr 'allow r' \
-o /etc/ceph/ceph.client.rbduser_v2.keyring
# Mettre à jour la configuration de l'application pour utiliser client.rbduser_v2, puis vérifier l'accès
# Supprimer l'ancienne identité lorsque c'est sûr
ceph auth rm client.rbduser
8. Vérifications de validation (répétables après chaque changement)
Exécutez ces vérifications rapides pour confirmer que le durcissement est effectif.
# Accès correctement limité
ceph auth list | grep client.rbduser
ceph auth get client.rbduser -f json-pretty
# Exposition réseau minimale
ss -tulpn | grep -E 'ceph|3300|6789|6800|7300'
# Sécurité sur le fil imposée
ceph config get mon auth_allow_insecure_global_id_reclaim
ceph mon dump | grep -E 'v2:'
# Santé du cluster stable
ceph -s
ceph health detail
Plan pilote local
Objectif : tester en toute sécurité l'accès aux privilèges minimaux et le durcissement du transport pour une application utilisant un seul pool, et renforcer le pare-feu hôte sur un nœud.
Périmètre
- Stockage : pool
vms - Application : un seul hôte VM mappant une image RBD
- Nœuds concernés : un hôte OSD (pare-feu), les moniteurs (drapeaux de configuration) et l'hôte d'application (identité client)
Étapes
- Préparer et capturer l'état actuel
ceph -s
ceph config dump -f json-pretty > pilot-pre-config.json
- Créer un client restreint pour l'application
sudo ceph auth get-or-create client.vmapp \
mon 'profile rbd' \
osd 'profile rbd pool=vms' \
mgr 'allow r' \
-o /etc/ceph/ceph.client.vmapp.keyring
sudo chown ceph:ceph /etc/ceph/ceph.client.vmapp.keyring
sudo chmod 600 /etc/ceph/ceph.client.vmapp.keyring
- Mapper et utiliser une image RBD avec la nouvelle identité
# Sur l'hôte d'application
rbd -n client.vmapp --keyring /etc/ceph/ceph.client.vmapp.keyring \
map vms/test-image
# Test d'E/S simple
sudo dd if=/dev/zero of=/dev/rbd/vms/test-image bs=1M count=64 oflag=direct
- Imposer la sécurité sur le fil
ceph config set mon auth_allow_insecure_global_id_reclaim false
# Confirmer que les points de terminaison v2 sont utilisés
ceph mon dump | grep v2:
- Verrouiller le pare-feu sur un hôte OSD (pilote)
# Autoriser le trafic OSD du réseau cluster uniquement depuis le sous-réseau cluster
sudo iptables -A INPUT -p tcp -s 10.20.0.0/24 --dport 6800:7300 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6800:7300 -j DROP
- Valider et mesurer
- Fonction : l'E/S de l'application se termine, pas d'erreurs d'authentification dans les journaux
- Sécurité : points de terminaison msgr2 annoncés, récupération insécurisée désactivée
- Exposition : seuls les ports attendus sont ouverts
ceph -s
journalctl -u ceph-* | tail -n 100
ss -tulpn | grep -E '3300|6789|6800|7300'
Retour arrière (si nécessaire)
- Annulez les règles de pare-feu en supprimant les nouvelles règles DROP
- Réactivez temporairement l'ancienne identité client sur l'application
- Restaurez l'instantané de configuration si un basculement a causé des problèmes
# Exemple : supprimer une règle DROP (ajustez le numéro de règle selon votre système)
sudo iptables -L INPUT --line-numbers
sudo iptables -D INPUT <numéro_règle>
Critères de succès
- L'application fonctionne en utilisant uniquement
client.vmapp - Les pools non autorisés sont inaccessibles
- Seuls les ports nécessaires sont ouverts sur l'hôte pilote
Conclusion
Le durcissement de Ceph est plus efficace lorsque vous :
- Imposer cephx avec des caps aux privilèges minimaux
- Protégez les trousseaux de clés avec des permissions de fichier strictes et une distribution limitée
- Limitez l'exposition réseau aux sous-réseaux connus et aux ports requis
- Privilégiez Messenger v2 et désactivez les comportements insécurisés
- Restreignez et chiffrez le tableau de bord
- Faites tourner les identifiants avec une coupure côte à côte
- Vérifiez avec des vérifications simples et répétables après chaque changement
Vérifications rapides avant un déploiement plus large
# L'authentification doit être au moindre privilège et correcte
ceph auth get client.vmapp -f json-pretty
# La sécurité sur le fil doit être en vigueur
ceph config get mon auth_allow_insecure_global_id_reclaim
ceph mon dump | grep v2:
# Seuls les ports nécessaires doivent être accessibles
ss -tulpn | grep -E 'ceph|3300|6789|6800|7300'
# Le cluster doit être en bonne santé
ceph -s
Adoptez le pilote, ajustez-le à votre topologie et étendez-le par étapes mesurées sur les pools et les nœuds. Documentez chaque décision pour que la maintenance future et la réponse aux incidents soient plus rapides et plus sûres.