janvier 2022
Nous sommes cinq étudiants en dernière année à Polytech Nice Sophia, en mineure Architectures Logicielles :
Les technologies cloud sont en plein essor et sont utilisées dans de nombreux projets réputés. Permettre un déploiement automatique et configurable de ces environnements est indispensable pour ces projets. En ce sens, des technologies, permettant une automatisation du déploiement de ces systèmes sur des infrastructures cloud et d’en configurer plusieurs aspects (ex. cloud provider, …), ont été développées : c’est le cas de Terraform. Cependant, n’importe quels outils demande de respecter de bonnes pratiques. Connaître et répandre les bonnes pratiques de l’utilisation de ce genre d’outil permet une meilleure maintenance de ces applications et de corriger de nombreux problèmes, qu’ils s’agissent de problèmes de lisibilité, de sécurité, de performance ou autre.
Cependant, ce n’est pas parce qu’on connait une bonne pratique qu’elle est correctement appliquée. Pour autant qu’on sache, aussi incroyable soit les outils comme Terraform, il pourrait être mal utilisé en pratique. Mais comment vérifie-t-on que si c’est le cas ? Pour certifier qu’un projet est de bonne qualité, il faut s’assurer qu’il respecte les bonnes pratiques autant que possible. Il faut donc les mesurer. Mais comment les mesurer ? Est-il ne serait-ce que possible de les mesurer ?
Ainsi, lors de ce projet nous chercherons à répondre à toutes les questions suivantes :
Quelles bonnes pratiques de Terraform sont vérifiables ?
Notre projet se concentre sur la notion de bonne pratique. Avant toute chose, il nous faut définir ce qu’est une bonne pratique. Cette définition n’est pas une définition unique, mais c’est à partir de cette définition que va évoluer le projet par la suite.
Nous définirons une définition en vérifiant les points suivants :
À partir de cette définition, nous pouvons rechercher et lister des bonnes pratiques en renseignant une description, une source, une explication, un potentiel exemple et une estimation de mesurabilité. Enfin, nous regroupons ces pratiques à l’aide de tags qui permettent de cerner certaines catégories de pratique (sécurité, lisibilité, …).
Vous trouverez l’ensemble des pratiques répertoriées dans ce tableau.
Maintenant que nous avons des pratiques, il nous faut estimer si elles sont bien utilisées en pratique.
Pour ce faire il nous faut des projets de référence à analyser, qui puissent représenter “la pratique” énoncée dans la question. Ensuite, il nous faut des *outils pour analyser des pratiques dans un projet. Enfin, nous pourrons lancer une analyse desdits projets afin d’estimer si telle ou telle bonne pratique est correctement employée.
Avec ces projets, nous devons représenter une norme. Il ne faut pas que ce soit des projets réalisés par un développeur solitaire en autodidacte ou par une classe d’étudiants. En ce sens, nous définirons que la sélection des projets sera influencée par la taille du projet, sa popularité, la taille et l’expérience de l’équipe de développement, la régularité des mises à jour et la densité de la partie consacrée à Terraform.
En ce sens, nous avons sélectionné une petite quantité de code de confiance récolté à la main pour plus de certitude.
Nom | Taille | Popularité | Création | Régularité | Contributeurs |
---|---|---|---|---|---|
StubbornJava | 1214 ko | 218 stars | Dec. 2016 | 361 commits | 4 |
Atlantis | 43 567 ko | 4.4k stars | Mai 2017 | 2014 commits | 206 |
Docker Android | 242 262 ko | 4.2k stars | Dec. 2016 | 541 commits | 38 |
DetectionLab | 198 188 ko | 3.3k stars | Dec. 2017 | 541 commits | 6 |
StreamAlert | 44 411 ko | 2.7k stars | Jan. 2017 | 1900 commits | 30 |
Le problème ici est la quantité de projets. Cependant, il est difficile de rechercher des projets de confiance avec GitHub. Peu de filtres, détection de code Terraform difficile et limite d’utilisation, le service a beaucoup de limites empêchant une bonne sélection de projets pertinents. Il nous faut donc de meilleures méthodes de recherche. Pour cela nous pourrions utiliser des technologies comme CodeDJ qui offrent un DSL permettant des recherches plus pertinentes.
Cependant, les recherches concernant l’utilisation de CodeDJ n’ont à ce jour pas porté leur fruit, leur base de données étant privée et reste à l’état de piste de recherche.
Pour savoir si Terraform est bien utilisé en pratique, il faut mesurer cela grâce à des outils. De ce fait, nous sélectionnons des outils en procédant par recherches avec Github. Notre recherche se fait en fonction de plusieurs critères : leur popularité, s’ils sont Open Source ou non et enfin la gratuité de l’outil. Au terme de cette recherche, nous retenons 6 outils : TFLint, Checkov, TFSec, Terrascan, Regula, Snyk IAC, tous traitant de domaines différents (analyse syntaxique, sécurité, etc.). Cependant, il nous paraît important de vérifier le nombre de règles que vérifient ces outils et le nombre de technologies auxquelles ils s’appliquent : ainsi nous voyons que Checkov est le projet le plus flexible avec un total de 1600 règles traitées et une couverture large des technologies. TFSec est, lui aussi, assez flexible. En revanche, en appliquant de nouveaux filtres, nous constatons qu’un bon nombre de projets ont une complexité non négligeable en raison du langage qu’ils utilisent (Rego, Go) et il est donc complexe d’écrire une règle personnalisée dans ces langages. Après quelques essais, nous nous apercevons que mettre en place une règle en Checkov, même avec un langage facile à prendre en main comme Python, reste compliqué. Au mieux, nous finirons par créer une règle qui utiliserait les règles déjà définies par le logiciel et ce n’est pas notre objectif. C’est pourquoi une piste d’exploration peut être d’essayer de mettre en place une règle avec TFLint malgré qu’il faille l’écrire en Go.
Par la suite, nous allons nous concentrer sur l’utilisation de Checkov.
Nous pouvons maintenant analyser les projets avec Checkov :
Projet | Taux de succès |
---|---|
StubbornJava | 13% 🟥 |
Atlantis | 50% 🟧 |
Docker | 76% 🟨 |
DetectionLab | 48% 🟧 |
StreamAlert | 94% 🟩 |
Le problème ici, c’est que ça nous ne nous donne aucune preuve que cette analyse reflète une bonne ou mauvaise utilisation de bonne pratique. En effet, rien nous dit que les vérifications effectuées par Checkov vérifient une pratique qui respecte notre définition d’une bonne pratique.
La question est : Comment pouvons-nous utiliser checkov pour prouver une bonne pratique ? Dans un premier temps, nous allons sélectionner un petit échantillon de bonne pratique simple afin de vérifier que l’analyse est possible avant de l’étendre au reste de la sélection.
Ainsi, nous nous concentrerons sur les pratiques, accès sécurisé, suivante :
Il faut maintenant nous demander comment les vérifier dans un projet.
Pour que l’utilisation de Checkov soit pertinent pour vérifier ces pratiques, il nous faut sélectionner des règles
définies par la technologie qui sont associables à nos bonnes pratiques. Ainsi, nous effectuerons les vérifications
suivantes : CKV_AWS_41
, CKV_AWS_45
, CKV_AWS_46
, CKV_AWS_58
, CKV_AWS_149
, CKV_AZURE_41
, CKV_BCW_1
,
CKV_GIT_4
, CKV_LIN_1
, CKV_OCI_1
, CKV_OPENSTACK_1
, CKV_PAN_1
. Toutes ont été sélectionnées manuellement pour
vérifier qu’elles sont bien associées à nos bonnes pratiques.
Ainsi, nous pouvons utiliser la commande suivante sur les projets :
checkov -d <directory> --compact --framework terraform --check CKV_AWS_41,CKV_AWS_45,CKV_AWS_46,CKV_AWS_58,CKV_AWS_149,CKV_AZURE_41,CKV_BCW_1,CKV_GIT_4,CKV_LIN_1,CKV_OCI_1,CKV_OPENSTACK_1,CKV_PAN_1
De cette manière, nous obtenons les résultats suivants :
Projet | Taux de succès |
---|---|
StubbornJava | 100% 🟩 |
Atlantis | 100% 🟩 |
Docker | 100% 🟩 |
DetectionLab | 100% 🟩 |
StreamAlert | 100% 🟩 |
Nous observons un total respect des règles en question. De par ce résultat, nous pouvons affirmer que les bonnes pratiques sélectionnées sont en effet bien respectées. Cependant, cette affirmation est fondée sur peu de projets. Afin de confirmer cette affirmation, il est nécessaire de trouver plus de projets pertinents à analyser.
À défaut de pouvoir utiliser CodeDJ, nous retournons sur une recherche GitHub manuelle. Cette fois-ci en recherchant avec des mots clés que l’on peut retrouver dans des fichiers Terraform. Cependant, bien que cela nous permet de connaître des projets ayant des fichiers Terraform, cela ne nous permet pas de faire des filtres sur ces projets. Afin de combler ce manque, nous mettons en place une méthodologie de recherche et des scripts permettant leur exécution.
Afin d’effectuer une recherche des projets GitHub contenant au moins un fichier Terraform, nous essayons une première approche à base de requêtes à l’API de GitHub :
extension:tf language:hcl
(2 096 750 fichiers trouvés)
=> Trop de fichiers par projet, le parcours est par conséquent trop longterraform extension:tf
(505 379 fichiers trouvés)
=> Trop de fichiers par projet, le parcours est par conséquent trop long
=> Certains fichiers invalides indiquent des résultats peu fiablesterraform extension:tf language:hcl
(504 803 fichiers trouvés)
=> Trop de fichiers par projet, le parcours est par conséquent trop longterraform extension:tf
(126 222 fichiers trouvés)
=> Trop de fichiers par projet, le parcours est par conséquent trop long
=> Certains fichiers invalides indiquent des résultats peu fiablesrequired_providers extension:tf language:hcl
(126 219 fichiers trouvés)
=> Requête OK ✅
Cette dernière requête fonctionne, car l’argument required_providers
n’est déclaré qu’une seule fois par projet
Terraform (déclaration des dépendances). Évidemment, il est toujours possible de détecter plusieurs fichiers répondant
à ces critères dans un projet. Cependant, cela semble être grandement limité au vu du nombre de fichiers trouvés lors de
chaque requête. Malheureusement, l’API de GitHub impose de nombreuses limites d’utilisation. Elle limite notamment le
nombre de requêtes de recherche à 30 requêtes/min, le nombre de résultats par page à 100, ainsi que le nombre de
résultats accessibles par requête à 1000 (même lorsque l’on utilise la pagination). Nous devons donc trouver
une stratégie afin de récupérer le maximum de fichiers (et donc de projets associés). Pour cela, nous allons utilisé
l’argument size dans la requête qui permet d’indiquer la taille des fichiers (en octets) que nous souhaitons trouver.Première stratégie : Envoyer une requête par taille de 0 à 203 000 octets, cette grande taille n’étant pas arbitraire, mais correspond au plus grand fichier identifié.
Exemple : required_providers extension:tf language:hcl size:1
,
required_providers extension:tf language:hcl size:2
, …
Le parcours trop long et fastidieux (203 000 requêtes potentielles). En effet, nous avons calculé qu’il faudrait 4.7 jours (203 000 / 30 = 6767 secondes = 112 heures = 4.7 jours) pour récupérer les fichiers Terraform de cette manière.
Deuxième stratégie : Envoyer une requête par intervalle de taille entre 0 et 203 000 octets, avec un pas de 50 octets.
Exemple : required_providers extension:tf language:hcl size:0..49
,
required_providers extension:tf language:hcl size:50..99
, …
Cette stratégie de requête nous semble déjà plus appropriée, limitant le nombre de requêtes possibles. Néanmoins, elle nécessite d’identifier un intervalle limité, à la fois calculable en temps et efficient, afin de récupérer le maximum de projets.
Nous allons donc essayer d’affiner cet intervalle, ci-dessous un graphe résultant d’un pas plus petit que précédemment : 10 octets.
Nous pouvons aisément remarquer une zone plus dense que les autres de 60 à 3780 octets. Cet intervalle regroupe 95% des fichiers Terraform trouvés par GitHub. Pour cette raison, nous allons nous concentrer sur cet intervalle avec un pas de 5 octets pour récupérer le maximum de fichiers Terraform (et donc de projets à analyser) en un minimum de temps. Une fois l’analyse terminée, nous constatons que nous avons identifié un total de 92 repositories GitHub contenant au moins un fichier Terraform.
Une fois que nous avons récupéré la liste des repositories, nous utilisons un second script pour analyser chaque repository avec Checkov :
Nombre de projet | Taux de succès moyen | Projets ayant 100% de succès |
---|---|---|
92 | 88,04% | 80,43% |
Vous trouverez les détails de l’analyse ici.
À première vue, Terraform semble être bien utilisé en pratique. Du moins, cette affirmation est basée sur les bonnes pratiques que nous avons nous-mêmes sélectionnées. Afin de généraliser cette affirmation, il serait nécessaire de recommencer une procédure identique, adapté pour l’intégralité des bonnes pratiques, c’est-à-dire :
Cela représente un travail long et fastidieux, surtout si l’on prend en compte que certaines bonnes pratiques sont plus accessoires que d’autres : facilité de maintenance auprès des développeurs contre défaut majeur ou faille de sécurité en cas de négligence.
Si l’on se restreint à notre sélection, nous pouvons affirmer au vu des résultats que Terraform est bien utilisé en pratique.