OCI モニタリングを活用してログイン失敗を検知する

# 今回やりたいこと
OCIコンソールへの不正アクセスを防ぐため、ログイン失敗が複数回発生した場合に、サービス・コネクタ・ハブを通じてモニタリングと連携し、担当者にアラートメールを送信する仕組みを構築します。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/2e88a8d4-5e03-9382-2fde-8940d526bbd4.png)

# 作業手順
以下の手順でログイン失敗検知の仕組みを構築します。
1. **ログイン失敗の試行と監査ログの確認**
1. **サービス・コネクタ・ハブの作成**
1. **モニタリングの作成**
1. **アラートメールの送信**

# 設定内容
### 事前準備
事前準備として、パスワードを誤入力して「**ユーザー名またはパスワードが無効です。**」と表示される状態を再現します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/88075ea4-0cbc-9100-b71c-d81d3df388f5.png)

通知用トピックとして、システム管理者のメールアドレスを登録したトピックを作成済みであることを確認します。
（今回は`TP-LoginFailure`というトピックを使用します。）

:::note info
トピックの作成手順については以下のドキュメントをご参照ください。
[トピックの作成](https://docs.oracle.com/ja-jp/iaas/Content/Notification/Tasks/create-topic.htm)
:::


## 監査ログの確認
監査ログを確認する場合、OCIコンソール画面左上のナビゲーションメニューから「**監視および管理**」→「**監査**」を選択します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1916807f-d68a-5102-5f16-2f96409ab3b0.png)

監査ログのタイプが`com.oraclecloud.IdentitySignOn.InteractiveLogin`を確認します。
（コンソールログインに関するログです。）
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/17212604-cb76-6068-8f56-4a3e862234b4.png)

:::note info
ログ検索時にルート・コンパートメントを選択する必要があります。
:::

対象ログの右側の折りたたみのアイコンを選択して展開、
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/574061e6-8dcb-d46c-d534-55bae2f8a991.png)

赤枠の箇所がログイン失敗に関するログです。
```
"message"："InteractiveLogin failed with response Authentication failure 入力されたユーザー名またはパスワードが正しくありません。"
```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/0b43f977-9f15-685f-a3b8-8cadaeed8ad7.png)


該当ログを選択、「**サービス・コネクタ・ハブの作成**」で使用するため、「**値のコピー**」で控えておきます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/b0a954f9-52b1-382b-946c-466b126e7038.png)


## サービス・コネクタ・ハブの作成
ログイン失敗用ログの確認後、サービス・コネクタ・ハブの作成を行います。
「**監視および管理**」→「**コネクタ**」を選択します。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/e4e05b3e-2ed8-504e-8e80-3052199faccc.png)

「**コネクタの作成**」を選択します。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/38d61b01-41f1-8f76-38c9-3ae9e2617c91.png)
***
以下の情報を入力します。
* コネクタ名：任意（例：`SCH-LoginFailure`）
* 説明：任意（例：`ログイン失敗用コネクタ`）
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/24cf9fa4-9fa0-0268-1337-36af40814dfc.png)
* コネクタの構成
    * ソース：ロギング
    * ターゲット：モニタリング
* ソースの構成
    * ログ・グループ：`_Audit`（監査ログ用デフォルトログ・グループ）
    * ログ・フィルタ・タスク
        * フィルタ・タイプ：`属性`
        * 属性名：`data.message`
        * 属性値：`InteractiveLogin failed with response Authentication failure`
:::note info
ソースのコンパートメントはルート・コンパートメントを選択する必要があります。
:::
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/e0d67867-8e00-633f-5b85-8d795fa4b0b4.png)

* ターゲットの構成
    * メトリック・ネームスペース：任意（例：`custom_audit`）
    * メトリック：任意（例：`LoginFailure`）
:::note info
ターゲットの構成値は手動で入力します。
:::
:::note info
メトリック・ネームスペースの接頭辞として、oci_ および oracle_ はOracleの予約語であるため使用できません。
:::
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/a5cfc989-cbf3-572d-8a84-e513e656bde8.png)
***
検知するログの文字列をアラートメールに表示したい場合、「**ディメンションの追加**」から「**パスの編集**」で以下の内容を入力後、「**変更の保存**」を選択します。

* 文字列
    * ディメンション名：`message`
    * 値：`logContent.data.message`
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/067321b2-6d48-af51-2aad-0059322647e2.png)

尚、作成時に以下の画面が表示された場合、サービス・コネクタ・ハブがモニタリングへの書き込み権限を持っていないことを意味します。
この場合、モニタリングへの書き込みを許可するIAMポリシーを作成する必要があります。
デフォルトでは「**ConnectorPolicy_monitoring_YYYY-MM-DDThh:mm：ssZ**」という名前で作成され、このIAMポリシー名で問題なければ「**作成**」を選択します。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1fc6ebe2-1aa5-5439-0be7-33a7ce796111.png)

IAMポリシーが作成されると、以下のステートメントが定義されます。
```
allow any-user to use metrics in compartment id <コンパートメントのOCID> where all {request.principal.type='serviceconnector', target.metrics.namespace='<メトリック・ネームスペース>', request.principal.compartment.id='<コンパートメントのOCID>'}
```

