SSM-Bastion ou comment se connecter a une instance/bdd privée sur AWS
Tags: aws, securite, bastion, architecture
Published: 2021-04-15 19:09:52

Un des challenges les plus fréquents d'un projet sur AWS en ce qui concerne la sécurité et l'accessibilité d'une EC2 ou d'une base de donnée privée tourne autour du Bastion.

Le Bastion est le point central pour accéder depuis l'extérieur à des resources privées. (hors DirectConnect)

![SSH Bastion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sp1bg2dclfwj11y38cbj.png)

*Architecture classique d'un bastion via un tunnel SSH*

Qu'en est-il de la **resilience** ?
**Filtrer** les IP's entrantes via un Security Group ?
La **rotation** des clés SSH

ça sera pas mal de travail au quotidien...

Alors comment accéder a son instance privée de manière sécurisée ?

Avec le navigateur, directement, vous pouvez utiliser [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html) ou meme dans certains cas [EC2 Serial Console]  (https://aws.amazon.com/fr/blogs/aws/troubleshoot-boot-and-networking-issues-with-new-ec2-serial-console/)

Sinon concrètement ? comment accéder à une base de donnée sur AWS (Redshift, Aurora, DocumentDB, RDS,...) ou se connecter en SSH sans utiliser sur l'EC2 de destination Session Manager ?

### SSM-Bastion
Je suis très heureux de partager avec vous SSM-Bastion, comment cela fonctionne-t-il ?


![SSM-Bastion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ulu5mr5cibjmqe5nhht.png)
*Architecture de SSM-Bastion*

Voyons ça de plus prés, premièrement l'instance **n'as pas besoin d'être exposée publiquement (via un subnet public)**
Résilience et réduction de cout avec une **Spot instance** dans un **Auto Scaling group**.

1/ Via un [script](https://github.com/Menahem1/SSM-Bastion/tree/main/script), l'utilisateur qui souhaite se connecter lance une commande de port forwarding, authentifié par son AWS Access Key et Secret Key.
L'instance EC2 qui est déployée en tant que SSM-Bastion doit communiquer avec des points de terminaison AWS, lorsque vous vous trouver dans un **VPC sans NAT Gateway** vous allez avoir besoin des endpoints suivants : 

![SSM-Bastion Endpoints](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wocrbjc8ppodzoxlgm3l.png)

Note : Pour KMS vous allez avoir besoin de l'activer à travers la [console](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-enable-encryption.html) ou par [cli](https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-create-preferences-cli.html)

2/ Après que l'utilisateur ait lancé le port forwarding command (via Run Command) l'EC2 SSM-Bastion crée le tunnel vers la destination

3/ Une fois le tunnel créé (via socket), la session est ouverte sur le poste local, permettant de s'y connecter a partir du localhost


### Lancement d'une connexion - exemple
Pour lancer une session avec le script il existe 2 possibilités



1/ Session interactive (sans paramètre dans la commande)
`./ssm-bastion-port-forwarding.sh`

![Session interactive](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xs1q5lqdfliogwj6jt4l.png)
> *Une connexion vers une EC2 privée avec l'IP 10.0.0.1 écoutant sur le port 3006, le port ouvert sur la machine sera 9090*


2/ Avec arguments dans la ligne de commande 
Vous pouvez lancer directement une session avec les arguments dans la ligne de commande, ci-dessous les paramètres nécessaires

 `   ./ssm-bastion-port-forwarding.sh ip_ou_dns_destination port_destination port_source `


![avec-arguments](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nbel1jgr9knnmesftqsp.png)
> *Example d'une connexion avec une destination secrete le port de destination est le 4567, le port ouvert sur la machine locale est 8768*

Après ça vous pouvez utiliser votre connexion sur *localhost:port_ouvert*

Vous pouvez retrouver le code Terraform ainsi que lscript Bash sur [github](https://github.com/Menahem1/SSM-Bastion)