Jの衝動書き日記

さらりーまんSEの日記でございます。

SpringBootでLDAP認証-認証用情報の設定-

SpringBootでLDAP認証は以下の構成となっている。

  1. LDAPサーバの構築
  2. 認証用情報の設定
  3. LDAP認証をおこなうアプリケーションの作成

認証用情報の設定

1.ツールのインストール

 その前にツールのインストールをおこなう。phpldapadminだ。このツールはLDAPサーバの設定をブラウザで行うためののものである。登録した情報が階層構造で見れるので便利なのだ。登録した情報自体はコマンドでも確認できるが意図した構造になっているかを確認するには一目で理解できたほうが楽だ。もっともCUIだけでやるという漢のかたはスキップしてよい。

 手順は以下のとおりだ。

  1. レポジトリの追加:EPEL・Remi
  2. phpldapadminのインストール
  3. phpldapadminのログイン方法の変更(DNにする)
  4. 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にvagrantVMを起動して作っている。最初は上記のアクセス先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認証をおこなうためには認証対象となるユーザ情報(アカウント名とパスワード)が必要となる。また特定の操作を特定のユーザのみに許可したい場合(認可という)は権限情報も必要となる。またそれらを登録するためにはそれらを格納するための基点情報も必要となる。
 手順としては次の通りだ。

  1. グループの作成
  2. ユーザ情報の登録
  3. 権限情報の追加と割当

 

 最初にグループの作成をおこなう。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のインストール手順を参考