CentOS7.9にdockerでOpenLDAPとphpLDAPadminを導入する

<!-- この記事はテンプレートをおかりしています -->
# はじめに
・OpenLDAPの環境をphpLDAPadminでアカウントを作成し、ホスト含め複数端末にてログインできるように設定するところまでがゴール。
・ググったところあまり見当たらず苦心したのでまとめています。初心者がネットの海を溺れながら探り当てた方法につき過不足があることをご了承ください。
・セキュリティ未考慮です。
・参考画像はありません。すみません。

※2023/10/02追記
playbookにもありましたがクライアント設定のnsswitch.conf編集が抜けてましたので追記。

・LDAPホスト(CentOS7.9)
```
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# 
```
・クライアント(Ubuntu22.04)
20.04でも可能なことを確認しています。
また、CentOSでのクライアント接続手順も記載しています。
```
root@settingtest3-VirtualBox:/home/settingtest3/デスクトップ# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04 LTS"
root@settingtest3-VirtualBox:/home/settingtest3/デスクトップ# 
```

<!-- 発端や概要を記載 -->

<!-- 各チャプター -->
<a id="#dockerコンテナ起動"></a>
# dockerコンテナ起動

Bashでコンテナ起動。

```
vi ldap.bash
```

```bash:ldap.bash
SERVICE=ldap-service
HOST_NAME=ldap-host
PASSWORD=adminpass
docker run \
    -p 389:389 \
    --restart=always \
    --name $SERVICE \
    --hostname $SERVICE \
    --env 'LDAP_ORGANISATION=Setumei' \
    --env LDAP_DOMAIN=example.com \
    --env LDAP_ADMIN_PASSWORD=$PASSWORD \
    --detach \
    osixia/openldap
docker run \
    -p 443:443 \
    --restart=always \
    --name ${SERVICE}-admin \
    --hostname ${SERVICE}-admin \
    --link $SERVICE:$HOST_NAME \
    --env PHPLDAPADMIN_LDAP_HOSTS=$HOST_NAME \
    --detach \
    osixia/phpldapadmin
```

```
bash ldap.bash
```


-p が無いと設定が正しくてもホストからでも接続できなくなった
docker-composeはよくわかりませんでした。

<a id="#phpLDAPadminにてLDAPアカウント作成"></a>
# phpLDAPadminにてLDAPアカウント作成
0. `https://localhost`にて接続。
上記ldap.bashでたてた場合、以下でログイン。
```
Login DN:cn=admin,dc=example,dc=com
Password:adminpass
```

##### 0. ログイン後左ペインのツリーをクリック後、右ペインのCreate a child entryで以下作成
※左ペインのCreate a child entryはなにか一つ作成してRefreshボタンを押さないと出現しない

##### 1. グループディレクトリ作成
Generic: Organisational Unit
名前例：Groups
#のちに作成するPosixGroupのまとめ役としてouを作成

##### 2. ユーザーディレクトリ
Generic: Organisational Unit
名前例：Users
#アカウントのまとめ役

##### 3. LDAPアカウントグループ
Generic: Posix Group
名前例：LDAPgroup

##### 4. LDAPアカウント
Generic: User Account
名前例：ldap
#Login ShellはBashにしておく

アカウントは作成後2つあるように見えることがあるが、Refreshボタンを押すと１つになる。
最初のアカウントはUIDが1000になるが、ローカルのアカウントで被っている可能性が高いので二つ目以降がおすすめ
もしくはGeneric: User Accountではなく、DefaultからObjectClassをCtrl押しながら複数選択しすべて手動入力して作成か


<a id="#LDAP接続手順_on_CentOS_with_nslcd※LDAPサーバ本体でも可能"></a>
# LDAP接続手順 on CentOS with nslcd※LDAPサーバ本体でも可能

