Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure DevOps Services
Beleid voor artefacten wordt afgedwongen voordat het wordt geïmplementeerd in kritieke omgevingen zoals de productieomgeving. 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 voor de evaluatie van artefacten, moet het aangepaste beleid worden geconfigureerd. In deze handleiding wordt beschreven hoe aangepaste beleidsregels kunnen worden gemaakt.
Opmerking
Momenteel zijn de ondersteunde artefacttypen containerafbeeldingen en Kubernetes-omgevingen.
Vereiste voorwaarden
Gebruik Rego voor het definiëren van beleid dat gemakkelijk te lezen en te schrijven is.
Raak vertrouwd met de Rego-querytaal . De basis is genoeg.
Rego breidt Datalog uit om gestructureerde documentmodellen zoals JSON te ondersteunen. Rego-query's zijn beweringen over gegevens die zijn opgeslagen in OPA. Deze query's kunnen worden gebruikt om beleidsregels te definiëren waarmee exemplaren van gegevens worden opgesomd die de verwachte status van het systeem schenden.
Aangepast beleid maken
Hieronder ziet u de voorbeeldbeleidsregels die worden gedeeld. Op basis van uw vereisten kunt u uw eigen set beleidsregels bouwen.
Het specifieke project/pijplijn controleren
Met dit beleid wordt gecontroleerd of de images zijn gebouwd door Azure Pipelines en Pipeline-foo. Dit werkt alleen als de pijplijndefinitie het naamveld overschrijft in iets als: AzureDevOps_$(BuildDefinitionName)_$(Date:yyyyMMMDD)$(Rev:.r). Hier vindt u meer informatie over het benoemen van pijplijnuitvoeringen .
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
Dit beleid controleert of de images alleen van toegestane registries komen.
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], "/@")
}
Verboode poorten checken
Dit beleid controleert op verboden poorten die blootgesteld zijn in de containerafbeelding.
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 naar specifieke omgevingen/resources waarvoor Controle is 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], "/@")
}