はじめのGCP㉑Cloud Loggingからアラート通知を作成する方法を説明します!

クラウド

今回は、Cloud Loggingからアラート通知を作成する方法を説明します。

以前のブログで、Cloud Loggingのログから特定の文字列を検出して通知する方法として、Cloud Pub/SubとCloud Funcitonsを使用する方法を説明しました。しかし、わざわざこの2つのサービスを使わなくても、Cloud Loggingのログからアラートを作成することができましたので、今回はその方法を説明します。

アラート通知を行うことで、組織で使用しているGoogle Cloudを監視することができます。情報システム担当者やインフラ担当者必見の内容となっております。

是非、最後までご覧いただけると嬉しいです。

Cloud Loggingとは

Cloud Logging とは、リアルタイムのログ管理システムです。Cloud Loggingでは、検索や分析、モニタリングをサポートしています。各種Google Cloud リソースから自動的にログを収集します。

Cloud Loggingについては、以前のブログで詳しく説明していますので、そちらをご参考ください。

Logging のクエリ言語

アラートを作成する際、特定のログを検出するために、クエリを使用します。クエリ(query)とは、問い合わせや要求などのことを言います。様々なログから特定のキーワードやリソースでクエリを作成できます。まずは、Loggingのクエリ言語について説明します。

Loggingのクエリ言語のサンプルは下記になります。

logName: "projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gcs_bucket"
protoPayload.authorizationInfo.permission = "storage.buckets.delete"

1.クエリの表記方法

クエリには大きく3つの要素があります。

  1. ログ名(Log Name)
    ログ名は、コロン(”:”)を使用します。
    例)logName: “projects/project-id/logs/cloudaudit.googleapis.com%2Factivity”
  2. ラベル(Labels)
    ラベルは、イコール(”=”)を使用します。
    例)resource.type=”gcs_bucket”
  3. フィールド(Fields)
    フィールドは、ドット(”.”)を使用して階層構造を表現し、コロン(”:”)を使用して値を指定します。
    例)protoPayload.authorizationInfo.permission = “storage.buckets.delete”

このように、Logging のクエリ言語では、ログ名ラベルフィールドの3つを組み合わせて、クエリを作成します。

そのほかのサンプルクエリについては、下記Google ドキュメントをご参考ください。

サンプルクエリ  |  Cloud Logging  |  Google Cloud

アラートの作成方法

それでは、実際にアラートを作成します。今回作成するアラートの仕様は、

ドメイン外のユーザーが、プロジェクトリソースにオーナーロールを付与されたらアラート通知する

上記とします。

GCPのプロジェクトリソースにオーナーロールが付与されると、他のユーザーをプロジェクト参加させることができます。セキュリティリスクが高くなので、今回は、それを検知するアラートを作成します。

私のLoggingクエリの作り方

私がLoggingのクエリを作成する際に使用している方法は、実際のログを参照する方法です。今回は、クエリを作成するため、一時的にドメイン外のユーザー(プリンシパル)にオーナーロールを付与しました。そのときのログが、下記になります。一部変更しています。

{
    "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "status": {},
        "authenticationInfo": {
            "principalEmail": "administrator@domain_name"
        },
        "requestMetadata": {
            "callerIp": "123.45.67.89",
            "callerSuppliedUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36,gzip(gfe),gzip(gfe)",
            "requestAttributes": {},
            "destinationAttributes": {}
        },
        "serviceName": "cloudresourcemanager.googleapis.com",
        "methodName": "InsertProjectOwnershipInvite",
        "authorizationInfo": [
            {
                "resource": "projects/project_ID",
                "permission": "resourcemanager.projects.setIamPolicy",
                "granted": true,
                "resourceAttributes": {
                    "service": "cloudresourcemanager.googleapis.com",
                    "name": "projects/project_ID",
                    "type": "cloudresourcemanager.googleapis.com/Project"
                }
            },
            {
                "permission": "resourcemanager.projects.setIamPolicy",
                "granted": true,
                "resourceAttributes": {}
            }
        ],
        "resourceName": "projects/project_ID",
        "request": {
            "member": "user:E-Mail Address",
            "projectId": "project_ID",
            "@type": "type.googleapis.com/google.internal.cloud.resourcemanager.InsertProjectOwnershipInviteRequest"
        },
        "response": {
            "@type": "type.googleapis.com/google.internal.cloud.resourcemanager.InsertProjectOwnershipInviteResponse"
        }
    },
    "insertId": "-idjskdik86",
    "resource": {
        "type": "project",
        "labels": {
            "project_id": "project_ID"
        }
    },
    "timestamp": "2023-06-11T09:15:41.404781Z",
    "severity": "NOTICE",
    "logName": "projects/project_ID/logs/cloudaudit.googleapis.com%2Factivity",
    "receiveTimestamp": "2023-06-11T09:15:42.403388641Z"
}

