

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 配置 Argo CD 权限
<a name="argocd-permissions"></a>

Argo CD 托管功能与 Amazon Identity Center 集成以进行身份验证，并使用内置的 RBAC 角色进行授权。本主题将介绍如何为用户和团队配置权限。

## Argo CD 权限的工作原理
<a name="_how_permissions_work_with_argo_cd"></a>

Argo CD 功能通过 Amazon 进行身份验证，并提供三个内置的 RBAC 角色进行授权。

当用户访问 Argo CD 时：

1. 他们使用 Amazon Identity Center（可以与企业身份提供者联合）进行身份验证

1.  Amazon Identity Center 向 Argo CD 提供用户和组信息

1. Argo CD 会根据配置将用户和组映射到 RBAC 角色

1. 用户只能看到他们有权访问的应用程序和资源

## 内置 RBAC 角色
<a name="_built_in_rbac_roles"></a>

Argo CD 功能提供三个内置角色，您需要将其映射到 Amazon Identity Center 的用户和组。这些角色是**全局范围的角色**，用于控制对项目、集群和存储库等 Argo CD 资源的访问权限。

**重要**  
全局角色控制对 Argo CD 本身的访问权限，而非对应用程序这类项目范围内的资源的访问权限。默认情况下，EDITOR 和 VIEWER 用户无法查看或管理应用程序，他们需要项目角色才能访问项目范围内的资源。有关授予对应用程序和其他项目范围内资源的访问权限的详细信息，请参阅 [项目角色和项目范围内的访问权限](#project-roles)。

 **ADMIN** 

对所有 Argo CD 资源和设置的完全访问权限：
+ 创建、更新和删除任何项目中的应用程序和 ApplicationSets
+ 管理 Argo CD 配置
+ 注册和管理部署目标集群
+ 配置存储库访问权限
+ 创建和管理项目
+ 查看所有应用程序状态和历史记录
+ 列出并访问所有集群和存储库

 **EDITOR** 

可以更新项目和配置项目角色，但无法更改全局的 Argo CD 设置：
+ 更新现有项目（无法创建或删除项目）
+ 配置项目角色和权限
+ 查看 GPG 密钥和证书
+ 无法更改全局的 Argo CD 配置
+ 无法直接管理集群或存储库
+ 若没有项目角色，则无法查看或管理应用程序

 **VIEWER** 

对 Argo CD 资源的只读访问权限：
+ 查看项目配置
+ 列出所有项目（包括该用户未被分配到的项目）
+ 查看 GPG 密钥和证书
+ 无法列出集群或存储库
+ 无法进行任何更改
+ 若没有项目角色，则无法查看或管理应用程序

**注意**  
要授予 EDITOR 或 VIEWER 用户访问应用程序的权限，ADMIN 或 EDITOR 必须创建项目角色，将 Identity Center 组映射到项目中的特定权限。

## 项目角色和项目范围内的访问权限
<a name="project-roles"></a>

全局角色（ADMIN、EDITOR、VIEWER）将控制对 Argo CD 本身的访问。项目角色控制对特定项目内的资源和功能的访问权限，包括：
+  **资源**：应用程序、ApplicationSets、存储库凭证、集群凭证
+  **功能**：日志访问、对应用程序容器组（pod）的 exec 访问权限

 **了解两级权限模型**：
+  **全局范围**：内置角色决定了用户能够对项目、集群、存储库以及 Argo CD 设置进行何种操作
+  **项目范围**：项目角色决定了用户能够对特定项目中的资源和功能进行何种操作

这意味着：
+ ADMIN 用户无需额外配置即可访问所有的项目资源和功能
+ 必须向 EDITOR 和 VIEWER 用户授予项目角色，才能访问项目资源和功能
+ EDITOR 用户可以创建项目角色，以便在他们能够更新的项目中为自己及他人授予访问权限

 **工作流示例**：

1. ADMIN 将 Identity Center 组全局映射到 EDITOR 角色

1. ADMIN 为团队创建项目

1. EDITOR 在该项目中配置项目角色，以授予团队成员访问项目范围内资源的权限

1. 团队成员（可能拥有 VIEWER 全局角色）现在可以根据其项目角色权限查看并管理该项目中的应用程序

有关配置项目角色的详细信息，请参阅 [基于项目的访问控制](#_project_based_access_control)。

## 配置角色映射
<a name="_configure_role_mappings"></a>

创建或更新功能时，将 Amazon Identity Center 用户和组映射到 Argo CD 角色。

 **示例角色映射**：

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["AdminGroup", "alice@example.com"],
    "EDITOR": ["DeveloperGroup", "DevOpsTeam"],
    "VIEWER": ["ReadOnlyGroup", "bob@example.com"]
  }
}
```

**注意**  
角色名称区分大小写，必须为大写（ADMIN、EDITOR、VIEWER）。

**重要**  
EKS 功能与 Amazon Identity Center 集成后，每个 Argo CD 功能可支持最多 1000 个身份。身份可以是用户或组。

 **更新角色映射**：

```
aws eks update-capability \
  --region us-east-1 \
  --cluster-name cluster \
  --capability-name capname \
  --endpoint "https://eks.ap-northeast-2.amazonaws.com" \
  --role-arn "arn:aws:iam::[.replaceable]111122223333:role/[.replaceable]`EKSCapabilityRole`" \
  --configuration '{
    "argoCd": {
      "rbacRoleMappings": {
        "addOrUpdateRoleMappings": [
          {
            "role": "ADMIN",
            "identities": [
              { "id": "686103e0-f051-7068-b225-e6392b959d9e", "type": "SSO_USER" }
            ]
          }
        ]
      }
    }
  }'