全ての項目を作成後、「**作成**」を選択します。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/72e18b75-f120-40d0-e060-d730e49357af.png)

サービス・コネクタ・ハブが正常に作成されます。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/944bdbf5-0488-2676-fd3a-0fe01b90999f.png)

## モニタリングの作成
サービス・コネクタ・ハブの作成後、モニタリングを作成します。
「**監視および管理**」→「**アラーム定義**」を選択します。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/6fb14ca9-6301-6c60-3323-f3b1669756ac.png)

「**アラームの作成(Create Alarm）**」を選択します。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/ebbf270e-58c0-7f7d-a58a-0a58f2016c3f.png)
***
以下の情報を入力、「**Save Alarm（アラームの保存）**」を選択します。
* Alarm name（アラーム名）：任意（例：`AL-LoginFailure`）
* Alarm summary（アラーム・サマリー）：任意（例：`イベントが到着しました。通知内容：ステータス：{{status}}  発生日時：{{timestamp}} 重大度：{{severity}} オブジェクト名：{{title}} メッセージ： {{Dimensions.message}}`）
:::note info
この箇所で使用する変数は「**動的変数**」と呼ばれ、発報時に内容が自動的に置き換わります。
ただし、改行は使用不可で1行のみ表示されます。
:::
* Metric description（メトリック詳細）
    * Metric namespace（メトリック・ネームスペース）：任意（例：`custom_audit`）
    * Metric name（メトリック名）：任意（例：`LoginFailure`）
    * Interval（間隔）：任意（例：`1 minutes`）
    * Statistic（統計）：`Count`
:::note info
 **Count**はIntervalで設定した間隔での合計値を返します。
詳細は以下のOCI公式ドキュメントをご覧ください。
[問合せの統計の選択](https://docs.oracle.com/ja-jp/iaas/Content/Monitoring/Tasks/query-metric-statistic.htm)
:::
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1df73a36-7fb8-eb1f-193e-23ff5d502787.png)
* Metric dimensions（メトリック・ディメンション）
    * Dimension name：任意（例：`connectorName`）
    * Dimension value：任意（例：`SCH-LoginFailure`）
* Trigger rule（トリガー・ルール）
    * Operator（演算子）：任意（例：`greater than or equal to（次より大きいか等しい）`）
    * value（値）：任意（例：`1`）
    * Trigger delay minutes（トリガー遅延分数）：任意（例：`1分`）
    * Alarm Severity（アラーム重大度）：任意（例：`Critical`）
    * Alarm Body（アラーム本体）：任意（ここでは空白）
:::note info
 **Trigger delay minutes**（トリガー遅延分数）は条件が維持される必要がある時間で、継続時間と置き換えてください。
[アラームへのトリガー・ルールの追加](https://docs.oracle.com/ja-jp/iaas/Content/Monitoring/Tasks/create-edit-alarm-query-trigger-rule.htm)
:::
:::note info
**Alarm Severity**（アラーム重大度）は`Critical`,`Error`,`Warning`,`Info`から選択可能です。
:::
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/beb2bf6a-5249-25a4-4b54-d10017fbb23c.png)

* Destination（宛先）
    * Destination Service（宛先サービス）：Notifications
    * Topic（トピック）：任意（例：`TP-LoginFailure`）
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/bfacfcf2-940a-e690-5284-3d6ea4ec0db2.png)

* Message Grouping（メッセージのグループ化）：任意（例：`Group notifications across metric streams`）
* Message Format（メッセージのフォーマット）：任意（例：`Send formatted messages`）
* Repeat notification? （通知の繰り返し）：無効
::: note
有効の場合、繰り返しの間隔を分単位で設定可能です。
:::
* Suppress notifications（抑制通知）：無効
::: note
有効時には指定期間モニタリングが非アクティブ状態となり、アラームが発報しません。
:::
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/3c307746-510a-ae88-37ac-1b8ff3fd1cde.png)

モニタリング用アラームが作成されます。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/cb2dffe0-4e5b-6ba8-200b-1b11b501b38a.png)

## アラートメールの送信テスト
設定後、ログイン失敗を試行すると、以下のようなアラートメールが送信されます。
![23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/9f07b113-cc84-d970-7dd6-bebe8ca33b74.jpeg)

アラートメールが発報された後、さらにログイン失敗の監査ログが記録されない場合、10分後にアラートの状態が `RESET`に戻り、解除メールが送信されます。

::: note
10分以上経過しても解除メールが届かない場合、ログイン失敗が継続して発生している可能性があります。
その際は、対象ユーザーのアクセス元などを確認し、必要な対応を行うことを推奨します。
:::
![24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/6ce59b28-b73d-c5f8-ffcc-bb0f13951a82.jpeg)

以上で全ての設定は完了です！！

# 参考記事
https://cloudii.jp/news/blog/oracle-cloud/login_failure

https://qiita.com/yukitkns/items/eb453ec052e1a084d9d1