Files
hacktricks-cloud/src/pentesting-cloud/azure-security/az-services/az-container-registry.md

8.2 KiB
Raw Blame History

Az - Container Registry

{{#include ../../../banners/hacktricks-training.md}}

基本信息

Azure Container Registry (ACR) 是一个安全的私有注册表,允许您 在 Azure 云中存储、管理和访问容器镜像。它与多个 Azure 服务无缝集成提供大规模的自动构建和部署工作流。通过地理复制和漏洞扫描等功能ACR 有助于确保容器化应用程序的企业级安全性和合规性。

权限

这些是 不同的权限 根据文档 可以授予容器注册表的权限:

  • 访问资源管理器
  • 创建/删除注册表
  • 推送镜像
  • 拉取镜像
  • 删除镜像数据
  • 更改策略
  • 签名镜像

还有一些 内置角色 可以分配,也可以创建 自定义角色

身份验证

Warning

即使注册表名称包含一些大写字母,您也应该始终使用 小写字母 登录、推送和拉取镜像,这一点非常重要。

有 4 种方法可以对 ACR 进行身份验证:

  • 使用 Entra ID:这是对 ACR 进行身份验证的 默认 方法。它使用 az acr login 命令对 ACR 进行身份验证。此命令将 凭据存储~/.docker/config.json 文件中。此外,如果您在没有访问 docker 套接字的环境中运行此命令,例如在 云终端 中,可以使用 --expose-token 标志获取 令牌 以对 ACR 进行身份验证。然后,您需要使用用户名 00000000-0000-0000-0000-000000000000 进行身份验证,例如:docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN
  • 使用管理员帐户:管理员用户默认情况下是禁用的,但可以启用,然后可以使用管理员帐户的 用户名密码 访问注册表,具有对注册表的完全权限。这仍然被支持,因为一些 Azure 服务使用它。请注意,为此用户创建了 2 个密码,并且两个都是有效的。您可以使用 az acr update -n <acrName> --admin-enabled true 启用它。请注意,用户名通常是注册表名称(而不是 admin)。
  • 使用令牌:可以创建一个具有 特定 scope map(权限)的 令牌 来访问注册表。然后,可以使用令牌的名称作为用户名,使用生成的任何密码对注册表进行身份验证,命令为 docker login -u <registry-name> -p <password> <registry-url>
  • 使用服务主体:可以创建一个 服务主体 并分配一个角色,如 AcrPull 以拉取镜像。然后,可以使用 SP appId 作为用户名和生成的密钥作为密码 登录到注册表

来自 文档 的示例脚本,用于生成具有注册表访问权限的 SP

#!/bin/bash
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)

PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

加密

只有 Premium SKU 支持 静态加密 图像和其他工件。

网络

只有 Premium SKU 支持 私有端点。其他 SKU 仅支持 公共访问。公共端点的格式为 <registry-name>.azurecr.io,而私有端点的格式为 <registry-name>.privatelink.azurecr.io。因此,注册表的名称在所有 Azure 中必须是唯一的。

Microsoft Defender for Cloud

这允许您 扫描注册表中的图像 以查找 漏洞

软删除

软删除 功能允许您在指定天数内 恢复已删除的注册表。此功能 默认情况下是禁用的

Webhooks

可以在注册表中 创建 Webhooks。在此 Webhook 中,需要指定一个 URL以便在执行 推送或删除操作时发送请求。此外Webhooks 可以指示一个范围,以指示将受到影响的存储库(图像)。例如,'foo:*' 表示存储库 'foo' 下的事件。

从攻击者的角度来看,在注册表中 执行任何操作之前 检查这一点是很有趣的,并在需要时暂时删除它,以避免被检测到。

连接的注册表

这基本上允许 将图像镜像 从一个注册表到另一个注册表,通常位于本地。

它有 2 种模式:只读读写。在第一种模式中,图像仅从源注册表 拉取,而在第二种模式中,图像也可以 推送 到源注册表。

为了让客户端从 Azure 访问注册表,当使用连接的注册表时,会生成一个 令牌

运行与任务

运行与任务允许在 Azure 中执行与容器相关的操作,这些操作通常需要在本地或 CI/CD 管道中完成。例如,您可以 构建、推送和运行注册表中的图像

构建和运行容器的最简单方法是使用常规运行:

# Build
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile .

# Run
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null

然而,这将触发从攻击者的角度来看并不太有趣的运行,因为它们没有附加任何托管身份。

然而,任务可以附加系统和用户托管身份。这些任务是用于提升权限的。在权限提升部分,可以看到如何使用任务来提升权限。

缓存

缓存功能允许从外部存储库下载镜像并将新版本存储在注册表中。它需要通过从 Azure Vault 选择凭据来配置一些凭据

从攻击者的角度来看,这非常有趣,因为它允许转向外部平台,如果攻击者有足够的权限访问凭据,从外部存储库下载镜像并配置缓存也可以用作持久性机制

枚举

Warning

即使注册表名称包含一些大写字母,您也应该仅在访问它的 URL 中使用小写字母,这一点非常重要。

# List of all the registries
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
az acr list

# Get the details of a registry
az acr show --name <registry-name>

# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>

# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>

# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-group>

# List deleted repository tags
## At the time of this writing there isn't yet any command to restore it
az acr repository list-deleted --name <registry-name>

# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>

# List tasks runs
az acr task list-runs --registry <registry-name>

# List connected registries
az acr connected-registry list --registry <registry-name>

# List cache
az acr cache list --registry <registry-name>

# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>

未经身份验证的访问

{{#ref}} ../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md {{#endref}}

权限提升与后期利用

{{#ref}} ../az-privilege-escalation/az-container-registry-privesc.md {{#endref}}

参考

{{#include ../../../banners/hacktricks-training.md}}