#author("2022-03-18T15:23:26+00:00","default:sysosa","sysosa") #author("2022-03-18T15:30:47+00:00","default:sysosa","sysosa") pukiwikiでldap認証を噛まそうと思った. っでCentOS7で作ったLDAP(openldap)があってそれとの接続は上手く行ったものの group名 によるアクセス制限を課すには 「&color(magenta){memberOf};」属性が必要なようで、作ったこのLDAPには完備されていなかった... 一応sambaでADを動かすとその中のLDAP機能には「&color(magenta){memberOf};」属性は用意されていて普通に使えた. っていうことはwindows向けの代物なのかな? なら「スキーマ拡張」すれば使えるのかなとひらめいたが、sambaスキーマを乗せても「&color(magenta){memberOf};」がなかった... っでOpenLDAPにmemberOf属性を追加させてみた 参照先: [[https://kifarunix.com/how-to-create-openldap-member-groups/>+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]] ***現状確認と機能追加 [#a4b170f9] memberOfが有効になる機能が既に入っているかを確認します #code(nonumber){{ [root@ldap-server ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | less }} この結果で #code(nonumber){{ : dn: cn=module{0},cn=config objectClass: olcModuleList cn: module{0} : }} とか含む内容があれば器はできているのですが、ないのなら組み込みます いつものようにldifを用意して ldapadd で反映させます #code(nonumber){{ [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 }} そうして再度確認をすると下記のような表記になる #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 : 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」が使われます #code(nonumber){{ [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」 ***新しいグループを作ってそこにメンバーをアサインする [#lbf3d3c3] 新しいグループ cryo を作ります。作る際に「member」としてユーザを指定します #code(nonumber){{ [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 }} この結果を確認してみます #code(nonumber){{ [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」が反映できた ***pukiwikiに適用する [#wdf1b856] 事前に「php-ldap」パッケージをインストールします 「pukiwiki.ini.php」にて #code(nonumber){{ $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', '#ABC#'=> 'ldap:cryo', '##'=>'valid-user', // すべてのページの閲覧には認証を通るのが必要 ); $edit_auth = 1; $edit_auth_pages = array( '##'=>'ldap:cryo,admin', // 全てのページの修正にはmemberOfのcryo所属かユーザadminであることが必要 ); }} とかで。