

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# Argo CD アクセス許可を設定する
<a name="argocd-permissions"></a>

Argo CD マネージド機能は、AWS アイデンティティセンターとの統合により認証を実施し、組み込みの RBAC ロールを使用して認可を行います。このトピックでは、ユーザーとチームに対するアクセス許可を設定する方法について説明します。

## Argo CD によるアクセス許可の仕組み
<a name="_how_permissions_work_with_argo_cd"></a>

Argo CD 機能は、AWS アイデンティティセンターを使用して認証を実施し、組み込みの 3 つの RBAC ロールを使用して認可を行います。

ユーザーが Argo CD にアクセスすると、次のようになります。

1. AWS アイデンティティセンターを使用してユーザーが認証されます (社内の ID プロバイダーにフェデレーションできます)。

1.  AWS アイデンティティセンターは、ユーザーとグループの情報を Argo CD に提供します。

1. Argo CD は、現在の設定に基づいてユーザーとグループを RBAC ロールにマッピングします。

1. ユーザーには、自分がアクセス許可を持つアプリケーションとリソースのみが表示されます。

## 組み込みの RBAC ロール
<a name="_built_in_rbac_roles"></a>

Argo CD 機能には、AWS アイデンティティセンターのユーザーとグループにマッピングする組み込みのロールが 3 つあります。これらは、プロジェクト、クラスター、リポジトリなどの Argo CD リソースへのアクセスを制御する**グローバルスコープのロール**です。

