Accès à une instance EC2 d'un réseau privé avec SSM
A moins d’avoir un bastion, par défaut, il est impossible de se connecter
depuis l’extérieur à une instance AWS EC2 se trouvant dans un réseau privé. Il
existe plusieurs solutions pour y arriver, mais je vais vous détailler celle qui
est la plus économique avec l’utilisation de SSM
avec des VPC endpoints
.
Comparaison des couts NAT Gateway / VPC Endpoints
J’ai décidé d’utiliser des VPC Endpoints en comparant le prix avec et celui des Nat Gateways :
- Coût NAT Gateway : 0.05 USD / heure + 0.05 USD par Go de données transférées
- Coût VPC Endpoints : 0.011 USD / heure + 0.01 par PO de données transférées
Pour activer SSM, j’ai besoin de 3 VPC endpoints. Donc le coût est bien inférieur à celui de la NAT Gateway.
Qu’est que AWS SSM
SSM d’AWS, gestionnaire de Session, fait partie d’un ensemble de fonctionnalités facilitant la gestion des ressources d’infrastructure AWS. Parmi ses fonctionnalités, on retrouve la gestion des sessions qui permet d’ouvrir un shell interactif dans le navigateur ou via la CLI d’AWS sans passer par SSH. On comprend vite que du coup, on réduit la surface d’attaque, renforçant ainsi notre niveau de sécurité de ces instances.
Configuration d’un réseau privé
Je vais utiliser la console AWS pour créer mon VPC composé de deux sous-réseaux, un privé et un public. C’est dans le réseau privé que j’ajouterai une instance EC2 par la suite.
Pour cela dans la console AWS, allez dans la gestion des VPC, puis cliquez sur [Créer un VPC]. Je vous conseille d’utiliser le mode [VPC et Plus encore]. Vous n’aurez rien à modifier si ce n’est le nom du VPC et les blocs d’adresses.
Création du groupe de Sécurité
Pour que SSM fonctionne sur un réseau privé, il faut que le groupe de sécurité attaché au point de terminaison d’un VPC autorise les connexions entrantes sur le port 443 à partir du sous-réseau privé de l’instance gérée. Donc dans la gestion des Groupes de Sécurité, nous allons définir un groupe de Sécurité SSM autorisant le flux HTTPS dans les règles entrantes. Attention à bien indiquer le VPC créé précédemment.
Création des VPC endpoints
Toujours dans la section VPC, cliquez sur [Points de Terminaison]. Il faudra répéter cette opération pour les 3 endpoints suivant :
com.amazonaws.eu-west-3.ssm
com.amazonaws.eu-west-3.ssmmessages
com.amazonaws.eu-west-3.ec2messages
Cliquez [Créez un point de terminaison] puis dans la section services filtrez sur le service ssm ou ec2 comme dans l’image ci-dessous.
Ensuite dans la partie VPC prenez votre VPC créer auparavant. Dans la partie Sous-Réseaux prenez bien les réseaux privés. Pour le Groupe de Securité prenez celui que vous avez créé.
Répétez l’opération avec les trois points de terminaisons. Vous devriez obtenir ceci :
Création du role IAM
Pour que Session Manager fonctionne, il faut permettre à une instance d’utiliser les fonctions de base de SSM. Pour cela, il faut créer un rôle contenant la stratégie AmazonSSMManagedInstanceCore
Allez dans la section IAM et [Créer un Rôle]. Dans la première étape sélectionner service AWS et Cas d’utilisation EC2 puis [Suivant].
Ensuite dans la politique, filtrez sur SSM et
sélectionner AmazonSSMManagedInstanceCore
.
Dans le nom du Rôle, entrez un nom explicite comme AllowSSMtoEC2
et cliquez sur
[Créer le Role].
Création de l’instance
Bon, nous avons terminé les préparatifs. Passons à la création de l’instance EC2.
Dans la section EC2, cliquez sur [lancer une instance].
Dans la section paire de clés, prenez [Continuer sans paire de clés (Non recommandé)]
Dans la section Paramètres réseau, choisissez bien votre VPC et sous-réseau privé. Pour le groupe de sécurité, sélectionnez celui créé précédemment.
Reste à indiquer le rôle. Déroulez la section [Détails avancés] et dans le profil
d’instance IAM sélectionnez celui créé plus haut : AllowSSMtoEC2
Tout est prêt. On lance l’instance ! Cliquez sur [Connectez-vous à l’instance]
puis [Session Manager]. Vous devriez obtenir cet écran :
Cliquez sur [Se connecter]. Vous devriez obtenir cet écran :
Connexion à l’instance via SSM avec la CLI AWS
Avant de se connecter, il faut au préalable installer et configurer la CLI AWS. Comme très souvent, je vais utiliser asdf pour réaliser cette opération.
asdf plugin add aws-cliasdf install aws-cli latestasdf global aws-cli latest
Passons à la configuration du compte :
aws configureAWS Access Key ID [None]: xxxxxxxxxxAWS Secret Access Key [None]: xxxxx/xx/xxxxxxxxxxxxxxxxxxxxDefault region name [None]: eu-west-3Default output format [None]: json
Il faut ensuite installer le plugin Session Manager. Voici les liens pour le télécharger :
Une fois installé pour se connecter à l’instance :
export AWS_PROFILE=persoexport AWS_DEFAULT_REGION=eu-west-3aws ssm start-session --target i-00be13f6b2811f61d
Starting session with SessionId: admuser-0a85dc1da03fe5f3c/usr/bin/bashsh-4.2$ /usr/bin/bash[ec2-user@ip-10-0-0-140 bin]$
Configurer le profil dans Session Manager
Il est possible de définir des profils pour la connexion. Vous avez certainement remarqué que ma session lance un shell bash. Comment faire ?
Allez dans la section AWS Session Manager. Cliquez sur Préférences puis [Modifier].
Dans cet écran vous pouvez indiquer un utilisateur particulier :
Mais aussi des commandes à exécuter à l’ouverture de la session :
Utiliser une session SSH via SSM
Pour utiliser une connexion SSH via SSM, il faut :
- Lors de la création de l’instance ajouter une clé SSH
- Ajouter ces lignes avec votre configuration ssh. Editez le fichier
$HOME/.ssh/config
et ajoutez ces lignes en début de fichier :
host i-* mi-* User ec2-user ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
Pour le user attention, ils sont spécifiques à chaque type d’AMI: Amazon Linux -> ec2-user, Ubuntu -> ubuntu, …
Ensuite, il suffit d’utiliser la commande suivante :
ssh i-00be13f6b2811f61d
ED25519 key fingerprint is SHA256:9n13ByefoUAwKbDVM5BLDIOUR/+yM2WJsn4ewC8MmiY.This key is not known by any other namesAre you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added 'i-00be13f6b2811f61d' (ED25519) to the list of known hosts.
__| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___|
https://aws.amazon.com/amazon-linux-2/[ec2-user@ip-10-0-0-140 ~]$
Lancer des commandes et playbooks Ansible avec SSM
Nous avons fait le plus dur, il suffit juste d’indiquer le nom de nos machines dans l’inventaire :
ansible -m setup -i i-00be13f6b2811f61d, all | grep ansible_product_version "ansible_product_version": "4.11.amazon",
La voie est ouverte pour gérer vos instances de manière sécurisée !
Conclusion
En premier, je tiens à remercier Florian CLISSON et Farouk EL HAMDI pour m’avoir aidé à l’élaboration de ce tutoriel. Dans un prochain billet, je publierai le code Terraform pour réaliser la même opération. J’aimerais aussi utiliser ce type de connexion pour mes tests de Rôles et Collection Ansible sur des instances EC2. En effet, pour le moment, j’utilise une connexion via une IP Publique.