2007年12月12日

Nullクライアントでメールを集める - postfix編

これから先はメールサーバを管理しようと思う人ならば、sendmail は捨てて postfix から始めた方がよい。

そのうち新人の管理者が、

「sendmailってなんすか」

「むかしのあれっすね。骨董品ですよ。はぁはぁ」

とか言う時代が来るんだろうなぁ。

気落とさずにpostfixに対して Null クライアントの設定をしよう。

postfix のNullクライアント設定

設定の内容は

  1. smtp 接続はループバックにのみで、リモートアクセスさせない。
  2. ローカルで受ける宛先ドメインを空にする。
  3. ローカル以外宛先のメールを、Mail Hub にリレーする。
  4. アドレスのドメイン部分に対して$mydomain へのマスカレードを行う。
  5. マスカレードの対象は、エンベロープ送信者、ヘッダ送信者、エンベロープ受信者、ヘッダ受信者の全て。

/etc/postfix/main.cf

inet_interfaces = loopback-only
myhostname = host.example.com
mydomain = example.com
myorigin = $myhostname
mydestination =
relayhost = $mydomain

masquerade_classes =  envelope_sender,header_sender,envelope_recipient,header_recipient
masquerade_domains = $mydomain

これで、sendmail の EXPOSED_USERが空の場合と同じになる。

postfix で EXPOSED_USER を実現?

sendmail の EXPOSED_USER と同じことを行うにはどうすればよいのか?

EXPOSED_USER で指定したユーザがマスカレード対象を除外されるのは、ヘッダ送信者/ヘッダ受信者の変換のみのようである。 実際の挙動とcf で変換した sendmail.cf をざっと見た限りそう思う。

どこにも一次情報が見当たらない。。。だから嘘かもしれない。

postfix で、masquerade_exceptions にユーザを追加すると、エンベロープ送信者/エンベロープ受信者の変換も除外になるので、ちょっとだけ追加の設定が必要である。

/etc/postfix/main.cf

...
masquerade_exceptions = root
virtual_alias_maps = regexp:/etc/postfix/virtual_regexp

/etc/postfix/virtual_regexp

/^root@.+\.example\.com$/ root@example.com

これで、ヘッダ部分のFrom:/To:でのみ root@host.example.com 形式のまま残るようになる。

ただ、無理して sendmail と同じ動作するようにする必要は無いかも。

追記

存在しないホストでも変換してしまう。

user@host.example.com -> user@example.com
user@ZZZ.example.com -> user@example.com

postfix の masquerade_domains 設定はちょっと外向きのメールサーバには向かないなぁ。。。

追記

Open Directory の設定のまとめ 2008Q1

Nullクライアントでメールを集める - sendmail編

OpenDirectory で認証を一元管理すると、個別のホストにメールスプールがある必要は無く、一カ所のドメインの Mail Hub に集めるのがよい。このとき、個々のホストのメールサーバの設定は、Null クライアントと呼ばれる。

Leopard Server をドメインの Mail Hub にするには次の設定を必要がある。ただ、実際には GUI ツールの「サーバ管理」で対応する項目を変更する。

  1. DNSサーバで、ドメイン名に対してMXレコードを設定する

    example.com IN MX 10 leopard.example.com

  2. ドメイン名を mydestination に追加する

/etc/postfix/main.cf

...
mydomain = example.com
...
mydestination = ... $mydomain
...

今まで認証してきたOSのNullクライアントの設定をしよう。

Sendmail の設定

伝統的にほとんどのシステムのデフォルトになっている。 設定ファイル sendmail.cf を直に編集するには骨が折れるので、 簡便に設定できる cf (?) のソース設定ファイル sendmail.mc を使うのが要である。

