OpenDistroでドキュメントレベルセキュリティ/フィールドレベルセキュリティ/フィールドマスキング

こちらの続きとしてます。
https://qiita.com/pioho07/items/994e51d2709305416fca

以前のqiitaから若干変えていますが、登場する要素は以下です。
テナントyokogushi2のユーザーがuser2で、ロールkansa-role2のロールにマッピングされています。

* ユーザー：user2
* ロール：kansa-role2
* ロールマッピング：user2 + kansa-role2
* テナント：yokogushi2

# 公式ドキュメントの説明
https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/fgac.html#fgac-enabling

* ドキュメントレベルセキュリティ
ドキュメントレベルのセキュリティにより、インデックス内のどのドキュメントをユーザーが表示できるかを制限できます。ロールを作成するときに、インデックスパターンと Elasticsearch クエリを指定します。そのロールにマッピングされたすべてのユーザーは、クエリに一致するドキュメントのみを表示できます。ドキュメントレベルのセキュリティは、検索時に受け取るヒットの数に影響します。

* フィールドレベルセキュリティ
フィールドレベルのセキュリティにより、どのドキュメントフィールドをユーザーが表示できるかを制御できます。ロールを作成するときに、含めるフィールドと除外するフィールドのリストを追加します。フィールドを含めると、そのロールにマッピングされたユーザーはそれらのフィールドのみを表示できます。フィールドを除外すると、除外されたフィールドを除くすべてのフィールドを表示できます。フィールドレベルのセキュリティは、検索時にヒットに含まれるフィールドの数に影響します。

* フィールドのマスキング
フィールドのマスキングは、フィールドレベルのセキュリティに代わるもので、フィールド内のデータを完全に削除するのではなく、匿名化できます。ロールを作成するときに、マスクするフィールドのリストを追加します。フィールドのマスキングは、検索時にフィールドの内容を表示できるかどうかに影響します。

# ドキュメントレベルセキュリティ

https://opendistro.github.io/for-elasticsearch-docs/docs/security/access-control/document-level-security/

まずドキュメントレベルセキュリティを設定する前の状態として
cloudtrailのログを検索するとeventNameフィールドの値は、GetObject, PutObject, HeadBucketが確認できます

![スクリーンショット 0002-08-29 15.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/fd0d18eb-5c3d-57c2-ee9e-6cee9b98f71c.png)

ここから管理者で操作します。
ドキュメントレベルセキュリティを設定します。
kansa-role2の"Index Permissions"タブをクリックし、"Document Level Security Query"に以下を入れます。
内容はeventNameがPutObjectのみを表示することになります。

![スクリーンショット 0002-08-30 14.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/a24a6766-5e3f-dafb-39bd-266151c429bb.png)


```json:
{
  "match": {
    "eventName": "PutObject"
  }
}
```

user2でログインし確認します。eventNameがPutObjectのみが表示されています。

![スクリーンショット 0002-08-29 15.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/82f765f3-f4b1-f953-6fd6-e17e8ae3a6d4.png)

もっと複雑なクエリも書けます。公式ドキュメントを参考にしてみてください。
ただ、複雑なクエリはパフォーマンスにも影響がありますのでご注意を

# フィールドレベルセキュリティ

https://opendistro.github.io/for-elasticsearch-docs/docs/security/access-control/field-level-security/

まずフィールドレベルセキュリティを設定する前の状態として、フィールドevent.outcomeは表示されています。値はsuccessとfailureの2つです。

![スクリーンショット 0002-08-29 15.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/a1ecbf19-84bd-c97e-d4b7-41f1e73c3cdc.png)

検索をしてもヒットします。

![スクリーンショット 0002-08-29 15.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/c90b338c-84e6-fff2-097c-b5cc3b5f78d1.png)

ここから管理者で操作します。
フィールドレベルセキュリティを設定します。
さっきと同じ箇所のロールkansa-role2のIndex Permissionsタブで、"Include or exclude fields"の箇所で
右上を[Exclude fields]を選択します。これでこのあと設定するフィールドを対象外(表示しない)にします。
除外したいフィールドを入れます。ここでは"event.outcome"
※Include fieldを選択すれば、表示したいフィールドだけ選べます

![スクリーンショット 0002-08-29 16.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/984b1885-b275-48a7-d050-d2ef22728c4b.png)

user2でログインして確認します。
先程と同じ箇所にフィールドがないこと

![スクリーンショット 0002-08-29 16.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/88111d7d-208b-d044-0885-1fd3ee7b9de5.png)

検索しても出てこないことがわかります

![スクリーンショット 0002-08-29 16.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/5ce211b0-ad3b-b42b-5d09-f22a1168cba0.png)

### 注意点
ドキュメントレベルのセキュリティとの相互作用
ドキュメントレベルのセキュリティはElasticsearchクエリに依存しています。つまり、クエリが正しく機能するためには、クエリのすべてのフィールドが表示されている必要があります。ドキュメントレベルのセキュリティと併せてフィールドレベルのセキュリティを使用する場合は、ドキュメントレベルのセキュリティが使用するフィールドへのアクセスを制限しないようにしてください。

# フィールドのマスキング

https://opendistro.github.io/for-elasticsearch-docs/docs/security/access-control/field-masking/

まずフィールドマスキングを設定する前の状態として
今はuserIdentity.accessKeyId(アクセスキーID)が見えています。

![スクリーンショット 0002-08-29 16.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/fecc6815-a642-3c32-d757-49c5e9029a9a.png)

ここから管理者で操作します。
フィールドマスキングを設定します。
さっきと同じ箇所のロールkansa-role2のIndex Permissionsタブで、2つ前に設定した"Document Level Security Query"があれば削除しておきます。(今回のuserIdentity.accessKeyIdのフィールドが含まれなくなってしまうため)
"Anonymize fields"にマスクしたいフィールドを入れます。ここで"userIdentity.accessKeyId"を入力します。

![スクリーンショット 0002-08-29 16.36.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/20da4e9f-c594-4417-8fe9-6df50e8895ba.png)

user2でログインし確認します。
フィールドの値がマスキングされています。

![スクリーンショット 0002-08-29 16.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/31784c06-2e08-f9ac-df0b-17c8df7921a4.png)

※内部的な設定値は、opendistro_security.compliance.saltで、「ハッシュ値を生成するときに使用するソルト。32文字以上にする必要があります。使用できるのはASCII文字のみ」
以下はコンフィグelasticsearch.ymlの記述例です。

```
opendistro_security.compliance.salt: abcdefghijklmnopqrstuvqxyz1234567890
```

※現在は文字列フィールドのみマスキング可能で、フィールドの値を暗号化ハッシュに置き換えます