pukiwikiでldap認証を噛まそうと思った.
っでCentOS7で作ったLDAP(openldap)があってそれとの接続は上手く行ったものの group名 によるアクセス制限を課すには
「memberOf」属性が必要なようで、作ったこのLDAPには完備されていなかった...
一応sambaでADを動かすとその中のLDAP機能には「memberOf」属性は用意されていて普通に使えた.
っていうことはwindows向けの代物なのかな?
なら「スキーマ拡張」すれば使えるのかなとひらめいたが、sambaスキーマを乗せても「memberOf」がなかった...
っでOpenLDAPにmemberOf属性を追加させてみた
参照先:
https://kifarunix.com/how-to-create-openldap-member-groups/
http://www.ceres.dti.ne.jp/~t-yamada/ldap/authentication_infrastructure_for_Linux_and_Redmine_by_multimastered-OpenLDAP.html
memberOfが有効になる機能が既に入っているかを確認します
[root@ldap-server ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | less
この結果で
:
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
:
とか含む内容があれば器はできているのですが、ないのなら組み込みます
いつものようにldifを用意して ldapadd で反映させます
[root@ldap-server ~]# vi add_memberof.ldif
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModulePath: /usr/lib64/openldap
olcModuleLoad: memberof.la
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f add_memberof.ldif
[root@ldap-server ~]# vi config_memberof.ldif
dn: olcOverlay=memberof,olcDatabase={2}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfRefInt: TRUE
olcMemberOfDangling: ignore
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f config_memberof.ldif
そうして再度確認をすると下記のような表記になる
[root@ldap-server ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | less
:
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib64/openldap
olcModuleLoad: {0}memberof.la
:
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: {0}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
:
次に「refint.la」を組み込みます。この際、すでに「cn=module{0},cn=config」があるのでそこに反映させる。なので「modify」が使われます
[root@ldap-server ~]# vi add_refint.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: refint.la
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f add_refint.ldif
また確認すると
#code(nonumber){{
[root@ldap-server ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | less
:
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib64/openldap
olcModuleLoad: {0}memberof.la
olcModuleLoad: {1}refint.la
:
(略
[root@ldap-server ~]#
となる。
これで下地の準備は完了. ldapを一旦再起動「systemctl restart slapd.service」
新しいグループ cryo を作ります。作る際に「member」としてユーザを指定します
[root@ldap-server ~]# vi cryo_group.ldif
dn: cn=cryo,ou=group,dc=sybyl,dc=local
objectClass: groupOfNames
cn: cryo
member: uid=foo,ou=people,dc=sybyl,dc=local
[root@ldap-server ~]# ldapadd -x -D cn=Manager,dc=sybyl,dc=local -W -f cryo_group.ldif
この結果を確認してみます
[root@ldap-server ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b dc=sybyl,dc=local | less
:
dn: cn=cryo,ou=Group,dc=sybyl,dc=local
objectClass: groupOfNames
cn: cryo
member: uid=foo,ou=people,dc=sybyl,dc=local
:
[root@ldap-server ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b dc=sybyl,dc=local memberof | less
:
dn: uid=foo,ou=People,dc=sybyl,dc=local
memberOf: cn=cryo,ou=group,dc=sybyl,dc=local
:
[root@ldap-server ~]#
っとこれで「memberOf」が反映できた
事前に「php-ldap」パッケージをインストールします
「pukiwiki.ini.php」にて
$auth_type = AUTH_TYPE_FORM;
$ldap_user_account = 1; // (0: Disabled, 1: Enabled)
$ldap_server = 'ldap://ldap-server:389';
$ldap_base_dn = 'dc=sybyl,dc=local';
$ldap_bind_dn = 'uid=$login,ou=people,dc=sybyl,dc=local';
$read_auth = 1;
$read_auth_pages = array(
'##'=>'valid-user', // すべてのページの閲覧には認証を通るのが必要
);
$edit_auth = 1;
$edit_auth_pages = array(
'##'=>'ldap:cryo,admin', // 全てのページの修正にはmemberOfのcryo所属かユーザadminであることが必要
);
とかで。