

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 连接 Azure 资源
<a name="connecting-azure-connecting-azure-resources"></a>

Azure 资源集成使 AWS DevOps 代理能够在事件调查期间发现和调查 Azure 订阅中的资源。代理使用 Azure 资源图进行资源发现，并且可以访问 Azure 环境中的指标、日志和配置数据。

此集成遵循两个步骤的过程：在 AWS 帐户级别注册 Azure，然后将特定的 Azure 订阅与各个代理空间相关联。

## 先决条件
<a name="prerequisites"></a>

在连接 Azure 资源之前，请确保你有：
+ 访问 AWS DevOps 代理控制台
+ 有权访问目标订阅的 Azure 帐户
+ 对于管理员同意方法：有权在 Microsoft Entra ID 中进行管理员同意的帐户
+ 对于应用程序注册方法：具有配置联合身份凭证权限的 Entra 应用程序，并在您的 AWS 账户中启用了[出站联合身份验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-federation.html)

**注意：**您也可以从代理空间内开始注册。导航到**辅助源**，单击 “**添加**”，然后选择 **Azure**。如果 Azure Cloud 尚未注册，则控制台会引导你先完成注册。

## 通过管理员同意注册 Azure 资源
<a name="registering-azure-resources-via-admin-consent"></a>

管理员同意方法在 AWS DevOps 代理托管的应用程序中使用基于同意的流程。

### 第 1 步：开始注册
<a name="step-1-start-the-registration"></a>

1. 登录 AWS 管理控制台并导航到 AWS DevOps 代理控制台

1. 转到**能力提供者**页面

1. 找到 “A **zure 云**” 部分，然后单击 “**注册**”

1. 选择**管理员同意**注册方法

### 第 2 步：完成管理员同意
<a name="step-2-complete-admin-consent"></a>

1. 查看正在申请的权限

1. 点击继续 — 您将被重定向到 Microsoft Entra 管理员同意页面

1. 使用有权执行管理员同意的用户主账号登录

1. 审查 AWS DevOps 代理申请并授予同意

### 步骤 3：完成用户授权
<a name="step-3-complete-user-authorization"></a>

1. 管理员同意后，系统会提示您进行用户授权，以验证您作为授权租户成员的身份

1. 使用属于同一 Azure 租户的帐户登录

1. 授权后，您将重定向回 AWS DevOps 代理控制台，状态为成功

### 步骤 4：分配角色
<a name="step-4-assign-roles"></a>

