SIEM on Amazon OpenSearchのデプロイ方法とパラメータ徹底解説【SIEM on AOSを1から学ぶ!第二弾】

記事タイトルとURLをコピーする

「漠然とデータを採っているが活用できていない」「ログ分析の手間を減らしたい」…
シリーズ第二弾では、実際にSIEM on AOSをデプロイしてみましょう。躓きやすいポイントとパラメータも細かく解説します。

はじめに

図解が好きな垣見(かきみ)です。

SIEM on AOSを1から学ぶ!ブログシリーズ第二弾です。第一弾では概要を説明したので、次は実際にデプロイしてみましょう。
今回のゴールはもちろん、「実際にSIEMがデプロイできるようになること」です。
ついでにCloudTrailのレプリケーションでのログ連携も試してみます。よろしくお願いします。

SIEM on OpenSearch Service(公式): github.com

シリーズ第一弾(SIEMとは?SIEM on AOSで何が見られる?)
シリーズ第三弾(できたリソースを全て確認してみる)
色々試してみた(過去ブログ、上級者向け)

公式のワークショップもあるのですが、私はいくつかハマった箇所があったので、パラメータを詳しく説明しながら見ていきます。

やること

  • 個人検証用環境にSIEM on Amazon OpenSearchをデプロイする
  • SIEM on AOSにCloudTrailのログをレプリケーションで連携してみる
  • リソースの削除方法を知る

構成図。灰色以外の部分ができます。頑張って書いた構成図なのでたくさん載せます。

準備・注意事項

よくお読みください。

  • 作成時に必要なので、VPN等、利用者のglobal IP adressをがわかるようにしておいてください
  • 利用時には毎回、VPNなどを繋いで作成時に設定したglobal IP adressと同じアドレスになるようにしてください(作成後のダッシュボードログインに必要です)

    • 何らかの理由でglobal IP adressが変わってしまった場合、新たに設定をし直す必要があります。後述の「ダッシュボードへのログイン」>「エラー時」をご覧ください
      余談ですが、SWXにはこんな社内ツールも存在します。
  • 検証にかかる料金について、OpenSearchは1日でこれくらいかかります。消し忘れや予算オーバーが無いように注意してください

    • その他リソースは別要因で動いているところもあるので写真で表示される合計コストには揺れがあります。すみません

作成後、丸一日放置したときのCost Explorerの表示

  • GeoIP機能(IPアドレスの国別マッピング機能)を使いたい場合、事前にこちらの弊社ブログに従ってMaxmindのライセンスキーを取得し、メモしておいてください

最初のみブログと画面が異なりますが「Learn more」以降は一緒です

  • デプロイには30分程度かかります
  • 作成のための権限周りについては今回は取り扱いません
  • 一度CloudFormationスタックを作成してから何らかの原因で削除する場合は、手動でいくつかのリソースを削除する必要があります
    • 削除の章で詳しく解説するので、削除時はスタック削除だけで終わらせないでください
    • 特にもう一度リソースを作りたい場合は、同名のリソースが残っていると失敗します。KMSのキーはすぐには消せないので名前を変更する必要があります。ハマりポイントです

作成

実際に作っていきましょう。

CloudFormation作成手順

検索窓でCloudFormationと検索して移動し、「スタック」を選択
【スタックの作成】>【新しいリソースを使用(標準)】

ClourFormationステップ1, 2, 3, 4

ステップ1. スタックの作成

  1. 【既存のテンプレートを選択】
  2. 【Amazon S3 URL】
  3. こちらのリンクから、デプロイするリージョンが一致するTemlate URLをコピーして【Amazon S3 URL】に入力
  4. 【次へ】

ステップ2. スタックの詳細

下に表形式でパラメータをまとめたので、「とりあえず動かしたい」という場合は備考に「★必須★」とある最初の2つだけ実施して後はそのままでも良いです。

