[図解初めてのokta]oktaのLDAP Interfaceを使用して、LDAP(S)認証する

# 概要

初めてoktaを使って自社アプリとLDAP(S)の連携をしたので、LDAPS関連の設定手順を残したいと思います。

# 前提条件

oktaに管理者権限を有するアカウントがあり、利用できること。
[先日発表された「Okta Starter Developer Edition」](https://www.okta.com/jp/press-room/press-releases/okta-developer-starter/)を使用した。

# 全体の流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/41cc9231-c4f2-98ae-49eb-ba7d15dcb588.png)

# 手順

1. LDAP認証時にディレクトリ情報を取得するユーザを追加する。
   管理者ユーザをそのまま利用すると権限過多なので別ユーザを作成することを推奨します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/fe2ff5fc-c742-07fc-9d74-7e2a7ecf2cbc.png)

2. 作成したユーザでログインできることを確認する。
   確認メールの検証リンクまで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/ab52cdfd-88bf-dd87-4502-9179285eb3fb.png)

3. 作成したユーザを[読み取り専用管理者権限](https://help.okta.com/en/prod/Content/Topics/Security/healthinsight/limit-admins.htm?cshid=csh-limit-admins)に追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/804e3deb-0c73-8299-de1d-e7d6facf237c.png)
LDAP用ユーザ名を入力し、「Read Only Administrator」にチェックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/81cdcd8b-2ec6-e21a-029b-1d0c7141b21c.png)

4. LDAP Interfaceを有効にする。（デフォルト有効）
   LDAP Interfaceは自前でLDAPサーバを構築せずにoktaで予め用意されているLDAPサービスを使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/b1769596-b3c2-dc94-bd35-74977d8c6e89.png)

5. LDAP(S)用の設定値を確認し、連携したいアプリケーション、サービスに入力する
   LDAPSを使用する場合は、636ポート、LDAPは389ポート（StartTLSに対応していること）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/e3dfb78e-ad07-0317-228e-ca7f05d410e1.png)

6. [オプション]LDAPS使用時に必要の証明書の入手方法
   ブラウザで読み込まれている証明書をそのまま保存し、連携先のアプリケーション、サービスなどにインポートする。
ただし、有効期間には要注意！
またこの方法は公式の手順ではなく、[ヘルプセンターに記載されたものを手順](https://support.okta.com/help/s/article/How-to-save-the-Okta-certificate-from-a-browser?language=en_US)として採用しています。
もし、正しい手順やこんなやり方もあるよという方がいましたらコメント頂けると嬉しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/82dbeb7d-2c12-f5ed-ac41-b607a1e514dc.png)

7. アプリケーション、サービス側の設定
    - ホスト、ポート、ベースDNは上記のLDAP Interfaceで表示されている値を用いてください。
    - 管理者DNは`uid=読み取り専用ユーザのユーザID(メールアドレス), ou=users, dc=サブドメイン名, dc=okta, dc=com`
    - 管理者PWは読み取り専用ユーザのPW
    - 認証時にユーザIDとなるキーはoktaのユーザ「Profile」の属性名を指定する。
        - アプリケーションやサービスのログインユーザIDがoktaと同じメールアドレス型式ならば、`uid`を指定すればOK
        - その他の場合は、Profileの「Variable Name」(下図参照)を使用する。なお、属性を拡張する場合も下記の手順を参照してください。
8. [オプション]Profileを拡張し、認証時のログインキーとして使用する。
   ユーザが属しているProfileを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/e7dc9096-3957-d7d3-25d2-8198fcb5a771.png)
  下図の「Variable Name」はログインキーとして使用できる属性名になります。
   属性を追加場合は、「Add Attribue」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/bcbc2dd4-4cf7-2487-2a04-bc36a5e93fc0.png)
   認証用なので、stringで問題ないと思います。
   Variable nameは一度決めたら変えられないので、変えたい場合は、削除し、再作成してください。
   作成後はユーザのProfileの該当項目に値を入力し、連携先のアプリケーションやサービスにログインキーとして指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/f3b2778d-b978-81fd-2379-a3a3b14b57e1.png)

# セキュリティ対策

LDAP(S)認証のリクエスト元を[IPベースで制限する仕組み（IP以外もいろいろできます）](https://help.okta.com/en/prod/Content/Topics/Security/network/get-started.htm)があります。
リストに追加された時点で機能するようになります。
何もなければすべて許可、1つ以上あった場合は、それらのIPのみが許可される。
また、ブラックリストも追加できる。
なお、Webからのログインは「[sign-on policy]((https://help.okta.com/en/prod/Content/Topics/Security/network/add-network-zone-signin-policy.htm))」で該当の設定が追加されていなければ影響しないと思われ（未確認）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/2fec193c-9678-180f-b7f8-0425be8ffc4b.png)