Beleidscontroles voor artefacten
Azure DevOps Services
Artefactbeleid wordt afgedwongen voordat u implementeert in kritieke omgevingen, zoals productie. Deze beleidsregels worden geëvalueerd op basis van alle implementeerbare artefacten in de opgegeven pijplijnuitvoering en blokkeren de implementatie als de artefacten niet voldoen. Als u een controle toevoegt om artefact te evalueren, moet het aangepaste beleid worden geconfigureerd. In deze handleiding wordt beschreven hoe aangepaste beleidsregels kunnen worden gemaakt.
Notitie
Momenteel zijn de ondersteunde artefacttypen voor containerinstallatiekopieën en Kubernetes-omgevingen
Vereisten
Gebruik Rego voor het definiëren van beleid dat eenvoudig te lezen en te schrijven is.
Maak uzelf vertrouwd met de Rego-querytaal . Basisbeginselen zijn mogelijk.
Rego breidt Datalog uit om gestructureerde documentmodellen zoals JSON te ondersteunen. Rego-query's zijn asserties over gegevens die zijn opgeslagen in OPA. Deze query's kunnen worden gebruikt om beleid te definiëren dat exemplaren van gegevens opsommen die de verwachte status van het systeem schenden.
Aangepast beleid maken
Hieronder ziet u de gedeelde voorbeeldbeleidsregels. Op basis van uw vereisten kunt u uw eigen set beleidsregels maken.
Specifiek project/specifieke pijplijn controleren
Met dit beleid wordt gecontroleerd of de installatiekopieën worden gebouwd door Azure Pipelines en Pipeline-foo. Dit werkt alleen als de pijplijndefinitie het naamveld overschrijft naar iets als: AzureDevOps_$(BuildDefinitionName)_$(Date:yyyyMMMMdd)$(Rev:.r). Meer informatie over het benoemen van pijplijnuitvoeringen vindt u hier.
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], "/@")
}
Toegestane registers controleren
Met dit beleid wordt gecontroleerd of de installatiekopieën alleen afkomstig zijn uit toegestane registers.
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], "/@")
}
Verboden poorten controleren
Met dit beleid wordt gecontroleerd op verboden poorten die beschikbaar zijn in de containerinstallatiekopieën.
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], "/@")
}
Eerdere implementaties controleren
Met dit beleid wordt gecontroleerd of de installatiekopie vooraf is geïmplementeerd in een/meer van de omgevingen voordat deze wordt geïmplementeerd in specifieke omgevingen/resources met Controle geconfigureerd.
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], "/@")
}