まず、オーナーロールが付与されたユーザーは、

"member": "user:E-Mail Address",

上記に記述されています。

ここのクエリは、

NOT protoPayload.request.member = "*@domain_name"

になります。「domain_name」の部分は、GCPを使用している実際のドメイン名にします。「*」でワイルドカードを定義しており、最初に「NOT」を付けているので、「ドメイン以外の全てのメールアドレス」という指定になります。

次に、プロジェクトにオーナーロールが付与されている記述は、

"methodName": "InsertProjectOwnershipInvite",

で定義されています。これを、クエリを使用して記述すると、

protoPayload.methodName = "InsertProjectOwnershipInvite"

になります。フィールドは、上から値を一つずつ「.(ピリオド)」で繋げる方法になります。

以上のことから、ドメイン外のアカウントが、プロジェクトリソースにオーナーロールを付与のクエリは、

protoPayload.methodName = "InsertProjectOwnershipInvite"
NOT protoPayload.request.member = "*@domain_name"

になります。これを、アラート作成する際のフィルタに記述します。

ログベースのアラート ポリシー作成手順

それでは、実際にログベースのアラート ポリシーを作成します。作成は、全6ステップです。

  1. Cloud Loggingを開く
  2. アラートを作成
  3. アラートポリシー名を設定
  4. ログフィルタ入力
  5. 通知の間隔とインシデントの自動クローズ期間を設定
  6. 通知チャンネル

1.Cloud Loggingを開く

コンソール上部の検索窓から「Logging」で検索をかけて、ロギング(Cloud Logging)を開きます。

2.アラートを作成

クエリフィールド右下の「アラートを作成」を選択します。

3.アラートポリシー名を設定

「Alert Policy Name」を設定します。「Documentation」は任意です。設定後、「次へ」を選択します。

  • Alert Policy Name:必須
  • Documentation:任意

4.ログフィルタ入力

先程作成したクエリを入力後、「次へ」を選択します。

5.通知の間隔とインシデントの自動クローズ期間を設定

通知の間隔は、最初のアラートを検出してから、次のアラートを検出するまでの時間です。最速は5分です。インシデントの自動クローズ期間は、アラート通知を行うと、Cloud Monitoringの「Incidents」項目に表示します。そこから削除するまでの期間です。最長が7日です。私は初期設定を使用しています。設定後、「次へ」を選択します。

  • 通知の間隔:5分/10分/15分/30分/1時間/6時間/12時間/1日/2日/3日/7日/Custom から選択
  • インシデントの自動クローズ期間:30分/1時間/6時間/12時間/1日/2日/3日/7日/Custom から選択

Cloud Monitoringの「Incidents」項目は、下記になります。

6.通知チャンネル

通知チャンネルの選択を行います。通知チャンネルは、以前のブログで作成した「Notification_Alert」を使用します。選択後、「SAVE」を選択します。

正常に作成されると、Cloud Monitoringの「Policies」に表示されます。

ログベースのアラート ポリシー作成手順は、以上になります。

アラートメール

最後に、実際のアラートメールをお見せします。一部隠しています。

まとめ

本日は、下記3点について説明しました。

  1. Cloud Loggingとは
  2. Logging のクエリ言語
  3. アラートの作成方法

Google Cloudを使用する上で、様々な監視を行うはとても重要です。組織で使用する場合、リソースの作成方法によっては、機密情報が漏れてしまったり、セキュリティリスクが高くなったりするので、監視は必須です。セキュリティ事故が発生しないように、アラートポリシーを作成し、Google Cloudの利用を監視しましょう。

また、今回は、IAMの監視について説明しましたが、使用しているリソースの負荷状況等(CPU使用率、メモリ消費量)を監視する際も、Cloud Loggingのアラート通知を使用します。今回説明したことを実践し、安心・安全なクラウド生活を送ってください。

これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!

それでは、次回のブログで!

タイトルとURLをコピーしました