OSsendmail cfの場所OSTYPEDOMAIN
RedHat 6.28.11.6 /usr/lib/sendmail-cf linuxgeneric
RedHat 7.28.11.6 /usr/share/sendmail-cf linuxgeneric
RedHat 7.38.12.11.20060308 /usr/share/sendmail-cf linuxgeneric
RedHat 88.12.8 /usr/share/sendmail-cf linuxgeneric
RedHat 98.12.11.20060308 /usr/share/sendmail-cf linuxgeneric
Fedora Core 18.12.11.20060308 /usr/share/sendmail-cf linuxgeneric
Fedora Core 28.12.11.20060308 /usr/share/sendmail-cf linuxgeneric
Fedora Core 38.13.1 /usr/share/sendmail-cf linuxgeneric
Fedora Core 48.13.7 /usr/share/sendmail-cf linuxgeneric
Fedora Core 58.13.8 /usr/share/sendmail-cf linuxgeneric
Fedora Core 68.14.1 /usr/share/sendmail-cf linuxgeneric
Fedora78.14.1 /usr/share/sendmail-cf linuxgeneric
Fedora88.14.1 /usr/share/sendmail-cf linuxgeneric
CentOS 4.x8.13.1 /usr/share/sendmail-cf linuxgeneric
CentOS 5.x8.13.8 /usr/share/sendmail-cf linuxgeneric
FreeBSD 6.28.13.8 /usr/share/sendmail/cf freebsd6generic
NetBSD 3.18.13.5.20060614 /usr/share/sendmail bsd4.4generic
Solaris88.11.7p3+Sun /usr/lib/mail solaris8solaris-generic
Solaris98.13.8+Sun /usr/lib/mail solaris8solaris-generic
Solaris108.13.8+Sun /etc/mail/cf solaris8solaris-generic

取り敢えず、今日の時点の最新パッチを当てたり、当てなかったりの状態なので、異なって場合もある。

sendmail.mc の設定

/etc/mail/sendmail.mc