##### ①必要パッケージインストール
```
yum -y install openldap-clients nss-pam-ldapd
```
##### ②初期設定
```
authconfig --enableldap --enableldapauth --ldapserver=127.0.0.1 --ldapbasedn="dc=example,dc=com" --enablemkhomedir --update
```
#basednとアドレスを書き換えて実行
 authconfigで変更するとpam.dのconfやnsswitch.confなどの設定が上書きされるため初回以降は注意

##### ③uriとbaseを設定　※④参考
```
vi /etc/openldap/ldap.conf
```
binddnとbindpwはssh/suするだけなら不要

##### ④nslcd.conf編集
```
vi /etc/nslcd.conf
```
#以下例のようにuri、base、binddn、bindpwを追記する
　base dc=example,dc=com
　uri ldap://10.0.2.114
　binddn cn=admin,dc=example,dc=com
　bindpw adminpass

##### ⑤nslcdサービススタート
```
systemctl restart nslcd
systemctl enable nslcd
```

##### ⑥nslcd正常性確認
```
getent passwd
#まだ表示されない
systemctl status nslcd
#エラーが発生していないか確認（getentなどで接続を試みないとエラーが表示されない可能性あり）
```
Can't contact LDAP server なんちゃら...のエラーが出る場合は設定が足りない可能性あり

##### ⑦nsswitch.conf編集
```
vi /etc/nsswitch.conf
```
#passwd:shadow:group:に ldapを追記。sssはそのままでもok
\==============
passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files ldap
\==============

##### ⑧LDAPアカウントが表示されるか確認
```
getent passwd
```
#LDAPアカウントが一番下に*付きで表示されることを確認
 表示されない場合はsystemctl status nslcdでエラー内容を見てみる

##### ⑨suでログインできるか確認
```
su ldap
```
#ログイン後「bash: /home/users/****/.bashrc: 許可がありません」と表示された場合は、UIDがサーバ本体の他アカウントなどと被っている可能性
 sh-4.2$ と表示される場合はLoginShellが/bin/bashに指定されていない可能性

##### ⑩sshでログインできるようにしたい場合
```
vi /etc/pam.d/password-auth
vi /etc/pam.d/password-auth-ac
```
#sssをldapに置換 :s/sss/ldap/g
 念のためpassword-auth-acも同じようにldapに置換

##### ⑪sshできるか確認
```
ssh ldap@localhost
```

<a id="#LDAP接続手順_on_Ubuntu_with_pam(?)"></a>
# LDAP接続手順 on Ubuntu with pam(?)

##### ①必要パッケージインストール
```
apt install libnss-ldap libpam-ldap ldap-utils
```
#ldap://アドレス 、デフォルトはldapi:///になっていることに注意
 ドメインを入力、no,noを選択

##### ②/ldap.conf編集
```
vi /etc/ldap.conf
```
#以下例のようにbinddn,bindpwを入力し、
 　binddn cn=admin,dc=example,dc=com
 　bindpw adminpass
 その他設定がLDAPサーバの設定とあっているか確認。
 　base dc=example,dc=com
 　uri ldap://10.0.2.114
 　ldap_version 3

##### ③nsswitch.conf編集
```
vi /etc/nsswitch.conf
```
#passwd:shadow:group:に ldapを追記。
\==============
passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files ldap
\==============

##### ③接続できるか確認
```
getent passwd
su ldap
```
#LDAPアカウントが見える、ログインできることを確認


