GCP - Basic Information

Support HackTricks

リソース階層

Google Cloudは、従来のファイルシステムの概念に似たリソース階層を使用します。これにより、ポリシーと権限の特定のアタッチメントポイントを持つ論理的な親/子のワークフローが提供されます。

高レベルでは、次のようになります:

Organization
--> Folders
--> Projects
--> Resources

仮想マシン(Compute Instanceと呼ばれる)はリソースです。リソースはプロジェクト内に存在し、他のCompute Instanceやストレージバケットなどと一緒に存在する可能性があります。

Projects Migration

プロジェクトを組織なしで組織に移行することが可能です。このためにはroles/resourcemanager.projectCreatorroles/resourcemanager.projectMoverの権限が必要です。プロジェクトが他の組織内にある場合、最初にその組織から移動するためにGCPサポートに連絡する必要があります。詳細はこちらを参照してください。

Organization Policies

組織のクラウドリソースに対する集中管理を可能にします:

  • 組織のリソースの使用方法に制限を設定するための集中管理。

  • 開発チームがコンプライアンスの範囲内で作業するためのガードレールを定義および確立。

  • プロジェクトオーナーとそのチームがコンプライアンスを破る心配なく迅速に動けるよう支援。

これらのポリシーは組織全体、フォルダ、またはプロジェクトに影響を与えるように作成できます。ターゲットリソース階層ノードの子孫は組織ポリシーを継承します。

組織ポリシーを定義するには、制約を選択します。これは、Google CloudサービスまたはGoogle Cloudサービスのグループに対する特定の種類の制限です。その制約を希望する制限で設定します。

Common use cases

  • ドメインに基づくリソース共有の制限。

  • Identity and Access Managementサービスアカウントの使用制限。

  • 新しく作成されたリソースの物理的な場所の制限。

  • サービスアカウントの作成を無効化。

組織のリソースを細かく制御するための多くの制約があります。詳細については、すべてのOrganization Policy Service制約のリストを参照してください。

Default Organization Policies

GCP組織を設定する際にGoogleがデフォルトで追加するポリシーは次のとおりです:

Access Management Policies

  • Domain restricted contacts: 指定されたドメイン外のユーザーをEssential Contactsに追加することを防ぎます。これにより、Essential Contactsは選択したドメイン内の管理されたユーザーIDのみがプラットフォーム通知を受け取ることができます。

  • Domain restricted sharing: 指定されたドメイン外のユーザーをIAMポリシーに追加することを防ぎます。これにより、IAMポリシーは選択したドメイン内の管理されたユーザーIDのみがこの組織内のリソースにアクセスできるように制限されます。

  • Public access prevention: Cloud Storageバケットが公開されるのを防ぎます。これにより、開発者がCloud Storageバケットに認証されていないインターネットアクセスを設定することを防ぎます。

  • Uniform bucket level access: Cloud Storageバケットのオブジェクトレベルのアクセス制御リスト(ACL)を防ぎます。これにより、IAMポリシーをCloud Storageバケット内のすべてのオブジェクトに一貫して適用することでアクセス管理が簡素化されます。

  • Require OS login: 新しいプロジェクトで作成されたVMにはOS Loginが有効になります。これにより、個別のSSHキーを作成および管理することなく、IAMを使用してインスタンスへのSSHアクセスを管理できます。

Additional security policies for service accounts

  • Disable automatic IAM grants: デフォルトのApp EngineおよびCompute Engineサービスアカウントがプロジェクト作成時に自動的にEditor IAMロールを付与されるのを防ぎます。これにより、サービスアカウントが作成時に過度に許可されたIAMロールを受け取ることを防ぎます。

  • Disable service account key creation: 公開サービスアカウントキーの作成を防ぎます。これにより、永続的な資格情報が漏洩するリスクを減らします。

  • Disable service account key upload: 公開サービスアカウントキーのアップロードを防ぎます。これにより、漏洩または再利用されたキー素材のリスクを減らします。

Secure VPC network configuration policies

  • Define allowed external IPs for VM instances: 公開IPを持つComputeインスタンスの作成を防ぎます。これにより、インターネットトラフィックにさらされるのを防ぎます。

  • Disable VM nested virtualization: Compute Engine VM上でのネストされたVMの作成を防ぎます。これにより、監視されていないネストされたVMのセキュリティリスクが減少します。

  • Disable VM serial port: Compute Engine VMへのシリアルポートアクセスを防ぎます。これにより、Compute Engine APIを使用してサーバーのシリアルポートに入力することを防ぎます。

  • Restrict authorized networks on Cloud SQL instances: 公開または内部ネットワーク範囲外からのCloud SQLデータベースへのアクセスを防ぎます。

  • Restrict Protocol Forwarding Based on type of IP Address: 外部IPアドレスに対するVMプロトコル転送を防ぎます。

  • Restrict Public IP access on Cloud SQL instances: 公開IPを持つCloud SQLインスタンスの作成を防ぎます。これにより、インターネットトラフィックにさらされるのを防ぎます。

  • Restrict shared VPC project lien removal: Shared VPCホストプロジェクトの誤って削除されるのを防ぎます。

  • Sets the internal DNS setting for new projects to Zonal DNS Only: サービスの可用性が低下するレガシーDNS設定の使用を防ぎます。

  • Skip default network creation: デフォルトのVPCネットワークおよび関連リソースの自動作成を防ぎます。これにより、過度に許可されたデフォルトのファイアウォールルールを回避します。

  • Disable VPC External IPv6 usage: 外部IPv6サブネットの作成を防ぎます。これにより、未承認のインターネットアクセスにさらされるのを防ぎます。

