Sécurisez vos tests d’application avec Azure DevOps !

Web testing Sécurité Azure Devops
Par Salim MEKNI il y a un an 4 minutes

L’un des Frameworks de testing en full code les plus répandus dans la communauté des testeurs est l’incontournable duo Java/Selenium.

Le langage Java et la librairie Selenium sont très utilisés pour les tests UI qui sont exécutés en CI via Jenkins.

Néanmoins il est aussi possible d’utiliser cette technologie open source dans un écosystème Cloud Microsoft. Le but d’interfacer cet outil de test avec la forge Microsoft est d’harmoniser au maximum les technologies utilisées entre les équipes de développement et les testeurs, afin d’assurer un meilleur suivi et une optimisation des ressources disponibles dans votre société.

Je ne vais pas m’attarder dans cet article sur la partie testing avec du Java Selenium mais plutôt sur comment tirer profit d’Azure DevOps pour écrire un code sécurisé, qui n’expose pas les données d’authentification en public.

Pour ce faire, nous allons procéder en 2 parties :

  • Partie 1 : Comment écrire un code sécurisé en Java qui n’expose pas notre SUT (System Under Test)

  • Partie 2 : Comment paramétrer les secrets pour masquer les données dans Azure DevOps et le pipeline CICD

  • C‘est parti !

Première partie

Le but est de variabiliser dans le code les données que nous allons stocker par la suite dans un groupe de variables sur Azure DevOps.

Nous allons prendre le scénario d’authentification avec les données : identifiant, mot de Passe et une URL d’application.

image

Première étape : Créer un dossier « configuration » sous la racine de notre projet pour mettre un fichier .properties’’ que je vais nommer ‘’config.properties’’.

image

Dans ce fichier nous allons écrire les données d’authentification :

  • Username : notre identifiant
  • Password : notre mot de passe
  • baseURL : notre url d’application

Deuxième étape : Je crée un deuxième dossier « utilities » sous lequel je vais créer une class Java qui va lire ma configuration et je la nome "ReadConfig.java".

import java.io.FileInputStream;
import java.util.Properties;
import java.io.File;

public class ReadConfig {
    Properties pro;
    public ReadConfig()
    {
         File src = new File("./Configuration/config.properties");
         try {
             FileInputStream fis = new FileInputStream(src);
             pro = new Properties();
             pro.load(fis);
         } catch (Exception e) {
             System.out.println("Exception is " + e.getMessage());
        }
    }
    public  String getApplicationURL()
    {
        String url=pro.getProperty("baseURL");
        return url;
    }
    public  String getUsername()
    {
        String username=pro.getProperty("username");
        return username;
    }
    public  String getPassword()
    {
        String password=pro.getProperty("password");
        return password;
    }

}

Troisième étape : Dans ma class ‘’BaseClass’’ je rajoute

Ce qui va me permettre de charger ces données à chaque fois que je lance mon test

public class BaseClass {

    ReadConfig readConfig = new ReadConfig();
    public String baseURL =  readConfig.getApplicationURL();
    public String password = readConfig.getPassword();
    public String username =  readConfig.getUsername();
    public static WebDriver driver;


    @BeforeClass
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
       
        driver.get(baseURL);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }
    @AfterClass
    public void tearDown(){
        driver.quit();
    }
}

Quatrième étape : A la fin il faut rajouter les dépendances ‘’azure-security-keyvault-key’’ et ‘’azure-identity’’dans le fichier pom.xml

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-security-keyvault-keys</artifactId>
    <version>4.2.3</version>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.2.0</version>
</dependency>

Deuxième partie

Sur Azure DevOps je crée un groupe de variables sous Pipleine/Libray puis je rajoute un nouveau groupe de variables

image

Dans ce groupe de variables, je rajoute les variables suivantes tels qu’ils sont identifiés dans le fichier ReadConfig.java pour les verrouiller.

  • username : notre identifiant
  • password : notre mot de passe
  • baseURL : notre url d’application

image

Une fois le verrouillage effectué, il devient impossible de les afficher.

Il est aussi possible de charger les secrets dans des key vault Azure dans le but d’une utilisation centralisée par les équipes OPS.

Pour ce faire, il suffit de cocher la case : link secrets from an Azure Key vault as variables

image

Comment charger ce groupe de variables dans votre pipeline Azure ?

Pour utiliser un groupe de variables, ouvrez votre pipeline, sélectionnez Groupes de variables dans variables, puis choisissez Groupe de variables de lien. Dans un pipeline de build, vous voyez une liste de groupes disponibles. Dans un pipeline de mise en production, par exemple, vous voyez également une liste déroulante d’étapes dans le pipeline. Il ne reste plus qu’à lier le groupe de variables à une ou plusieurs de ces étapes dans le pipeline

image

Si vous utilisez un ‘’secrets’’ charger dans une key vault, il est aussi possible d’utiliser ces derniers de la façon suivante dans votre fichier Yaml :

image

Votre configuration est prête à présent !

Pour toute exécution en locale, le fichier ’’config.properties’’ va fournir les données d’authentification et les tests seront déclenchés sur votre machine.

Pour toute exécution en CICD, il faut pousser le code avec votre fichier ’’config.properties’’ vide, car les données sont stockées dans Azure DevOps et ne sont pas visibles.

Le CICD Azure fera le reste !

A vous de jouer 😉