OneLoginとSumo Logicを連携させ、Slackにアラートを送信する

こんにちは、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」をクリックします。

f:id:cmt_192cm:20210406172522p:plain
Sumo Logic ホーム画面

そして、「Collection」をクリックします。

f:id:cmt_192cm:20210406172552p:plain
Sumo Logic ホーム画面

遷移した画面において、右上の「Add Collector」をクリックします。

f:id:cmt_192cm:20210406172640p:plain
Sumo Logic Collection 一覧

ポップアップが表示されます。ここでは右側の「Hosted Collector」をクリックします。

f:id:cmt_192cm:20210406172736p:plain
Sumo Logic Collector 作成画面

遷移した画面において、「Name」に適切な値(例:OneLogin)を入力し、「Time Zone」は「(GMT+09:00) Asia/Tokyo」を選択します。そしてフィールドを入力後、左下の「Save」をクリックします。

f:id:cmt_192cm:20210406172942p:plain
Sumo Logic Collector 設定画面

そしてポップアップが表示されます。「OK」クリックします。

f:id:cmt_192cm:20210406173413p:plain
Sumo Logic Collector 確認ポップアップ

遷移した画面において、「HTTP Logs & Metrics」をクリックします。

f:id:cmt_192cm:20210406173520p:plain
Sumo Logic Source 作成画面

遷移した画面において、「Name」に適切な値(例:Webhook)を入力します。そして、「Source Category」においても適切な値(例:Prod/OneLogin/Webhook)を入力します(Source Categoryでは「環境名 / サービス名」というように命名すると、後ほどSumo Logicにログを取り込むサービスが増加した場合でもログを分類しやすくなります)。

f:id:cmt_192cm:20210406174020p:plain
Sumo Logic Source 設定画面

先程の画面を下にスクロールします。「Specify a format」を選択し、画像のように以下の値を入力します。

Format Timestamp locator
yyyy-MM-dd HH:mm:ss zzz \"event_timestamp\":\"(.*)\",

f:id:cmt_192cm:20210406175150p:plain
Sumo Logic Source 設定画面

遷移した画面において、表示されたURLをメモ帳に控えておきます。そして、「OK」をクリックします。

f:id:cmt_192cm:20210406175226p:plain
Sumo Logic Source URL 生成画面

OneLoginでの設定

OneLoginにログインし、右上の「管理」というボタンをクリックします。

f:id:cmt_192cm:20210406170504p:plain
OneLogin Portal画面

遷移した画面において「Webhooks」をクリックします。

f:id:cmt_192cm:20210406171547p:plain
OneLogin 管理者画面

「New Webhook」をクリックし、「Event Webhook for Log Management」をクリックします。

f:id:cmt_192cm:20210406171634p:plain
OneLogin Webhooks 作成

ポップアップが表示されます。「Name」に適切な値(例:Sumo Logic)を入力します。「Format」では「SIEM(NDJSON)」を選択します。そして、「Listner URL」では先程メモ帳に控えておいたURLをペーストします。そして「Save」をクリックします。

f:id:cmt_192cm:20210406180308p:plain
OneLogin Webhooks 設定画面

遷移した画面において、作成したWebhookが表示されます。設定当初は赤字で「Disconnected」と表示されます。

f:id:cmt_192cm:20210406180645p:plain
OneLogin Webhooks Connection 確認画面

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」をクリックします。

f:id:cmt_192cm:20210407130041p:plain
Sumo Logic ホーム画面

そして、「Alerts」をクリックします。

f:id:cmt_192cm:20210407130637p:plain
Sumo Logic ホーム画面

遷移した画面において、「Connections」をクリックします。

f:id:cmt_192cm:20210407130729p:plain
Sumo Logic Connections 作成画面

遷移した画面において、右端の「+」をクリックします。

f:id:cmt_192cm:20210407130819p:plain
Sumo Logic Connections 作成画面

遷移した画面において、「Slack」を選択します。

f:id:cmt_192cm:20210407130910p:plain
Sumo Logic Connections 作成画面

