*Esteban, Floren, Gauvain* # Projet 1 ## Génèse ### 1. Préparation du projet - Floren : l'architecte - Esteban : le soutien moral - Gauvain : la petite secrétaire #### Notes Il se peut que les lignes de code affichées dans les captures d'écran ne soient pas 100% conformes avec les blocs de code tapés au-dessus. C'est normal : nous expérimentons au fur et à mesure, et quand la capture d'écran est faite, il se peut que nous ne nous apercevions d'une coquille ou d'un oubli que bien plus tard. Et qu'un paquet installé (genre NMAP) soit désinstallé plus tard, faute d'usage. Règle du **"moins de paquet = moins de surface d'attaque"**. Le résultat est normalement affiché en capture d'écran, mais en cas de discordance, les blocs de code commentés font foi. ### 2. Définir l'architecture #### A. Les Machines Virtuelles [ROCKY_LINUX - Installation](https://docs.rockylinux.org/9/guides/9_6_installation/) - Rocky Linux sur Hyperviseur - Deux connexions réseau : en Accès par Pont ou Réseau NAT - Pas de GUI Nous avons décidé d'utiliser : - 3 VMs Rocky Linux 9.7 (version Boot), les infos sur la version 10 faisant état d'une version peu stabilisée - sur VirtualBox (par simplicité) - En réseau NAT (pour avoir une plage réseau vraiment isolée) - Pas de GUI ``` sudo dnf update -y sudo dnf install -y firewalld nano curl wget sudo systemctl enable --now firewalld ``` Synchronisation des serveurs avec `chrony` : *Sur MON/MR* ``` nano /etc/chrony.conf allow 10.0.10.0/24 ``` *Sur OSD1* ``` nano /etc/chrony.conf server 10.0.10.11 iburst peer 10.0.10.13 iburst ``` *Sur OSD2* ``` nano /etc/chrony.conf server 10.0.10.11 iburst peer 10.0.10.12 iburst ``` Et on change les noms des machines : ``` sudo hostnamectl set-hostname ['monmgr', 'osd1', 'osd2'] ``` #### B. Configuration du **bonding** [REDHAT - Configure Network Bonding](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_network_bonding) [Bonding in Rocky Linux](https://www.server-world.info/en/note?os=Rocky_Linux_10&p=bonding) - Mode [*active-backup*](https://www.ibm.com/docs/en/linux-on-systems?topic=recommendations-bonding-modes) - Bridge dédié au **bond** *active-backup* dans le Ceph Ajouter le bond : ``` sudo nmcli connection add type bond con-name bond0 ifname bond0 mode active-backup sudo nmcli connection add type ethernet ifname enp0s3 master bond0 sudo nmcli connection add type ethernet ifname enp0s8 master bond0 sudo nmcli connection modify bond0 \ ipv4.method manual \ ipv4.addresses 10.0.10.[11,12,13]/24 \ ipv4.gateway 10.0.10.1 \ ipv4.dns 1.1.1.1 sudo nmcli connection up bond0 ``` Vérifications : ``` cat /proc/net/bonding/bond0 sudo nmcli device sudo nmcli connection ``` Vérification de la redondance en débranchant une NIC dans la VM : #### C. Réglages du pare-feu [REDHAT - Using and configurind firewalld](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_firewalls_and_packet_filters/using-and-configuring-firewalld_firewall-packet-filters) - Zone personnalisée : `ceph-mcs2025` - Associée à l'interface du **bond0** - [Autorisation des ports nécessaires à CEPH](https://docs.redhat.com/fr/documentation/red_hat_ceph_storage/5/html/configuration_guide/ceph-firewall-ports_conf) et associés ``` sudo firewall-cmd --permanent --new-zone=ceph-mcs2025 # Pour vérifier sudo firewall-cmd --reload sudo firewall-cmd --get-zones sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-interface=bond0 sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-service=ssh sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=80/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=443/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=3300-3303/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=6789/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=6800-7300/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=7480/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=8443/tcp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=123/udp sudo firewall-cmd --permanent --zone=ceph-mcs2025 --add-port=6800-7300/udp sudo firewall-cmd --reload ``` Et on vérifie : ``` sudo firewall-cmd --info-zone=ceph-mcs2025 ``` ### 3. Installer et configurer Ceph #### A. Choix du Ceph On a décidé d'utiliser RGW pour diverses raisons : 1. c'est celui que nous connaissons le moins (raison éducative) 2. c'est un système basé sur une technologie qui devient un standard nuagique (avec AWS S3 repris même par les concurrents) 3. parce que pourquoi pas #### B. Préparation des noeuds [CEPH - cephadm](https://docs.ceph.com/en/squid/cephadm/) | [CEPH - Host Management](https://docs.ceph.com/en/squid/cephadm/host-management/) - Installer `cephadm` version **`squid`** (*les deux dernières, `latest` et `tentacles` étant non stabilisées*) - Déployer le moniteur **MON** et gestionnaire **MGR** sur le premier noeud, ajout des deux autres comme **OSD** Sur les trois noeuds : ``` sudo dnf install -y centos-release-ceph-squid sudo dnf install -y cephadm # Pour les dépendances liées au déploiement de configurations sudo dnf install -y python3-yaml python3-jinja2 ``` Sur les deux noeuds OSD : ``` sudo cephadm add-repo --release squid sudo cephadm install ceph-common ``` Bootstrap du cluster sur le noeud principal : ``` sudo cephadm bootstrap \ --mon-ip 10.0.10.11 \ --allow-fqdn-hostname \ --initial-dashboard-user admin \ --initial-dashboard-password 'Dashboard123!' # Copie de la clef publique du MON/MGR sur les OSD ssh-copy-id -f -i /etc/ceph/ceph.pub root@10.0.10.12 ssh-copy-id -f -i /etc/ceph/ceph.pub root@10.0.10.13 # Vérification sudo ceph orch host ls ``` Copie de la configuration du MON/MGR sur les OSD : ``` scp /etc/ceph/ceph.conf root@10.0.10.12:/etc/ceph/ scp /etc/ceph/ceph.conf root@10.0.10.13:/etc/ceph/ scp /etc/ceph/ceph.client.admin.keyring root@10.0.10.12:/etc/ceph/ scp /etc/ceph/ceph.client.admin.keyring root@10.0.10.13:/etc/ceph/ ssh root@10.0.10.12 "chmod 600 /etc/ceph/*.keyring && chmod 644 /etc/ceph/ceph.conf" ssh root@10.0.10.13 "chmod 600 /etc/ceph/*.keyring && chmod 644 /etc/ceph/ceph.conf" ``` Ajout des hôtes dans le cluster **Ceph** : ``` sudo ceph orch host add osd1 10.0.10.12 sudo ceph orch host add osd2 10.0.10.13 ``` [Ajout des **OSD** dans le cluster :](https://docs.ceph.com/en/squid/cephadm/services/osd/) ``` sudo ceph orch device ls # Si on veut tout asservir sans distinction sudo ceph orch apply osd --all-available-devices # Si on veut asservir un panel précis de volumes sudo ceph orch daemon add osd monmgr:/dev/sdb sudo ceph orch daemon add osd osd1:/dev/sdb sudo ceph orch daemon add osd osd2:/dev/sdb ``` #### C. Déployer le service RGW https://docs.ceph.com/en/squid/radosgw/ https://docs.ceph.com/en/squid/radosgw/s3/ - Créer un *daemon* RGW avec `ceph orch apply rgw` - Configurer le domaine S3, clefs d'accès et politiques des seaux [Déploiement du service RGW :](https://docs.ceph.com/en/latest/cephadm/services/rgw/) ``` sudo ceph orch apply rgw rgw-mcs \ --realm=realm-mcs \ --zone=zone-mcs \ --placement="2 osd1 osd2" # Ou en version "triviale" sudo ceph orch apply rgw rgw-mcs ``` Vérifier l'intégrité du cluster RGW : ``` sudo ceph orch ps --daemon_type rgw ``` [Créer un admin S3 :](https://docs.ceph.com/en/squid/man/8/radosgw-admin/) ``` sudo dnf install -y epel-release sudo dnf install -y ceph-radosgw sudo radosgw-admin user create --uid=egf2025 --display-name="EstGauFlo 2025" ``` Modifier le ceph.conf : ``` sudo nano /etc/ceph/ceph.conf [client.radosgw.gateway] host = [monmgr, osd1, osd2] keyring = /etc/ceph/ceph.client.radosgw.gateway.keyring rgw_frontends = "beast port=7480" sudo systemctl start ceph-radosgw@rgw.gateway sudo nano /etc/ceph/ceph.client.radosgw.keyring [client.admin] key = ******* caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" ``` Vérifier la santé du cluster Ceph : ``` sudo ceph -s sudo ceph health detail ``` Configurer l'accès S3 : ``` sudo dnf install -y awscli aws configure set aws_access_key_id XXOKHTFX8OUAW4YEFBVT aws configure set aws_secret_access_key b3Cn2vYARkbnGWlPVdCg16ZYUZ3IczXC4SvtBBMy aws s3 ls --endpoint-url http://10.0.10.11:7480 ``` ##### Notes sur le précédent bloc Ca ne sert à rien de copier le couple ID-Clef, ce sont des utilisateurs locaux, mais ce sont bien des vraies. On sait ce qu'on fait présentement, mais il est évident qu'on ne fait jamais ça en production. La solution de niveau 1 c'est d'utiliser une variable d'environnement temporaire (`AWS_ID="XXOKHTFX8OUAW4YEFBVT"` et ensuite appeler avec un `$AWS_ID` dans le shell pour une expiration à déconnexion), et la solution de niveau 2 serait de déployer un serveur Consul/Vault sur le réseau pour gérer des secrets. Vérifications : Et ensuite faire un test de téléversement dans un seau S3 avec la [documentation officielle](https://docs.aws.amazon.com/cli/latest/reference/s3/) ``` aws s3 cp ./fichier s3://bucket/ --endpoint-url http://10.0.10.11:7480 ``` #### D. (Bonus) Vérifier sur le Dashboard Nous avons rajouté dans le réseau NAT (mais pas le Ceph) une machine tierce avec interface graphique, Rocky Linux ou Debian pour se connecter sur le dashboard : ### 4. Cisco Packet Tracer #### A. Créer la topologie en GUI - VLAN unique pour les 3 - Switchs Layer 2 (un ou plusieurs) #### B. Créer la topologie en CLI Création des LAGs : ``` enable conf t interface range fa0/[1-7]-[3-9] channel-group [1,2,3] mode active no shutdown end write memory ``` Créer les VLAN : ``` enable conf t vlan 10 name CephCluster exit interface fa0/24 switchport mode access switchport access vlan 10 no shutdown exit interface port-channel [1,2,3] switchport mode trunk switchport trunk native vlan 1 switchport trunk allowed vlan 1,10 no shutdown end write memory ``` [Créer la passerelle HSRP sur les routeurs :](https://routeur.clemanet.com/hsrp-cisco.php) ``` enable conf t ip routing interface Gig0/0/1.10 encapsulation dot1q 10 ip address 10.0.10.[2,3] 255.255.255.0 standby 1 ip 10.0.10.1 standby 1 priority [100, 150] standby 1 preempt no shutdown end show standby write memory ``` Et on vérifie par un PING d'un OSD à un autre : Et on teste avec un routeur éteint : #### C. Sécurisation https://www.cisco.com/c/deleteme/sec/b_1710_sec_9300_cg/port_security.html - Limiter le *MAC-address learning* - Activer *port-security* en mettant 1 dresse MAC maximum - Configurer les ports d'administration (console/VTY) avec authentification locale - Activer le SSH sur les switchs avec restriction aux adresses du VLAN - Autoriser le trafic Ceph, IMCP et SNMP uniquement depuis les adresses de gestion Sécurité des ports : ``` enable conf t interface range fa0/#-# // ports non utilisés shutdown exit interface range fa0/#-# // ports en usage switchport port-security switchport port-security maximum 1 switchport port-security violation restrict switchport port-security mac-address sticky ``` Activer le SSH : ``` ip domain-name mcs2025.local username admin secret mcs2025 crypto key generate rsa general-keys modulus 2048 ip ssh version 2 ``` Protection par mot de passe : ``` enable conf t enable password encryption line console 0 password CisCanne login local line vty 0 4 login local transport input ssh enable secret Conf-Iture end write memory ``` ACL pour le trafic Ceph : ``` ip access-list extended CEPH-ALLOW permit tcp any any eq 80 permit tcp any any eq 443 permit tcp any any eq 6789 permit tcp any any eq 7480 permit tcp any any eq 8443 permit tcp any any range 3300 3303 permit tcp any any range 6800 7300 permit udp any any range 6800 7300 permit icmp any any permit udp any any eq 161 deny ip any any ``` # Liens utiles ## Bibliographie ### Ceph [Tutoriel Scaleway d'un cluster Ceph](https://www.scaleway.com/en/docs/tutorials/ceph-cluster/) [Tutoriel d'installer Ceph sur Rocky Linux](https://www.linkedin.com/pulse/step-by-step-instructions-install-ceph-rocky-linux-saman-salamat/) [Configuration RGW sur RedHat](https://docs.redhat.com/de/documentation/red_hat_ceph_storage/3/html/object_gateway_guide_for_red_hat_enterprise_linux/rgw-configuration-reference-rgw) [Cephadm pour RGW](https://docs.ceph.com/en/reef/cephadm/services/rgw/) [Déployer Ceph sur Rocky Linux 9](https://random-it-blog.de/ceph/ceph-storage-cluster-deployment-on-rocky-linux-9-centos-9/) ### Pare-feu Rocky [Mettre en place FirewallD](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-rocky-linux-8) [Ports pour cluster Ceph](https://docs.redhat.com/en/documentation/red_hat_ceph_storage/5/html/configuration_guide/ceph-firewall-ports_conf) [FirewallD par Stéphane Robert](https://blog.stephane-robert.info/docs/securiser/reseaux/firewalld/) ### Détails sur la configuration ["Beast" pour RadosGW](https://documentation.suse.com/fr-fr/ses/7.1/single-html/ses-admin/book-storage-admin.html#config-ogw) ## Ressources [Rocky Linux](https://rockylinux.org/fr-FR/download)