Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| pratique:informatique:bastionssh [07/05/2025 10:47] – Zatalyz | pratique:informatique:bastionssh [09/05/2025 17:14] (Version actuelle) – [Configuration côté utilisatrice] Zatalyz | ||
|---|---|---|---|
| Ligne 7: | Ligne 7: | ||
| En cours d' | En cours d' | ||
| </ | </ | ||
| + | |||
| + | Pré-requis : | ||
| + | * Savoir gérer SSH : génération de clé, configuration de sshd, usage de '' | ||
| ===== Attention à la fausse sécurité ===== | ===== Attention à la fausse sécurité ===== | ||
| Ligne 17: | Ligne 20: | ||
| Le Bastion 1 est un serveur en ligne des plus classique. Ce sera le seul point d' | Le Bastion 1 est un serveur en ligne des plus classique. Ce sera le seul point d' | ||
| + | |||
| + | ==== Conventions ==== | ||
| + | |||
| + | Dans l' | ||
| + | * " | ||
| + | * " | ||
| + | * " | ||
| + | * " | ||
| + | * 10.0.0.10, 10.0.0.11 et 10.0.0.12 sont des serveurs derrière le Bastion2 et sur un réseau local. | ||
| + | |||
| + | |||
| + | ==== Configuration côté Bastion1 ==== | ||
| + | Ce bastion, le premier de la chaine, est donc celui auquel on se connecte depuis " | ||
| + | |||
| + | * Port personnalisé (non 22) | ||
| + | * Désactivation des authentifications inutiles (mot de passe, PAM, etc.) | ||
| + | * `AllowUsers` ou `Match User` pour restreindre les accès | ||
| + | * Désactivation du shell si non nécessaire (`PermitTTY no`, `ForceCommand`, | ||
| + | * Ajout des clés dans `~/ | ||
| + | * Autoriser uniquement les connexions sortantes SSH vers Bastion2 (port personnalisé) | ||
| + | * Bloquer les autres sorties SSH/TCP si possible | ||
| + | * Paramétrer sshguard, fail2ban/ | ||
| + | * Activation de la journalisation SSH | ||
| + | |||
| + | === Pour les passagères === | ||
| + | Ceci concerne les utilisatrices qui ne font que passer, et donc qui n' | ||
| + | |||
| + | * Désactiver le shell | ||
| + | |||
| + | === Pour les admins === | ||
| + | Là c'est différent : les admins ne rebondissent pas, elles peuvent avoir un shell, et peuvent tout péter. | ||
| + | |||
| + | ==== Configuration côté Bastion2 ==== | ||
| + | Ce bastion est l' | ||
| + | |||
| + | Même trucs que sur Bastion1, en fait. | ||
| + | |||
| + | * Autoriser uniquement les connexions vers le réseau local ou vers des IPs précises (serveur final) | ||
| + | |||
| + | === sshd_config === | ||
| + | |||
| + | Concernant le port ssh, dans le cas que je traite, Bastion2 est derrière une box. Cette dernière n' | ||
| + | |||
| + | <code bash / | ||
| + | # Protocole et sécurité de base | ||
| + | Protocol 2 | ||
| + | StrictModes yes | ||
| + | # CHANGER : Port 22 | ||
| + | |||
| + | # Chiffrement et algorithmes | ||
| + | HostKey / | ||
| + | KexAlgorithms sntrup761x25519-sha512, | ||
| + | Ciphers chacha20-poly1305@openssh.com, | ||
| + | MACs hmac-sha2-256-etm@openssh.com, | ||
| + | PubkeyAcceptedAlgorithms ssh-ed25519, | ||
| + | |||
| + | # Authentification | ||
| + | PermitRootLogin no | ||
| + | AllowGroups wheel jump | ||
| + | |||
| + | PasswordAuthentication no | ||
| + | PermitEmptyPasswords no | ||
| + | KbdInteractiveAuthentication no | ||
| + | PubkeyAuthentication yes | ||
| + | UsePAM yes | ||
| + | |||
| + | # Paramètres de session et de connexion | ||
| + | MaxAuthTries 6 | ||
| + | LoginGraceTime 30 | ||
| + | ClientAliveInterval 3m | ||
| + | ClientAliveCountMax 5 | ||
| + | |||
| + | # Comportement à la connexion, environnement | ||
| + | PrintLastLog yes | ||
| + | PrintMotd no | ||
| + | PermitUserEnvironment no | ||
| + | AcceptEnv LANG LC_* | ||
| + | |||
| + | # Interdiction de session interactive | ||
| + | PermitTTY no | ||
| + | X11Forwarding no | ||
| + | AllowTcpForwarding no | ||
| + | PermitTunnel no | ||
| + | # Bloque tout shell interactif | ||
| + | ForceCommand /bin/false | ||
| + | |||
| + | # Journalisation | ||
| + | LogLevel VERBOSE | ||
| + | |||
| + | # Match précise qui a droit à quoi | ||
| + | Match Group jump | ||
| + | # AllowTcpForwarding nécessaire pour que ce soit transmis, | ||
| + | # Renseigner ensuite les adresses et ports. | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Match Group wheel | ||
| + | PermitTTY yes | ||
| + | ForceCommand none | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 100%> | ||
| + | On peut aussi ajouter dans notre config ssh ce bloc : | ||
| + | < | ||
| + | # Par défaut, interdire tous le monde | ||
| + | DenyUsers * | ||
| + | |||
| + | # Réautoriser les utilisateurs depuis Bastion1 uniquement | ||
| + | Match Address 101.1.1.1 | ||
| + | AllowGroups wheel jump | ||
| + | </ | ||
| + | Vérifier comment ça réagit, je tâtonne. Potentiellement ça interdit vraiment sauf si on vient du bastion. | ||
| + | |||
| + | Si on veut un accès direct aux sysadmin : | ||
| + | |||
| + | < | ||
| + | # Par défaut, interdire tous le monde | ||
| + | AllowGroups wheel | ||
| + | |||
| + | # Réautoriser les utilisateurs depuis Bastion1 uniquement | ||
| + | Match Address 101.1.1.1 | ||
| + | AllowGroups wheel jump | ||
| + | </ | ||
| + | Mais j'aime pas. Je ne le sens pas. | ||
| + | </ | ||
| + | |||
| + | === Nftables === | ||
| + | |||
| + | Il faut aussi paramétrer nftables pour n' | ||
| + | |||
| + | <code bash / | ||
| + | # Autoriser SSH si : | ||
| + | # - source = Bastion1 (externe). mettre son ip, c'est pas 101.1.1.1 | ||
| + | # - OU source dans le LAN 192.168.1.0/ | ||
| + | # SSH ne sera sans doute pas sur le port 22, adapter... | ||
| + | ip saddr { 101.1.1.1, 192.168.1.0/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | === Créer les utilisatrices === | ||
| + | Il faut permettre à Alice de passer en rebondissant et sans s' | ||
| + | |||
| + | Tout en root/sudo : | ||
| + | < | ||
| + | groupadd wheel | ||
| + | groupadd jump | ||
| + | useradd alice -m -G jump | ||
| + | mkdir / | ||
| + | nano / | ||
| + | # Mettre la clé publique dans ce fichier | ||
| + | chown -R alice: / | ||
| + | chmod 0700 / | ||
| + | chmod 0600 / | ||
| + | |||
| + | useradd lapin -m -G sudo, | ||
| + | passwd lapin | ||
| + | mkdir / | ||
| + | nano / | ||
| + | # Mettre la clé publique dans ce fichier | ||
| + | chown -R lapin: / | ||
| + | chmod 0700 / | ||
| + | chmod 0600 / | ||
| + | |||
| + | === L' | ||
| + | Bastion2 étant l' | ||
| + | < | ||
| + | ping 192.168.1.10 | ||
| + | ip neigh</ | ||
| + | |||
| + | Si ça ne trace pas la route, si ça ne ping pas... la dernière commande liste les ip voisines, ça peut donner des pistes. | ||
| + | ==== Configuration côté Serveur final ==== | ||
| + | * sshd_config | ||
| + | * Accepter uniquement des connexions depuis Bastion2 | ||
| + | |||
| + | <code bash sshd_config/ | ||
| + | # Protocole et sécurité de base | ||
| + | Protocol 2 | ||
| + | StrictModes yes | ||
| + | |||
| + | # Chiffrement et algorithmes | ||
| + | HostKey / | ||
| + | KexAlgorithms sntrup761x25519-sha512, | ||
| + | Ciphers chacha20-poly1305@openssh.com, | ||
| + | MACs hmac-sha2-256-etm@openssh.com, | ||
| + | PubkeyAcceptedAlgorithms ssh-ed25519, | ||
| + | |||
| + | # Authentification | ||
| + | PermitRootLogin no | ||
| + | AllowGroups wheel | ||
| + | |||
| + | PasswordAuthentication no | ||
| + | PermitEmptyPasswords no | ||
| + | KbdInteractiveAuthentication no | ||
| + | PubkeyAuthentication yes | ||
| + | UsePAM yes | ||
| + | |||
| + | # Paramètres de session et de connexion | ||
| + | MaxAuthTries 6 | ||
| + | LoginGraceTime 30 | ||
| + | ClientAliveInterval 3m | ||
| + | ClientAliveCountMax 5 | ||
| + | |||
| + | # Comportement à la connexion, environnement | ||
| + | PrintLastLog yes | ||
| + | PrintMotd no | ||
| + | PermitUserEnvironment no | ||
| + | AcceptEnv LANG LC_* | ||
| + | |||
| + | # Redirections et accès à distance | ||
| + | AllowTcpForwarding no | ||
| + | X11Forwarding no | ||
| + | </ | ||
| + | |||
| + | === Cas particulier d'un tunnel === | ||
| + | Dans un cas particulier, | ||
| + | |||
| + | < | ||
| + | Match User alice | ||
| + | AllowTcpForwarding yes | ||
| + | PermitTunnel yes | ||
| + | </ | ||
| + | => seul l' | ||
| + | |||
| + | Les bastions ont aussi besoin de permettre ce tunnel : | ||
| + | < | ||
| + | Match User alice | ||
| + | PermitOpen 192.168.1.42: | ||
| + | AllowTcpForwarding yes | ||
| + | </ | ||
| + | |||
| + | ==== Configuration côté utilisatrice ==== | ||
| + | Combien de clés ssh différentes faut-il générer ? | ||
| + | * Une clé par serveur cible | ||
| + | * Une clé pour accéder à la maintenance des bastions (pour les personnes autorisées bien sûr). | ||
| + | |||
| + | On différencie bien l' | ||
| + | |||
| + | On peut ensuite avoir des clés différentes pour chaque serveur cible, par contre cela demande d' | ||
| + | |||
| + | En dehors des clés, le seul truc réellement à bidouiller est le fichier " | ||
| + | |||
| + | Génération des clés : | ||
| + | < | ||
| + | ssh-keygen -t ed25519 -f ~/ | ||
| + | |||
| + | * -t : type, donc ed25519. | ||
| + | * -f : précise le nom du fichier ; permet de retrouver plus facilement ce qui sert " | ||
| + | * -C : ajoute un commentaire ; sans rien préciser ce sera votre utilisateur@host du système où vous êtes. | ||
| + | |||
| + | Copier les clés sur les bastions dans " | ||
| + | |||
| + | <code bash ~/ | ||
| + | |||
| + | === La partie Alice (au pays des serveurs) === | ||
| + | Alice n'a accès (au final) qu'aux VM ; mais elle doit passer par les deux bastions pour ça. | ||
| + | |||
| + | Génération de sa clé : | ||
| + | < | ||
| + | |||
| + | Copier la clé **publique** sur la/les VM auxquelles elle a accès ainsi que dans les deux bastions, dans ''/ | ||
| + | |||
| + | Son fichier de config avec un seul bastion (tout en local, donc adresse locale !!!). Ça, ça marche. | ||
| + | <code bash ~/ | ||
| + | # Bastion2 | ||
| + | Host bastion2 | ||
| + | HostName 192.168.1.22 | ||
| + | User alice | ||
| + | IdentityFile ~/ | ||
| + | ForwardAgent no | ||
| + | | ||
| + | # Accès à la VM finale (via les deux bastions) | ||
| + | Host vm-finale | ||
| + | HostName 192.168.1.11 | ||
| + | User alice | ||
| + | IdentityFile ~/ | ||
| + | ProxyJump bastion2 | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 60%> | ||
| + | <code bash ~/ | ||
| + | # Bastion1 - 1er saut | ||
| + | Host bastion1 | ||
| + | HostName 101.1.1.1 | ||
| + | User alice | ||
| + | IdentityFile ~/ | ||
| + | ForwardAgent no | ||
| + | |||
| + | # Bastion2 - 2e saut | ||
| + | Host bastion2 | ||
| + | HostName 192.168.1.2 | ||
| + | User alice | ||
| + | IdentityFile ~/ | ||
| + | ProxyJump bastion1 | ||
| + | ForwardAgent no | ||
| + | |||
| + | # Accès à la VM finale (via les deux bastions) | ||
| + | Host vm-finale | ||
| + | HostName 192.168.1.11 | ||
| + | User alice | ||
| + | IdentityFile ~/ | ||
| + | ProxyJump bastion2 | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | Pour se connecter : | ||
| + | ssh vm-finale | ||
| + | |||
| + | <WRAP center round tip 100%> | ||
| + | Attention si on utilise un script (genre [[pratique: | ||
| + | </ | ||
| + | |||