遷移した画面において、「Name」に適切な値(例:OneLogin Alert)、「URL」に先程Slackで発行したWebhook URLを入力します。そして、右下の「Save」をクリックします。

f:id:cmt_192cm:20210407131042p:plain
Sumo Logic Connections 作成画面

以上で、Slackにアラートを送信するための基本的な設定は終了です。

ユーザーがロックされたとき

まずはOneLoginユーザーがロックされた場合のアラートを送信する設定を行います。

右上の青い「+New」をクリックします。

f:id:cmt_192cm:20210407162604p:plain
Sumo Logic ホーム画面

ポップアップが表示されます。「Log Search」をクリックします。

f:id:cmt_192cm:20210407183157p:plain
Sumo Logic Log Search 作成画面

下記文字列中のパラメータを表に従い、エディタの置換機能などを用いて置換してください。

f:id:cmt_192cm:20210407183307p:plain
Sumo Logic 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

クエリの入力後は以下のようになります。

f:id:cmt_192cm:20210407184711p:plain
Sumo Logic Query 編集画面

適宜タイムレンジを広げます。ここでは「Last 15 Minutes」であったものを「Last 24 Hours」へと変更します。

f:id:cmt_192cm:20210407185058p:plain
Sumo Logic Time Range 変更画面

そして作成したLog Searchに名前をつけて保存します。左下の「Save As」をクリックしてください。

f:id:cmt_192cm:20210407185201p:plain
Sumo Logic 保存画面

ポップアップが表示されます。「Name」に適切な値(例:OneLogin User Lock)を入力します。また、こちらのLog Searchを保存するフォルダを選択します。そして、左下の「Schedule this search」をクリックします。

f:id:cmt_192cm:20210407185522p:plain
Sumo Logic Alert 設定画面

遷移した画面において、「Run Frequency」で「Naver」となっている値を「Real Time」へと変更します。

f:id:cmt_192cm:20210407185724p:plain
Sumo Logic Alert 設定画面
f:id:cmt_192cm:20210407185758p:plain
Sumo Logic Alert 設定画面

遷移した画面において、「Time range for scheduled search」を「Last 5 Minutes」へと変更します。そして「Alert Type」というプルダウンを展開します。

f:id:cmt_192cm:20210407190007p:plain
Sumo Logic Alert

「Alert Type」では「Webhook」を選択します。

f:id:cmt_192cm:20210407190037p:plain
Sumo Logic Alert Webhook 設定画面

「Send a separate alert for each search result」にチェックを入れ、「Maximum no. of alerts」は「100」を入力します。そして、「Connection」では冒頭に作成したConnection(例:OneLogin Alert)を選択します。

f:id:cmt_192cm:20210407190128p:plain
Sumo Logic Alert Webhook 設定画面

「Customize Payload」を有効化し、「Payload」に以下の文字列を入力します。そして「Save」をクリックします。

f:id:cmt_192cm:20210407191326p:plain
Sumo Logic Alert Webhook 設定画面

{
    "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に送信されます。

f:id:cmt_192cm:20210414180512p:plain
OneLogin User Lock アラート

ユーザーに特定のロールが付与されたとき

「ユーザーがロックされたとき」の手順と同様に以下のクエリのパラメータをエディタの置換機能などを用いて置換してください。そして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に送信されます。

f:id:cmt_192cm:20210414183123p:plain
OneLogin Role Added アラート

ポリシーが変更されたとき

「ユーザーがロックされたとき」の手順と同様に以下のクエリのパラメータをエディタの置換機能などを用いて置換してください。そして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に送信されます。

f:id:cmt_192cm:20210414183202p:plain
OneLogin Policy Updated アラート

さいごに

いかがでしたでしょうか。本記事の設定をしていただくことで簡単にOneLoginでのイベントログをSlackに送信されたアラートにより検知することが可能となりました。本記事のような設定をOneLogin以外のサービスにおいても行い、社内利用のサービスのアラートを作成していくとめちゃくちゃ便利ですよ。