```

## 使用管理员账户
<a name="_admin_account_usage"></a>

管理员账户专为初始设置和管理任务（例如注册集群和配置存储库）而设计。

 **何时适合使用管理员账户**：
+ 初始功能设置和配置
+ 单人开发或快速演示
+ 管理任务（注册集群、配置存储库、创建项目）

 **管理员账户最佳实践**：
+ 请勿将账户令牌提交给版本控制
+ 如果令牌暴露，则立即轮换
+ 将账户令牌的使用限制在设置和管理任务
+ 设置较短的过期时间（最长 12 小时）
+ 在任何给定时间只能创建 5 个账户令牌

 **何时改用基于项目的访问**：
+ 与多个用户共享的开发环境
+ 任何与生产环境相似的环境
+ 需要有关操作执行者的审计跟踪记录时
+ 需要强制实施资源限制或访问边界时

对于生产环境和多用户场景，请使用基于项目的访问控制，并将专用 RBAC 角色映射到 Amazon Identity Center 组。

## 基于项目的访问控制
<a name="_project_based_access_control"></a>

使用 Argo CD 项目（AppProject）为团队提供精细的访问控制和资源隔离。

**重要**  
在为用户或用户组分配项目特定角色之前，您必须首先在功能配置中将他们映射到全局的 Argo CD 角色（ADMIN、EDITOR 或 VIEWER）。如果没有全局角色映射，用户将无法访问 Argo CD，即使他们被分配了项目角色也是如此。  
考虑将用户全局映射到 VIEWER 角色，然后通过特定于项目的角色授予其他权限。这既提供了基础的访问权限，又能在项目层面实现精细的控制。

项目提供以下功能：
+  **源限制**：限制可以使用哪些 Git 存储库
+  **目标限制**：限制可以指向哪些集群和命名空间
+  **资源限制**：限制可以部署哪些 Kubernetes 资源类型
+  **RBAC 集成**：将项目映射到 Amazon Identity Center 组或 Argo CD 角色

 **团队隔离示例项目**：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: Team A applications

  # Required: Specify which namespaces this project watches for Applications
  sourceNamespaces:
  - argocd

  # Source restrictions
  sourceRepos:
  - https://github.com/myorg/team-a-apps

  # Destination restrictions
  destinations:
  - namespace: team-a-*
    server: arn:aws:eks:us-west-2:111122223333:cluster/production

  # Resource restrictions
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace
  namespaceResourceWhitelist:
  - group: 'apps'
    kind: Deployment
  - group: ''
    kind: Service
  - group: ''
    kind: ConfigMap
```

### 源命名空间
<a name="_source_namespaces"></a>

使用 EKS Argo CD 功能时，AppProject 定义中必须包含 `spec.sourceNamespaces` 字段。此字段用于指定哪个命名空间可以包含引用此项目的应用程序或 ApplicationSets。

**重要**  
EKS Argo CD 功能仅支持应用程序和 ApplicationSets 的单个命名空间，即您在创建该功能时指定的命名空间（通常为 `argocd`）。这与支持多个命名空间的开源 Argo CD 不同。

 **AppProject 配置** 

所有 AppProjects 都必须在 `sourceNamespaces` 中包含该功能配置的命名空间：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a-project
  namespace: argocd
spec:
  description: Applications for Team A

  # Required: Specify the capability's configured namespace (configuration.argoCd.namespace)
  sourceNamespaces:
    - argocd  # Must match your capability's namespace configuration

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'

  # Destination restrictions
  destinations:
    - namespace: 'team-a-*'
      server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster
```

**注意**  
如果您从 `sourceNamespaces` 中省略了该功能的命名空间，则该命名空间中的应用程序或 ApplicationSets 将无法引用此项目，从而导致部署失败。

 **为用户分配项目**：

项目角色授予 EDITOR 和 VIEWER 用户访问项目资源（应用程序、ApplicationSets、存储库和集群凭证）和功能（日志、exec）的权限。如果没有项目角色，即便这些用户拥有全局角色访问权限，他们也无法访问这些资源。

ADMIN 用户无需项目角色即可访问所有应用程序。

 **示例：向团队成员授予应用程序访问权限** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  # ... project configuration ...

  sourceNamespaces:
  - argocd

  # Project roles grant Application-level access
  roles:
  - name: developer
    description: Team A developers - can manage Applications
    policies:
    - p, proj:team-a:developer, applications, *, team-a/*, allow
    - p, proj:team-a:developer, clusters, get, *, allow  # See cluster names in UI
    groups:
    - 686103e0-f051-7068-b225-e6392b959d9e  # Identity Center group ID

  - name: viewer
    description: Team A viewers - read-only Application access
    policies:
    - p, proj:team-a:viewer, applications, get, team-a/*, allow
    - p, proj:team-a:viewer, clusters, get, *, allow  # See cluster names in UI
    groups:
    - 786203e0-f051-7068-b225-e6392b959d9f  # Identity Center group ID
```

