こんにちは、Sumo Logicエンジニアの新藤です。最近メガネを新調しましたが誰にも気づいてもらえず1週間が経過しました。しかし、同じSumo Logicエンジニアの方に唯一気づいて頂きました。ありがとう。
前置きはここまでにしておいて早速本題に入ります。本記事では以下の設定を行います。
- OneLoginのイベントログをSumo Logicに送信する設定
- OneLoginで特定のイベントが発生した際に、Sumo LogicからSlackにアラートを送信する設定
そして、本記事を読んで頂くことによって以下を実現可能です。
OneLoginで特定のイベントログが生じた際にSlackにアラートを送信する
本記事では「特定のイベントログ」として以下の項目についてアラートを作成しました。
- アカウントのロック
- ロールの付与
- ポリシーの更新
設定自体は非常に簡単であるため、OneLoginを利用されているのであればSumo Logicとの連携設定を行うことをオススメします。
必要なもの
- OneLoginの管理者権限
- Sumo Logic
- Slack
OneLoginとSumo Logicの連携設定
Sumo Logicでの設定
まず、OneLoginとSumo Logicを連携する設定を行います。OneLoginではSumo Logicに代表されるSIEMとイベントログをWebhook連携することでOneLoginのイベントをSIEMを用いて監視を行うことが可能です。
まずSumo Logicにログインし、左下の「Manage Data」をクリックします。
そして、「Collection」をクリックします。
遷移した画面において、右上の「Add Collector」をクリックします。
ポップアップが表示されます。ここでは右側の「Hosted Collector」をクリックします。
遷移した画面において、「Name」に適切な値(例:OneLogin)を入力し、「Time Zone」は「(GMT+09:00) Asia/Tokyo」を選択します。そしてフィールドを入力後、左下の「Save」をクリックします。
そしてポップアップが表示されます。「OK」クリックします。
遷移した画面において、「HTTP Logs & Metrics」をクリックします。
遷移した画面において、「Name」に適切な値(例:Webhook)を入力します。そして、「Source Category」においても適切な値(例:Prod/OneLogin/Webhook)を入力します(Source Categoryでは「環境名 / サービス名」というように命名すると、後ほどSumo Logicにログを取り込むサービスが増加した場合でもログを分類しやすくなります)。
先程の画面を下にスクロールします。「Specify a format」を選択し、画像のように以下の値を入力します。
Format | Timestamp locator |
---|---|
yyyy-MM-dd HH:mm:ss zzz |
\"event_timestamp\":\"(.*)\", |
遷移した画面において、表示されたURLをメモ帳に控えておきます。そして、「OK」をクリックします。
OneLoginでの設定
OneLoginにログインし、右上の「管理」というボタンをクリックします。
遷移した画面において「Webhooks」をクリックします。
「New Webhook」をクリックし、「Event Webhook for Log Management」をクリックします。
ポップアップが表示されます。「Name」に適切な値(例:Sumo Logic)を入力します。「Format」では「SIEM(NDJSON)」を選択します。そして、「Listner URL」では先程メモ帳に控えておいたURLをペーストします。そして「Save」をクリックします。
遷移した画面において、作成したWebhookが表示されます。設定当初は赤字で「Disconnected」と表示されます。
1~2時間経過後に緑字で「Connected」という表示に変更されます。
以上でOneLoginとSumo Logicの連携設定は終了です。
Slackとの連携設定
OneLoginにおいて特定のイベントログが発生したことをSumo Logicが検知した際に、Slackにアラートとしてメッセージを送信することが可能です。 こちらの連携設定を行うことによって担当者の方は常にSumo Logicを監視する必要はなく、Slackにアラートが送信されたときにのみSumo Logicにログインし、イベントログを確認するといった運用が可能となります。
本記事ではOneLoginにおいて、下記イベントログが発生した際にSlackにアラートを送信する仕組みの設定について解説します。
- ユーザーがロックされたとき
- ユーザーに特定のロールが付与されたとき
- ポリシーが変更されたとき
まず、Sumo LogicからSlackにアラートを送信するための基本的な設定を行います。 Slackの特定のチャンネルのWebhook URLを発行してください。そしてSumo Logicにログインし、「Manage Data」をクリックします。
そして、「Alerts」をクリックします。
遷移した画面において、「Connections」をクリックします。
遷移した画面において、右端の「+」をクリックします。
遷移した画面において、「Slack」を選択します。
遷移した画面において、「Name」に適切な値(例:OneLogin Alert)、「URL」に先程Slackで発行したWebhook URLを入力します。そして、右下の「Save」をクリックします。
以上で、Slackにアラートを送信するための基本的な設定は終了です。
ユーザーがロックされたとき
まずはOneLoginユーザーがロックされた場合のアラートを送信する設定を行います。
右上の青い「+New」をクリックします。
ポップアップが表示されます。「Log Search」をクリックします。
下記文字列中のパラメータを表に従い、エディタの置換機能などを用いて置換してください。
パラメータ名 | パラメータの説明 | 本記事での例 |
---|---|---|
{{ONELOGIN_SOURCE_CATEGORY}} |
OneLoginのイベントログのSource Category | Prod/OneLogin/Webhook |
{{ONELOGIN_DOMAIN}} |
OneLoginのドメイン | dev-pentio.onelogin.com |
{{SUMOLOGIC_DOMAIN}} |
Sumo Logicのドメイン | dev-pentio.jp.sumologic.com (初期値はservice.jp.sumologic.com ) |
_sourceCategory="{{ONELOGIN_SOURCE_CATEGORY}}" | json "event.event_type_id","event.user_name", "event.ipaddr", "event.user_id" as event_id, user, ipaddr, user_id | "{{ONELOGIN_DOMAIN}}" as onelogin_domain | where event_id = 19 | parse field=user "* *" as user_fn, user_ln | format("%s %s", user_ln, user_fn) as user_ja | formatDate(_messageTime, "yyyy-MM-dd HH:mm:ss") as date | format("%s%s%s%s%s", "https://", onelogin_domain, "/users/", user_id, "/edit") as onelogin_user_url | format("%s%s%s%s", "https://", onelogin_domain, "/users?name=", user_ln) as onelogin_lock_user_url | toLong(_messagetime - 86400000) as one_day_ago | format("https://%s/ui/index.html#section/search/@", "{{SUMOLOGIC_DOMAIN}}") as sumo_endpoint | urlencode("_sourceCategory=\"{{ONELOGIN_SOURCE_CATEGORY}}\"|json\"event.event_type_id\",\"event.user_name\",\"event.user_id\"as type_id,user,user_id|where user_id=\"") as encoded_url | format("%s%s,%s@%s%s%s", sumo_endpoint, one_day_ago, _messagetime, encoded_url, user_id, "%22") as sumo_url | "下記アカウントがロックされました。" as event | fields date, ipaddr, user_ja, onelogin_user_url, onelogin_lock_user_url, sumo_url, event
クエリの入力後は以下のようになります。
適宜タイムレンジを広げます。ここでは「Last 15 Minutes」であったものを「Last 24 Hours」へと変更します。
そして作成したLog Searchに名前をつけて保存します。左下の「Save As」をクリックしてください。
ポップアップが表示されます。「Name」に適切な値(例:OneLogin User Lock)を入力します。また、こちらのLog Searchを保存するフォルダを選択します。そして、左下の「Schedule this search」をクリックします。
遷移した画面において、「Run Frequency」で「Naver」となっている値を「Real Time」へと変更します。
遷移した画面において、「Time range for scheduled search」を「Last 5 Minutes」へと変更します。そして「Alert Type」というプルダウンを展開します。
「Alert Type」では「Webhook」を選択します。
「Send a separate alert for each search result」にチェックを入れ、「Maximum no. of alerts」は「100」を入力します。そして、「Connection」では冒頭に作成したConnection(例:OneLogin Alert)を選択します。
「Customize Payload」を有効化し、「Payload」に以下の文字列を入力します。そして「Save」をクリックします。
{ "attachments": [ { "pretext": "<!here> {{Results.event}}", "fields": [ { "title": "日時", "value": "{{Results.date}}" }, { "title": "IPアドレス", "value": "{{Results.ipaddr}}" }, { "title": "対象アカウント", "value": "<{{Results.onelogin_user_url}}|{{Results.user_ja}}>" }, { "value": "<{{Results.sumo_url}}|24時間以内のアクセスログを確認>" } ], "mrkdwn_in": ["text", "pretext"], "color": "#ff0000", "username": "OneLogin" } ] }
ユーザーがロックされ、一定時間(2、3分)経過すると以下の画像のようなアラートがSlackに送信されます。
ユーザーに特定のロールが付与されたとき
「ユーザーがロックされたとき」の手順と同様に以下のクエリのパラメータをエディタの置換機能などを用いて置換してください。そしてSumo Logicに以下のクエリを入力してください。
パラメータ名 | パラメータの説明 | 本記事での例 |
---|---|---|
{{ONELOGIN_SOURCE_CATEGORY}} |
OneLoginのイベントログのSource Category | Prod/OneLogin/Webhook |
{{ONELOGIN_DOMAIN}} |
OneLoginのドメイン | dev-pentio.onelogin.com |
_sourceCategory="{{ONELOGIN_SOURCE_CATEGORY}}" | json "event.event_type_id","event.user_name", "event.ipaddr", "event.user_id", "event.role_name", "event.actor_user_name", "event.role_id", "event.notes" as event_id, user, ipaddr, user_id, role, actor_user, role_id, notes | "{{ONELOGIN_DOMAIN}}" as onelogin_domain | where event_id in ("147", "149", "513") | parse field=user "* *" as user_fn, user_ln nodrop | parse field=actor_user "* *" as actor_user_fn, actor_user_ln nodrop | format("%s %s", user_ln, user_fn) as user_ja | format("%s %s", actor_user_ln, actor_user_fn) as actor_user_ja | formatDate(_messageTime, "yyyy-MM-dd HH:mm:ss") as date | format("%s%s%s%s%s", "https://", onelogin_domain, "/roles/", role_id, "/edit") as onelogin_role_url | format("%s%s%s%s%s", "https://", onelogin_domain, "/users/", user_id, "/edit") as onelogin_user_url | if(event_id matches "149", "ユーザーマッピング", actor_user_ja) as actor_user_ja | if(event_id matches "147", "下記アカウントに手動でロールが追加されました。", if(event_id matches "149", "下記アカウントにユーザーマッピングにより自動的にロールが追加されました。", if(event_id matches "513", "APIによりロールが追加されました。", "ロールが追加されました。"))) as event | fields user_id, role_id, ipaddr, event, onelogin_user_url, user_ja, date, onelogin_role_url, role, actor_user_ja
Payloadには以下の文字列を入力します。
{ "attachments": [ { "pretext": "{{Results.event}}", "fields": [ { "title": "日時", "value": "{{Results.date}}" }, { "title": "IPアドレス", "value": "{{Results.ipaddr}}" }, { "title": "ロール名", "value": "<{{Results.onelogin_role_url}}|{{Results.role}}>" }, { "title": "対象アカウント", "value": "<{{Results.onelogin_user_url}}|{{Results.user_ja}}>" }, { "title": "ロールを追加したユーザー", "value": "{{Results.actor_user_ja}}" } ], "mrkdwn_in": ["text", "pretext"], "color": "#29A1E6", "username": "OneLogin" } ] }
ロールが追加され、一定時間(2、3分)経過すると以下の画像のようなアラートがSlackに送信されます。
ポリシーが変更されたとき
「ユーザーがロックされたとき」の手順と同様に以下のクエリのパラメータをエディタの置換機能などを用いて置換してください。そしてSumo Logicに以下のクエリを入力してください。
パラメータ名 | パラメータの説明 | 本記事での例 |
---|---|---|
{{ONELOGIN_SOURCE_CATEGORY}} |
OneLoginのイベントログのSource Category | Prod/OneLogin/Webhook |
{{ONELOGIN_DOMAIN}} |
OneLoginのドメイン | dev-pentio.onelogin.com |
_sourceCategory="{{ONELOGIN_SOURCE_CATEGORY}}" | json "event.event_type_id","event.user_name", "event.ipaddr", "event.user_id", "event.actor_user_name", "event.policy_id", "event.policy_name" as event_id, user, ipaddr, user_id, actor_user, policy_id, policy | "{{ONELOGIN_DOMAIN}}" as onelogin_domain | where event_id = 157 | parse field=user "* *" as user_fn, user_ln nodrop | parse field=actor_user "* *" as actor_user_fn, actor_user_ln nodrop | format("%s %s", user_ln, user_fn) as user_ja | format("%s %s", actor_user_ln, actor_user_fn) as actor_user_ja | formatDate(_messageTime, "yyyy-MM-dd HH:mm:ss") as date | format("%s%s%s%s%s", "https://", onelogin_domain, "/policies/", policy_id, "/edit") as onelogin_policy_url | format("%s%s%s%s%s", "https://", onelogin_domain, "/users/", user_id, "/edit") as onelogin_user_url | "ポリシーが更新されました。" as event | fields user_id, policy_id, ipaddr, event, onelogin_user_url, user_ja, date, onelogin_policy_url, policy, actor_user_ja
Payloadには以下の文字列を入力します。
{ "attachments": [ { "pretext": "{{Results.event}}", "fields": [ { "title": "日時", "value": "{{Results.date}}" }, { "title": "IPアドレス", "value": "{{Results.ipaddr}}" }, { "title": "ポリシー名", "value": "<{{Results.onelogin_policy_url}}|{{Results.policy}}>" }, { "title": "ポリシーを更新したユーザー", "value": "{{Results.actor_user_ja}}" } ], "mrkdwn_in": ["text", "pretext"], "color": "#29A1E6" } ] }
ポリシーが更新され、一定時間(2、3分)経過すると以下の画像のようなアラートがSlackに送信されます。
さいごに
いかがでしたでしょうか。本記事の設定をしていただくことで簡単にOneLoginでのイベントログをSlackに送信されたアラートにより検知することが可能となりました。本記事のような設定をOneLogin以外のサービスにおいても行い、社内利用のサービスのアラートを作成していくとめちゃくちゃ便利ですよ。