8.2 KiB
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}}
参考
- https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli
- https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager
{{#include ../../../banners/hacktricks-training.md}}
