Aller au contenu principal

Accès à une instance EC2 d'un réseau privé avec SSM

· 6 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.

Plus d'infos

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-cli
asdf install aws-cli latest
asdf global aws-cli latest

Passons à la configuration du compte :

aws configure
AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxx/xx/xxxxxxxxxxxxxxxxxxxx
Default region name [None]: eu-west-3
Default 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=perso
export AWS_DEFAULT_REGION=eu-west-3
aws ssm start-session --target i-00be13f6b2811f61d

Starting session with SessionId: admuser-0a85dc1da03fe5f3c
/usr/bin/bash
sh-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'"
attention

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 names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: 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.