Home Tags Anciens articles Mon CV

Projet : sftpud

Ce week-end je n’étais pas en Allemagne, du coup j’ai voulu pisser du code pour une fois que j’avais le loisir de le faire. J’ai eu l’idée de me lancer un petit challenge : coder quelque chose, n’importe quoi, from zero to github, en 24 à 48h.

NOTE: il s’avère que j’ai en fait perdu environ 2h de ma vie à regarder X-Men: Dark Phoenix. Quelle daube.

SPOILER ALERT: au final, j’ai mis bout à bout 6h, de zéro à ce que vous trouverez sur Github.

L’idée derrière sftpud m’est venu en découvrant ce projet. Je suis tombé dessus hier ou avant-hier et quand j’ai lu le code, j’ai été un peu déçu car je m’attendais à découvrir un code qui m’apprendrait à utiliser du VPN dans AWS sans serveurs, mais il s’avère que le script principal utilise des scripts Python pour lancer une EC2, puis déroule un autre script sh, qui se charge finalement d’installer et de paramétrer OpenVPN sur l’EC2 créée précédemment.

Je ne crache pas sur le travail du gars, c’est chouette et ça marche. Mais un script Python de création de VPN à la volée et serverless aurait été intéressant. Et là… J’avais mon idée.

sftpud permet de créer un espace SFTP, avec un utilisateur et sa clef SSH, dans n’importe quelle région du monde (comprenez : d’AWS), en une seule commande. Pas d’EC2 derrière, même pas de bash sauf pour le script d’installation. Que du Python, du boto3. Pour le reste, cela s’appuie sur les APIs AWS, notamment celle de AWS Transfer, auquel nous avions d’ailleurs consacré un article en co-authoring avec l’ami @zoph.

Le projet se décompose en deux scripts :

  • sftpup : permet de créer le SFTP en lui donnant en argument au moins une région et un arn, le reste des arguments a une valeur par défaut si non précisé.
  • sftpdown : permet de détruire le SFTP. Il faut lui donner la région et l’id du SFTP.

Tout se fait sans serveurs donc. J’ai parlé de paramètres par défaut, sachez donc que sans précisions de votre part :

  • une clef ssh est générée à la volée dans .ssh/sftpud via une commande subprocess.call() utilisant ssh-keygen (oui, j’ai encore assez d’honneur pour ne pas utiliser system()).
  • l’utilisateur est celui connecté sur votre système, obtenu depuis la variable d’environnement USERNAME.

Vous pouvez spécifiez une clef et un utilisateur différent de celui par défaut si vous le souhaitez. Voici un exemple complet d’utilisation de chacun des deux scripts.

sftpup:

$ bin/sftpup.py -r eu-west-1 -u kharec -a "arn:aws:iam::829937339934:role/newroletest" -k ~/.ssh/id_rsa
Job's done. Server's being created by AWS now.
[...]
OK, connect with : 

sftp -i /home/kharec/.ssh/id_rsa kharec@s-1f1b77e2761b4589a.server.transfer.eu-west-1.amazonaws.com 

You're welcome.
$ sftp kharec@s-1f1b77e2761b4589a.server.transfer.eu-west-1.amazonaws.com 
The authenticity of host 's-1f1b77e2761b4589a.server.transfer.eu-west-1.amazonaws.com (52.210.40.101)' can't be established.
RSA key fingerprint is SHA256:dZ8pzUGgT0MRVqbAh2BWuF8/JFs2DAff4VAamz1T10g.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 's-1f1b77e2761b4589a.server.transfer.eu-west-1.amazonaws.com,52.210.40.101' (RSA) to the list of known hosts.
Connected to kharec@s-1f1b77e2761b4589a.server.transfer.eu-west-1.amazonaws.com.
sftp> 

sftpdown:

$ bin/sftpdown.py -r eu-west-1 -i s-1f1b77e2761b4589a
Your server s-1f1b77e2761b4589a in region eu-west-1 was deleted. 

Vous pouvez retrouver le code sous GPLv3 sur mon Github.

Challenge completed :-)