Audit Logs を活用したリアルタイムアラートで Google Cloud の Service Account Key 運用を安全にする

2023-11-17

はじめに

こんにちは。株式会社 Belong で SRE をしている shigwata です。

昨今、セキュリティインシデントを多く見かけるようになりました。 Google Cloud を利用してセキュリティインシデントを起こさないためには、Service Account の運用を適切に行うことが重要です。

Belong では、Service Account 運用のセキュリティ向上のため、以前紹介 した OIDC を利用しています。OIDC を利用することで、Service Account Key の利用は減少しました。
しかし、Service Account Key の利用がなくなったわけではありません。減少したとはいえ、Service Account Key を利用するケースは少なからずあります。

本記事では、Service Account Key の発行が避けられないという状況を考慮し、管理者が Service Account Key の発行をリアルタイムで知ることができる仕組みを紹介します。

Service Account Key の重要性と安全な運用の背景

Service Account Key は Google Cloud でサービスやアプリケーションが他のサービスと対話するための認証手段です。JSON 形式のファイルで提供され、認証情報(クライアント ID、クライアントシークレット、プロジェクト ID など)を含みます。これを使用することで、アプリケーションは Google Cloud API へのアクセス権を得ます。Service Account には IAM ロールが割り当てられ、これによってアクセス権限が制御されます。ただし、鍵は機密情報であり、適切な管理が必要です。漏洩によるセキュリティリスクがあるため、安全な保存や定期的なローテーションが不可欠です。

Audit Logs を活用したリアルタイムアラートの仕組み

Audit Logs(監査ログ) を活用したリアルタイムアラートのアーキテクチャ図は、以下の通りです。

auditlog-alert

このアーキテクチャ図では、以下のようなプロセスが示されています:

  1. Service Account Key の発行: ユーザーが Service Account Key を発行します。この操作は Google Cloud の Audit Logs に記録されます。

  2. Audit Logs の収集: Audit Logs は Aggregated sinks(集約シンク)によって収集されます。Aggregated sinks は複数のプロジェクトのログを組織やフォルダのレベルで作成し、配下のプロジェクトのログを集約します。

  3. Cloud Pub/Sub へのエクスポート: Aggregated sinks はログを Cloud Pub/Sub トピックにエクスポートします。Cloud Pub/Sub はリアルタイムのメッセージングサービスで、メッセージの配信を保証します。

  4. Cloud Functions のトリガー: Cloud Pub/Sub トピックは Cloud Functions をトリガーします。Cloud Functions はイベント駆動のサーバーレスコンピューティングサービスで、Cloud Pub/Sub メッセージを受け取ると関数が実行されます。

  5. Slack への通知: Cloud Functions は Slack API を使用してリアルタイムのアラートを送信します。これにより、Service Account Key の発行がリアルタイムで監視され、必要な場合にはすぐに対応することができます。

このアーキテクチャは、Audit Logs を活用したリアルタイムアラートの仕組みの一例です。この仕組みを利用することで、Google Cloud の運用をより安全かつ効率的に行うことができます。

このアーキテクチャの重要な点を以下で説明します。

Audit Logs

Audit Logs は Google Cloud での操作やイベントに関する「いつ誰がどこで何をしたか」という情報を記録します。これにより、Google Cloud のデータとシステムをモニタリングして、脆弱性や外部データの不正使用の可能性を確認できるようになります。 また、Audit Logs は Cloud Logging や Cloud Monitoring を通じてアクセス可能で、これらのツールを使用することでリアルタイムな監視やアラートの設定が可能です。

Service Account Key の発行イベントも、Audit Logs に記録されます。以下のようなログ1が Cloud Logging に記録されます。

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "sam@example.com"
    },
    "methodName": "google.iam.admin.v1.CreateServiceAccountKey",
    "request": {
      "@type": "type.googleapis.com/google.iam.admin.v1.CreateServiceAccountKeyRequest",
      "name": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
    },
    "resourceName": "projects/-/serviceAccounts/123456789012345678901"
  },
  "resource": {
    "type": "service_account"
  }
}

Aggregated sinks

Aggregated sinks は複数のプロジェクトのログを組織やフォルダのレベルで作成し、配下のプロジェクトのログを集約することができます。これにより、ログの一元管理や、ログのエクスポートを簡単に行うことができます。 シンク先には、Cloud Storage、BigQuery、Cloud Pub/Sub などが利用できます。今回は、Cloud Pub/Sub を利用します。

Service Account Key の発行を収集するためフィルタ条件は次のようになります。2

resource.type = "service_account"
protoPayload.serviceName = "iam.googleapis.com"
protoPayload.methodName:"CreateServiceAccountKey"
log_id("cloudaudit.googleapis.com/activity")

Aggregated sinks は次のようなコマンドで作成可能です。3

gcloud logging sinks create ${SINK_NAME} \
  pubsub.googleapis.com/projects/${PROJECT_ID}/topics/${TOPIC_ID} \
  --include-children \
  --organization=${ORGANIZATION_ID} \
  --log-filter="resource.type=service_account protoPayload.serviceName=iam.googleapis.com protoPayload.methodName:CreateServiceAccountKey log_id(cloudaudit.googleapis.com/activity)"

まとめ

今回は、Service Account Key を発行した場合に、リアルタイムに Slack に通知する仕組みを紹介しましたが、Audit Logs を活用したリアルタイムアラートの仕組みを利用することで、様々なアラートを設定することができます。 例えば、ユーザーが特定のリソース(例えば、Cloud Storage バケット)に対して不適切なアクセス権を設定した場合にアラートを設定することができます。これにより、誤って公開されたリソースをすぐに特定し、適切なアクセス権に修正することができます。 また特定の API(例えば、BigQuery API)の使用量が一定の閾値を超えた場合にアラートを設定することができます。これにより、予期せぬ課金を防ぐことができます。

Belong では、Google Cloud の運用に興味がある方を募集しています。 もし弊社に興味を持っていただけたら <エンジニアリングチーム紹介ページ> をご覧いただけたら幸いです。

Footnotes

  1. Service Account Key を作成した場合のログ

  2. Google Cloud 公式のサンプルクエリ

  3. Aggregated sinks の作成