Megosztás a következőn keresztül:


Összetevő-szabályzatok ellenőrzése

Azure DevOps Services

Az összetevő-szabályzatok kényszerítve lesznek, mielőtt kritikus környezetekben, például éles környezetben üzembe helyeznénk. Ezeket a szabályzatokat a rendszer kiértékeli az adott folyamatfuttatás összes üzembe helyezhető összetevője alapján, és letiltja az üzembe helyezést, ha az összetevők nem felelnek meg. Az Összetevő kiértékeléséhez az ellenőrzés hozzáadásához konfigurálnia kell az egyéni szabályzatot. Ez az útmutató az egyéni szabályzatok létrehozásának módját ismerteti.

Megjegyzés

Jelenleg a támogatott összetevőtípusok tárolólemezképekhez és Kubernetes-környezetekhez tartoznak

Előfeltételek

A Rego használatával könnyen olvasható és írható szabályzatokat definiálhat.

Ismerkedjen meg a Rego lekérdezési nyelvével. Az alapismeretek igen.

A JSON-hoz hasonló strukturált dokumentummodellek támogatásához a Rego kibővíti a Datalogot. A rego lekérdezések az OPA-ban tárolt adatokra vonatkozó helyességi feltételek. Ezek a lekérdezések olyan szabályzatok meghatározására használhatók, amelyek a rendszer várt állapotát sértő adatpéldányokat sorolnak fel.

Egyéni szabályzatok létrehozása

Az alábbiakban a mintaszabályzatok vannak megosztva. A követelmények alapján létrehozhatja saját szabályzatkészletét.

Adott projekt/folyamat ellenőrzése

Ez a szabályzat ellenőrzi, hogy a rendszerképeket az Azure Pipelines és a Pipeline-foo készítette-e. Ahhoz, hogy ez működjön, a folyamat definíciójának felül kell bírálnia a névmezőt a következőhöz hasonlóra: AzureDevOps_$(BuildDefinitionName)_$(Date:yyyyyMMdd)$(Rev:.r). A folyamatfuttatások elnevezéséről itt talál további információt.

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

Az engedélyezett regisztrációs adatbázisok ellenőrzése

Ez a szabályzat ellenőrzi, hogy a rendszerképek csak engedélyezett beállításjegyzékekből származnak-e.

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

Tiltott portok ellenőrzése

Ez a szabályzat ellenőrzi a tárolólemezképben közzétett tiltott portokat.

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

Korábbi üzemelő példányok ellenőrzése

Ez a szabályzat ellenőrzi, hogy a rendszerképet előre telepítették-e egy vagy több környezetbe, mielőtt az adott környezetbe/erőforrásokba lett-e üzembe helyezve az Ellenőrzés konfigurálva beállítással.

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