ó°Œ Back to basics â Jâai une đ clĂ© SSH đ», et maintenant ó°€ ? Speaker : Laurent Grangeau - @laurentgrangeau Speaker : Ludovic Piot - @lpiot
A presentation at JUG Summer Camp 2023 in September 2023 in La Rochelle, France by Ludovic Piot
ó°Œ Back to basics â Jâai une đ clĂ© SSH đ», et maintenant ó°€ ? Speaker : Laurent Grangeau - @laurentgrangeau Speaker : Ludovic Piot - @lpiot
Qui sommes-nous ? Laurent Grangeau Solutions Architect @ Google @laurentgrangeau #JugSummerCamp Ludovic Piot CTO @ Duonyx @lpiot @Speaker
SSH kĂ©sako ? fonctionnalitĂ©s cas dâusage
SSH origin story SSH = Secure SHell CrĂ©Ă© en 1995 par ó°żTatu Ylönen. v2.0 en 2006 par lâIETF (Internet Engineering Task Force). RFC-4251, 8308, 9141 Protocole de communication entre 2 ordinateurs : â client (initiateur de la connexion) â serveur (destinataire de la connexion) Sâappuie sur TCP/22 Standard dâimplĂ©mentation : â programme client (openSSH, PuTTY) â daemon serveur (sshd) Des compĂ©titeurs Ă©mergent : â MoSH (mobile, rĂ©seau intermittent) â Teleport (approche moderne/Web) #JugSummerCamp @Speaker
SSH main features SSH = Secure SHell Protocole de communication entre 2 ordinateurs : â client (initiateur de la connexion) â serveur (destinataire de la connexion) SĂ©curisĂ©. Remplace rlogin, telnet⊠Shell = â đ envoyer des commandes shell Ă exĂ©cuter sur le serveur (ssh) â et rĂ©cupĂ©rer les rĂ©sultats des sorties standard â sĂ©curiser FTP (sFTP) â faire transiter des fichiers (scp, rsync) vers et depuis le serveur â faire transiter des flux de donnĂ©es du serveur vers le client (ssh tunneling) â faire transiter des flux de donnĂ©es du client vers un tiers via le serveur (ssh forward) â exposer un filesystem distant (sshfs) Performant Architecture en couches permet de faire Ă©voluer la force de sĂ©curisation avec le temps #JugSummerCamp @Speaker
SSH kesako ? SSH = Secure SHell Secure = â nĂ©gociation des protocoles de chiffrement entre client et serveur â authentification des client et serveur (par chiffrement asymĂ©trique) â tunnel chiffrĂ© des flux de donnĂ©es en transit (par chiffrement symĂ©trique) â identification đ du serveur (sshfp) â intĂ©gritĂ© des donnĂ©es (par hash des donnĂ©es) 3 couches de sĂ©curitĂ© : transport layer authentification du serveur confidentialitĂ© intĂ©gritĂ© user authentication lâutilisateur est authentifiĂ© par le serveur connection protocol tunnel de communication chiffrĂ© canaux de communication logiques multiples #JugSummerCamp @Speaker
cryptographie koikoubeh ? symétrique / asymétrique RSA, DSA, EDCSA, EdDSA
Mettons-nous bien dâaccord ! #JugSummerCamp @Speaker
Chiffrement symĂ©trique Objectif : transformer la donnĂ©e en une donnĂ©e chiffrĂ©e irrĂ©cupĂ©rable sans la clĂ© de dĂ©chiffrement Une seule clĂ© utilisĂ©e â par lâexpĂ©diteur pour chiffrer â par le destinataire pour dĂ©chiffrer Avantages : â implĂ©mentations relativement simples â Algo utilisĂ© pour le chiffrement / algo-1 pour le dĂ©chiffrement â Perfs Ă©quivalentes en chiffrement / dĂ©chiffrement â Algos cĂąblĂ©s dans les processeurs InconvĂ©nient : â toute la sĂ©curitĂ© repose sur un secret⊠partagĂ© Type dâattaques : brute force #JugSummerCamp @Speaker
Chiffrement symétrique Différents algorithmes de chiffrement (cipher) : AES, 3DES, TwoFish, ChaCha20⊠Différentes familles : stream cipher, block cipher Basés sur des permutations de blocs avec injection de la clé en multiples instances⊠#JugSummerCamp @Speaker
Chiffrement asymĂ©trique Objectif : ne pas partager la clĂ© de chiffrement/dĂ©chiffrement La clĂ© privĂ©e nâest jamais partagĂ©e â elle permet de forger une/des clĂ©s publiques (paires de clĂ©s) â seule la clĂ© privĂ©e peut dĂ©chiffrer un ciphertext produit par une clĂ© publique â la clĂ© publique ne peut pas dĂ©chiffrer un ciphertext produit par elle mĂȘme, ni par la clĂ© privĂ©e Avantages : â mieux adaptĂ© Ă la coopĂ©ration massive autour dâun sujet de connection sĂ©curisĂ©e â la clĂ© privĂ©e unique est un moyen dâauthentification naturel InconvĂ©nients : â algorithmes plus complexes (et plus lents) â nĂ©cessitĂ© de diffuser la clĂ© publique â la fuite de la clĂ© privĂ©e rĂ©duit la sĂ©curitĂ© Ă nĂ©ant Type dâattaque : dĂ©duire la clĂ© privĂ©e depuis la clĂ© publique #JugSummerCamp @Speaker
Algos de chiffrement asymĂ©trique DiffĂ©rents algos : â RSA (RivestâShamirâAdleman) â DSA (Digital Signature Algorithm) â ECDSA/EdDSA (Elliptic Curve Digital Signature Algorithm) â EdDSA (Edwards-curve Digital Signature Algorithm) â ED25519 (twisted Edwards-curve Digital Signature Algorithm) DSA đĄHĂ© oui ! Câest ce que lâon dĂ©finit quand on produit les paires de clĂ©s ProblĂšme du logarithme discret RĂ©solution par exponentiation modulaire RSA Factorisation de nombres entiers n=p*q đ€« n : modulus (eq. clĂ© publique) p, q : 2 nombres premiers suïŹsamment grands et suïŹsamment Ă©loignĂ©s lâun de lâautre (eq. clĂ© privĂ©e) Pour obtenir un ciphertext, on utilise un nombre alĂ©atoire conjointement Ă la clĂ© privĂ©e. Plus n est grand et plus diïŹcile est la dĂ©duction de p et q Assez adaptĂ© Ă contrer la loi de Moore et la brute force Si ce nombre est dĂ©couvert, la clĂ© privĂ©e est compromise. Aujourdâhui, clĂ©s privĂ©es de 2048/4096 sont encore valables. #JugSummerCamp La randomisation sur ordinateur nâest pas assez alĂ©atoire. La brute force a eu raison de cette implĂ©mentation. (PS3 encryption keys) ECDSA / EdDSA / ED25519 ProblĂšme du logarithme discret RĂ©solution par courbe elliptique Algo trĂšs performant ClĂ©s bcp plus petites Toutes les courbes elliptiques nâoffrent pas les mĂȘmes niveaux de sĂ©curitĂ© đ ECDSA đ EdDSA / Ed25519 (Courbe dâEdwards tordue) @Speaker
ClĂ©s formats de stockage DiffĂ©rents formats de stockage des clĂ©s RFC4716 SSH public key format PEM Privacy Enhanced Mail IETF standard Format historique de stockage de clĂ©s publique/privĂ©e / certificats Ne stocke que les clĂ©s publiques Assez proche de PEM, mais sans CRC en fin de ligne Des headers⊠Un format de section diffĂ©rent⊠Encodage base64. PKCS8 Public-Key Cryptography Standards PPK PuTTY Private Key Permet de stocker la clĂ© privĂ©e sous forme chiffrĂ©e ou en clair. Format propriĂ©taire PuTTY Identifie explicitement lâalgo de gĂ©nĂ©ration de la clĂ© Permet de stocker des certificats Permet de stocker des paires de clĂ©s privĂ©e/publique #JugSummerCamp PuTTY-gen, utilitaire de gĂ©nĂ©ration de clĂ©s / conversion de format de clĂ©s Permet de stocker la clĂ© privĂ©e de maniĂšre chiffrĂ©e. Gestion des caractĂšres de fin de ligne (Windows / Linux) đ @Speaker
ssh-keygen demo time! [fedora@guimbarde .ssh]$ ssh-keygen -t rsa -b 4096 -N hellojugsummercamp -f jugsummercamp-rsa-key [fedora@guimbarde .ssh]$ ssh-keygen -e -f Generating public/private rsa key pair. jugsummercamp-rsa-key.pub -m pem Your identification has been saved in ââ-BEGIN RSA PUBLIC KEYââjugsummercamp-rsa-key MIICCgKCAgEA4WasILNm/wEVvQ3S7Tp0yaqrnxL5X8OGUbTIyZcsy9DyBpfvh8oo Your public key has been saved in KxLXdafCP55Zz9CKEDTAwpKn14CbzB+w9DUG5/ANigBCSCO1NTIFbCJtlHgxjGpw jugsummercamp-rsa-key.pub k8Kx+I9ytdvkl2kFYMX9PeNpZrs2gacw2+t0ABQoXSsK/khU6UK1tAb8XuM+zfaP The key fingerprint is: L4D18rlAg2aYGv6z6Q9wfrwzhXvuD3ddnZOyjxp0x80v9rnH9QAV4xgeV4vYQA5K SHA256:2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs 0M7okWV17jDUzHEluzTKgsjwJKkVQTNn4vox0L5Lq6gn+RaWgVGPLVoDtHSnhs42 fedora@guimbarde.thegaragebandofit.com gZejrWUIEst6xLIpIWhjpPDIpudnkb0nzv7Nu/N9ZtKIIcsx6sTofP9+PDsf2EFD The keyâs randomart image is: 0qIJd0t/iOBpS5//AZ2aRyTWHS1DwaYCDOWX2G3We99ionN07ND2PD7h2D31k4h2 +â-[RSA 4096]ââ+ YGfQzM09JGarxuPz4WvETk/zGM9uRZR647NQfcwEMkrV6aiLp0fFEDm/p+fJR94L | . . | | E | | . B | | * @ .| | S + O *.| [fedora@guimbarde .ssh]$ cat jugsummercamp-rsa-key.pub | + o B +.+| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDhZqwgs2b/ARW9DdLtOnTJqqufEvlfw4ZRtMjJlyzL0PIGl++HyigrEtd1p8I/nlnP0IoQNMDCkqfX | o o. + B+o+| gJvMH7D0NQbn8A2KAEJII7U1MgVsIm2UeDGManCTwrH4j3K12+SXaQVgxf0942lmuzaBpzDb63QAFChdKwr+SFTpQrW0Bvxe4z7N9o8vgPXy | . ⊠+ *B.| uUCDZpga/rPpD3B+vDOFe+4Pd12dk7KPGnTHzS/2ucf1ABXjGB5Xi9hADkrQzuiRZXXuMNTMcSW7NMqCyPAkqRVBM2fi+jHQvkurqCf5FpaB | ⊠=*BO| UY8tWgO0dKeGzjaBl6OtZQgSy3rEsikhaGOk8Mim52eRvSfO/s27831m0oghyzHqxOh8/348Ox/YQUPSogl3S3+I4GlLn/8BnZpHJNYdLUPB +ââ[SHA256]ââ-+ pgIM5ZfYbdZ732Kic3Ts0PY8PuHYPfWTiHZgZ9DMzT0kZqvG4/Pha8ROT/MYz25FlHrjs1B9zAQyStXpqIunR8UQOb+n58lH3gvwZuumS4IM YRCJE/IOfMCRVMWRcExnzZ2iivQ8MKnivQFeTdwXx15fMLdZfjkb1M5R9sV4sXSiznE1PfZdC9Iyc6+FLbprW+eCYk/VlOuME/V8nIAuuy0e QniJUOrnw9WUK4XKGKcSa3S6Mwo02TcsvOQyNwM7K91PJOs74QBSsxWAwrq2/6Mk8w== fedora@guimbarde.thegaragebandofit.com #JugSummerCamp @Speaker
SSH connexion ! négociation / connexion échange de clés publiques authentification partage de clé symétrique
Session SSH, sĂ©quence dâinitialisation #JugSummerCamp @Speaker
Session SSH, sĂ©quence dâinitialisation #JugSummerCamp @Speaker
Partage de la clĂ© symĂ©trique, Diffie-Hellman KEX algorithm Objectif : gĂ©nĂ©rer et partager la clĂ© symĂ©trique utilisĂ©e pour le chiffrement symĂ©trique du tunnel Contrainte : la clĂ© partagĂ©e doit ĂȘtre prĂ©sente des 2 cĂŽtĂ©s SANS ĂȘtre Ă©changĂ©e SĂ©quence : 1. Utilisation dâune valeur de dĂ©part (trĂšs grand nombre premier) partagĂ©e 2. GĂ©nĂ©ration de couples de clĂ©s asymĂ©triques temporaires 3. Ăchange des clĂ©s publiques temporaires 4. GĂ©nĂ©ration de la clĂ© symĂ©trique partagĂ©e en combinant a. sa propre clĂ© privĂ©e b. la clĂ© publique du tiers Configuration : RekeyLimit Dans la session : ~R pour force le rekey. SSH REKEY - exemple de log debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: debug1: SSH2_MSG_KEXINIT sent rekeying in progress SSH2_MSG_KEXINIT received kex: algorithm: curve25519-sha256@libssh.org kex: host key algorithm: ecdsa-sha2-nistp256 kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none kex: curve25519-sha256@libssh.org need=64 dh_need=64 kex: curve25519-sha256@libssh.org need=64 dh_need=64 expecting SSH2_MSG_KEX_ECDH_REPLY rekeying in progress rekeying in progress Server host key: ecdsa-sha2-nistp256 SHA256:E9HuzpVQJ/5DavNIZhWzJrADNj5Ntw69RJ1obXJtlGo set_newkeys: rekeying, input 5156 bytes 167 blocks, output 5864 bytes 0 blocks rekey after 134217728 blocks SSH2_MSG_NEWKEYS sent expecting SSH2_MSG_NEWKEYS set_newkeys: rekeying, input 5168 bytes 0 blocks, output 5864 bytes 0 blocks rekey after 134217728 blocks SSH2_MSG_NEWKEYS received #JugSummerCamp @Speaker
Gestion des clĂ©s, rotation, diffusion, confidentialitĂ© , rĂ©vocation ClĂ© symĂ©trique Rotation Dans le fichier de configuration /etc/ssh/ssh_config RekeyLimit 1G 1h Dans la session : ~R pour forcer le rekey. SSH REKEY - exemple de log debug1: SSH2_MSG_KEXINIT sent debug1: rekeying in progress debug1: SSH2_MSG_KEXINIT received debug1: kex: algorithm: curve25519-sha256@libssh.org debug1: kex: host key algorithm: ecdsa-sha2-nistp256 debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none debug1: kex: curve25519-sha256@libssh.org need=64 dh_need=64 debug1: kex: curve25519-sha256@libssh.org need=64 dh_need=64 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY debug1: rekeying in progress debug1: rekeying in progress debug1: Server host key: ecdsa-sha2-nistp256 SHA256:E9HuzpVQJ/5DavNIZhWzJrADNj5Ntw69RJ1obXJtlGo debug1: set_newkeys: rekeying, input 5156 bytes 167 blocks, output 5864 bytes 0 blocks debug1: rekey after 134217728 blocks debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: set_newkeys: rekeying, input 5168 bytes 0 blocks, output 5864 bytes 0 blocks debug1: rekey after 134217728 blocks debug1: SSH2_MSG_NEWKEYS received #JugSummerCamp ClĂ©s asymĂ©triques Diffusion copie de fichiers ConfidentialitĂ© chown ${user} ${myprivatekey} chmod 600 ${myprivatekey} RĂ©vocation suppression de la clĂ© publique de /home/${user}/.ssh/known_hosts de /home/${user}/.ssh/authorized_keys Rotation ClĂ©s asymĂ©triques ó°€ @Speaker
CÎté serveur ssh, config CÎté client $ cat .ssh/config Host guimbarde Hostname guimbarde.thegaragebandofit.com User fedora Port 22 IdentityFile /root/.ssh/ish-liPadeM2_ovh_ecdsa Compression yes #JugSummerCamp $ cat /etc/ssh/ssh_config # Host * # ForwardAgent no # ForwardX11 no # PasswordAuthentication yes # HostbasedAuthentication no # GSSAPIAuthentication no # GSSAPIDelegateCredentials no # GSSAPIKeyExchange no # GSSAPITrustDNS no # BatchMode no # CheckHostIP yes # AddressFamily any # ConnectTimeout 0 # StrictHostKeyChecking ask # IdentityFile ~/.ssh/id_rsa # IdentityFile ~/.ssh/id_dsa # IdentityFile ~/.ssh/id_ecdsa # IdentityFile ~/.ssh/id_ed25519 # Port 22 # Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc # MACs hmac-md5,hmac-sha1,umac-64@openssh.com # EscapeChar ~ # Tunnel no # TunnelDevice any:any # PermitLocalCommand no # VisualHostKey no # ProxyCommand ssh -q -W %h:%p gateway.example.com # RekeyLimit 1G 1h # UserKnownHostsFile ~/.ssh/known_hosts.d/%k # Include /etc/ssh/ssh_config.d/*.conf @Speaker
SSH fingerprint ! empreinte de clé publique et known_host
Empreinte de la clĂ© publique Chaque clĂ© publique est associĂ©e Ă une empreinte appelĂ© fingerprint La clĂ© publique est stockĂ©e cĂŽtĂ© client dans un fichier known_host Objectif : empĂȘcher les attaques de type man-in-the-middle [fedora@guimbarde .ssh]$ ssh fedora@guimbarde.thegaragebandofit.com The authenticity of host âguimbarde.thegaragebandofit.comâ canât be established. ED25519 key fingerprint is SHA256:2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? PossibilitĂ© de stocker le fingerprint de maniĂšre centrale dans une zone DNS : DNS SSHFP guimbarde.thegaragebandofit.com. 3600 IN SSHFP 4 2 2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs <Name> [<TTL>] [<Classe>] SSHFP <Algorithme> <Type> <RĂ©sultat de la Fonction de hachage> Algorithme : 0=rĂ©servĂ©, 1=RSA, 2=DSA, 3=ECDSA, 4=Ed25519 Type : 0=rĂ©servĂ©, 1=SHA-1, 2=SHA-256 Pas activĂ© par dĂ©faut, lors de la connexion, il faut ajouter lâoption -o âVerifyHostKeyDNS askâ [fedora@guimbarde .ssh]$ ssh -o âVerifyHostKeyDNS askâ fedora@guimbarde.thegaragebandofit.com [âŠ] Matching host key fingerprint found in DNS. Are you sure you want to continue connecting (yes/no)? VĂ©rification du fingerprint au niveau DNS [fedora@guimbarde .ssh]$ ssh-keygen -r guimbarde.thegaragebandofit.com. guimbarde.thegaragebandofit.com. 3600 IN SSHFP 4 2 2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs #JugSummerCamp @Speaker
Empreinte de la clé publique Si changement du fingerprint @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: POSSIBLE DNS SPOOFING DETECTED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ The RSA host key for guimbarde.thegaragebandofit.com remote host has changed,and the key for the corresponding IP address xxx.yy.xxx.yy is unknown. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs. Please contact your system administrator. Add correct host key in /home/.ssh/known_hosts to get rid of this message. Offending key in /home/.ssh/known_hosts:1 Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks. Effacement du fingerprint dans le fichier known_host ssh-keygen -R guimbarde.thegaragebandofit.com Vérification du fingerprint des clés publiques coté client ssh-keygen -lf jugsummercamp-rsa-key.pub 4096 SHA256:2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs fedora@guimbarde.thegaragebandofit.com (RSA) #JugSummerCamp @Speaker
Empreinte de la clé publique Gestion de multiples utilisateurs 1/ Ajout de la clé dans le known_host pour chaque utilisateur 2/ -o StrictHostKeyChecking=no (pas recommandé) 3/ ssh-keyscan -H -t rsa guimbarde.thegaragebandofit.com >> /etc/ssh/ssh_known_hosts #JugSummerCamp @Speaker
SSH copy-id ! copie de la clé publique et authorized_keys
Copie de la clĂ© publique cĂŽtĂ© serveur Pour accepter les connexions, il faut que le serveur connaisse la clĂ© publique CotĂ© serveur, la clĂ© publique est stockĂ© dans le fichier ~/.ssh/authorized_keys [fedora@guimbarde .ssh]$ cat ~/.ssh/jugsummercamp-rsa-key.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWeSBZZiWaLQkKYwxsNhvEur5HLlymF5A6cGcjEvrQzDzLHqe7/yMaenZ9jMGxJ/et8snq3KyDw7VaQvui AHsZdES0IhDiAb82XkEn8sd7dvRqMXlnIdGpZUJ33UwOevDfn3N6JGK/6uvuJLTFcz5L/K+6pk06ur9Go1gIseCTtjmBqzpgc3bB+mD/uAfLbBXz 2kJdc1RnvBk8sBxQ9UXYdwGRdEWA6RvkU1mGaOAMLhKDOxjR6rg8JQe0CTeKVFq9JdCs+KIhOiYkyZBMv8qM0s+PJpblexOoivmgPbQRjaI+qdC/ b1QtQzdAPwobFbJeRFT1IrIvKA97YNBtTv8 fedora@guimbarde.thegaragebandofit.com Peut avoir plusieurs types dĂ©pendant de ce que vous avez choisi comme algorithme Plusieurs solutions pour copier la clĂ© 1/ Manuellement 2/ Utilisation de ssh-copy-id [fedora@guimbarde .ssh]$ ssh-copy-id -i ~/.ssh/jugsummercamp-rsa-key.pub fedora@guimbarde.thegaragebandofit.com /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: â/home/fedora/.ssh/jugsummercamp-rsa-key.pubâ /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed â if you are prompted now it is to install the new keys fedora@guimbarde.thegaragebandofit.comâs password: Number of key(s) added: 1 Now try logging into the machine, with: âssh fedora@guimbarde.thegaragebandofit.comâ and check to make sure that only the key(s) you wanted were added. #JugSummerCamp @Speaker
SSH agent ! gestion de multiples clés
Connexion automatique avec ssh-agent La gestion des clĂ©s peut ĂȘtre compliquĂ© (plusieurs 10aine de clĂ©s voir 100aine par workstation) Il faut se rappeler de quelle clĂ© est associĂ© Ă quels serveurs Et aussi de chaque passphrase -> Ca peut ĂȘtre fastidieux ssh-agent est un helper qui garde la trace des clĂ©s dâidentitĂ© des utilisateurs et de leurs passphrases. Lâagent peut ensuite utiliser ces clĂ©s pour se connecter Ă dâautres serveurs sans que lâutilisateur nâait Ă saisir Ă nouveau un mot de passe ou une passphrase. Cela permet de mettre en Ćuvre une forme dâauthentification unique (SSO). DĂ©marrage de lâagent [fedora@guimbarde .ssh]$ eval â$(ssh-agent -s)â Agent pid 1383 VĂ©rification du dĂ©marrage de lâagent [fedora@guimbarde .ssh]$ echo $SSH_AGENT_PID 1383 Par dĂ©faut, lâagent SSH ajoute les clĂ©s suivantes : ~/.ssh/id_rsa, .ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519, et ~/.ssh/identity #JugSummerCamp @Speaker
Connexion automatique avec ssh-agent SSH Agent forwarding Le protocole SSH met en Ćuvre du SSH agent forwarding, un mĂ©canisme par lequel un client SSH permet Ă un serveur SSH dâutiliser lâagent ssh local sur le serveur auquel lâutilisateur se connecte, comme sâil sâagissait dâun agent local. Câest une forme de SSO transitif Mais contient des risques ! Toute personne root sur le serveur peut avoir accĂšs Ă la socket ssh-agent, et donc usurper lâidentitĂ© de connexion Il vaut mieux utiliser ProxyJump [fedora@guimbarde .ssh]$ ssh -J bastion.thegaragebandofit.com fedora@guimbarde.thegaragebandofit.com SĂ©quencement : 1/ SSH va utiliser la clĂ© dans lâagent pour se connecter au bastion 2/ Ensuite, SSHD depuis le bastion va se connecter Ă guimbarde et va forwarder la connexion Ă lâagent local 3/ Lâagent local va ensuite renĂ©gocier le handshake via le bastion Pas de transfert de clĂ© sur le bastion ! #JugSummerCamp @Speaker
SSH-add ! ajout et listing de clés complémentaires
Ajout et listing des clĂ©s de connexion Comment ajouter des clĂ©s supplĂ©mentaire dans lâagent ? Avec la commande ssh-add [fedora@guimbarde .ssh]$ ssh-add ~/.ssh/id_ed25519 Identity added: id_ed25519 (fedora@guimbarde.thegaragebandofit.com) Dans le cas ou la clĂ© Ă une passphrase, ssh-add va lancer la commande ssh-askpass pour avoir la passphrase et la stocker de maniĂšre sĂ©curisĂ©e. Lister toutes les identitĂ©es [fedora@guimbarde .ssh]$ ssh-add -L ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWeSBZZiWaLQkKYwxsNhvEur5HLlymF5A6cGcjEvrQzDzLHqe7/yMaenZ9jMGxJ/et8snq3KyD w7VaQvuiAHsZdES0IhDiAb82XkEn8sd7dvRqMXlnIdGpZUJ33UwOevDfn3N6JGK/6uvuJLTFcz5L/K+6pk06ur9Go1gIseCTtjmBqzpg c3bB+mD/uAfLbBXz2kJdc1RnvBk8sBxQ9UXYdwGRdEWA6RvkU1mGaOAMLhKDOxjR6rg8JQe0CTeKVFq9JdCs+KIhOiYkyZBMv8qM0s+P JpblexOoivmgPbQRjaI+qdC/b1QtQzdAPwobFbJeRFT1IrIvKA97YNBtTv8 fedora@guimbarde.thegaragebandofit.com Lister tous les fingerprints [fedora@guimbarde .ssh]$ ssh-add -l 4096 SHA256:2ui1Vvf76v/eUPkyW4GN8QY6Z+zC7YX+U8pGZIwWyUs fedora@guimbarde.thegaragebandofit.com (RSA) #JugSummerCamp @Speaker
SSH at scale ? gestion de multiples clés
Gestion at scale Comment faire pour pouvoir gĂ©rer et stocker de maniĂšre sĂ©curisĂ©e plusieurs 10aine voir 100aine de clĂ©s ? De plus, les clĂ©s ne sont pas liĂ© Ă une identitĂ© La rĂ©ponse ? SSH certificate !! â â â â â â Les certificats sont liĂ©s Ă lâidentitĂ© de lâutilisateur. Les certificats expirent automatiquement. Les certificats peuvent contenir des restrictions SSH, par exemple interdire lâattribution de PTY ou la redirection de ports. Les certificats SSH peuvent ĂȘtre synchronisĂ©s avec les certificats Kubernetes. Les certificats incluent des mĂ©tadonnĂ©es. Cela permet un contrĂŽle dâaccĂšs basĂ© sur les rĂŽles. Les certificats rĂ©solvent les problĂšmes de TOFU (trust on first use). Les certificats utilisateur et hĂŽte signĂ©s par la mĂȘme autoritĂ© de certification Ă©tablissent la confiance et Ă©liminent le besoin de TOFU. #JugSummerCamp @Speaker
Gestion at scale Comment gĂ©nĂ©rer des certificats ? [fedora@guimbarde .ssh]$ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in host_ca. Your public key has been saved in host_ca.pub. The key fingerprint is: SHA256:tltbnMalWg+skhm+VlGLd2xHiVPozyuOPl34WypdEO0 host_ca The keyâs randomart image is: +â-[RSA 4096]ââ+ | +o.| | .+..o| | o.o.+ | | o o.= E| | S o o=o | | âŠ.+ = +.| | ..=. %.o.o| | *o Oo=.+.| | .oo=ooo+..| +ââ[SHA256]ââ-+ Une best practice est de gĂ©nĂ©rer aussi un CA pour les utilisateurs [fedora@guimbarde .ssh]$ ssh-keygen -t rsa -b 4096 -f user_ca -C user_ca #JugSummerCamp @Speaker
Gestion at scale Gestion des certificats par machine [fedora@guimbarde .ssh]$ ssh-keygen -f ssh_host_rsa_key -N â -b 4096 -t rsa [fedora@guimbarde .ssh]$ ssh-keygen -s host_ca -I guimbarde.thegaragebandofit.com -h -n guimbarde.thegaragebandofit.com -V +52w ssh_host_rsa_key.pub Enter passphrase: # the passphrase used for the host CA Signed host key ssh_host_rsa_key-cert.pub: id âguimbarde.thegaragebandofit.comâ serial 0 for guimbarde.thegaragebandofit.com valid from 2023-06-30T15:00:00 to 2024-06-30T15:01:37 -s : CA racine pour signer le certificat (host) -I : identitĂ© du certificat -h : certificat host -n : nom de la machine -V : durĂ©e de validitĂ© Ajout du CA dans le know_host : @cert-authority *.thegaragebandofit.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDwiOso0Q4W+KKQ4OrZZ1o1X7g3yWcmAJtySILZSwo1GXBKgurV4jmmBN5RsHetl98QiJq64e8oKX1vGR25 1afalWu0w/iW9jL0isZrPrmDg/p6Cb6yKnreFEaDFocDhoiIcbUiImIWcp9PJXFOK1Lu8afdeKWJA2f6cC4lnAEq4sA/Phg4xfKMQZUFG5sQ/Gj1 StjIXi2RYCQBHFDzzNm0Q5uB4hUsAYNqbnaiTI/pRtuknsgl97xK9P+rQiNfBfPQhsGeyJzT6Tup/KKlxarjkMOlFX2MUMaAj/cDrBSzvSrfOwzk qyzYGHzQhST/lWQZr4OddRszGPO4W5bRQzddUG8iC7M6U4llUxrb/H5QOkVyvnx4Dw76MA97tiZItSGzRPblU4S6HMmCVpZTwva4LLmMEEIk1lW5 HcbB6AWAc0dFE0KBuusgJp9MlFkt7mZkSqnim8wdQApal+E3p13d0QZSH3b6eB3cbBcbpNmYqnmBFrNSKkEpQ8OwBnFvjjdYB7AXqQqrcqHUqfwk X8B27chDn2dwyWb3AdPMg1+j3wtVrwVqO9caeeQ1310CNHIFhIRTqnp2ECFGCCy+EDSFNZM+JStQoNO5rMOvZmecbp35XH/UJ5IHOkh9wE5TBYIe FRUYoc2jHNAuP2FM4LbEagGtP8L5gSCTXNRM1EX2gQ== host_ca #JugSummerCamp @Speaker
Gestion at scale Gestion des certificats par utilisateur [fedora@guimbarde .ssh]$ ssh-keygen -f user-key -b 4096 -t rsa [fedora@guimbarde .ssh]$ ssh-keygen -s user_ca -I fedora@thegaragebandofit.com -n fedora -V +1d user-key.pub Enter passphrase: # the passphrase used for the user CA Signed user key user-key-cert.pub: id âfedora@thegaragebandofit.comâ serial 0 for fedora valid from 2020-03-19T16:33:00 to 2020-03-20T16:34:54 -s : CA racine pour signer le certificat (user) -I : identitĂ© du certificat -n : liste des utilisateurs -V : durĂ©e de validitĂ© #JugSummerCamp @Speaker
Gestion at scale Inspecter un certificat [fedora@guimbarde .ssh]$ ssh-keygen -L -f user-key-cert.pub user-key-cert.pub: Type: ssh-rsa-cert-v01@openssh.com user certificate Public key: RSA-CERT SHA256:egWNu5cUZaqwm76zoyTtktac2jxKktj30Oi/ydrOqZ8 Signing CA: RSA SHA256:tltbnMalWg+skhm+VlGLd2xHiVPozyuOPl34WypdEO0 (using ssh-rsa) Key ID: âfedora@thegaragebandofit.comâ Serial: 0 Valid: from 2020-03-19T16:33:00 to 2020-03-20T16:34:54 Principals: fedora Critical Options: (none) Extensions: permit-X11-forwarding permit-agent-forwarding permit-port-forwarding permit-pty permit-user-rc #JugSummerCamp @Speaker
Gestion at scale Stockage dans un LDAP Ajout du schĂ©ma dans le LDAP dn: cn=openssh-lpk,cn=schema,cn=config objectClass: olcSchemaConfig cn: openssh-lpk olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME âsshPublicKeyâ DESC âMANDATORY: OpenSSH Public keyâ EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME âldapPublicKeyâ SUP top AUXILIARY DESC âMANDATORY: OpenSSH LPK objectclassâ MAY ( sshPublicKey $ uid ) ) CrĂ©ation de la requĂȘte de rĂ©cupĂ©ration de la clĂ© ldapsearch â(&(objectClass=posixAccount)(uid=ââ$1ââ))â âsshPublicKeyâ | sed -n â/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gpâ Ajout du script dans le dĂ©mon SSHD AuthorizedKeysCommand /path/to/script AuthorizedKeysCommandUser nobody #JugSummerCamp @Speaker
Gestion at scale Ajout de la clĂ© dans le LDAP [fedora@guimbarde .ssh]$ ldapmodify -xWD âuid=fedora,ou=Users,dc=thegaragebandofit,dc=comâ cn: uid=fedora.ou=Groups,dc=thegaragebandofit,dc=com changetype: modify add: ldapPublicKey cn: uid=fedora,ou=Groups,dc=thegaragebandofit,dc=com changetype: modify add: sshPublicKey sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWeSBZZiWaLQkKYwxsNhvEur5HLlymF5A6cGcjEvrQzDzLHqe 7/yMaenZ9jMGxJ/et8snq3KyDw7VaQvuiAHsZdES0IhDiAb82XkEn8sd7dvRqMXlnIdGpZUJ33UwOev Dfn3N6JGK/6uvuJLTFcz5L/K+6pk06ur9Go1gIseCTtjmBqzpgc3bB+mD/uAfLbBXz2kJdc1RnvBk8s BxQ9UXYdwGRdEWA6RvkU1mGaOAMLhKDOxjR6rg8JQe0CTeKVFq9JdCs+KIhOiYkyZBMv8qM0s+PJpbl exOoivmgPbQRjaI+qdC/b1QtQzdAPwobFbJeRFT1IrIvKA97YNBtTv8 fedora@guimbarde.thegaragebandofit.com #JugSummerCamp @Speaker
Gestion at scale â â â â â â Lâutilisateur crĂ©e une paire de clĂ©s SSH personnelle. Lâutilisateur sâauthentifie auprĂšs de lâespace de stockage avec ses identifiants de fournisseur dâidentitĂ© (IDP). Une fois authentifiĂ©, lâutilisateur envoie sa clĂ© publique SSH Ă Vault pour signature. Vault signe la clĂ© SSH et renvoie le certificat SSH Ă lâutilisateur. Lâutilisateur Ă©tablit une connexion SSH Ă lâaide du certificat SSH. LâhĂŽte vĂ©rifie que le certificat SSH du client est signĂ© par lâautoritĂ© de certification SSH approuvĂ©e et autorise la connexion. #JugSummerCamp @Speaker
SSH et sur le cloud ? diffĂ©rentes façons de sâauthentifier
Sur le cloud, IaaS Immutable infra â â â Injection des clĂ©s dans la golden AMI (Packer, par exemple) Jeu de clĂ©s par compte / projet / instance group / etc. (Terraform, par exemple) Configuration du cloud-init pour peupler les arborescences /home/${user}s Mutable infra â gestion via config. management (Ansible, etc.) â OS login (GCP) #JugSummerCamp @Speaker
Sur le cloud, IaaS OS Login â Gestion automatique du cycle de vie des comptes Linux â Autorisation fine Ă lâaide de Google IAM â Mises Ă jour automatiques des autorisations â PossibilitĂ© dâimporter des comptes Linux existants â IntĂ©gration avec la vĂ©rification en deux Ă©tapes du compte Google â IntĂ©gration avec la journalisation dâaudit Quâest-ce que ca fait ? â Supprime les fichiers authorized_keys de la VM. â Configure un serveur OpenSSH avec lâoption AuthorizedKeysCommand. Cette commande rĂ©cupĂšre les clĂ©s SSH associĂ©es au compte utilisateur Linux pour authentifier la tentative de connexion. â Configure la fonctionnalitĂ© NSS (Name Service Switch) pour fournir au systĂšme dâexploitation les informations relatives Ă lâutilisateur OS Login. â Ajoute un ensemble de configurations PAM (Pluggable Authentication Modules) pour autoriser la connexion de lâutilisateur. Les configurations PAM vĂ©rifient les autorisations IAM pour la connexion et lâaccĂšs administratif. Ces configurations PAM exĂ©cutent Ă©galement dâautres tĂąches telles que la configuration du rĂ©pertoire dâaccueil du compte utilisateur Linux. #JugSummerCamp @Speaker