Instana Self-hosted on dockerをサクッとLDAP認証に設定する

# はじめに
こんにちは。[Instana Observability Advent Calendar 2023][0]の4日目の投稿です。

[0]:https://qiita.com/advent-calendar/2023/instana

Instana self-hosted on dockerは検証用に気軽に立てられますが、Instanaのユーザーを追加したい場合、ユーザーを招待して、届いたメールアドレスでアクションが必要となるため、SMTPサーバーの設定などなかなか面倒です。

今回は、dockerの環境にLDAPサーバーを立てることで簡単にユーザーを追加する方法をご紹介します。

本手順は以下の環境で実施しています。

- Instana Backend: Self-Hosted on docker (Single) Build 247-2
- Platform: IBM Cloud VSI
- OS: Ubuntu 20.04
- docker: 24.0.7 (Community Edition)
- docker-compose: v2.21.0


# 本手順の対象・流れ
1. Instana Backend サーバー環境はdockerの環境なので、そこに相乗りしてLDAPサーバーを立てます。今回はサンプルファイルを用意したのでそれを使って構築します。
2. Instana Web UIからLDAP認証に切り替える設定を行います。本手順では、グループ・マッピングの機能については言及しません。
3. 最後に、LDAP認証でInstana Web UIにログインできることを確認します。


# 1. LDAPサーバーの構築
Instana Backend サーバーはインストール済みである前提とします。
dockerに加えて、[docker-compose][1]もインストール済みである前提とします。

[1]:https://docs.docker.jp/compose/install/compose-plugin.html

必要なファイルをサーバーに置いて、`docker compose up -d`を打つだけです。
サンプルファイルは個人のgithubに公開しておきましたので使ってみてください。

https://github.com/yukikod/instana-samples/tree/main/self-hosted_docker_openldap

## 1.1 docker-compose.ymlファイル
LDAPはOpenLDAPとし、コンテナイメージは [osixia/openldap][1.2] を使用します。
適当なディレクトリに`docker-compose.yml`ファイルを配置または作成します。

[1.2]:https://github.com/osixia/docker-openldap
```shell
mkdir -p /docker/openldap; cd /docker/openldap
vi docker-compose.yml
```

環境変数(environment)の定義については、必要に応じて変更して使ってください。
何が設定できるかが知りたい方は [osixia/openldap][1.2] のページをご覧ください。

```yaml
LDAP_ORGANISATION: IBM
LDAP_DOMAIN: instana.local
LDAP_BASE_DN: dc=instana,dc=local
LDAP_ADMIN_PASSWORD: admin
LDAP_CONFIG_PASSWORD: config
LDAP_TLS: false
```

:::note warn
変更した場合は、`ldapadd.ldif`の内容も合わせて変更が必要となります。
:::


## 1.2 ldapadd.ldifファイル 
必要な情報は全てLDIFファイルで定義します。
そうすることで、一度作ってしまえば何度でも同じ環境をサクッと作成できるようになります。

`docker-compose.yml`と同じディレクトリに配置します。

サンプルファイルでは、`admin`ユーザーとは別に`instanaut1`ユーザーを作成します。
ユーザーを追加する場合はブロック毎コピペして追記します。

```
# instanaut1, people, instana.local
dn: uid=instanaut1,ou=people,dc=instana,dc=local
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: instanaut1
cn: instanaut1
sn: instanaut1
mail: instanaut1@instana.local
userPassword: {SSHA}j2NdJprA9opORImusfmNW9fJ4PoQPT4I
```

ユーザーを追加した場合は、instanaグループのmemberにも追記するようにします。
```
# instana, group, instana.local
dn: cn=instana,ou=group,dc=instana,dc=local
objectClass: top
objectClass: groupOfNames
cn: instana
member: uid=admin,ou=people,dc=instana,dc=local
member: uid=instanaut1,ou=people,dc=instana,dc=local
```

## 1.3 openldapコンテナの起動
`docker-compose.yml`と`ldapadd.ldif`が用意できたらコンテナを起動します。
初めて起動するときはイメージプルがありますのでインターネット接続が必要です。