IAM Roles

これらはAWSのIAMポリシーのようなもので、各ロールには一連の権限が含まれています。

しかし、AWSとは異なり、ロールの集中リポジトリはありません。その代わりに、リソースがYのプリンシパルにXのアクセスロールを与える形式です。リソースに誰がアクセスできるかを知る唯一の方法は、そのリソースに対して**get-iam-policyメソッドを使用すること**です。 これは問題になる可能性があります。なぜなら、プリンシパルがどの権限を持っているかを知る唯一の方法は、すべてのリソースに誰に権限を与えているかを尋ねることであり、ユーザーはすべてのリソースから権限を取得する権限を持っていないかもしれないからです。

IAMには3種類のロールがあります:

  • Basic/Primitive roles:これはOwnerEditor、およびViewerロールを含み、IAMの導入前から存在していました。

  • Predefined roles:特定のサービスに対して細かいアクセスを提供し、Google Cloudによって管理されます。多くの定義済みロールがあり、それらのすべてとその権限をこちらで確認できます。

  • Custom roles:ユーザーが指定した権限リストに従って細かいアクセスを提供します。

GCPには数千の権限があります。ロールが権限を持っているかどうかを確認するには、こちらで権限を検索し、どのロールがそれを持っているかを確認できます。

また、こちらで定義済みロール各製品が提供するものを検索できます。いくつかのロールはユーザーにアタッチできず、一部の権限のためにSAsにのみアタッチできることに注意してください。 さらに、権限関連するサービスにアタッチされている場合にのみ効果を発揮することに注意してください。

また、カスタムロールが特定の権限を使用できるかどうかをこちらで確認できます。

GCP - IAM, Principals & Org Policies Enum

Users

GCPコンソールにはユーザーやグループの管理はありません。それはGoogle Workspaceで行われます。ただし、Google Workspaceで異なるアイデンティティプロバイダーを同期することは可能です。

Workspacesのユーザーとグループにアクセスするにはhttps://admin.google.comを使用します。

MFAはWorkspacesユーザーに強制することができますが、攻撃者はGCPにcli経由でアクセスするためのトークンを使用することができ、これはMFAで保護されません(ユーザーがログインして生成する際にのみMFAで保護されます:gcloud auth login)。

Groups

組織が作成されると、いくつかのグループが強く推奨されます。これらのいずれかを管理している場合、組織全体または重要な部分を危険にさらす可能性があります:

Group

Function

gcp-organization-admins (group or individual accounts required for checklist)

組織に属する任意のリソースを管理します。このロールは慎重に割り当ててください。組織管理者はすべてのGoogle Cloudリソースにアクセスできます。代わりに、この機能は非常に特権が高いため、グループを作成する代わりに個別のアカウントを使用することを検討してください。

gcp-network-admins (required for checklist)

ネットワーク、サブネット、ファイアウォールルール、およびCloud Router、Cloud VPN、クラウドロードバランサーなどのネットワークデバイスの作成。

gcp-billing-admins (required for checklist)

請求アカウントの設定と使用状況の監視。

gcp-developers (required for checklist)

アプリケーションの設計、コーディング、およびテスト。

gcp-security-admins

アクセス管理や組織制約ポリシーを含む、組織全体のセキュリティポリシーの確立と管理。Google Cloudセキュリティ基盤ガイドについては、こちらを参照してください。

gcp-devops

継続的インテグレーションとデリバリー、監視、およびシステムプロビジョニングをサポートするエンドツーエンドのパイプラインの作成または管理。

gcp-logging-admins

gcp-logging-viewers

gcp-monitor-admins

gcp-billing-viewer (no longer by default)

プロジェクトの支出の監視。典型的なメンバーは財務チームの一員です。

gcp-platform-viewer (no longer by default)

Google Cloud組織全体のリソース情報のレビュー。

gcp-security-reviewer (no longer by default)

クラウドセキュリティのレビュー。

gcp-network-viewer (no longer by default)

ネットワーク構成のレビュー。

grp-gcp-audit-viewer (no longer by default)

