Yapıt ilkesi denetimleri

Azure DevOps Services

Yapıt ilkeleri üretim gibi kritik ortamlara dağıtılamadan önce uygulanır. Bu ilkeler, belirtilen işlem hattı çalıştırmasında dağıtılabilir tüm yapıtlar için değerlendirilir ve yapıtlar uygun değilse dağıtımı engeller. Yapıtı değerlendirmek için bir denetim eklemek için özel ilkenin yapılandırılması gerekir. Bu kılavuzda özel ilkelerin nasıl oluşturulabileceği açıklanmaktadır.

Not

Şu anda desteklenen yapıt türleri kapsayıcı görüntüleri ve Kubernetes ortamları içindir

Önkoşullar

Okuması ve yazması kolay ilke tanımlamak için Rego kullanın.

Rego sorgu dilini tanıyın. Temel bilgiler bunu yapar.

JSON gibi yapılandırılmış belge modellerini desteklemek için Rego, Datalog'u genişletir. Rego sorguları, OPA'da depolanan verilerde yapılan onaylardır. Bu sorgular, sistemin beklenen durumunu ihlal eden veri örneklerini listeleyen ilkeleri tanımlamak için kullanılabilir.

Özel ilkeler oluşturma

Aşağıda paylaşılan örnek ilkeler verilmiştır. Gereksinimlerinize bağlı olarak, kendi ilke kümenizi oluşturabilirsiniz.

Belirli bir projeyi/işlem hattını denetleme

Bu ilke, görüntülerin Azure Pipelines ve Pipeline-foo tarafından derlenip derlenmediğini denetler. Bunun çalışması için işlem hattı tanımının ad alanını şu şekilde geçersiz kılması gerekir: AzureDevOps_$(BuildDefinitionName)_$(Date:yyyyMMdd)$(Rev:.r). İşlem hattı çalıştırmalarını adlandırma hakkında daha fazla bilgi için buraya bakın.

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

İzin verilen kayıt defterlerini denetleme

Bu ilke, görüntülerin yalnızca izin verilen kayıt defterlerinden olup olmadığını denetler.

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

Yasak bağlantı noktalarını denetleme

Bu ilke, kapsayıcı görüntüsünde kullanıma sunulan yasak bağlantı noktalarını denetler.

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

Önceki dağıtımları denetleme

Bu ilke, Denetimin yapılandırıldığı belirli ortamlara/kaynaklara dağıtılmadan önce görüntünün bir/daha fazla ortama önceden dağıtılıp dağıtılmadığını denetler.

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