OktaのシステムログをS3に掃き出す検証

サービス概要

Oktaとは、IDやパスワードの管理、認証を行うIDaaSサービスです。

目的・やりたいこと

Oktaのシステム監査ログを、AWSと連携してS3に掃き出す。

対象者

OktaのシステムログをS3に保管したい運用管理者

対象となる技術

  • Okta
  • EventBridge
  • Kinesis Data Firehose
  • S3

条件(導入にあたっての前提事項)

  • EventBridgeルールがターゲットにアクセスするときのロール「csi-se007-infra-kinesis-firehose-role」には、Firehoseへのフルアクセスポリシーと以下の信頼関係を付与
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "events.amazonaws.com",
                    "firehose.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  • Kinesis Firehoseを作成するときのサービスアクセスのロールには、念のためS3のフルアクセスを付与

参考URL

  1. An Automated Approach to Convert Okta System Logs into Open Cybersecurity Schema Framework (OCSF) Schema
  2. AWS EventBridgeログストリームを追加する
  3. https://github.com/okta/okta-ocsf-syslog/
  4. Terraform で Kinesis Firehose のエラーを CloudWatch Logs に送る

注意事項

  • OktaのWorkforce Identity Cloudは、無料期間限定で使用できるフリートライアル版では、[ログストリーミング]のメニューが現れないため、必ず商用版を使用してください。

概要図


https://www.okta.com/sites/default/files/styles/1640w_scaled/public/media/image/2023-05/Screenshot%202023-05-03%20at%203.32.39%20PM.png?itok=DiNjPyO0 より)

上記の構成図が理想ですが、検証では簡略化のため、Lambda、Glue、Security Lakeの三つを省いて以下の構成にしています。
Okta⇨Event Bus⇨EventBridge⇨Kinesis Firehose⇨S3

作業の流れ

事前作業

事前作業では、大きくOktaでの事前登録、AWS側での設定の二つに分かれます。

Oktaでの事前登録

1.[レポート] > [ログストリーミング]から[ログストリームを追加]

2.AWS EventBridgeを選択して[次へ]

3.例えば次のように入力して[保存]


これで該当のAWSアカウント側とOktaが連携する準備が整いました。

AWS側での設定

  • EventBridgeの設定

1.EventBridgeで[🔻統合] > [パートナーイベントソース]で表示されるため、選択して[イベントバスと関連づける]

2.[🔻バス] > [イベントバス]でカスタムイベントバスが表示されることを確認

3.[ルール]で2.のイベントバスを選択し、[ルールを作成]

4.適当に名前を入力し、[次へ]

5.[イベントソース]はその他、[イベントパターン]は今回OktaのRSAアプリだけを抽出するため、以下のターゲットIDとタイプを指定する

{
  "source": [{
    "prefix": "aws.partner/"
  }, {
    "anything-but": {
      "prefix": "aws."
    }
  }],
  "detail.target.id": ["0oaaxhrubefY4WRbP1d7"],
  "detail.target.type": ["AppInstance"]
}

6.ターゲットは次のように指定して[次へ]


この際設定するロールについては、前提条件参照

7.あとはデフォルトのまま[ルールの作成]

 

1.[Data Firehose] > [配信ストリームの作成]

2.送信先はS3

3.S3バケットは適当なものを設定、/systemlog配下に吐き出して、[配信ストリームを作成]


ちなみに詳細設定の[CloudWatch エラーのログ記録]はデフォルトのまま有効にしておきましょう。

検証手順

ここでは、OktaのRSAアプリを起動させてその際のログがS3に出力されることを確認します。

1.OktaのRSAアプリをクリック

2.すると以下のページが表示される

3.RSAに関するシステムログが残ることを確認

4.EventBridgeルールの[モニタリング]タブで、該当時間にInvocations、TriggeredRulesが無事記録されており、FailedInvocationsの出力がないことを確認

5.Kinesis Firehoseの[モニタリング]タブで、該当時間に「Amazon S3 への配信が成功しました」DeliveryToS3.Succsessが記録されていることを確認

6.S3の当該バケットに当該時間帯のログがあることを確認

7.念のためダウンロードして中身を確認
そのままだと見にくいので、json整形ツールで変換
以下のように無事target.id=0oaaxhrubefY4WRbP1d7の物だけを含んだログが表示されることを確認

〜略〜
        "target" : [
            {
                "id" : "0oaaxhrubefY4WRbP1d7",
                "type" : "AppInstance",
                "alternateId" : "RSA SAML Test Service Provider",
                "displayName" : "RSA SAML Test Service Provider",
                "detailEntry" : {
                    "signOnModeType" : "SAML_2_0",
                    "signOnModeEvaluationResult" : "AUTHENTICATED"
                }
            },
            {
                "id" : "rulanyibaeNdyPYQZ1d7",
                "type" : "Rule",
                "alternateId" : "unknown",
                "displayName" : "Rule for External_OktaAuth",
                "detailEntry" : null
            }
        ]
 〜略〜

所要時間

2時間

カスタマイズ

以下のEventBrideルールのイベントパターン条件で、Amazonアプリによるサインインまたはポリシー評価サインオンのログだけを発行することに成功

{
  "detail.eventType": ["user.authentication.sso", "policy.evaluate_sign_on"],
  "detail.target.id": ["0oab9aw8yaouf1TFr1d7"],
  "detail.target.type": ["AppInstance"],
  "source": [{
    "prefix": "aws.partner/"
  }, {
    "anything-but": {
      "prefix": "aws."
    }
  }]
}