include(`/usr/share/sendmail-cf/m4/cf.m4')
OSTYPE(`linux')
DOMAIN(`generic')
# 上の3行は、システムに応じて変更
FEATURE(`no_default_msa')
FEATURE(`nullclient', `example.com.')
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')

Null クライアント設定で、エンベロープ/ヘッダの発信者/受信者ともに example.com ドメインにマスカレードする。 ただし、ヘッダの発信者/受信者のrootユーザのみ除外される。 (rootも対象にする場合、generic.m4 ファイル内の EXPOSED_USER を変更すればよい)。 かつ、リモートアクセスを受けない。

sendmail.cf の生成

m4 を使って生成する。 Solarisだと companionパッケージのGNU m4を使った方(/{opt,usr}/sfw/bin/gm4)がよい。

# ${M4} /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

sendmail の起動

RedHat/Fedora/CentOS/Solaris8/9の場合

# /etc/init.d/sendmail restart

FreeBSD 6.2

# grep sendmail /etc/rc.conf
sendmail_enable="YES"
# /etc/rc.d/sendmail restart

NetNSD 3.1

# grep sendmail /etc/rc.conf
sendmail=YES
# /etc/rc.d/sendmail restart

Solaris10の場合

# svccfg -s sendmail setprop config/local_only=false
# svcadm refresh sendmail
# svcadm restart sendmail

メールの配送確認

これで、root, 一般ユーザ, 不明ユーザでメールを出して、戻されること無くMail Hub 内で処理されればよい。

# date | mailx -s Test root
# date | mailx -s Test user
# date | mailx -s Test unknown

追記

Open Directory の設定のまとめ 2008Q1

2007年12月6日

OpenDirectory で自動マウンタのマップ

自動マウントのマップを提供するのは Open Directory に限らず一般的なLDAPサーバのお話になる。

Open Directory で使うのに留意するのは2点のみである。

  1. 利用できる LDAP schema は2種類である。
    1. automountMap/auotmount (rfc2307bisに記載があるもの)
    2. nisMap/nisObject (rfc2307に定義されている)
  2. エントリの置き場所は、cn=automountMap,<basedn> の下が推奨

今まで、Open Directory で認証できたOSのために、マップ情報を提供してみた。

ただし、amdは除く、、、

前提

  1. Open Directory にユーザの認証情報がある。
  2. ユーザのホームディレクトリは、/home/fileserver/usernameの形式にする。
  3. fileserver はDebian/Linux etch の普通のNFSサーバである。
  4. NFSv3/NFSv4 で共通のエクスポートポイントで、/export/home を公開している。
  5. sec=sys/krb5/krb5i/krb5pのセキュリティモードにも対応してる。

本当は、sec=sys を切り捨てたいが、未だにNFSv3でsec=sysのみでの対応しかできないクライアントがまだまだある。。。

2 に関しては、ホームディレクトリ直上のディレクトリが間接マップだと、MacOSX の Finder が正しくホームディレクトリを扱えない場合があるためで、特にファイルサーバ名でなくグループ名でも構わない。

MacOSX 10.5.x 用

ファイルベースのauto_master/auto_home は既にあり、同時にNIS or LDAP への参照のエントリが書かれている。なので、auto_home にエントリを追加すればよい。

dn: automountMapName=auto_home,cn=automountMap,dc=example,dc=com
objectClass: automountMap
objectClass: top
automountMapName: auto_home

dn: automountKey=fileserver,automountMapName=auto_home,cn=automountMap,dc=example,dc=com
objectClass: automount
objectClass: top
automountInformation: fileserver:/export/home
automountKey: fileserver

Solaris 8〜10 用

Solaris8/9 は NFSv3 で、 Solaris10 は NFSv4 がデフォルトになるが、/etc/default/nfs で変更ができる。サーバ側でNFSv3/NFSv4 両方の対応ができているが、sec=krb5i ありでマウントできるようにしたい。。。なぁ。

そのために、auto_master マップ名をauto_master_solaris別名で参照する設定をしたので、こいつにオプションを付加して対応する。

dn: automountMapName=auto_master_solaris,cn=automountMap,dc=example,dc=com
objectClass: automountMap
objectClass: top
automountMapName: auto_master_solaris

dn: automountKey=/home,automountMapName=auto_master_solaris,cn=automountMap,dc=example,dc=com
objectClass: automount
objectClass: top
automountInformation: auto_home -sec=krb5i
automountKey: /home

Linux autofs 5.x 用

未だに主流にならない autofs 5.x はどこに行く。。。

マップ名は既にauto.master であり別名化しなくてもよい。LDAP schema は automountMap/automount(rfc2307bis) を選択する。(CentOS/Fedora系では/etc/sysconfig/autofs とかで設定)。

/home エントリは、auto_home を再利用し、同時に NFSv4 と sec=krb5i を利用するようにする。

dn: automountMapName=auto.master,cn=automountMap,dc=example,dc=com
objectClass: automountMap
objectClass: top
automountMapName: auto.master

dn: automountKey=/home,automountMapName=auto.master,cn=automountMap,dc=example,dc=com
objectClass: automount
objectClass: top
automountInformation: ldap:auto_home -fstype=nfs4,sec=krb5i
automountKey: /home

Linux autofs 3.x, 4.x 用

未だにこっちの方(CentOS4, etchとか)が多いのか?!

3.x, 4.x と通して共通の設定にするには

  1. LDAP schema は nisMap/nisObject
  2. autmount情報は古い形式(ldap:host:basedn)で書く必要がある。
  3. NFSv3 で、セキュリティフレーバなし。

が必要なので、auto.master/auto.home をnisMap/nisObject として登録する。

dn: nisMapName=auto.master,cn=automountMap,dc=example,dc=com
objectClass: nisMap
objectClass: top
nisMapName: auto.master

dn: nisMapName=auto.master,cn=automountMap,dc=example,dc=com
objectClass: nisObject
objectClass: top
cn: /home
nisMapEntry: ldap:auth.home.moimoitei.jp:nisMapName=auto.home,cn=automountMap,dc=example,dc=com
nisMapName: auto.master

dn: nisMapName=auto.home,cn=automountMap,dc=example,dc=com
objectClass: nisMap
objectClass: top
nisMapName: auto.home

dn: nisMapName=auto.home,cn=automountMap,dc=example,dc=com
objectClass: nisObject
objectClass: top
cn: fileserver
nisMapEntry: fileserver:/export/home
nisMapName: auto.home

ちょっと、無理し過ぎかも。

追記

Open Directory の設定のまとめ 2008Q1

2007年12月2日

OpenDirectory で Solaris8〜10を認証

物好きで Solaris8から入手していたので設定してみた。

  1. Solaris 8 + Admin Pack(SEAMのサーバとか?)
  2. Solaris 9
  3. Solaris 10

とりあえず、全部最新パッチを当ててある。

追加パッケージ

Solaris 8 には、標準で SSH が含まれていないので、Freeware for Solarisから入手してインストールする。

Solaris8

# sudo pkgadd -d libgcc-3.4.6-sol8-x86-local
# sudo pkgadd -d zlib-1.2.3-sol8-x86-local
# sudo pkgadd -d libintl-3.4.0-sol8-intel-local
# sudo pkgadd -d libiconv-1.11-sol8-x86-local
# sudo pkgadd -d openssl-0.9.8f-sol8-x86-local
# sudo pkgadd -d openssh-4.7p1-sol8-x86-local

SunFreeware の openssh は GSSAPI が有効になって構築されていない。Admin Pack の SEAM の中の SUNWkr5sv に kerberozied telnetd があるので、とりあえず入れとく。 telnetdはいまさらなので要らないかも。

Solaris9/10 のSSHは、Sun の手によるGSSAPIのサポートが組込まれているので、標準のものを使うようにする。

Kerberos5 設定

Solaris 8-10 は、MIT Kerberos のカスタムバージョンが使われているが、設定ファイルはほぼ同じ。

/etc/krb5/krb5.conf

...
[libdefaults]
    default_realm = EXAMPLE.COM
...
[realms]
    EXAMPLE.COM = {
        kdc = leopardserver.example.com:88
        admin_server = leopardserver.example.com:749
    }
...
[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM
...

Solaris8-9ではデフォルトで利用できる暗号化タイプが少なく des-cbc-crc:normal に限定したプリンシプルの鍵を作成する。

Solaris8-9 のkadminは利用できる暗号化タイプのみに限定して keytab に保存ができない(ktaddの-eオプションが使えないみたい)ので、OpenDirectory があるマシン上で生成した方がよい。

Solaris8まではKerberozied NFS を利用する場合のNFSクライアント側で使うものは nfsプリンシプルではなくrootプリンシプルなので、こちらを生成する。

# kinit -p diradmin
Authenticating as principal diradmin with password.
Password for diradmin@EXAMPLE.COM:
kadmin:  addprinc -randkey host/solaris8.example.com@EXAMPLE.COM
kadmin:  addprinc -randkey root/solaris8.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/solaris8.keytab -e des-cbc-crc:normal host/solaris8.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/solaris8.keytab -e des-cbc-crc:normal root/solaris8.example.com@EXAMPLE.COM
...
kadmin:  addprinc -randkey host/solaris9.example.com@EXAMPLE.COM
kadmin:  addprinc -randkey nfs/solaris9.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/solaris9.keytab -e des-cbc-crc:normal host/solaris9.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/solaris9.keytab -e des-cbc-crc:normal nfs/solaris9.example.com@EXAMPLE.COM
...
kadmin:  addprinc -randkey host/solaris10.example.com@EXAMPLE.COM
kadmin:  addprinc -randkey nfs/solaris10.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/solaris10.keytab host/solaris10.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/solaris10.keytab nfs/solaris10.example.com@EXAMPLE.COM

それぞれのマシンの /etc/krb5/krb5.keytab にコピーする。

時間の同期がとれてるかは要確認。

LDAP の設定

手動で設定する方法をとる。

  1. XX.XX.XX.XX は Open Directory があるマシンのIPアドレス
  2. auto_master マップに関しては、Solaris限定のマップ auto_master_solaris を参照するように変更する。

Solaris8

# ldapclient -v -i \
-d example.com \
-b "dc=example,dc=com" \
-a none \
-o 60 \
-s one \
-S passwd:cn=users,?one \
-S group:cn=groups,?one \
-S automount:cn=automountMap,?one \
-S auto_master:automountMapName=auto_master_solaris,cn=automountMap,?one \
XX.XX.XX.XX

Solaris9-10

# ldapclient -v manual \
-a domainName=example.com \
-a defaultSearchBase="dc=example,dc=com" \
-a defaultServerList=XX.XX.XX.XX \
-a credentialLevel=anonymous \
-a authenticationMethod=none \
-a bindTimeLimit=60 \
-a searchTimeLimit=60 \
-a defaultSearchScope=one \
-a serviceSearchDescriptor=passwd:cn=users,?one \
-a serviceSearchDescriptor=group:cn=groups,?one \
-a serviceSearchDescriptor=automount:cn=automountMap,?one \
-a serviceSearchDescriptor=auto_master:automountMapName=auto_master_solaris,cn=automountMap,?one

ここまでやると nsswitch.conf のほとんどのエントリが ldap を見るようになる。でも、対応するレコード群がないので困ったモード全開になってしまう。

NSSの設定

Solaris 8-10

/etc/nsswitch.conf

...
passwd:     files ldap
group:      files ldap
...
hosts:      files dns
...
automount:  files ldap
...
<それ以外のエントリに含まれる ldap は削除>
...

これで Open Directory 上のユーザ情報が見えれば良し。

PAMの設定

ユーザのパスワードのタイプが「暗号化パスワード」のみの運用では、何もする必要が無さそうである。。。ここら辺事情はどうも分からん。

Solairs の PAM は1つのファイルに全部の設定が列挙されている。必要なサービスで変更が必要であるが、雑多なのでloginとother に限って設定例として上げる。

Solaris8-10

/etc/pam.conf

...
login   auth sufficient         pam_krb5.so.1 use_first_pass
login   auth required           pam_unix_auth.so.1
...
other   auth sufficient         pam_krb5.so.1 use_first_pass
other   auth required           pam_unix_auth.so.1
...
login   account required        pam_unix_account.so.1
login   account optional         pam_krb5.so.1
...
other   account required        pam_unix_account.so.1
other   account optional         pam_krb5.so.1
...
other   session required         pam_unix_session.so.1
other   session optional          pam_krb5.so.1
...

取り敢えず、pam_unix_* 前後ののそれぞれに pam_krb5 を入れ込むようにする。。。でいいと思う。パスワード変更はいまいち分からんので放っとく。

GSSやらnfssecやらの設定

Kerberozied NFS が利用できるように、

  1. /etc/nfssec.conf の krb5/krb5i/krb5p のコメントアウト部分を外す。
  2. /etc/gss/mech の kerberos_v5 のコメントアウト部分を外す。
  3. /etc/gss/gsscred.conf で、files 指定にする。
  4. 何のためか分からんが gsscred -m kerberos_v5 -a を実行しとく。

Solaris10 が使うNFSのバージョンが気になる場合は /etc/default/nfs で変更する。

以上。

何となく、認証できたり、ホームディレクトリがautomountしたり、、、だなぁ。

$ telnet -f solaris8
Trying 172.30.2.23...
Connected to solaris8.example.com.
Escape character is '^]'.
[ Kerberos V5 accepts you as ``user@EXAMPLE.COM'' ]
[ Kerberos V5 accepted forwarded credentials ]
Last login: Sun Dec  2 22:22:03 from xx.xx.xx.xx
% klist
チケットキャッシュ: /tmp/krb5cc_5000
デフォルトプリンシパル: user@EXAMPLE.COM

有効開始時間                       期限切れ                       サービスプリンシパル
Sun Dec 02 22:22:26 2007  Mon Dec 03 07:21:28 2007  krbtgt/EXAMPLE.COM@EXAMPLE.COM
        更新時間(迄) Sun Dec 09 21:21:28 2007
Sun Dec 02 22:22:26 2007  Mon Dec 03 07:21:28 2007  nfs/fileserver.exmaple.com@EXAMPLE.COM
        更新時間(迄) Sun Dec 09 21:21:28 2007
% /sbin/mount
...
/home/fileserver on fileserver:/export/home remote/read/write/setuid/sec=krb5i/dev=2f80006 on Sun Dec  2 22:16:36 2007
....
$ ssh solaris9
Warning: No xauth data; using fake authentication data for X11 forwarding.
Last login: Sun Dec  2 21:45:30 2007 from xx.xx.xx.xx
Sun Microsystems Inc.   SunOS 5.9       Generic January 2003
....
$ ssh solairs10
....

あぁ、後でautomount 用のレコードもちょっと残しておこう。

追記

Open Directory の設定のまとめ 2008Q1

Cocoa Emacs 24.3 構築 (2013/03版)

暫く使っている Cocoa Emacs を更新していなかったので、24.3 に上げてみた。 当てるパッチは inline patch と ポップアップフリーズ対応パッチ くらい。 24.3 には既にフルスクリーン実装が入っているので、よく使われているフルスクリーンパッチは外し...