Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Serviços de DevOps do Azure
As políticas de artefatos são aplicadas antes da implementação em ambientes críticos, como o ambiente de produção. Essas políticas são avaliadas em relação a todos os artefatos a implementar num dado ciclo de execução do pipeline e bloqueiam a implantação se os artefatos não cumprirem os requisitos. Adicionar uma verificação para avaliar o Artefato requer que a política personalizada seja configurada. Este guia descreve como políticas personalizadas podem ser criadas.
Observação
Atualmente, os tipos de artefato suportados são para imagens de contêiner e ambientes Kubernetes
Pré-requisitos
Use o Rego para definir políticas fáceis de ler e escrever.
Familiarize-se com a linguagem de consulta Rego . O básico serve.
Para suportar modelos de documentos estruturados como o JSON, a Rego estende o Datalog. As consultas Rego são afirmações sobre dados armazenados em OPA. Essas consultas podem ser usadas para definir políticas que enumeram instâncias de dados que violam o estado esperado do sistema.
Criação de políticas personalizadas
Abaixo estão os exemplos de políticas compartilhadas. Com base em suas necessidades, você pode criar seu próprio conjunto de políticas.
Verificar projeto/pipeline específico
Esta política verifica se as imagens são criadas pelo Azure Pipelines e pelo Pipeline-foo. Para que isso funcione, a definição de pipeline deve substituir o campo de nome para algo como: AzureDevOps_$(BuildDefinitionName)_$(Date:yyyyMMdd)$(Rev:.r). Veja mais sobre como nomear runs de pipeline aqui.
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], "/@")
}
Verificar os registros permitidos
Esta política verifica se as imagens são provenientes apenas de registos permitidos.
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], "/@")
}
Verificar portas proibidas
Esta política verifica se há portas proibidas expostas na imagem do contêiner.
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], "/@")
}
Verificar implantações anteriores
Esta política verifica se a imagem foi pré-distribuída em um ou mais ambientes antes de ser implantada em um ambiente ou recurso específico com a Verificação configurada.
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], "/@")
}