Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Azure DevOps Services
Les stratégies d’artefact sont appliquées avant le déploiement dans des environnements critiques tels que la production. Ces stratégies sont évaluées pour tous les artefacts déployables dans l'exécution d'une séquence de pipeline donnée et bloquent le déploiement si les artefacts ne sont pas conformes. L’ajout d’une vérification pour évaluer Artifact nécessite la configuration de la stratégie personnalisée. Ce guide décrit comment les stratégies personnalisées peuvent être créées.
Note
Actuellement, les types d’artefacts pris en charge sont destinés aux images conteneur et aux environnements Kubernetes
Prerequisites
Utilisez Rego pour définir une stratégie facile à lire et à écrire.
Familiarisez-vous avec le langage de requête Rego . Les bases suffiront.
Pour prendre en charge des modèles de documents structurés comme JSON, Rego étend Datalog. Les requêtes Rego sont des assertions sur les données stockées dans OPA. Ces requêtes peuvent être utilisées pour définir des stratégies qui énumèrent des instances de données qui violent l’état attendu du système.
Création de stratégies personnalisées
Vous trouverez ci-dessous les exemples de stratégies partagées. En fonction de vos besoins, vous pouvez créer votre propre ensemble de stratégies.
Vérifier un projet/un pipeline spécifique
Cette stratégie vérifie si les images sont générées par Azure Pipelines et Pipeline-foo. Pour que cela fonctionne, la définition du pipeline doit remplacer le champ de nom par quelque chose comme : AzureDevOps_$(BuildDefinitionName)_$(Date :yyyyMMdd)$(Rev :.r). Pour plus d’informations sur l’affectation de noms aux exécutions de pipeline , consultez cette page.
allowedBuilder := "AzureDevOps_pipeline-foo"
checkBuilder[errors] {
trace("Check if images are built by Azure Pipelines")
resourceUri := values[index].build.resourceUri
image := fetchImage(resourceUri)
builder := values[index].build.build.provenance.builderVersion
trace(sprintf("%s: builder", [builder]))
not startswith(builder, "allowedBuilder")
errors := sprintf("%s: image not built by Azure Pipeline [%s]", [image,builder])
}
fetchRegistry(uri) = reg {
out := regex.find_n("//.*/", uri, 1)
reg = trim(out[0], "/")
}
fetchImage(uri) = img {
out := regex.find_n("/.*@", uri, 1)
img := trim(out[0], "/@")
}
Vérifier les registres autorisés
Cette stratégie vérifie si les images proviennent uniquement des registres autorisés.
allowlist = {
"gcr.io/myrepo",
"raireg1.azurecr.io"
}
checkregistries[errors] {
trace(sprintf("Allowed registries: %s", [concat(", ", allowlist)]))
resourceUri := values[index].image.resourceUri
registry := fetchRegistry(resourceUri)
image := fetchImage(resourceUri)
not allowlist[registry]
errors := sprintf("%s: source registry not permitted", [image])
}
fetchRegistry(uri) = reg {
out := regex.find_n("//.*/", uri, 1)
reg = trim(out[0], "/")
}
fetchImage(uri) = img {
out := regex.find_n("/.*@", uri, 1)
img := trim(out[0], "/@")
}
Vérifier les ports interdits
Cette stratégie vérifie les ports interdits exposés dans l’image de conteneur.
forbiddenPorts = {
"80",
"22"
}
checkExposedPorts[errors] {
trace(sprintf("Checking for forbidden exposed ports: %s", [concat(", ", forbiddenPorts)]))
layerInfos := values[index].image.image.layerInfo
layerInfos[x].directive == "EXPOSE"
resourceUri := values[index].image.resourceUri
image := fetchImage(resourceUri)
ports := layerInfos[x].arguments
trace(sprintf("exposed ports: %s", [ports]))
forbiddenPorts[ports]
errors := sprintf("%s: image exposes forbidden port %s", [image,ports])
}
fetchRegistry(uri) = reg {
out := regex.find_n("//.*/", uri, 1)
reg = trim(out[0], "/")
}
fetchImage(uri) = img {
out := regex.find_n("/.*@", uri, 1)
img := trim(out[0], "/@")
}
Vérifier les déploiements antérieurs
Cette stratégie vérifie si l’image a été pré-déployée sur un/plusieurs environnements avant d’être déployée sur un environnement/ressources spécifique avec Check configuré.
predeployedEnvironments = {
"env/resource1",
"env2/resource3"
}
checkDeployedEnvironments[errors] {
trace(sprintf("Checking if the image has been pre-deployed to one of: [%s]", [concat(", ", predeployedEnvironments)]))
deployments := values[index].deployment
deployedAddress := deployments[i].deployment.address
trace(sprintf("deployed to : %s",[deployedAddress]))
resourceUri := deployments[i].resourceUri
image := fetchImage(resourceUri)
not predeployedEnvironments[deployedAddress]
trace(sprintf("%s: fails pre-deployed environment condition. found %s", [image,deployedAddress]))
errors := sprintf("image %s fails pre-deployed environment condition. found %s", [image,deployedAddress])
}
fetchRegistry(uri) = reg {
out := regex.find_n("//.*/", uri, 1)
reg = trim(out[0], "/")
}
fetchImage(uri) = img {
out := regex.find_n("/.*@", uri, 1)
img := trim(out[0], "/@")
}