KibanaのSAML認証

### 目的

この記事では、KibanaにてSAML認証（Okta経由）を有効化するための手順を纏めます。


### 前提

- SSLを使用したネットワークトラフィックの暗号化が設定されていること(以下URLを参照)。
- https://www.elastic.co/jp/blog/configuring-ssl-tls-and-https-to-secure-elasticsearch-kibana-beats-and-logstash#prepare-logstash

### 手順
#### 1. Oktaの設定手順

①接続先のKibanaの情報をもとに以下情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/874e3f30-6fcf-d101-16e3-7556bcdb639e.png)


***/api/security/v1/saml***は、固定っぽいので注意が必要です。

②group Attributeの値を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/cc5eb4ae-9446-48be-efdc-ef515ec8ed7f.png)


#### 2. Elasticsearchの設定手順

以下を設定してElasticsearchを再起動します。

①メタデータを/etc/elasticsearch/samlに作成

```bash:idp-metadata.xml
# pwd
/etc/elasticsearch/saml
# ls -ll
total 4
-rw-r--r-- 1 root elasticsearch 2380 Mar 21 13:03 idp-metadata.xml
```


idp-metadata.xmlの中身は以下からGetできます。
[View Setup Instructions] -> [Provide the following IDP metadata to your SP provider.]
をコピーしてidp-metadata.xmlに貼り付けます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/e40f0e0b-4361-04c1-ab4b-4b0b115047ac.png)



②elasticsearch.ymlの設定値を以下の通り変更します。

```bash:elasticsearch.ymlの設定
# ----------------------------------- SAML Setting ------------------------------------
xpack.security.authc.token.enabled: true
xpack.security.authc.realms.saml:
         saml1:
           order: 2
           attributes.principal: "nameid"
           attributes.groups: "groups"
           idp.metadata.path: saml/idp-metadata.xml
           idp.entity_id: "https://sso.example.com/"
           sp.entity_id:  "https://kibana.example.com/"
           sp.acs: "https://kibana.example.com/api/security/v1/saml"
           sp.logout: "https://kibana.example.com/logout"
           sp.acs: "https://sso.example.com/api/security/v1/saml"
           sp.logout: "https://sso.example.com/logout"
```

#### 3. Kibanaの設定手順

以下を設定してKibanaを再起動します。


kibana.ymlを以下の通り編集します。basic.basic1はBasic認証をのこすための設定です。
KibanaにSMAL経由でログインできなくなったときのリカバリーとして作成しました。
<KibanaIP:Port>/loginでBasic認証に切り替えられるそうです。

```bash:kibana.ymlの設定
xpack.security.authc.providers:
  saml.saml1:
    order: 0
    realm: "saml1"
  basic.basic1:
    order: 1
```

#### 4. Oktaユーザーとグループの作成

グループ（OK_Kibana_Admin）を作成し、既存のOktaユーザーを所属させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/24ae5914-4634-90a8-85c2-b8bf07cd3167.png)


#### 5. OktaグループとKibanaのRollを紐づけ

既存のKibana Roll（superuser）とOktaのグループを紐づけるために、
KibanaのDevToolで以下コマンドを実行します。
***version 7.12だとDev Toolではなく、GUI画面で編集するそうです。***
https://www.elastic.co/guide/en/kibana/current/role-mappings.html


```bash:aaa
PUT /_security/role_mapping/saml-kibana-admins
{
   "enabled": true,
    "roles": [ "superuser" ],
    "rules": { "all" : [
        { "field": { "realm.name": "saml1" } },
        { "field": { "groups": "OK_Kibana_Admin" } }
    ]},
    "metadata": { "version": 1 }
}

```

以上です。


### 参考URL

- [mappingの設定](https://www.elastic.co/guide/en/elasticsearch/reference/7.11/saml-role-mapping.html)
- [技術ブログ](https://nettweets.com/2019/08/22/integrating-kibana-in-elastic-cloud-with-okta-step-by-step/)
- [kibana SAML設定](https://www.elastic.co/guide/en/elasticsearch/reference/7.11/saml-kibana.html)
- [Elasticsearch SAML設定](https://www.elastic.co/guide/en/elasticsearch/reference/7.11/saml-guide-authentication.html#saml-attribute-mapping)
- [SAMLの処理フロー](https://www.elastic.co/jp/blog/how-to-enable-saml-authentication-in-kibana-and-elasticsearch)
- [ElasticsearchのTLS化](https://www.elastic.co/jp/blog/configuring-ssl-tls-and-https-to-secure-elasticsearch-kibana-beats-and-logstash#prepare-logstash)
- [elasticの技術ブログ](https://www.elastic.co/jp/blog/setting-up-saml-for-elastic-enterprise-search-okta-edition)