SpringBootでLDAP認証は以下の構成となっている。
- LDAPサーバの構築
- 認証用情報の設定
- LDAP認証をおこなうアプリケーションの作成
認証用情報の設定
1.ツールのインストール
その前にツールのインストールをおこなう。phpldapadminだ。このツールはLDAPサーバの設定をブラウザで行うためののものである。登録した情報が階層構造で見れるので便利なのだ。登録した情報自体はコマンドでも確認できるが意図した構造になっているかを確認するには一目で理解できたほうが楽だ。もっともCUIだけでやるという漢のかたはスキップしてよい。
手順は以下のとおりだ。
- レポジトリの追加:EPEL・Remi
- phpldapadminのインストール
- phpldapadminのログイン方法の変更(DNにする)
- phpldapadminへのアクセス権の変更
まずはレポジトリを追加する。
# EPELリポジトリ # yum -y install epel-release # Remiリポジトリ # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
つぎにphpldapadminをインストールする。phpldapadminの名前の通りphpで実装されているためphpも入れる。最初はRemi使わないでインストールしたが実行に必要なパッケージ(xml関連)が入らなかったりしたのでRemi使うのが無難。
# yum -y install --enablerepo=remi,remi-php70 phpldapadmin
phpのためツールの起動手順は特にない。httpdが起動していればよい。
終わったらphpldapadminのログイン方法を変更する。
デフォルトだとuidとなっている。これはLDAPサーバで管理する情報のうちuidを持つユーザでログインするということだ。
今はそれがいない(前の手順で作成した管理者はcn=adminである)であるためDNを指定してログインできるようにする。
# diff /etc/phpldapadmin/config.php.bk /etc/phpldapadmin/config.php 397,398c397,398 < //$servers->setValue('login','attr','dn'); < $servers->setValue('login','attr','uid'); --- > $servers->setValue('login','attr','dn'); > //$servers->setValue('login','attr','uid');
最後に phpldapadminへのアクセス権の変更をおこなう。
デフォルトだとローカルアクセスしか許可していないためこれを変更する。ただ、今回は検証用なので厳密には設定せずそっくり開けてしまう(実際の環境では当然こんなことしない)。
# cat phpldapadmin.conf # # Web-based tool for managing LDAP servers # Alias /phpldapadmin /usr/share/phpldapadmin/htdocs Alias /ldapadmin /usr/share/phpldapadmin/htdocs <directory usr="" share="" phpldapadmin="" htdocs=""> <ifmodule mod_authz_core="" c=""> # Apache 2.4 Require local Require ip 192.168.1.1(※アクセスしてくるもの) </ifmodule> <ifmodule mod_authz_core="" c=""> # Apache 2.2 #Order Deny,Allow #Deny from all #Allow from 127.0.0.1 #Allow from ::1a Order Allow,Deny Allow from all </ifmodule> # 設定後httpdを再起動 # systemctl restart httpd
ちなみに検証環境は自PCにvagrantでVMを起動して作っている。最初は上記のアクセス先IPアドレスに自PCのIPアドレスを設定していたがForbiddenとなっていた。VMにアクセスするときは別に割り当てられたIF経由でアクセスするためIPアドレスが違うのを忘れていた。
再起動後、http://{LDAPサーバ}/phpldapadmin/へアクセスし管理者DN(記事の例ではcn=admin,dc=test,dc=example,dc=jp)でログインする。画面にはdc=test,dc=example,dc=jpが木構造のrootとして表示されているはずだ。他には何も情報がないためdc=test,dc=example,dc=jpのみだが。
2.認証情報の設定
LDAP認証をおこなうためには認証対象となるユーザ情報(アカウント名とパスワード)が必要となる。また特定の操作を特定のユーザのみに許可したい場合(認可という)は権限情報も必要となる。またそれらを登録するためにはそれらを格納するための基点情報も必要となる。
手順としては次の通りだ。
- グループの作成
- ユーザ情報の登録
- 権限情報の追加と割当
最初にグループの作成をおこなう。phpldapadminを導入したためコマンドでは設定せずphpldapadminのインポート機能を使っておこなう。
# ユーザ情報格納用 dn: ou=people,dc=test,dc=example,dc=jp objectclass: organizationalUnit ou: people # 権限格納用 dn: ou=role,dc=test,dc=example,dc=jp objectclass: organizationalUnit ou: role
organizationalUnitを作成したためou(組織名)を設定する。名前はpeople,roleとしたが名前は何でもよい。ユーザ情報や権限情報はこれらの下に設定することになる。
各objectclassで必須となる属性や属性情報そのものを確認したい場合はphpldapadminの画面上のスキーマから確認できる。
次にユーザ情報の登録をおこなう。ユーザ情報としては少なくともアカウント名とパスワードが必要なのでこれらを含むobjectclassで情報を登録する必要がある。
本記事ではinetOrgPersonを使用する。uid:アカウント名,userpassword:パスワードの属性を持ち、他にsn(last family name),cn(common name)を必須属性とする(ちなみにuidは任意だったりする)。
ただ、inetOrgPersonを使用するためにはスキーマのインポートが必要のため最初にこれをおこなう。この作業はコマンドで実行する。
# スキーマの追加 # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif # ユーザ情報の追加 ※2ユーザを追加(これはphpldapadminで実施) dn: uid=gokuu,ou=people,dc=test,dc=example,dc=jp objectclass: inetOrgPerson sn: 悟空 ※日本語でもOK cn: 孫 悟空 ※日本語でもOK uid: gokuu userpassword: {SSHA}9JYvrXQeS+idmmijQlu3bmYBYZ38eUib dn: uid=gohan,ou=people,dc=test,dc=example,dc=jp objectclass: inetOrgPerson sn: 悟飯 cn: 孫 悟飯 uid: gohan userpassword: {SSHA}vteURqgusPSHBdQAO8tGy46tkWfGu67L
今回はDNをuidとしているがsnやcnを使っても問題はない。指定したobjectclassに存在する属性なのであれば使用できる(とは言えuidが一般的)。
ここで登録したユーザアカウントでphpldapadminにログインすることも可能だ。ただし参照のみで情報の変更はできない。
また、phpldapadminを使ってユーザ情報を追加する場合はuidは重複禁止となっている。通常は問題ないがもし支障がある場合(階層が別だがアカウントが同一であるときなど)は /etc/phpldapadmin/config.phpの以下の設定を変更すること。
$servers->setValue('unique','attrs',array('mail','uid','uidNumber')); #ここで指定した内容が重複禁止となる
最後に権限情報の追加と権限割当をおこなう。権限情報の登録にはgroupOfUniqueNamesを使用する。ここで規定されるuniqueMember属性がLDAP認証で必要となるためだ。
識別はcnでおこなう。このためcnが権限名となる。権限名には特に規定はない。
権限割当はuniqueMemberにその権限を与えたいユーザのDNを指定することでおこなう。uniqueMemberにユーザのDNが無いということはそのユーザにはその権限がないと言うことを示す。
# admin権限の登録と割当 dn: cn=admin,ou=role,dc=test,dc=example,dc=jp cn: admin objectclass: groupOfUniqueNames uniquemember: uid=gokuu,ou=people,dc=test,dc=example,dc=jp # user権限の登録と割当 dn: cn=user,ou=role,dc=test,dc=example,dc=jp cn: user objectclass: groupOfUniqueNames uniquemember: uid=gokuu,ou=people,dc=test,dc=example,dc=jp # 権限を追加で割当(権限情報の作成後の新たにユーザを追加した場合など) dn: cn=user,ou=role,dc=test,dc=example,dc=jp changetype: modify add: uniqueMember uniqueMember: uid=gohan,ou=people,dc=test,dc=example,dc=jp
ちなみに権限を追加で割当したい場合はGUI操作でもできる。
dc=test,dc=example,dc=jp クリック → ou=roleクリック → cn=adminクリック → uniqueMemberの値追加
GUI操作でおこなう場合登録済のユーザDNが表示されるためちょっとした変更の場合はこっちの方が簡単かもしれない。
参考
qiita.com※phpldapadminのインストール手順を参考