<a id="#reference"></a>
# 参考文献（勝手に）
- [Qiita記事投稿用テンプレート](https://qiita.com/tkrtmy1031/items/80c292fab5d631c6d4ba)
- [dockerでLDAP Serverを起動。ついでにphpLDAPadminも](https://qiita.com/kokardy/items/1179bb2f96f790acc6c5)
- [LDAPクラインアントからLDAPサーバへログインしよう](https://qiita.com/i13ame/items/c3d7f4a28729045167d2)
- [OpenLDAP : LDAPクライアントの設定 (AD)](https://www.server-world.info/query?os=CentOS_7&p=openldap&f=8)
- [PAM と NSS の違い、LDAP連携のイメージ](https://milestone-of-se.nesuke.com/sv-basic/linux-basic/pam-nss-ldap/)
- [サーバー管理の困った！を○○で解決　LDAPを使ったユーザー管理編 2/2](https://www.nedia.ne.jp/blog/tech/2015/09/08/5570)
- [dockerコンテナ使ってOpenLDAPへcentos8からssh接続する](https://gavann-it.com/2021/09/25/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%BF%E3%81%A3%E3%81%A6openldap%E3%81%B8centos8%E3%81%8B%E3%82%89ssh%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B/)

# 雑記
・筆者はLDAPについて、PAMについて、ログイン認証の仕組みについてなどよく理解していません。
・basednもbinddnも同じでとりあえず問題なし。
・dockerの-pオプションはdocker updateコマンド未対応で--ENVオプションでもないので後付けはできないハズ。
・おまけ①　centos7.9でのdockerインストール手順
```
#参考：https://docs.docker.jp/engine/installation/linux/docker-ce/centos.html
yum install -y yum-utils 
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin 
systemctl enable docker 
systemctl start docker
```
・おまけ②　AnsibleでのLDAP設定Playbook※Ubuntu18.04以降
```
    - name: apt install libnss-ldap libpam-ldap ldap-utils
      apt:
        name:
          - libnss-ldap
          - libpam-ldap
          - ldap-utils

    - name: "/etc/ldap.conf.org.d/ の存在確認"
      stat:
        path: "/etc/ldap.conf.org.d/"
      register: ldap_conf_reg

    - name: "ldap.confをバックアップ"
      synchronize:
        src: "/etc/"
        dest: "/etc/ldap.conf.org.d/"
        rsync_opts:
             - "--include=ldap.conf"
             - "--exclude=*"
        times: no #タイムスタンプ無視
        checksum: yes #タイムスタンプ無視
      delegate_to: "{{ inventory_hostname }}"
      when: ldap_conf_reg.stat.exists == false

    - name: "ldap.conf編集_uri"
      lineinfile:
        path: "/etc/ldap.conf"
        regexp: "^uri ldap"
        line: "uri ldap://10.0.2.114/"

    - name: "ldap.conf編集_base dc=example,dc=com"
      lineinfile:
        path: "/etc/ldap.conf"
        regexp: "^base dc="
        line: "base dc=example,dc=com"

    - name: "ldap.conf編集_ldap_version 3"
      lineinfile:
        path: "/etc/ldap.conf"
        regexp: "^ldap_version"
        line: "ldap_version 3"

    - name: "ldap.conf編集_binddn,bindpw"
      blockinfile:
        path: "/etc/ldap.conf"
        block: |
          binddn cn=admin,dc=example,dc=com
          bindpw adminpass

    - name: "/etc/nsswitch.conf.org.d/ の存在確認"
      stat:
        path: "/etc/nsswitch.conf.org.d/nsswitch.conf"
      register: nsswitch_conf_reg

    - name: "nsswitch.confをバックアップ"
      synchronize:
        src: "/etc/"
        dest: "/etc/nsswitch.conf.org.d/"
        rsync_opts:
             - "--include=nsswitch.conf"
             - "--exclude=*"
        times: no #タイムスタンプ無視
        checksum: yes #タイムスタンプ無視
      delegate_to: "{{ inventory_hostname }}"
      when: nsswitch_conf_reg.stat.exists == false

    - name: "nsswitch.conf編集_shadow"
      lineinfile:
        path: "/etc/nsswitch.conf"
        regexp: "^shadow:         "
        line: "shadow:         files ldap"

    - name: "nsswitch.conf編集_passwd"
      lineinfile:
        path: "/etc/nsswitch.conf"
        regexp: "^passwd:         "
        line: "passwd:         files systemd ldap"

    - name: "nsswitch.conf編集_group"
      lineinfile:
        path: "/etc/nsswitch.conf"
        regexp: "^group:          "
        line: "group:          files systemd ldap"
```

以上