CentOS7 + OpenLDAPにおけるsha2の利用

# まえがき
一年近く前にやった作業を今更アップするので、今は状況が改善してるかもしれない・・・
OpenLDAP上に保存している様々なデータ上で、例えばユーザパスワードとか保存している場合はよくある状況だろうけど、その際、平文のまま保存しておくのは当然ナンセンス。

普通は、sha1でハッシュ化した文字列で置いておくんだけど、ご存知の通り現在ではsha1やめてsha2使おうねってなってる。
ところが、CentOSにおけるyumでインストールしたOpenLDAPではsha2を標準では扱えない。
※他は知らない
そのため別途、sha2モジュールを自分でコンパイルして組み込んであげないといけない。

仕事で先輩に頼まれて、試行錯誤しながら頑張ったときのメモ。
ただし今回の場合、色々事情があってOpenLDAP自体はyumでインストールし、別途sha2モジュールだけを生成して組み合わせて使う、という少し変態なことをやってる。

要件とかにもよるんだろうけれど、yum版OpenLDAPは使用せず、自前でコンパイルしたOpenLDAPを使ったほうが本来は良いのだろうと思う。


# 環境
CentOS7(1503)

# 作業始める前に確認
sha2モジュールが使用可能か確認
sha2モジュールを明示的に指定して、sha2でパスワードをハッシュ化できるか試してみる

```shell-session
[root@localhost ~]# slappasswd -h '{SHA256}' -o module-load=/usr/lib64/openldap/pw-sha2.so -s foobar

※ここで使用不可/エラーなどなら下記コンパイル手順を行っていく
※というか絶対エラーになるはず・・・
※他の場所にモジュールがないことを確認するために、find / -name pw-sha2.so とかで検索してみてもよいかも
```

# モジュールのコンパイル作業

### 前提
gccが導入済みであること
※未導入の場合、yum install gcc

### 作業ディレクトリに移動しソースをDLおよび解凍

```shell-session
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.44.tgz
[root@localhost src]# tar xzvf openldap-2.4.44.tgz
[root@localhost openldap-2.4.44]# cd openldap-2.4.44
```

### Makefileの作成
※db関連はあえて除外 (他にも必要なパッケージがたくさんありめんどうくさいため)
※除外させない場合、db4とかが必要になってくる

```shell-session
[root@localhost openldap-2.4.44]# ./configure --enable-bdb=no --enable-hdb=no
```

### 依存ライブラリと本体のコンパイル

```shell-session
[root@localhost openldap-2.4.44]# make depend
[root@localhost openldap-2.4.44]# make
```

### sha2モジュールのコンパイル

```shell-session
[root@localhost openldap-2.4.44]# cd /usr/local/src/openldap-2.4.44/contrib/slapd-modules/passwd/sha2
[root@localhost sha2]# make
../../../../libtool --mode=link gcc -g -O2 -Wall -version-info 0:0:0 \
-rpath /usr/local/libexec/openldap -module -o pw-sha2.la slapd-sha2.lo sha2.lo ../../../../libraries/libldap_r/libldap_r.la ../../../../libraries/liblber/liblber.la
cc -shared  .libs/slapd-sha2.o .libs/sha2.o  -Wl,--rpath -Wl,/usr/local/src/openldap-2.4.44/libraries/libldap_r/.libs -Wl,--rpath -Wl,/usr/local/src/openldap-2.4.44/libraries/liblber/.libs -Wl,--rpath -Wl,/usr/local/lib -L/usr/local/src/openldap-2.4.44/libraries/liblber/.libs ../../../../libraries/libldap_r/.libs/libldap_r.so ../../../../libraries/liblber/.libs/liblber.so  -Wl,-soname -Wl,pw-sha2.so.0 -o .libs/pw-sha2.so.0.0.0
(cd .libs && rm -f pw-sha2.so.0 && ln -s pw-sha2.so.0.0.0 pw-sha2.so.0)
(cd .libs && rm -f pw-sha2.so && ln -s pw-sha2.so.0.0.0 pw-sha2.so)
ar cru .libs/pw-sha2.a  slapd-sha2.o sha2.o
ranlib .libs/pw-sha2.a
creating pw-sha2.la
(cd .libs && rm -f pw-sha2.la && ln -s ../pw-sha2.la pw-sha2.la)
[root@localhost sha2]# ls -l .libs/
total 220
-rw-r--r--. 1 root root 76796 Jan 14 15:17 pw-sha2.a
lrwxrwxrwx. 1 root root    13 Jan 14 15:17 pw-sha2.la -> ../pw-sha2.la
-rw-r--r--. 1 root root   887 Jan 14 15:17 pw-sha2.lai
lrwxrwxrwx. 1 root root    16 Jan 14 15:17 pw-sha2.so -> pw-sha2.so.0.0.0
lrwxrwxrwx. 1 root root    16 Jan 14 15:17 pw-sha2.so.0 -> pw-sha2.so.0.0.0
-rwxr-xr-x. 1 root root 61488 Jan 14 15:17 pw-sha2.so.0.0.0
-rw-r--r--. 1 root root 43184 Jan 14 15:14 sha2.o
-rw-r--r--. 1 root root 32288 Jan 14 15:14 slapd-sha2.o
```


# OpenLDAPへの組み込み作業

## 準備
前工程で生成した以下を/usr/lib64/openldap/配下にコピー
pw-sha2.la
pw-sha2.so
pw-sha2.so.0
pw-sha2.so.0.0.0

### コンフィグの変更

```shell-session:slapd.conf
※13行目あたりに追加
moduleload      pw-sha2.la
```

### コンフィグ再生成

```shell-session
[root@localhost ~]# rm -rf /etc/openldap/slapd.d/*
[root@localhost ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
[root@localhost ~]# chown -R ldap:ldap /etc/openldap/slapd.d
```

### サービスの再起動および起動確認

```shell-session
[root@localhost ~]# systemctl restart slapd
[root@localhost ~]# journalctl -xn -u slapd
```

### モジュールが読み込まれていることを確認

```shell-session
[root@localhost ~]# less /etc/openldap/slapd.d/cn=config/ ~~module
[root@localhost ~]# slappasswd -h '{SHA256}' -o module-load=/usr/lib64/openldap/pw-sha2.so -s foobar
```