请参阅下面的[分配 Azure 角色](#assigning-azure-roles)。选择成员时搜索**AWS DevOps 代理**。

## 通过应用程序注册注册 Azure 资源
<a name="registering-azure-resources-via-app-registration"></a>

应用程序注册方法使用您自己的 Entra 应用程序和联合身份凭证。

### 第 1 步：开始注册
<a name="step-1-start-the-registration"></a>

1. 在 AWS DevOps 代理控制台中，转到**功能提供者**页面

1. 找到 “A **zure 云**” 部分，然后单击 “**注册**”

1. 选择**应用程序注册**方法

### 第 2 步：创建和配置您的 Entra 应用程序
<a name="step-2-create-and-configure-your-entra-application"></a>

按照控制台中显示的说明执行以下操作：

1. 在您的 AWS 账户中启用出站身份联合（在 IAM 控制台中，前往**账户设置** → **出站联合身份验证**）

1. 在你的 Microsoft Entra ID 中创建 Entra 应用程序，或者使用现有的 Entra 应用程序

1. 在应用程序上配置联合身份凭证

### 第 3 步：提供注册详情
<a name="step-3-provide-registration-details"></a>

在注册表中填写以下内容：
+ **租户 ID** — 你的 Azure 租户标识符
+ **租户名称**-租户的显示名称
+ **客户端 ID** — 您创建的 Entra 应用程序的应用程序（客户端）ID
+ **受众**-联邦凭证的受众标识符

### 步骤 4：创建 IAM 角色
<a name="step-4-create-the-iam-role"></a>

当您通过控制台提交注册时，将自动创建 IAM 角色。它允许 AWS DevOps 代理使用凭据并调用`sts:GetWebIdentityToken`。

### 步骤 5：分配角色
<a name="step-5-assign-roles"></a>

请参阅下面的[分配 Azure 角色](#assigning-azure-roles)。搜索您在选择成员时创建的 Entra 应用程序。

### 第 6 步：完成注册
<a name="step-6-complete-the-registration"></a>

1. 在 AWS DevOps 代理控制台中确认配置

1. 单击 “**提交**” 完成注册

## 分配 Azure 角色
<a name="assigning-azure-roles"></a>

注册后，授予应用程序对你的 Azure 订阅的读取权限。管理员同意和应用程序注册方法的此步骤相同。

1. 在 Azure 门户中，导航到你的目标订阅

1. 前往**访问控制 (IAM)**

1. 单击 “**添加**” > “**添加角色分配”**

1. 选择**读**者角色并单击 “**下一步**”

1. 单击 “**选择成员”**，搜索应用程序（要么是获得管理员同意的**AWS DevOps 代理**，要么是您自己的 Entra 应用程序进行应用程序注册）

1. 选择应用程序，然后单击 “**查看 \$1 分配**”

1. （可选）要使代理能够访问 Azure Kubernetes 服务 (AKS) 集群，请完成以下 AKS 访问权限设置。

**安全要求：**只能为服务主体分配**读者**角色（以及下面列出的 AKS 只读角色）。Reader 角色充当安全边界，将代理限制为只读操作，并限制间接提示注入攻击的影响。为角色分配写入或操作权限会大大增加提示注入的爆炸半径，并可能导致 Azure 资源受到损害。 AWS DevOps 代理仅执行读取操作。代理不会修改、创建或删除 Azure 资源。

### AKS 访问设置（可选）
<a name="aks-access-setup-optional"></a>

#### 步骤 1：Azure 资源管理器 (ARM) 级别访问权限
<a name="step-1-azure-resource-manager-arm-level-access"></a>

为应用程序分配 **Azure Kubernetes 服务集群用户角色**。

在 Azure 门户中，前往 “**订阅**” → “选择订阅” → “**访问控制 (IAM)**” → “**添加角色分配**” → 选择 **Azure Kubernetes 服务集群用户角色** → 分配给应用程序（要么是获得管理员同意的**AWS DevOps 代理**，要么是你自己的 Entra 应用程序进行应用程序注册）。

这涵盖了订阅中的所有 AKS 集群。要将范围限定到特定群集，请改为在资源组或单个群集级别进行分配。

#### 第 2 步：访问 Kubernetes API
<a name="step-2-kubernetes-api-access"></a>

根据集群的身份验证配置选择一个选项：

**选项 A：适用于 Kubernetes 的 Azure 基于角色的访问控制 (RBAC)（推荐）**

1. **如果尚未启用，请在集群上启用 Azure RBAC：Azure 门户 → AKS 集群 → **设置** → **安全配置** → **身份验证和授权** → 选择 Azure RBAC**

1. 分配只读角色：Azure 门户 → **订阅** → 选择订阅 → **访问控制 (IAM)** → **添加角色分配** → 选择 **Azure Kubernetes 服务 RBAC 阅读器** → 分配给应用程序

这涵盖了订阅中的所有 AKS 集群。

**选项 B：Azure 活动目录 (Azure AD) \$1 Kubernetes RBAC**

如果你的集群已经使用默认的 Azure AD 身份验证配置，并且你不想启用 Azure RBAC，则使用此选项。这需要按集群进行`kubectl`设置。

1. 将以下清单另存为`devops-agent-reader.yaml`：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: devops-agent-reader
rules:
  - apiGroups: [""]
    resources: ["namespaces", "pods", "pods/log", "services", "events", "nodes"]
    verbs: ["get", "list"]
  - apiGroups: ["apps"]
    resources: ["deployments", "replicasets", "statefulsets", "daemonsets"]
    verbs: ["get", "list"]
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods", "nodes"]
    verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: devops-agent-reader-binding
subjects:
  - kind: User
    name: "<SERVICE_PRINCIPAL_OBJECT_ID>"
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: devops-agent-reader
  apiGroup: rbac.authorization.k8s.io
```

1. `<SERVICE_PRINCIPAL_OBJECT_ID>`替换为服务主体的对象 ID。要找到它，请执行以下操作：Azure Portal → Entra ID → 企业应用程序 → 搜索应用程序名称（要么是获得管理员同意的**AWS DevOps 代理**，要么是你自己的 Entra 应用程序进行应用程序注册）。

1. 适用于每个集群：

```
az aks get-credentials --resource-group <rg> --name <cluster-name>
kubectl apply -f devops-agent-reader.yaml
```

**注意：**不支持仅使用本地帐户（不使用 Azure AD）的集群。我们建议在集群上启用 Azure AD 集成以使用此功能。

### 权限最低的自定义角色（可选）
<a name="least-privileged-custom-role-optional"></a>

为了实现更严格的访问控制，你可以创建一个自定义 Azure 角色，该角色的范围仅限于 A AWS DevOps gent 使用的资源提供者，而不是广泛的读者角色：

```
{
  "Name": "AWS DevOps Agent - Azure Reader",
  "Description": "Least-privilege read-only access for AWS DevOps Agent incident investigations.",
  "Actions": [
    "Microsoft.AlertsManagement/*/read",
    "Microsoft.Compute/*/read",
    "Microsoft.ContainerRegistry/*/read",
    "Microsoft.ContainerService/*/read",
    "Microsoft.ContainerService/managedClusters/commandResults/read",
    "Microsoft.DocumentDB/*/read",
    "Microsoft.Insights/*/read",
    "Microsoft.KeyVault/vaults/read",
    "Microsoft.ManagedIdentity/*/read",
    "Microsoft.Monitor/*/read",
    "Microsoft.Network/*/read",
    "Microsoft.OperationalInsights/*/read",
    "Microsoft.ResourceGraph/resources/read",
    "Microsoft.ResourceHealth/*/read",
    "Microsoft.Resources/*/read",
    "Microsoft.Sql/*/read",
    "Microsoft.Storage/*/read",
    "Microsoft.Web/*/read"
  ],
  "NotActions": [],
  "DataActions": [],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/{your-subscription-id}"
  ]
}
```

## 将订阅与代理空间关联
<a name="associating-a-subscription-with-an-agent-space"></a>

在帐户级别注册 Azure 后，将特定订阅与您的代理空间相关联：

1. 在 AWS DevOps 代理控制台中，选择您的代理空间

1. 前往 “**功能**” 选项卡

1. 在 “**次要来源**” 部分中，单击 “**添加**”

1. 选择 **Azure**

1. 为要关联的 Azure 订阅提供订阅 **ID**

1. 单击 “**添加**” 完成关联

你可以将多个订阅与同一个代理空间相关联，让代理在你的 Azure 环境中可见。

## 管理 Azure 资源连接
<a name="managing-azure-resources-connections"></a>
+ **查看已连接的订阅**-在 “**功能**” 选项卡中，“**次要来源**” 部分列出了所有连接的 Azure 订阅。
+ **删除订阅**-要断开订阅与代理空间的连接，请在 “**辅助来源**” 列表中选择该订阅并单击 “**删除**”。这不会影响账户级别的注册。
+ **移除注册**-要完全删除 Azure Cloud 注册，请转到**功能提供者**页面并删除注册。必须先移除所有代理空间关联。