**注意**  
在项目角色中包含 `clusters, get, *, allow` 以允许用户在用户界面中查看集群名称。如果没有此权限，则目标集群将显示为“未知”。

 **了解项目角色策略**：

策略格式为：`p, proj:<project>:<role>, <resource>, <action>, <object>, <allow/deny>`

 **资源策略**：
+  `applications, , team-a/, allow`：对 team-a 项目中所有应用程序的完全访问权限
+  `applications, get, team-a/*, allow`：对应用程序的只读访问权限
+  `applications, sync, team-a/*, allow`：可以同步应用程序，但不能创建/删除
+  `applications, delete, team-a/*, allow`：可以删除应用程序（谨慎使用）
+  `applicationsets, , team-a/, allow`：对 ApplicationSets 的完全访问权限
+  `repositories, *, *, allow`：对存储库凭证的访问权限
+  `clusters, *, *, allow`：对集群凭证的访问权限

 **功能策略**：
+  `logs, , team-a/, allow`：对应用程序日志的访问权限
+  `exec, , team-a/, allow`：对应用程序容器组（pod）的 Exec 访问权限

**注意**  
EDITOR 用户可以创建项目角色，以便在他们能够更新的项目中为自己及他人授予权限。这使得团队负责人能够自行控制其团队所使用的项目范围内资源的访问权限，而无需 ADMIN 的干预。

**注意**  
在 `groups` 字段中使用 Identity Center 组 ID（不是组名称）。您也可以将 Identity Center 用户 ID 用于个人用户访问。在 Amazon Identity Center 控制台中或使用 Amazon CLI 查找这些 ID。

## 常见权限模式
<a name="_common_permission_patterns"></a>

 **模式 1：拥有完整访问权限的管理员团队** 

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam", "SRETeam"]
  }
}
```

ADMIN 用户无需额外配置即可查看并管理所有的项目范围内资源。

 **模式 2：团队负责人管理项目，开发人员则通过项目角色进行访问** 

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

1. ADMIN 为每个团队创建项目

1. 团队负责人（EDITOR）配置项目角色，以授予其开发人员访问项目资源（应用程序、ApplicationSets、凭证）和功能（日志、exec）的权限

1. 开发人员（VIEWER）只能访问其项目角色所允许的资源和功能

 **模式 3：通过项目角色进行基于团队的访问** 

1. ADMIN 创建项目并将团队负责人全局映射到 EDITOR 角色

1. 团队负责人（EDITOR）为团队成员分配其项目中的相应项目角色

1. 团队成员只需要 VIEWER 全局角色，项目角色则提供对项目资源和功能的访问权限

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

## 最佳实践
<a name="_best_practices"></a>

 **优先使用用户组而非独立用户**：将 Amazon Identity Center 用户组映射到 Argo CD 角色，而不是单个用户，以便于管理。

 **从最低权限开始**：从 VIEWER 访问权限开始，然后根据需要授予 EDITOR 或 ADMIN 权限。

 **使用项目实现团队隔离**：为不同的团队或环境创建单独的 AppProjects 以强制实施边界。

 **利用 Identity Center 联合身份验证**：配置 Amazon Identity Center，以与企业身份提供者联合，从而实现集中式用户管理。

 **定期审查访问权限**：定期审查角色映射和项目分配，以确保适当的访问级别。

 **限制集群访问权限**：请记住，Argo CD RBAC 会控制 Argo CD 资源和操作的访问权限，这与 Kubernetes RBAC 无关。拥有 Argo CD 访问权限的用户可以将应用程序部署到 Argo CD 有权访问的集群。限制 Argo CD 可以访问的集群，并使用项目目标限制来控制应用程序的部署位置。

## Amazon 服务权限
<a name="shared_aws_service_permissions"></a>

要在 Application 资源中直接使用 Amazon 服务（而无需创建存储库资源），请将所需的 IAM 权限附加到功能角色。

 **用于 Helm 图表的 ECR**：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage"
      ],
      "Resource": "*"
    }
  ]
}
```

 **CodeCommit 存储库**：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codecommit:GitPull"
      ],
      "Resource": "arn:aws:codecommit:region:account-id:repository-name"
    }
  ]
}
```

 **CodeConnections（GitHub、GitLab、Bitbucket）**：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codeconnections:UseConnection"
      ],
      "Resource": "arn:aws:codeconnections:region:account-id:connection/connection-id"
    }
  ]
}
```

有关使用这些集成的详细信息，请参阅[配置存储库访问权限](argocd-configure-repositories.md)。

## 后续步骤
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md)：了解如何创建应用程序和管理部署
+  [Argo CD 概念](argocd-concepts.md)：了解 Argo CD 概念，包括项目
+  [EKS 功能的安全注意事项](capabilities-security.md)：查看针对功能的安全最佳实践