Delen via


Beleidscontroles voor artefacten

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], "/@")
}