スタック名を提供
見出し 解説 記入内容 備考
スタック名 CloudFormationのスタック名 【判別できる任意の名前】を入力する ★必須★
Initial Deployment Parameters
見出し 解説 記入内容 備考
AllowedSourceIpAddresses ダッシュボードアクセスを許可するアドレス。最初からあるアドレスはVPC内のルーティング用 末尾に【スペース+冒頭でメモしたMyGlobalIPアドレス】を書き加える ★必須★
(後からOpenSearchコンソールで変更可能)
Basic Configuration
見出し 解説 記入内容 備考
DeploymentTarget OpenSearchの形式でServerlessと選べる(未検証) 【opensearch_managed_cluster】のままで良い
DomainOrCollectionName OpenSearch上に表示される任意のダッシュボードドメイン名 任意で書き換える デフォルトはaes-siem(aesはamazon elastic opensearch の略)
SnsEmail SIEMのアラート通知先。SIEMそのものの異常通知も来る 任意で【通知先メールアドレス】を入力する Amazon SNS トピックにこのメールアドレスが登録され、OpenSearchダッシュボード> Destinations に SNS を選択することでアラートメールを送信する
ReservedConcurrency Lambda(es-loader)の予約同時実行数 エラーがないのにログ取り込み遅延やThrottleが常時発生する場合は、この値を大きくする(後述 デフォルト10
Log Enrichment - optional
見出し 解説 記入内容 備考
GeoLite2LicenseKey 冒頭でメモしたGeoLite2 Freeのライセンスキー 機能を使わないなら空欄 IPアドレスと国の紐づけが可能になる
TrustedProxyIpList ELB/CDN/ProxyサーバーのIPアドレスまたはネットワークアドレス 使わないならデフォルトのまま
OtxApiKey AlienVault OTXのAPIキー 使わないなら【空欄】のまま
EnableTor TOR IoCのダウンロード 使わないなら【false】のまま
EnableAbuseCh IoC from abuse.chのダウンロード 使わないなら【false】のまま
IocDownloadInterval 上記IoCのダウンロードインターバル 使わないなら【720】のまま
Advanced Configuration - optional
見出し 解説 記入内容 備考
LogBucketPolicyUpdate Log バケットのポリシーについて 初回は必ず【update_and_override】のまま。更新時には【keep】ではなく【update_and_override】を選択した場合、S3 Logバケットにログを書き込むためのバケットポリシーを自分で作成・管理する必要がある
VpcEndpointId Lambda 関数や他の数リソースをVPC内からのアクセスにしたいときは事前作成したVPCエンドポイントIDを入れる。グローバルアクセスならなし
CreateS3VpcEndpoint 既にあるものを使いたいなら【false】、それ以外は【true】
CreateSqsVpcEndpoin 同上
CreateSsmVpcEndpoint 同上
CreateStsVpcEndpoint 同上

※これ以降の項目はControl Towerとの統合・Security Lakeとの統合時以外は空白でOKです

参考:Control Towerとの統合時は以下の項目を入力する

Control Tower Integration - optional(詳細)

  • AWS Control Tower の Log Archive アカウントにあるログバケットのデータをそのまま SIEM on OpenSearch に取り込むことができます。
見出し 記入内容
ControlTowerLogBucketNameList Log Archive アカウントにある S3 バケット名を指定する
ControlTowerSqsForLogBuckets Log Archive アカウントで作成した SQS の ARN を指定する
ControlTowerRoleArnForEsLoader aes-siem-es-loader が引き受けるために作成した IAM Role の ARN を指定する

参考:Security Lakeとの統合時は以下の項目を入力する

Security Lake Integration - optional(詳細)

  • Amazon Security Lake のデータをそのまま SIEM on OpenSearch に取り込むことができます。
見出し 記入内容
SecurityLakeSubscriberSqs Security Lake が作成するサブスクライバーの SQS の ARN を指定する
SecurityLakeRoleArn Security Lake が作成するサブスクライバーの IAM Role の ARN を指定する
SecurityLakeExternalId Security Lake でサブスクライバー作成時に指定した external ID を指定する

参考:LambdaのQuota数について(ReservedConcurrency)

ReservedConcurrency「エラーがないのにログ取り込み遅延やThrottleが常時発生する場合は、この値を大きくする」について

  • Lambda では、関数の実行と保存に使用できるコンピューティングおよびストレージリソースの量に対してクォータを設定します。同時実行とストレージのクォータは、AWS リージョンごとに適用されます。一つアカウントに対して同時実行数のクォータのデフォルト値は1000です。
  • CloudFormationスタックのデプロイ対象アカウント・リージョンのLambdaクォータ数が上限に達している場合、クォータ不足が原因でスタック作成が失敗します。対象アカウントを確認し、必要に応じた引き上げなどを行った上でデプロイしてください。
  • 【ReservedConcurrency】のデフォルトは[10]ですが、エラーがないにもかかわらずログ取り込み遅延やThrottleが常時発生する場合は【ReservedConcurrency】の値を増やしてください。

ステップ3. スタックオプションの設定

ハンズオンでは触らなくてよい部分です。基本的なCloudFormationのオプションとなっています。

  • タグ:必要であれば付ける
  • アクセス許可:CloudFormation が引き受けることができる既存のIAMサービスロールを指定できる。作成のために必要なら変更する。
  • スタックの失敗オプション
    • プロビジョニング失敗時の動作:全てのスタックリソースをロールバックする
    • ロールバック中に新しく作成されたリソースを削除する:削除ポリシーを使用する
  • 詳細オプション:全て必要なければデフォルトのまま
    • スタックポリシー:指定したリソースに対して実行できる更新アクションを定義するJSON
    • ロールバック設定:スタック作成/更新時にロールバック基準値にできるCloudFormationアラーム
    • 通知オプション:スタッフ作成失敗の通知が欲しければ設定
    • スタックの作成オプション:スタック作成のタイムアウトおよび終了保護オプション

ステップ4. 確認して作成

パラメータはこんな感じになるはず。

問題がなさそうならチェックを入れて【送信】してください。

35分ほどかかります。(OpenSearchのドメイン作成に時間がかかる模様)
もし失敗&ロールバックが起っていたら「スタック削除 / 再作成時の注意」を見て該当リソースを削除してから再トライしましょう。(何もせずもう一度やるとリソースが残っているので失敗します)

入力したメールアドレス宛てに、「AWS Notification - Subscription Confirmation」が届くので [Confirm subscription] をしてください。

CloudFormationスタック削除 / 再作成時の注意

CloudFormationスタック削除(ロールバック含む)だけでは消えないリソースがいくつかあります。
特にCloudFormationスタック作成の再実行時、同じ名前のリソースが既にあることで作成に失敗するので、スタックと合わせて漏れなく削除しましょう。

  • CloudFormationスタックを削除しても残るリソース
    • OpenSearch Service ドメイン(デフォルト名:aes-siem)
    • S3 バケット×3
    • AWS KMS カスタマーマネージドキー: aes-siem-key (後述のkeyの削除方法は特に注意です)

リソース削除手順(ログ連携前の場合)

Cloudformationスタック作成失敗のロールバック手続きはここです。

  • CloudFormationスタックを削除する(3分程度で削除できます)
  • 以下、リソースを削除していく
    • OpenSearch Service domain: aes-siem
    • Amazon S3 bucket(中身が入っている場合は中身を先に削除する):
      • aes-siem-XXXXXXXXXXXX-log
      • aes-siem-XXXXXXXXXXXX-snapshot
      • aes-siem-XXXXXXXXXXXX-geo
  • AWS KMS カスタマーマネージドキー(aes-siem-key)の削除をスケジュールする
    • Keyは最低7日間残るため、AWS CLI画面で以下のコマンドを順に打ちこんでkeyのエイリアス名を削除することで再作成の際に干渉しないようにする(再作成しないなら削除のみで不要)
export AWS_DEFAULT_REGION=【AWS_REGIONに置き換えてください】
aws kms delete-alias --alias-name  "alias/aes-siem-key"

  • SIEM on OpenSearch Service を Amazon VPC 内にデプロイした場合は以下の AWS リソースも削除してください
    • Amazon VPC: aes-siem/VpcAesSiem (VPC を新規に作成した場合)
    • SecurityGroup: aes-siem-vpc-sg

その他のリソースを追加で作成していた場合はそちらも削除してください。

リソース削除手順(ログ連携後の場合)

もし連携用のログ取得や連携したEC2作成を行っていた場合は、以下ワークショップ手順を参考にそちらも削除してください。
参考: catalog.us-east-1.prod.workshops.aws

ダッシュボードへのログイン

いよいよログインです!
まず、VPNに繋ぐなどして、先ほど入力したGlobal IPアドレスになっているか確認してください。

ログイン情報が必要なので、CloudFormationの【出力】からAdminIDとPasswordをメモしておいてください。

ログイン場所に移動します。
【OpenSearchコンソール】>【一覧からドメイン名(スタックの詳細を指定」のBasic Configuration > DeploymentTargetDomainOrCollectionNameに該当)を選択】>URLをクリック
これでログインできるはずです!


もしもログイン画面ではなく{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet because no resource-based policy allows the es:ESHttpGet action"} とエラー表示された場合、VPNがつながれていないか自身のGlobal IPアドレスがOpenSearchで許可されていない可能性があります。

【OpenSearchコンソール】>【作成したドメイン名】>【セキュリティ設定】のアクセスポリシーJSONを確認し、現在繋いでいる(/許可したい)VPNのIPアドレスが入っているか確認してください。なければaws:SourceIpの中身に追加してください。
※aws:SourceIpは【CloudFormationステップ2.スタックの詳細】の【Initial Deployment Parameters】が反映される項目です

ログイン画面でCloudFormationの【出力】からメモした初期Username(AdminID)とPasswordを入れるとログインできます。

最初のログインではテナント選択画面になるのでGlobalを選択してください。

Globalだと複数人で結果が共有されるようになり、デプロイ時に自動で作成済みのダッシュボード等を利用できます。
※Private を選んでしまっても、Login 後に画面右上の丸いアイコンを選択して Switch tenants をクリックすると、同じ選択画面を表示できます。

ちなみに、Privateを選ぶと自分だけの環境になります。各ユーザー専用のダッシュボード等を用意して、カスタマイズをすることもできます。
Global を選んでいなくても、OpenSearch Dashboards の Dashboard等 のファイルをこちらの手順に従ってダウンロード・インポート設定をすることで、個人環境でダッシュボードが用意できます。

下記のポップアップ画面が表示されたら、[Dismiss] を選択してください。

お疲れ様です。これがホーム画面です。
ただ、このままではまだログを取得することはできません。

実際に使うときはセキュリティのため、右上丸からパスワードを変更してください。(パスワード管理は組織のルールに従ってください)

ログの取得設定(CloudTrailレプリケーション)

各種logをlog用S3に集約させる必要があるので、今回はCloudTrailを連携してみましょう。
その他logについては基本公式ワークショップの通りなので基本的にはこちらを見てください。

CloudTrailログ取得について

CloudTrailの1つの証跡とS3は1つしか関連付けられません。
SIEM用に証跡を新たに取得する場合は公式ワークショップの手順に従ってログ取得S3を指定してしまうのが良いです。(左図)

既に取得している場合、新たな証跡を作成してもよいのですが、その分お金がかかってしまいます。そのため、この資料には【既にあるCloudTrail証跡用に作られたS3バケットからSIEMログ用S3にレプリケーションする方法】を記載します。アカウントをまたいだSIEM集約もこのレプリケーションを使っての応用になります。(右図)

既存CloudTrailログのレプリケーション方法

  • 現在CloudTrailのログを取得しているバケットAのバージョニングを有効にする
    • S3>【バケットA】>【プロパティ】>バケットのバージョニング【編集】>【有効にする】>【保存】
  • log用S3のバージョニングが有効なのを確認する
  • S3>【バケットA】>【管理】>【レプリケーションルールを作成】>以下設定
    • 送信元
      • レプリケーションルール名:適宜
      • ステータス:有効
      • ルールスコープ:バケット内のすべてのオブジェクトに適用(そのままのバケット構造で大丈夫です)
    • 送信先
      • 【このアカウントのバケットを選択する】にチェック
      • バケット名:log用S3(「S3の参照」から選ばないと認識してもらえないことがあります)
      • IAMロール:新しく作成(CloudFormationでは作ってもらえません)
    • 暗号化
      • 【AWS Key Management Service (AWS KMS)で暗号化されたオブジェクトをレプリケートする】にチェックを入れる
      • 【aes-siem-key】を選ぶ
    • 残りはいじらなくてOK。リアルタイム性重視なら【レプリケーション時間のコントロール (RTC)】にチェックを入れるのもありかも(追加料金が発生します)
    • 【保存】をクリック
  • これまでの証跡をレプリケートすると、SIEM作成以前のデータが取得できます。
    • 大量だと時間がかかったりes-loaderが失敗するかもしれません(未検証なので注意してください)

おめでとうございます。設定完了です! 【S3>バケット>ログ用S3>AWSLogs/>[アカウントID]/】配下に【OpenSearch】に加えて取得されたリソース名が表示されます。

CloudTrailのログをSIEMダッシュボード上で見てみよう!

先ほどと同じように、Username(AdminID)とPasswordを使ってダッシュボードにログインしてください。
左ペインから、「Discover」を見てみましょう。
CloudTrailのログが一覧で見えていたら成功です!

(失敗する場合のヒント↓)

  • 右上から期間を設定できるので、もし何も出てこない場合はそれを触ってみてください。
  • まだS3に何もデータが無ければ、CloudTrailイベントが発生していないということが考えられます。一度ログアウトし、シークレットブラウザからAWSログインに数回わざと失敗してみてください。そのログが取得されます。

より細かいダッシュボード操作は、シリーズ第一回「何ができるの?基本機能の紹介」または公式のワークショップを参考に行ってください。

SIEM削除時のCloudTrailレプリケーション設定解除方法

もしSIEM削除後にレプリケーションを解除する場合は以下の手順に従ってください。

  • 先述のSIEMリソース削除手順のS3 bucketの前までやる
    • CloudFormationスタックを削除する(3分程度で削除できます)
    • OpenSearch Service domain: aes-siem削除
  • バケットA(CloudTrailに紐づくS3)のレプリケーション設定削除する
    • S3>【バケットA】>【管理】>レプリケーションルール>ルール名選択+【削除】>レプリケーションルールを削除する
  • バケットA(CloudTrailに紐づくS3)のバージョニング設定無効化(必須ではないので戻したい場合のみ)
    • S3>【バケットA】>【プロパティ】>バケットのバージョニング【編集】>【停止】+同意にチェック>【保存】
  • Amazon S3 bucket削除(中身が入っている場合は中身を先に削除する):
    • aes-siem-XXXXXXXXXXXX-log
    • aes-siem-XXXXXXXXXXXX-snapshot
    • aes-siem-XXXXXXXXXXXX-geo
  • AWS KMS カスタマーマネージドキー(aes-siem-key)の削除をスケジュールする(もしエイリアスも変更してすぐに使えるようにしたい場合はコマンドは先述と同様)
export AWS_DEFAULT_REGION=【AWS_REGIONに置き換えてください】
aws kms delete-alias --alias-name  "alias/aes-siem-key"

【オプション】OpenSearchダッシュボードURLの変更

おまけです。
OpenSearchダッシュボードのURL変更が必要な場合、以下の手順で行うことができます。
※事前にRoute53+ACMや外部サービスなどで証明書が発行されたドメインを取得しておく必要があります。

  • OpenSearch Serviceのマネジメントコンソールを開く
  • 左ナビゲーションペインからDomainsを選択
  • 一覧から変更したいDomain名をクリックする
  • 右上のActionsメニューから【 Edit cluster configuration】を選択
  • 【Custom endpoint】の下で、【Enable custom endpoint】をチェックする
  • Custom hostnameには事前に取得したDomain名を入力する
  • 【AWS certificate】では、Domainに使用するSSL証明書を選択する
  • 入力に問題なければ、【Dry run】をクリックする

まとめ

SIEMのデプロイとCloudTrailのログ連携はできましたでしょうか?
少しでもお役に立てたなら幸いです。

垣見(かきみ)(執筆記事の一覧)

2023年新卒入社 エンタープライズクラウド部所属

図解するのが好き。「サバワク」のアイキャッチ作成も担当しています