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