**重要**  
グローバルロールは、Application などのプロジェクトスコープのリソースではなく、Argo CD 自体へのアクセスを制御します。EDITOR ユーザーおよび VIEWER ユーザーは、デフォルトでは Application を表示または管理できません。プロジェクトスコープのリソースにアクセスするには、プロジェクトロールが必要です。Application およびその他のプロジェクトスコープのリソースへのアクセス許可の詳細については、「[プロジェクトロールとプロジェクトスコープのアクセス](#project-roles)」を参照してください。

 **ADMIN** 

すべての Argo CD リソースと設定へのフルアクセス:
+ 任意のプロジェクト内の Application と ApplicationSet を作成、更新、削除する
+ Argo CD 設定を管理する
+ デプロイターゲットクラスターを登録して管理する
+ リポジトリアクセスを設定する
+ プロジェクトを作成および管理する
+ すべてのアプリケーションのステータスと履歴を表示する
+ すべてのクラスターとリポジトリを一覧表示してアクセスする

 **EDITOR** 

プロジェクトを更新してプロジェクトロールを設定できますが、グローバル Argo CD 設定を変更することはできません。
+ 既存のプロジェクトを更新する (プロジェクトの新規作成および削除はできません)
+ プロジェクトロールとアクセス許可を設定する
+ GPG キーと証明書を表示する
+ グローバル Argo CD 設定を変更できない
+ クラスターとリポジトリを直接管理できない
+ プロジェクトロールがないと Application を表示または管理できない

 **VIEWER** 

Argo CD リソースへの読み取り専用アクセス:
+ プロジェクト設定を表示する
+ すべてのプロジェクト (ユーザーが割り当てられていないプロジェクトを含む) を一覧表示する
+ GPG キーと証明書を表示する
+ クラスターまたはリポジトリを一覧表示できない
+ 変更を加えることはできない
+ プロジェクトロールがないと Application を表示または管理できない

**注記**  
EDITOR ユーザーまたは VIEWER ユーザーに Application へのアクセス権を付与するには、ADMIN または EDITOR が、アイデンティティセンターグループをプロジェクト内の特定のアクセス許可にマッピングするプロジェクトロールを作成する必要があります。

## プロジェクトロールとプロジェクトスコープのアクセス
<a name="project-roles"></a>

グローバルロール (ADMIN、EDITOR、VIEWER) は、Argo CD 自体へのアクセスを制御します。プロジェクトロールは、以下を含む特定のプロジェクト内のリソースと機能へのアクセスを制御します。
+  **リソース**: Application、ApplicationSet、リポジトリ認証情報、クラスター認証情報
+  **機能**: アプリケーションポッドへのログアクセスと実行アクセス

 **2 レベルのアクセス許可モデルについて**:
+  **グローバルスコープ**: 組み込みロールは、ユーザーがプロジェクト、クラスター、リポジトリ、および Argo CD 設定で何ができるかを決定します
+  **プロジェクトスコープ**: プロジェクトロールは、ユーザーが特定のプロジェクト内のリソースと機能で何ができるかを決定します

つまり、次のようになります。
+ ADMIN ユーザーは、追加の設定なしですべてのプロジェクトリソースと機能にアクセスできます
+ EDITOR ユーザーおよび VIEWER ユーザーには、プロジェクトのリソースと機能にアクセスするためのプロジェクトロールを付与する必要があります
+ EDITOR ユーザーは、更新できるプロジェクト内で、自分やそれ以外のユーザーにアクセス権を付与するプロジェクトロールを作成できます。

 **ワークフローの例**:

1. ADMIN は、アイデンティティセンターグループを EDITOR ロールにグローバルにマッピングします。

1. ADMIN がチームのプロジェクトを作成する

1. EDITOR は、そのプロジェクト内のプロジェクトロールを設定して、チームメンバーにプロジェクトスコープのリソースへのアクセス権を付与します。

1. チームメンバー (VIEWER グローバルロールを持つ可能性がある) は、プロジェクトロールのアクセス許可に基づいて、そのプロジェクトの Application を表示および管理できるようになりました。

プロジェクトロールの設定の詳細については、「[Project ベースのアクセスコントロール](#_project_based_access_control)」を参照してください。

## ロールマッピングを設定する
<a name="_configure_role_mappings"></a>

機能の作成時や更新時に、AWS アイデンティティセンターのユーザーとグループを Argo CD ロールにマッピングします。

 **ロールマッピングの例**:

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

**注記**  
ロール名は、大文字と小文字が区別され、大文字 (ADMIN、EDITOR、VIEWER) にする必要があります。

**重要**  
EKS 機能と AWS アイデンティティセンターが統合されている場合、Argo CD 機能あたり最大 1,000 個の ID がサポートされます。ユーザーやグループを ID にすることができます。

 **ロールマッピングを更新する**:

```
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>

管理者アカウントは、クラスターの登録やリポジトリの設定など、初期セットアップと管理タスク向けに設計されています。

 **どのような場合に管理者アカウントが適切か**:
+ 機能の初期セットアップと設定
+ 単独開発や迅速なデモンストレーション
+ 管理タスク (クラスターの登録、リポジトリの設定、Project の作成)

 **管理者アカウントのベストプラクティス**:
+ アカウントトークンをバージョン管理にコミットしない
+ トークンが漏洩したらすぐにローテーションさせる
+ アカウントトークンの用途をセットアップと管理タスクに制限する
+ 有効期限を短くする (最大 12 時間)
+ 一度に作成できるアカウントトークンを 5 つまでとする

 **どのような場合に Project ベースのアクセスを使用するか**:
+ 複数のユーザーと開発環境を共有する場合
+ いずれの環境も本番稼働と同様にする場合
+ 誰がアクションを実行したかを監査証跡に残す場合
+ リソース制限やアクセス境界を設ける場合

本番稼働環境とマルチユーザーシナリオでは、専用の RBAC ロールを AWS アイデンティティセンターグループにマッピングして、Project ベースのアクセスコントロールを使用します。

## Project ベースのアクセスコントロール
<a name="_project_based_access_control"></a>

Argo CD Project (AppProject) を使用すると、チームを対象にアクセスコントロールとリソース分離をきめ細かく設定できます。

**重要**  
ユーザーまたはグループをプロジェクト固有のロールに割り当てる前に、まず機能設定でグローバル Argo CD ロール (ADMIN、EDITOR、または VIEWER) にマッピングする必要があります。ユーザーは、プロジェクトロールに割り当てられていても、グローバルロールマッピングなしで Argo CD にアクセスすることはできません。  
ユーザーを VIEWER ロールにグローバルにマッピングし、プロジェクト固有のロールを通じて追加のアクセス許可を付与することを検討してください。これにより、ベースラインアクセスが可能になり、プロジェクトレベルでのきめ細かな制御が可能になります。

Project でできることは以下のとおりです。
+  **ソースの制限**: 使用できる Git リポジトリを制限します。
+  **送信先の制限**: ターゲットにできるクラスターと名前空間を制限します。
+  **リソースの制限**: デプロイできる Kubernetes リソースタイプを制限します。
+  **RBAC の統合**: Project を AWS アイデンティティセンターグループまたは Argo CD ロールにマッピングします。

 **チームを分離する Project の例**:

```
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` フィールドが必要です。このフィールドは、このプロジェクトを参照する Application または ApplicationSet を含めることができる名前空間を指定します。

**重要**  
EKS Argo CD 機能は、Application と ApplicationSet 向けに一つの名前空間のみをサポートします。具体的には、機能の作成時に指定した名前空間になります (通常は `argocd`)。これは、複数の名前空間をサポートするオープンソースの Argo CD とは異なります。

 **AppProject の設定** 

すべての AppProject は、その機能の設定済み名前空間を `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` に含めないと、その名前空間の Application または ApplicationSet はこのプロジェクトを参照できず、デプロイが失敗します。

 **ユーザーを Project に割り当てる**:

プロジェクトロールは、EDITOR ユーザーおよび VIEWER ユーザーにプロジェクトリソース (Application、ApplicationSet、リポジトリ、クラスター認証情報) と機能 (ログ、実行) へのアクセスを許可します。プロジェクトロールがないと、これらのユーザーは、グローバルロールアクセスを持っていてもこれらのリソースにアクセスできません。

ADMIN ユーザーは、プロジェクトロールを必要とせずに、すべての Application にアクセスできます。

 **例: チームメンバーに Application へのアクセスを許可する** 

```
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` を含めることで、ユーザーが UI でクラスター名を表示できるようにします。このアクセス許可がない場合、送信先クラスターは「Unknown」として表示されます。

 **プロジェクトロールポリシーについて**:

ポリシーの形式は次のとおりです: `p, proj:<project>:<role>, <resource>, <action>, <object>, <allow/deny>` 

 **リソースポリシー**:
+  `applications, , team-a/, allow` – team-a プロジェクト内のすべての Application にフルアクセスできます
+  `applications, get, team-a/*, allow` – Application に読み取り専用でアクセスできます
+  `applications, sync, team-a/*, allow` – Application を同期できますが、作成/削除することはできません
+  `applications, delete, team-a/*, allow` – Application を削除できます (注意して使用すること)
+  `applicationsets, , team-a/, allow` – ApplicationSet にフルアクセスできます
+  `repositories, *, *, allow` – リポジトリ認証情報にアクセスできます
+  `clusters, *, *, allow` – クラスター認証情報にアクセスできます

 **機能ポリシー**:
+  `logs, , team-a/, allow` – アプリケーションログにアクセスできます
+  `exec, , team-a/, allow` – アプリケーションポッドへの実行アクセス

**注記**  
EDITOR ユーザーは、更新できるプロジェクト内で、自分やそれ以外のユーザーにアクセス許可を付与するプロジェクトロールを作成できます。これにより、チームリーダーは ADMIN の介入を必要とせずに、チームのプロジェクトスコープのリソースへのアクセスを制御できます。

**注記**  
`groups` フィールドでアイデンティティセンターグループ ID (グループ名ではない) を使用します。個別のユーザーアクセスにアイデンティティセンターユーザー ID を使用することもできます。AWS アイデンティティセンターコンソール内、または AWS 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) は、開発者にプロジェクトリソース (Application、ApplicationSet、認証情報) と機能 (ログ、実行) へのアクセスを許可するようにプロジェクトロールを設定する

1. 開発者 (VIEWER) は、プロジェクトロールで許可されているリソースと機能にのみアクセスできる

 **パターン 3: プロジェクトロールを使用したチームベースのアクセス** 

1. ADMIN はプロジェクトを作成し、チームリーダーを EDITOR ロールにグローバルにマッピングする

1. チームリーダー (EDITOR) は、チームメンバーをプロジェクト内のプロジェクトロールに割り当てる

1. チームメンバーには VIEWER グローバルロールのみが必要 – プロジェクトロールはプロジェクトリソースと機能へのアクセスを提供する

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

## ベストプラクティス
<a name="_best_practices"></a>

 **個々のユーザーではなくグループを使用する**: AWS アイデンティティセンターグループを個々のユーザーではなく Argo CD ロールにマッピングして、管理を容易にします。

 **最小特権から開始する**: VIEWER アクセスから開始し、必要に応じて EDITOR または ADMIN を付与します。

 **Project を使用してチームを分離する**: チームや環境ごとに AppProject を作成して、境界を確立します。

 **アイデンティティセンターのフェデレーションを活用する**: 社内の ID プロバイダーとフェデレーションするように AWS アイデンティティセンターを設定して、ユーザー管理を一元化します。

 **アクセスを定期的に見直す**: ロールのマッピングと Project の割り当てを定期的に見直して、適切なアクセスレベルを確保します。

 **クラスターへのアクセスを制限する**: Argo CD RBAC は Argo CD リソースとオペレーションへのアクセスを制御しますが、Kubernetes RBAC には対応していないことに注意してください。Argo CD にアクセスできるユーザーは、Argo CD がアクセスできるクラスターにアプリケーションをデプロイできます。Argo CD がアクセスできるクラスターを制限し、Project の宛先制限を使用して、アプリケーションをデプロイできる場所を制御します。

## AWS サービスのアクセス許可
<a name="shared_aws_service_permissions"></a>

Repository リソースを作成することなく Application リソースで AWS サービスを直接使用するには、必要な IAM アクセス許可を機能ロールにアタッチします。

 **ECR Helm チャート**:

```
{
  "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) - Project など Argo CD の概念を理解する
+  [EKS 機能のセキュリティに関する考慮事項](capabilities-security.md) - 機能のセキュリティのベストプラクティスを見直す