Ubuntu 20.04 LTS にOpenLDAPサーバーを構築したい

ubuntuにLDAPサーバーを構築するときに情報が散乱していて手間取ったのでまとめておきます

## 動作環境とか

```
Hardware: Raspberry Pi 3 Model B
OS: Ubuntu 20.04.2 LTS
```

## OpenLDAPのインストール

slapdとldap-utilsをインストールする

```bash
$ sudo apt install slapd ldap-utils
```

slapdにインストール中にLDAPサーバーの管理者パスワードを設定するように求められるので、適当に入力する

このままだとドメインがnodomainになっているので再設定を行ない適当なドメインに変更する

```bash
$ sudo dpkg-reconfigure slapd
```

設定画面がひらくので

```
Omit OpenLDAP server configuration?: No

DNS domain name?: [任意のドメイン]

Organization name?: [任意の組織名]

Administrator password?: [管理者パスワード(インストール時に設定したやつの再設定)]
```

このあとの質問はEnter連打で基本的にOK

一応設定の確認

```bash
$ sudo slapcat
```

設定したドメイン名がドットで区切られて、それぞれがカンマ区切りでdc=のあとに書いてあればOK
例：[hoge.example.com]の場合は[dc=hoge,dc=example,dc=com]

## LDAPサーバーの設定

### ユーザーとグループの組織単位の追加

base.ldifを作成して以下の内容を書き込む
dc=hoge,dc=example,dc=comのところはslapdの設定のところで設定したドメインに合わせて設定する

```:base.ldif
dn: ou=people,dc=hoge,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=hoge,dc=example,dc=com
objectClass: organizationalUnit
ou: groups 
```

書き込んだら設定を追加する

```bash
$ ldapadd -x -D cn=admin,dc=hoge,dc=example,dc=com -W -f base.ldif
```

このとき管理者パスワードを聞かれるので先に設定したやつを入力する

`adding new entry ~`が2つ(peopleとgroups)が帰ってくればOK

### LDAPサーバーにユーザーを追加

ユーザーのパスワードを生成する

```bash
$ slappasswd
New password:[アカウントに設定したいパスワードを入力]
Re-enter new password:[one more入力]
{SSHA}xxxxxxxxxxxxxxxxx
```

ここで表示された`{SSHA}xxxxxxxxxxxxxxxxx`のところをメモしておく

ldapuser.ldifを作成して以下の内容を書き込む
dc=hoge,dc=example,dc=comのところはslapdの設定のところで設定したドメインに合わせて設定する
`{SSHA}xxxxxxxxxxxxxxxxx`のところは先程メモしたやつを入力する
ここではユーザー[ubuntu]を例にしているが、ここは各々の環境でLDAPサーバーに追加したいユーザー名に変更する
また、uidNumber、gidNumberは追加したいユーザーのユーザーID、グループIDを入力する

```:ldapuser.ldif
dn: uid=ubuntu,ou=people,dc=hoge,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: ubuntu
sn: ubuntu
userPassword: {SSHA}xxxxxxxxxxxxxxxxx
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/ubuntu

dn: cn=ubuntu,ou=groups,dc=hoge,dc=example,dc=com
objectClass: posixGroup
cn: ubuntu
gidNumber: 2000
memberUid: ubuntu
```

書き込んだら設定を追加する

```bash
$ ldapadd -x -D cn=admin,dc=hoge,dc=example,dc=com -W -f ldapuser.ldif
```

このとき管理者パスワードを聞かれるので先に設定したやつを入力する

`adding new entry ~`が2つ(peopleとgroups)が帰ってくればOK

間違えて設定してしまって変更したいときは下のコマンドで既存の設定を削除してからもう一度行なう

ユーザー情報の削除

```bash
$ ldapdelete -x -W -D cn=admin,dc=hoge,dc=example,dc=com uid=ubuntu,ou=people,dc=hoge,dc=example,dc=com
```

グループ情報の削除

```bash
$ ldapdelete -x -W -D cn=admin,dc=hoge,dc=example,dc=com cn=ubuntu,ou=groups,dc=hoge,dc=example,dc=com
```

## LDAPクライアントの設定

### LDAPクライアントのインストール

```bash
$ sudo apt install libnss-ldapd libpam-ldapd ldap-utils
```

インストール時にいろいろ聞かれるので答えていく

```
LDAP server Uniform Resource Identifier: ldap://[構築したLDAPサーバーのIPアドレス]/

Distinguished name of the search base: [LDAPサーバーで設定したドメイン(dc=なんとかをカンマで区切ったやつ)]

Name services to configure: [passwd, group, shadowにチェックと入れる]
```

LDAPサーバーのIPアドレスのところは`ldap://[IP or Domain]`にしないとログインできない場合があるのでこの形式をおすすめする

これで動く(はず)

サーバーのIPアドレスとドメインをあとから変更したいときは`/etc/nslcd.conf`、Name servicesの変更は`/etc/nsswitch.conf`を編集する

### 動作確認

sshしてみる

```bash
$ ssh [LDAPサーバーで設定したユーザー名]@[LDAPサーバーのIPアドレス]
[LDAPサーバーで設定したユーザー名]@[LDAPサーバーのIPアドレス]’s password: [LDAPサーバーで設定したパスワード]

[ログインしたときのログ]

$
```
こんな感じにssh接続できたらOK
お疲れ様でした

## 参考文献

 - [Ubuntu 20.04 : OpenLDAP インストールと設定 : Server World](https://www.server-world.info/query?os=Ubuntu_20.04&p=openldap)
 - [How To Install and Configure OpenLDAP and phpLDAPadmin on Ubuntu 16.04 | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-ubuntu-16-04)
 - [Ubuntu 16.04 で OpenLDAP でユーザ認証を行う](https://qiita.com/syoyo/items/1c798b57b7897b8957f7)

## あとがき

 - 初Qiita記事だからこれでいいのかわからない
 - ドメインの設定に手こずって数時間悩んだ
 - いろいろいじってたら認証系の何かが死んでOS再インストールになった(ぴえん)