PostfixとDovecotとOpenLADP(その1/4) openLDAP2.4でスキーマ追加

諸事情によりセキュアーなメールサーバーを構築しなければならなくなった。
どうせやるんだったらLDAPとか絡めてやってみたい!

環境:

Ubuntu LTS 12.04
Linux version 3.11.0-18-generic (buildd@toyol) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #32~precise1-Ubuntu SMP Thu Feb 20 17:52:10 UTC 2014
/usr/sbin/slapd -V
@(#) $OpenLDAP: slapd (Sep 19 2013 22:39:38) $
buildd@panlong:/build/buildd/openldap-2.4.28/debian/build/servers/slapd

色々と探してみるといい良いページが見つかった。
Postfix+Dovecot+OpenLDAPでメールサーバ | UNIXLife

注意: 上記ページ手順ではメールシステム用LDAPツリーをゼロから構築する方式になっています。既に認証用のLDAPツリーが稼動している場合には、ちょっと都合が悪いので、手順の一部を変更しながら、既存のLDAPツリーにobjectClassのmailUserを追加するようにしてしました。

なお、安定稼動しているかどうかは検証していないので、At Your Own Riskでお願いいたします。

では、はじめよう。

メール用スキーマ

OpenLDAP2.3以降ではslapd.confではなくcn=configの設定変更を行う必要があるので、「openldap 2.4 スキーマ 追加」でgoogleすると、OpenLDAP 2.4 スキーマ追加 – sin_goto’s blogというページを発見。(残念ながら、私の環境ではうまくできなかったので、参考にしながら手順を補足する。)

0. メール用スキーマを編集する。

ページに提示してあるmail.schemaの場合、既存のLDAPツリーにぶら下がっている各スタッフのエントリーにmailUser やmailGroup objectClassを追加することができないので、これらを追加できるようにする変更を行う。またattributeにて定義してあったhomeDirectoryは既に別の用途に利用している為、これをメール配信用のディレクトリーにするのも都合が悪い。よって、新たにmailDirectoryというattributeを追加することにした。という訳でメールボックスは、この属性で指定することになる。

以上より、mail.schemaをちょっと改造する。
赤いところが変更箇所

root@IPD-0197:~# cat /etc/ldap/schema/mail.schema                                                                                      
attributetype (1.1.2.1.1.1 NAME 'mailForward'
    DESC 'forward address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.2 NAME 'mailAlias'
    DESC 'alias address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.3 NAME 'accountActive'
    DESC 'active or not active'
    EQUALITY booleanMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE)

attributetype (1.1.2.1.1.4 NAME 'domainName'
    DESC 'domain name'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE)

attributetype (1.1.2.1.1.5 NAME 'transport'
    DESC 'transport'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.6 NAME 'mailQuota'
    DESC 'Mail Home Directory Max byte'
    EQUALITY integerMatch    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE)

attributetype (1.1.2.1.1.7 NAME 'mailDrop'
    DESC 'drop address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype ( 1.3.6.1.4.1.15774.1.10.1.2.3 NAME 'mailDirectory'
        DESC 'mail directory'
        EQUALITY caseIgnoreIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )

objectClass (1.1.2.2.1.1 NAME 'mailUser'
    DESC 'mail user Object'
    SUP top AUXILIARY
    MUST ( transport $ mailDirectory $ accountActive $ domainName $ userPassword $ mailQuota )
    MAY  ( mailForward $ mailAlias ))

objectClass (1.1.2.2.1.2 NAME 'mailGroup'
   DESC 'ML Group Account Object'
   SUP top AUXILIARY
   MUST ( accountActive $ domainName $ mailDrop ))

1. 作業用に適当なディレクトリーを作成する

root@IPD-0197:/etc/ldap/schema# cd /tmp/                                                                
root@IPD-0197:/tmp# mkdir addschema
root@IPD-0197:/tmp# cd addschema/

2. 設定用のファイルを作成する。

結構、このファイルに記述するスキーマファイルの順番は重要だったりする。(色々と試した結果、/etc/ldap/slapd.d/cn=config/cn=schemaディレクトリ内の通し番号の順と同じにするのが都合よかった)

root@IPD-0197:/tmp/addschema# vi addschema.conf                                                         
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/mail.schema

3. コンバートする。

「現在設定されているschemaファイルの総数」を調べるとあったので、スキーマのディレクトリーを見る。

root@IPD-0197:~# ls -l /etc/ldap/slapd.d/cn\=config/cn\=schema
total 40
-rw------- 1 openldap openldap 15527 Mar 30 17:07 cn={0}core.ldif
-rw------- 1 openldap openldap 11361 Mar 30 17:07 cn={1}cosine.ldif
-rw------- 1 openldap openldap  6491 Mar 30 17:07 cn={2}nis.ldif
-rw------- 1 openldap openldap  2855 Mar 30 17:07 cn={3}inetorgperson.ldif

現在の通し番号は{3}までになっているので、次は{4}になる。
よって以下のコマンドを実施する。

root@IPD-0197:/tmp/addschema# slapcat -f ./addschema.conf -F /tmp/addschema -n0 -s 'cn={4}mail,cn=schema,cn=config' > ./cn=mail.ldif
root@IPD-0197:/tmp/addschema# ll                                                                        
total 24
drwxr-xr-x  3 root root 4096 Apr 20 03:33 ./
drwxrwxrwt 20 root root 4096 Apr 20 03:17 ../
-rw-r--r--  1 root root  196 Apr 20 03:29 addschema.conf
drwxr-x---  3 root root 4096 Apr 20 03:33 cn=config/
-rw-------  1 root root  941 Apr 20 03:33 cn=config.ldif
-rw-r--r--  1 root root 1779 Apr 20 03:33 cn=mail.ldif

できあがったcn=mail.ldifファイルの中身を見てみる。

root@IPD-0197:/tmp/addschema# cat cn\=mail.ldif 
dn: cn={4}mail,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {4}mail
olcAttributeTypes: {0}( 1.1.2.1.1.1 NAME 'mailForward' DESC 'forward address' 
 EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 1.1.2.1.1.2 NAME 'mailAlias' DESC 'alias address' EQUA
 LITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {2}( 1.1.2.1.1.3 NAME 'accountActive' DESC 'active or not a
 ctive' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE
  )
olcAttributeTypes: {3}( 1.1.2.1.1.4 NAME 'domainName' DESC 'domain name' EQUAL
 ITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.1.2.1.1.5 NAME 'transport' DESC 'transport' EQUALITY
  caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {5}( 1.1.2.1.1.6 NAME 'mailQuota' DESC 'Mail Home Directory
  Max byte' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-
 VALUE )
olcAttributeTypes: {6}( 1.1.2.1.1.7 NAME 'mailDrop' DESC 'drop address' EQUALI
 TY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {7}( 1.3.6.1.4.1.15774.1.10.1.2.3 NAME 'mailDirectory' DESC
  'mail directory' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
 .1.26{256} SINGLE-VALUE )
olcObjectClasses: {0}( 1.1.2.2.1.1 NAME 'mailUser' DESC 'mail user Object' SUP
  top AUXILIARY MUST ( transport $ mailDirectory $ accountActive $ domainName 
 $ userPassword $ mailQuota ) MAY ( mailForward $ mailAlias ) )
olcObjectClasses: {1}( 1.1.2.2.1.2 NAME 'mailGroup' DESC 'ML Group Account Obj
 ect' SUP top AUXILIARY MUST ( accountActive $ domainName $ mailDrop ) )
structuralObjectClass: olcSchemaConfig
entryUUID: cf6fa28c-5ce3-1033-81a6-ada6929c2c97
creatorsName: cn=config
createTimestamp: 20140420142839Z
entryCSN: 20140420142839.474478Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20140420142839Z

4. このファイルを反映させる。

root@IPD-0197:/tmp/addschema# ldapadd -Y EXTERNAL -H ldapi:/// -f ./cn=mail.ldif                        
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn={4}mail,cn=schema,cn=config"
ldap_add: Constraint violation (19)
        additional info: structuralObjectClass: no user modification allowed

なんだこりゃ! バイオレーションですよ。・・・・ orz。
もう嫌になってきた。 なんでこんなに面倒なんだ!!!!!!
・・・・気を取り直して、googleで黙々と調べる。・・・・・

あった、、、! おお、すばらしい! 非常に感謝します。神に見える。
Yet Another Diary: OpenLDAP 2.4: 動的なスキーマの登録
このページによれば、structuralObjectClass: olcSchemaConfig以降の最後の9行を消せばよい!との事。

バッサリと削除する。

一応、編集後のcn=mail.ldifです。

root@IPD-0197:/tmp/addschema# cat cn\=mail.ldif 
dn: cn={4}mail,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {4}mail
olcAttributeTypes: {0}( 1.1.2.1.1.1 NAME 'mailForward' DESC 'forward address' 
 EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 1.1.2.1.1.2 NAME 'mailAlias' DESC 'alias address' EQUA
 LITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {2}( 1.1.2.1.1.3 NAME 'accountActive' DESC 'active or not a
 ctive' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE
  )
olcAttributeTypes: {3}( 1.1.2.1.1.4 NAME 'domainName' DESC 'domain name' EQUAL
 ITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.1.2.1.1.5 NAME 'transport' DESC 'transport' EQUALITY
  caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {5}( 1.1.2.1.1.6 NAME 'mailQuota' DESC 'Mail Home Directory
  Max byte' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-
 VALUE )
olcAttributeTypes: {6}( 1.1.2.1.1.7 NAME 'mailDrop' DESC 'drop address' EQUALI
 TY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {7}( 1.3.6.1.4.1.15774.1.10.1.2.3 NAME 'mailDirectory' DESC
  'mail directory' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
 .1.26{256} SINGLE-VALUE )
olcObjectClasses: {0}( 1.1.2.2.1.1 NAME 'mailUser' DESC 'mail user Object' SUP
  top AUXILIARY MUST ( transport $ mailDirectory $ accountActive $ domainName 
 $ userPassword $ mailQuota ) MAY ( mailForward $ mailAlias ) )
olcObjectClasses: {1}( 1.1.2.2.1.2 NAME 'mailGroup' DESC 'ML Group Account Obj
 ect' SUP top AUXILIARY MUST ( accountActive $ domainName $ mailDrop ) )

リトライです。

root@IPD-0197:/tmp/addschema# ldapadd -Y EXTERNAL -H ldapi:/// -f ./cn=mail.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn={4}mail,cn=schema,cn=config"

root@IPD-0197:/tmp/addschema# ll /etc/ldap/slapd.d/cn\=config/cn\=schema
total 52
drwxr-x--- 2 openldap openldap  4096 Apr 20 03:56 ./
drwxr-x--- 3 openldap openldap  4096 Apr  5 18:40 ../
-rw------- 1 openldap openldap 15527 Mar 30 17:07 cn={0}core.ldif
-rw------- 1 openldap openldap 11361 Mar 30 17:07 cn={1}cosine.ldif
-rw------- 1 openldap openldap  6491 Mar 30 17:07 cn={2}nis.ldif
-rw------- 1 openldap openldap  2855 Mar 30 17:07 cn={3}inetorgperson.ldif
-rw------- 1 openldap openldap  1921 Apr 20 03:56 cn={4}mail.ldif

いぇーい!
できたみたい。

しかし、最低だな。
こんな煩雑な手順、だれが考えたんだろうか。
メンテナンス性、最悪。

うー、疲れた。今日はもうやめます。
すんません。
続きはまた後で。

追記

スキーマを削除する場合

追加したスキーマを削除してしまいたい場合は、slapdを停止した後、/etc/ldap/slap.d/cn=config/cn=shemaの下にある所望のLDIFファイルを削除してslapdを再起動すれば良いだけのようです。
ただし、削除するスキーマを元したデータが既に投入されている場合は、そのデータを削除をすることが前提条件となるみたいのなので、その場合はかなり厄介だと思います。

例えば、あるエントリーからobjectClassのmailUserを削除する場合は、下記のLDIFを作成してldapmodifyしなければならないでしょう。

dn: uid=kitada,ou=developer-grp,dc=ramuda,dc=co,dc=jp
changetype: modify
delete: objectClass
objectClass: mailUser

参考ページ
ldap delete schema
Re: Remove a schema using OpenLDAP dynamic configuration

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>