監査ログの表示。

gcp-scc-admin (no longer by default)

Security Command Centerの管理。

gcp-secrets-admin (no longer by default)

Secret Managerでのシークレットの管理。

Default Password Policy

  • 強力なパスワードを強制

  • 8〜100文字

  • 再利用不可

  • 有効期限なし

  • Workspaceにサードパーティプロバイダーを通じてアクセスしている場合、これらの要件は適用されません。

Service accounts

これらはリソースアタッチされ、GCPと簡単にやり取りするためにアクセスできるプリンシパルです。例えば、VMにアタッチされたService Accountの認証トークンにメタデータでアクセスすることが可能です。 IAMとアクセススコープの両方を使用する際に競合が発生することがあります。例えば、サービスアカウントがcompute.instanceAdminのIAMロールを持っているが、侵入したインスタンスがhttps://www.googleapis.com/auth/compute.readonlyのスコープ制限で制限されている場合です。これにより、インスタンスに自動的に割り当てられた

PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_ID@appspot.gserviceaccount.com

しかし、リソースにカスタムサービスアカウントを作成してアタッチすることも可能であり、次のようになります:

SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com

Access scopes

Access scopeは、GCP APIエンドポイントにアクセスするために生成されたOAuthトークンに付与されます。これにより、OAuthトークンの権限が制限されます。 つまり、トークンがリソースのオーナーに属していても、そのリソースにアクセスするためのスコープがトークンに含まれていない場合、そのトークンはその権限を(悪用)するために使用することはできません

Googleは実際に、アクセススコープを使用せず、完全にIAMに依存することを推奨しています。ウェブ管理ポータルは実際にこれを強制していますが、カスタムサービスアカウントをプログラムで使用することで、インスタンスにアクセススコープを適用することはまだ可能です。

スコープ割り当てられているか確認するには、クエリを実行します:

curl 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<access_token>'

{
"issued_to": "223044615559.apps.googleusercontent.com",
"audience": "223044615559.apps.googleusercontent.com",
"user_id": "139746512919298469201",
"scope": "openid https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/sqlservice.login https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/accounts.reauth",
"expires_in": 2253,
"email": "username@testing.com",
"verified_email": true,
"access_type": "offline"
}

以前のスコープは、データにアクセスするために**gcloudを使用してデフォルトで生成されるものです。これは、gcloud**を使用すると、最初にOAuthトークンを作成し、それを使用してエンドポイントに接続するためです。

これらの中で最も重要なスコープは**cloud-platformで、基本的にGCPの任意のサービスにアクセス可能**であることを意味します。

すべての可能なスコープのリストはこちら確認できます

gcloudのブラウザ資格情報がある場合、他のスコープでトークンを取得することが可能で、次のように行います:

# Maybe you can get a user token with other scopes changing the scopes array from ~/.config/gcloud/credentials.db

# Set new scopes for SDKs credentials
gcloud auth application-default login --scopes=https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/sqlservice.login,https://www.googleapis.com/auth/appengine.admin,https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/accounts.reauth,https://www.googleapis.com/auth/admin.directory.user,https://www.googleapis.com/auth/admin.directory.group,https://www.googleapis.com/auth/admin.directory.domain,https://www.googleapis.com/auth/admin.directory.user

# Print new token
gcloud auth application-default print-access-token

# To use this token with some API you might need to use curl to indicate the project header with --header "X-Goog-User-Project: <project-name>"

Terraform IAM Policies, Bindings and Memberships

Terraformによって定義されているように、https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iamを使用してGCPでプリンシパルにリソースへのアクセスを付与する方法にはいくつかの方法があります:

  • Memberships: 役割のメンバーとしてプリンシパルを設定します。役割やプリンシパルに制限はありません。ユーザーを役割のメンバーとして設定し、同じ役割のメンバーとしてグループを設定し、さらに他の役割のメンバーとしてこれらのプリンシパル(ユーザーとグループ)を設定することができます。

  • Bindings: 複数のプリンシパルを役割にバインドできます。これらのプリンシパルは他の役割にバインドされたり、メンバーになったりすることができます。しかし、バインドされていないプリンシパルがバインドされた役割のメンバーとして設定されている場合、次回バインディングが適用されるとメンバーシップは消えます

  • Policies: ポリシーは権威的であり、役割とプリンシパルを示し、その後、これらのプリンシパルは他の役割を持つことができず、これらの役割は他のプリンシパルを持つことができません(他のポリシー、バインディング、メンバーシップでも同様)。したがって、ポリシーで役割やプリンシパルが指定されると、そのすべての特権はそのポリシーによって制限されます。もちろん、プリンシパルがポリシーを変更するオプションや特権昇格の権限を与えられている場合は、この制限を回避できます(新しいプリンシパルを作成し、新しい役割をバインドするなど)。

References

Support HackTricks

Last updated