# Google Cloud環境のセットアップ

## Google Cloud環境の概要

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FskwUKKchJXDIOp7fPLXM%2Fimage.png?alt=media&#x26;token=98c03d51-64ae-4434-a291-bb8161d8605d" alt=""><figcaption></figcaption></figure>

## 概要

GCP環境内のリソースは、PAM設定レコードで構成されたサービスアカウントを使用して、Keeperゲートウェイから管理できます。必要に応じて、このサービスアカウントにドメイン全体の委任を設定すると、GCP検出で見つかったGoogle Workspaceユーザー (GCPプリンシパル) のパスワードを、Keeperゲートウェイでローテーションできるようになります。

対象となるGCPリソースへアクセスできるよう、サービスアカウントを適切に設定する必要があります。対応するサービスは次のとおりです。

* Compute Engine
* Cloud SQL
* Cloud Resource Manager
* 管理対象Microsoft Active Directory

さらに、Google Workspaceユーザーのパスワード変更を有効にするには、次の設定も必要です。

* Google Workspace管理コンソールでドメイン全体の委任を有効化
* スコープ: `https://www.googleapis.com/auth/admin.directory.user`
* `google_admin_email` には、Workspaceでのユーザー管理権限が付与されていること

GCPプリンシパルのパスワードローテーションを有効にする手順の詳細については、[以下の項目](#gcpyzpasuwdortshonnoopushon)をご参照ください。

### 必要なサービスアカウントの設定

サービスアカウントは、ユーザーではなく、Compute Engineインスタンスなどのアプリケーションやコンピューティングワークロードで使用される特別なアカウントです。

KeeperPAMで使用するサービスアカウントには、以下の最小限の権限が必要です。

```
compute.instances.list
compute.zones.list

cloudsql.instances.get
cloudsql.instances.list
cloudsql.users.update

resourcemanager.projects.getIamPolicy

managedidentities.domains.list
```

最小権限の原則を維持するため、GCP構成で指定するサービスアカウントには、上記の権限のみを付与してください。

#### 設定手順の概要

1. KeeperPAMなど、[カスタムロール](https://docs.cloud.google.com/iam/docs/creating-custom-roles?hl=ja)を作成します
2. サービスアカウントを作成します
3. 作成したカスタムロールをサービスアカウントに割り当てます
4. サービスアカウント用の新しいJSON形式の秘密鍵を作成します
5. ダウンロードしたファイルを保護のためKeeperボルトに保存します

このJSONファイルの内容を、Keeperボルト内のPAM構成レコードにある「サービスアカウントキー」フィールドにも追加します。

***

### GCPユーザーパスワードローテーションのオプション設定

このセクションの手順に従うことで、KeeperPAMによるGoogle Workspace IDのパスワードローテーションを任意で有効化できます。

GCPリソースの検出時、システムはIAMポリシー内にある `user:` 接頭辞付きのユーザー\
(例: `user:john.doe@example.com`) を識別します。これらは通常、GCPプロジェクト内で権限が付与されているGoogle Workspaceユーザーです。

これらのWorkspaceユーザーのパスワードをローテーションするには、サービスアカウントが以下の要件を満たしている必要があります。

* Google Workspaceでドメイン全体の委任が有効化されていること
* 適切なOAuthスコープで承認されていること
* サービスアカウントが代理で使用する管理者メールアドレスが指定されていること

### 要件

* サービスアカウントを含むGoogle Cloud Platformプロジェクト
* Google Workspaceの管理者アクセス権
* サービスアカウントのクライアントID (サービスアカウントの詳細画面で確認できます)

### 構成の手順

#### サービスアカウントでドメイン全体の委任を有効にする

1. [**Google Cloud コンソール**](https://console.cloud.google.com)にアクセスします
2. **\[IAM と管理]** → **\[サービス アカウント]** に移動します
3. PAM構成で使用しているサービスアカウントを探します
4. サービスアカウントをクリックして詳細を表示します
5. **\[詳細]** タブを開きます
6. **\[詳細設定]** の中にある **\[ドメイン全体の委任]** セクションを確認します
7. **\[Google Workspaceのドメイン全体の委任を有効にする]** をクリックします
8. **クライアントID**を控えておきます (次の手順で使用します)

#### Google Workspace 管理コンソールでサービスアカウントを承認する

1. [**Google Workspace 管理コンソール**](https://admin.google.com)にアクセスします
2. **\[セキュリティ]** → **\[アクセスとデータ管理]** → **\[API の制御]** に移動します
3. **\[ドメイン全体の委任]** までスクロールします
4. **\[ドメイン全体の委任を管理]** をクリックします
5. **\[新規追加]** をクリックします
6. **クライアントID**欄に、手順1で控えたクライアントIDを貼り付けます
7. **OAuthスコープ**欄に次を入力します

   ```
   https://www.googleapis.com/auth/admin.directory.user
   ```
8. **\[承認]** をクリックします

#### Google管理者メールアドレスの構成

Google管理者メールアドレスは、次の条件を満たすGoogle Workspaceユーザーアカウントです。

* Google Workspaceの管理者権限を持っていること
* 特に**ユーザー管理**の権限が付与されていること
* パスワード変更時に、サービスアカウントが代理で操作を行う際に使用するアカウントであること

#### 管理者ユーザーを作成または特定する

**オプションA: 既存のスーパー管理者を使用する**

`admin@example.com` など、既存のGoogle Workspace**スーパー管理者**のメールアドレスを使用します。

**オプションB: 専用のサービス管理者アカウントを作成する (推奨)**

1. **Google Workspace 管理コンソール**で **\[ディレクトリ]** → **\[ユーザー]** に移動します
2. **\[新しいユーザーを追加]** をクリックします
3. 次のようなユーザーを作成します
   * 名前: Keeper Gateway Service
   * メールアドレス: <keeper-gateway@example.com>
4. 作成したユーザーに管理者ロールを割り当てます
   1. **\[ディレクトリ]** → **\[ユーザー]** に移動します
   2. 作成したユーザーをクリックします
   3. **\[管理者の役割と権限]** をクリックします
   4. **\[ユーザー管理管理者]** (必要に応じて**スーパー管理者**) を割り当てます

***

### PAM構成レコードの設定

**Keeperボルトで \[シークレットマネージャー]** → **\[PAM構成]** に移動し、新しい **\[GCP PAM構成レコード]** を作成します。以下の項目を設定します。

#### サービスアカウントキー **(JSON形式)**

サービスアカウントのセットアップ時に作成したキー ファイルです。形式は以下のとおりです。

```json
{
  "type": "service_account",
  "project_id": "your-project-id",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "your-sa@your-project.iam.gserviceaccount.com",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "..."
}
```

#### Google管理者メールアドレス

この項目は、**GCPサービスプリンシパルのローテーション**を構成している場合にのみ必要です。

```
keeper-gateway@example.com
```

***

### 仕組み

GCPユーザーのパスワードをローテーションする際の処理は、次の流れで行われます。

1. システムは、GCPのIAMポリシーからユーザー (例: `user:john.doe@example.com`) を検出します
2. パスワードローテーションの実行時に、次の処理が行われます。
   * JSONキーからサービスアカウントの認証情報を読み込みます
   * `admin.directory.user` スコープを使用して認証情報を要求します
   * Google 管理者メールアドレスを代理として使用する委任された認証情報を作成します
   * Google Admin Directory APIを使用して、ユーザーのパスワードを更新します
3. パスワード変更は、対象のGoogle Workspaceユーザーに適用されます

### 必要な権限の概要

#### GCPプロジェクトの権限 (検出用)

GCPプロジェクト内でリソースを検出するため、サービスアカウントには次のIAM権限が必要です。

* `resourcemanager.projects.getIamPolicy` (IAMポリシーからユーザーを検出するために使用します)

#### Google Workspaceの権限

サービスアカウントには以下が必要となります。

* **ドメイン全体の委任**が有効化されていること
* **OAuthスコープ**: `https://www.googleapis.com/auth/admin.directory.user`

Google管理者メールアドレスに指定するアカウントには、次の権限が必要です。

* **ユーザー管理管理者**ロール (またはスーパー管理者)

### トラブルシューティング

#### 「No Google Admin email provided」エラー

**原因**\
PAM構成レコードで `google_admin_email` フィールドが設定されていません。

**対処方法**\
PAM構成レコードに管理者メールアドレスを追加してください。

***

#### 「Permission denied」または「Forbidden」エラー

**原因**\
ドメイン全体の委任が正しく構成されていません。

**対処方法**

* サービスアカウントでドメイン全体の委任が有効になっていることを確認します
* クライアントIDが **Google Workspace 管理コンソール** に正しく追加されていることを確認します
* OAuthスコープ\
  `https://www.googleapis.com/auth/admin.directory.user`\
  が承認されていることを確認します

#### 「Insufficient permissions」エラー

**原因**\
Google管理者メールアドレスに十分な権限が付与されていません。

**対処方法**\
管理者メールアドレスに **ユーザー管理管理者** ロール、または **スーパー管理者** ロールが付与されていることを確認してください。

#### 「Invalid credentials」 または 「Authentication failed」エラー

**原因**\
サービスアカウントキーが無効、または有効期限切れです。

**対処方法**

* **Google Cloud コンソール**でサービスアカウントキーを再生成します
* 新しいJSONキーを使用して、PAM構成レコードを更新します

#### ユーザーのパスワード変更は成功するが、ログインできない

**原因**\
パスワードポリシーの要件を満たしていません。

**対処方法**\
パスワード生成では、次の制約が適用されます。

* 最低8文字
* 小文字を1文字以上含む
* 大文字を1文字以上含む
* 数字を1文字以上含む
* 次の記号のいずれかを1文字以上含む: `!@#$%^&*()_+-=[]{}|`

### セキュリティのベストプラクティス

1. **専用のサービス管理者アカウントを使用**\
   個人の管理者アカウントではなく、本サービス専用のGoogle Workspaceユーザーを作成してください。
2. **サービスアカウントキーの配布を最小限に抑制**\
   サービスアカウントキー (JSON) は、**Keeperシークレットマネージャー**のみに安全に保管してください。
3. **管理者アクティビティを監視**\
   サービスアカウントによる操作について、Google Workspaceの管理者監査ログを定期的に確認してください。
4. **サービスアカウントキーをローテーション**\
   定期的にサービスアカウントキーを更新し、PAM構成レコードも併せて更新してください。
5. **最小権限の原則を適用**\
   追加の権限が必要な場合を除き、Super AdminではなくUser Management Adminロールのみを付与してください。

### その他のリソース

* Google Workspaceドメイン全体の委任ガイド
* Google管理者SDK Directory API
* サービスアカウント認証