```bash
docker compose up -d
[+] Running 10/10
 ✔ openldap 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled         17.1s 
   ✔ 45b42c59be33 Pull complete                                   1.0s 
   ✔ ae7fb8f59730 Pull complete                                   0.6s 
   ✔ 55443d9da5d5 Pull complete                                   8.9s 
   ✔ edbb56ba2f49 Pull complete                                   1.2s 
   ✔ 8690d28b09a7 Pull complete                                   1.6s 
   ✔ 7f3b6edb2b51 Pull complete                                   2.1s 
   ✔ 176dedf70b8e Pull complete                                   1.7s 
   ✔ 036fb52cada7 Pull complete                                   2.1s 
   ✔ 94404c4ec0d9 Pull complete                                   2.6s 
[+] Running 1/1
 ✔ Container openldap  Started  
```

### 1.4 ユーザーパスワードの変更
パスワードを変更します。

LDIFファイル内に記載するための暗号化されたパスワードを生成するには`slappasswd`コマンドを使用します。Linux OSにパッケージを追加しても良いのですが、最終的に不要なパッケージを極力入れたくないというのもあり、コンテナを活用します。

`slappasswd`コマンドの結果`{SSHA}`で始まる文字列が返ってくるので、
それを使って`ldapadd.ldif`内の該当ユーザーの`userPassword`属性の値を置換します。

```bash
docker exec openldap slappasswd -s <"暗号化したいパスワード">
{SSHA}YWD+yD8F3k2hEYOlGMj2d8Nist/V/Kfx

vi ldapadd.ldif
```

### 1.5 openldapコンテナの再起動
コンテナを再起動することで、新しいLDIFファイルでLDAPサーバーが再構築されます。
```bash
docker compose down
[+] Running 1/1
 ✔ Container openldap  Removed  
docker compose up -d
[+] Running 1/1
 ✔ Container openldap  Started

docker compose ps
NAME       IMAGE                    COMMAND                                SERVICE    CREATED          STATUS          PORTS
openldap   osixia/openldap:latest   "/container/tool/run --copy-service"   openldap   50 seconds ago   Up 49 seconds   0.0.0.0:389->389/tcp, :::389->389/tcp, 636/tcp
```

以上でLDAPサーバーの準備は完了です。

# 2. InstanaのLDAP認証設定
Instana Web UIにログインし、OpenLDAP認証を使用するように設定を行います。

:::note warn
設定を変更した後は、それまで使用していたローカルユーザは使用できなくなります。
:::

設定 > 認証 > LDAP にて、
以下のように必要な設定を入力します。

|設定項目  |設定値  |備考  |
|---|---|---|
|URL  |ldap://openldap:389  |openldapコンテナ名  |
|ユーザー  |cn=admin,dc=instana,dc=local  |LDAP管理者なのでそのまま  |
|パスワード  |LDAP管理者パスワード  |デフォルトはadmin  |
|基本  |dc=instana,dc=local  |Base DN  |
|グループ・クエリー  |(cn=instana)  |  |
|グループ・メンバー・フィールド  |member  |  |
|ユーザー・クエリー・テンプレート  |(uid=%s)  |  |
|Eメール・フィールド  |mail  |  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/9d754300-8e05-2c66-2d25-b6462c4ec9c4.png)

(つづき)
LDAPユーザー・アカウントの設定
LDAP内のAdminユーザーを指定し、構成のテストをクリックします。
"Test succeeded"と出ればOKです。

|設定項目  |設定値  |備考  |
|---|---|---|
|ユーザー名  |admin  |LDAP内のInstana Adminユーザー  |
|パスワード  |Instana Adminパスワード  |LDAP内のInstana Adminパスワード  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/dcfba25a-983c-ec56-80d9-7a9fdb5967ba.png)

オプションの設定は割愛し、保存ボタンをクリックします。
画面上部に「構成が正常に保存されました。」と出ればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/54c1ebec-3741-579c-536b-00e9de4582c0.png)

以上でInstanaのLDAP認証設定は完了です。

# 3. ログインの確認
Instana Web UIにLDAPに設定したユーザー/パスワードでログインします。

adminユーザーに関しては、Instana Adminユーザーに関連付けられており、設定も全て引き継がれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/589fb7db-dc9b-bb37-5180-fcb581525bcc.png)


追加のinstanaut1ユーザーに関しては、初回ログイン時にユーザーが作成されます。
今回はグループマッピングを使用していないため、Defaultグループに割り当てられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/82eaff6e-f9a3-7260-1df9-30ec42222c56.png)

# おわりに
Instana Self-Hosted on dockerのLDAP認証環境を簡単に作成する方法をまとめました。
複数ユーザーを簡単に扱えるようになると、細かいRBAC設定による挙動確認やダッシュボードの共有などの挙動を試したりと検証の幅が広がるところが良いですね。

少しでも参考になれば幸いです。