🧑‍🎓 Back to basics – J’ai une 🔑 clĂ© SSH đŸ’», et maintenant ?

A presentation at JUG Summer Camp 2023 in September 2023 in La Rochelle, France by Ludovic Piot

Slide 1

Slide 1

󰞌 Back to basics – J’ai une 🔑 clĂ© SSH đŸ’», et maintenant ó°€… ? Speaker : Laurent Grangeau - @laurentgrangeau Speaker : Ludovic Piot - @lpiot

Slide 2

Slide 2

Qui sommes-nous ? Laurent Grangeau Solutions Architect @ Google @laurentgrangeau #JugSummerCamp Ludovic Piot CTO @ Duonyx @lpiot @Speaker

Slide 3

Slide 3

SSH kĂ©sako ? fonctionnalitĂ©s cas d’usage

Slide 4

Slide 4

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

Slide 5

Slide 5

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

Slide 6

Slide 6

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

Slide 7

Slide 7

cryptographie koikoubeh ? symétrique / asymétrique RSA, DSA, EDCSA, EdDSA

Slide 8

Slide 8

Mettons-nous bien d’accord ! #JugSummerCamp @Speaker

Slide 9

Slide 9

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

Slide 10

Slide 10

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

Slide 11

Slide 11

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

Slide 12

Slide 12

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

Slide 13

Slide 13

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

Slide 14

Slide 14

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

Slide 15

Slide 15

SSH connexion ! négociation / connexion échange de clés publiques authentification partage de clé symétrique

Slide 16

Slide 16

Session SSH, sĂ©quence d’initialisation #JugSummerCamp @Speaker

Slide 17

Slide 17

Session SSH, sĂ©quence d’initialisation #JugSummerCamp @Speaker

Slide 18

Slide 18

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

Slide 19

Slide 19

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

Slide 20

Slide 20

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

Slide 21

Slide 21

SSH fingerprint ! empreinte de clé publique et known_host

Slide 22

Slide 22

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

Slide 23

Slide 23

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

Slide 24

Slide 24

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

Slide 25

Slide 25

SSH copy-id ! copie de la clé publique et authorized_keys

Slide 26

Slide 26

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

Slide 27

Slide 27

SSH agent ! gestion de multiples clés

Slide 28

Slide 28

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

Slide 29

Slide 29

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

Slide 30

Slide 30

SSH-add ! ajout et listing de clés complémentaires

Slide 31

Slide 31

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

Slide 32

Slide 32

SSH at scale ? gestion de multiples clés

Slide 33

Slide 33

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

Slide 34

Slide 34

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

Slide 35

Slide 35

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

Slide 36

Slide 36

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

Slide 37

Slide 37

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

Slide 38

Slide 38

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

Slide 39

Slide 39

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

Slide 40

Slide 40

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

Slide 41

Slide 41

SSH et sur le cloud ? diffĂ©rentes façons de s’authentifier

Slide 42

Slide 42

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

Slide 43

Slide 43

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