サービス概要
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
- An Automated Approach to Convert Okta System Logs into Open Cybersecurity Schema Framework (OCSF) Schema
- AWS EventBridgeログストリームを追加する
- https://github.com/okta/okta-ocsf-syslog/
- Terraform で Kinesis Firehose のエラーを CloudWatch Logs に送る
注意事項
- OktaのWorkforce Identity Cloudは、無料期間限定で使用できるフリートライアル版では、[ログストリーミング]のメニューが現れないため、必ず商用版を使用してください。
概要図
上記の構成図が理想ですが、検証では簡略化のため、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.あとはデフォルトのまま[ルールの作成]
- Kinesis Firehoseの設定
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."
}
}]
}