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

2007年11月29日

auto_master と auto.master の違い

auto.master / auto_master など、アンダーライン’_’とドット’.’だけ異なるautomount のマップ名が表記される ことがある。

Linux の autofs では、ドットの名前にこだわったり、Solaris とかのドキュメントを読むとアンダーラインの名前だったり、どんな違いがあるのだろうか?

又聞きの話だと、NISからNIS+の移行時に、NIS+ではドット文字が特殊な意味を持つので、auto.masterからauto_masterに変更になったらしい。(例,1,2)

Linux ではNIS+サーバが実装されなかったのもあり、’.’->’_’の変更が行われずにそのままになったらしい。

Linux の automount の情報は他とは微妙に違うので、別々にできるのも、そのままになっている理由かもしれない。

2007年11月28日

OpenDirectory で FreeBSD/NetBSDを認証

なんかシリーズ化して申し訳ないが、とりあえず設定してみた。

  1. FreeBSD 6.2-Release + ports (portsnap使って最新?)
  2. NetBSD 3.1 + pkgsrc-2007Q3

OpenBSD はPAMでは無くBSD_AUTH とかいう仕組みを使っており、かつ NSS に当たるものが見当たらないので、ちょっと諦めた。

ただ、3つともにはKerberos 5 認証は組み込まれている。。。不思議だ。

追加パッケージ

FreeBSD 6.2-Release

# cd /usr/ports/net/nss_ldap
# make install clean
...
# cd /usr/ports/security/pam_ldap
# make install clean
...

NetBSD 3.1

# cd /usr/pkgsrc/databases/nss_ldap
# make install clean
...
# cd /usr/pkgsrc/security/pam-ldap
# make install clean
...

Kerberos5 設定

FreeBSD/NetBSDともに KTH Heimdal Kerberos 5 が使われているのが、設定ファイルに関してはほぼ流用できる。

/etc/krb5.conf

...
[libdefaults]
    default_realm = EXAMPLE.COM
...
[realms]
    HOME.MOIMOITEI.JP = {
        kdc = leopardserver.example.com:88
    }
...
[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM

Open Directoryに使われているのは MIT Kerberos なので FreeBSD/NetBSD 上の kadmin は使えない。適当なマシンで keytab を作成してコピーする。

# kinit -p diradmin
Authenticating as principal diradmin with password.
Password for diradmin@EXAMPLE.COM:
kadmin:  addprinc -randkey host/freebsd.example.com@EXAMPLE.COM
kadmin:  addprinc -randkey host/netbsd.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/freebsd.keytab host/freebsd.example.com@EXAMPLE.COM
kadmin:  ktadd -k /tmp/netbsd.keytab host/netbsd.example.com@EXAMPLE.COM
...
/tmp/freebsd.keytab, /tmp/netbsd.keytab をそれぞれのマシンの/etc/krb5.keytabにコピー
...
freebsd# chmod 600 /etc/krb5.keytab
freebsd# ktutil list
FILE:/etc/krb5.keytab:

Vno  Type              Principal                                      
  3  des3-cbc-sha1     host/freebsd.example.com@EXAMPLE.COM
  3  arcfour-hmac-md5  host/freebsd.example.com@EXAMPLE.COM
  3  des-cbc-crc       host/freebsd.example.com@EXAMPLE.COM

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

LDAP の設定

LDAP用のPAM/NSS モジュールは、Linux でよく使われている PADL Software Pty Ltd のものなので、完全に同じ設定ファイルが使える。(参照OpenDirectory で Debian系を認証の/etc/ldap.conf)

FreeBSD 6.2-Release

# scp ubutnu71s:/etc/ldap.conf /tmp/ldap.conf
# cp /tmp/ldap.conf /usr/local/etc/ldap.conf
# cp /tmp/ldap.conf /usr/local/etc/nss_ldap.conf

NetBSD 3.1

# scp ubutnu71s:/etc/ldap.conf /tmp/ldap.conf
# cp /tmp/ldap.conf /usr/pkg/etc/pam_ldap.conf
# cp /tmp/ldap.conf /usr/pkg/etc/nss_ldap.conf

NSSの設定

FreeBSD 6.2-Release

/etc/nsswitch.conf

group: files ldap
hosts: files dns
networks: files
passwd: files ldap
shells: files

NetBSD 3.1

/etc/nsswitch.conf

group:          files ldap
hosts:          files dns
netgroup:       files
networks:       files
passwd:         files ldap
shells:         files

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

PAM の設定

ユーザのパスワードのタイプが「Open Directory」でのみの運用であれば、/etc/pam.d/system の pam_krb5 をコメントアウトを外してやれば良い。

「暗号化パスワード」も使う場合は pam_ldap を追加する。

FreeBSD 6.2-Release

/etc/pam.d/system

# auth
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      pam_krb5.so             no_warn try_first_pass
auth            sufficient      /usr/local/lib/pam_ldap.so no_warn try_first_pass
#auth           sufficient      pam_ssh.so              no_warn try_first_pass
auth            required        pam_unix.so             no_warn try_first_pass nullok

# account
account         required        pam_krb5.so
account         required        pam_login_access.so
account         required        pam_unix.so

# session
#session        optional        pam_ssh.so
session         required        pam_lastlog.so          no_fail

# password
password        sufficient      pam_krb5.so             no_warn try_first_pass
password        sufficient      /usr/local/lib/pam_ldap.so no_warn try_first_pass
password        required        pam_unix.so             no_warn try_first_pass

NetBSD 3.1

/etc/pam.d/system

# auth
auth            sufficient      pam_krb5.so             no_warn try_first_pass
auth            sufficient      /usr/pkg/lib/security/pam_ldap.so no_warn try_first_pass
auth            required        pam_unix.so             no_warn try_first_pass nullok

# account
account         required        pam_krb5.so
account         required        pam_unix.so

# session
session         required        pam_lastlog.so          no_fail no_nested

# password
password        sufficient      pam_krb5.so             no_warn try_first_pass
password        sufficient      /usr/pkg/lib/security/pam_ldap.so no_warn try_first_pass
password        required        pam_unix.so             no_warn try_first_pass

ただし、両方のOSともに /etc/pam.d/sshd は上記に設定をincludeしていないので、同様な変更が必要。

try_first_pass よりも use_first_pass を混ぜる方が好みだが、、、BSD 系はこうなんだろうなぁ。

accountタスクにpam_ldapを使ったエントリを加えると、何故かパスワードを変えろとかプロンプトが出るんだが、なんか設定が足らんかも。。。

amd の設定

FreeBSD/NetBSD ともに amd は標準の配布に含まれているが、ldap マップタイプが使えるようには構築されていない。また、amd の ldap 実装で使われる ldap schema は Open Directory には含まれていない。 なので、素直にファイルベースのものを使う。。。

そのうちAutoFS on FreeBSD 6が入ってくるのかなぁ。。。

FreeBSD 6.2-Release

/etc/rc.conf

...
rpcbind_enable="YES"
amd_enable="YES"
amd_flags="-F /etc/amd.conf"
...

NetBSD 3.1

/etc/rc.conf

...
rpcbind=YES
amd=YES
...

FreeBSD 6.2-Release/NetBSD3.1 両方

/etc/amd.conf

[ global ]
browsable_dirs = no
restart_mounts = yes
unmount_on_exit = yes
log_file = syslog
#log_options = all
auto_dir = /amd

map_type = file
mount_type = nfs
search_path = /etc

dismount_interval = 60

[ /home ]
map_name = amd.home

/etc/amd.home

/defaults       opts:=rw

fileserver        type:=nfs;rhost:=${key};rfs:=/export/home

/amd ディレクトリが無ければ作成。

追記

Open Directory の設定のまとめ 2008Q1

2007年11月26日

FreeBSD でコケる。でも立ち上がる。

向学のために VMware 上に FreeBSDをインストールしてみていたが、amd の設定で不明なエラーが出て詰まっていた。

# /etc/rc.d/amd start
# amq
amq: localhost: RPC: Port mapper failure - RPC: Unable to send
# dmesg
...
nfs send error 49 for server pid473@freebsd:/home
nfs server pid473@freebsd:/home: not responding
...

Google先生に聞くと、そんなが出てくるが、結局うやむやに解消されている、、、。

ふと気付いた。

ホスト名を指定すると、amqがマトモな返事を返してくれる!

# amq -h freebsd
/      root    "root"         freebsd:(pid473)
/home  toplvl  /etc/amd.home  /home

熟考の結果、ループバックインタフェースにIPv4のアドレス127.0.0.1が付いていなかった。。。

# ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
    inet6 ::1 prefixlen 128

原因はインストール直後のネットワーク設定をテキトウに書いたため。

/etc/rc.conf

...
network_interfaces="lo0 lnc0"
...

設定を変更して、再起動。。。ちゃんと動く。。。ばかぁ

Ubuntuサーバー版って

Ubuntuサーバー版って Web 系とかの個々のノードサーバ用なんだ。。。

OpenDirectory で Debian系を認証

Debian系は認証設定のツール群が充実していない。結局は設定ファイルを直に編集するのが近道になる。Debian Policy Manualを見る限り、ローカルユーザとNISなりLDAPなり外部由来ユーザの区別が無い。。。何だが X っぽい。

Ubuntu 7.10 リリース記念なので、こいつの Server 版を、Leopard Server にぶら下げてみた。

参考 OpenDirectory で Feodra/CentOSを 認証

追加パッケージ

# apt-get install libnss-ldap libpam-ldap
# apt-get install libpam-krb5 krb5-user
# apt-get install libpam-cracklib
# apt-get install portmap nfs-common autofs-ldap

Kerberos 5 設定

/etc/krb5.conf

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

これでKerberos5関連のコマンドが有効に機能するので確認するついでに、host/nfsプリンシパルを作成しとく。

# kinit -p diradmin
Authenticating as principal diradmin with password.
Password for diradmin@EXAMPLE.COM:
kadmin:  addprinc -randkey host/ubuntu71s.example.com@EXAMPLE.COM
kadmin:  addprinc -randkey nfs/ubuntu71s.example.com@EXAMPLE.COM
kadmin:  ktadd host/ubuntu71s.example.com@EXAMPLE.COM
kadmin:  ktadd -e des-cbc-crc:normal nfs/ubuntu71s.example.com@EXAMPLE.COM
# klist -k -e
keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   3 host/ubuntu71s.example.com@EXAMPLE.COM (Triple DES cbc mode with HMAC/sha1)
   3 host/ubuntu71s.example.com@EXAMPLE.COM (ArcFour with HMAC/md5)
   3 host/ubuntu71s.example.com@EXAMPLE.COM (DES cbc mode with CRC-32)
   3 nfs/ubuntu71s.example.com@EXAMPLE.COM (DES cbc mode with CRC-32)

うまく行かない場合、ネットワーク設定や時間同期を見直す。

LDAP 設定

Debian/etch の libnss-ldap/libpam-ldapの設定ファイルは、別々になっているが、特に分ける必要がないので、シンボリックリンクを張っとく。

# ln -sf /etc/ldap.conf /etc/libnss-ldap.conf
# ln -sf /etc/ldap.conf /etc/pam_ldap.conf

ldap の設定では、ホスト名ではなくIPアドレスを直に設定する。 (XX.XX.XX.XXがleopardserverのアドレス)

/etc/ldap.conf

host XX.XX.XX.XX
uri ldap://XX.XX.XX.XX/
base dc=example,dc=com
ldap_version 3
port 389
#bind_policy [hard|soft]
bind_policy soft

#binddn cn=proxyuser,??,dc=example,dc=com
#bindpw secret
#rootbinddn ???

ssl no
#ssl [no|on|start_tls]
#tls_cacertfile /etc/openldap/cacert
#tls_cacertdir /etc/openldap/cacerts
#tls_checkpeer yes
#tls_ciphers [SSLv2|SSLv3|TLSv1]
#tls_cert mycert
#tls_key mykey

timelimit 60
bind_timelimit 60
idle_timelimit 300

####
scope one

nss_schema rfc2307
nss_base_passwd cn=users,?one
nss_base_shadow cn=users,?one
nss_base_group  cn=groups,?one
nss_base_hosts  cn=machines,?one

pam_password exop
#pam_filter objectclass=account
pam_login_attribute uid
pam_check_host_attr no
pam_check_service_attr no

NSSの設定

/etc/nsswitch.conf

passwd:         files ldap
group:          files ldap
shadow:         files ldap

hosts:          files dns
networks:       files

protocols:      files
services:       files
ethers:         files
rpc:            files

netgroup:       ldap

automount:  files ldap

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

PAMの設定

pam の設定は管理者の数だけ書き方があるのだが、2点を留意して設定する。

  1. Linux-PAM の独自の制御フィールド構文を使わない。
  2. Debian 系の独自パッチにあまり依存しない。(特に、@include文ってなに?)

管理の簡便性のため、/etc/pam.d/common-* の設定ファイルは /etc/pam.d/system に纏めておく。

# echo "auth include system" > /etc/pam.d/common-auth
# echo "account include system" > /etc/pam.d/common-account
# echo "password include system" > /etc/pam.d/common-password
# echo "session include system" > /etc/pam.d/common-session

/etc/pam.d/system

#
# /etc/pam.d/system - authentication settings common to all services
#

# account
account sufficient  pam_unix.so
account sufficient  pam_krb5.so
account sufficient  pam_ldap.so
account required    pam_deny.so

# auth
auth    sufficient  pam_unix.so nullok_secure
auth    sufficient  pam_krb5.so use_first_pass
auth    sufficient  pam_ldap.so use_first_pass
auth    required    pam_deny.so

# password
password required   pam_cracklib.so retry=3 minlen=6 difok=3
password sufficient pam_unix.so use_authtok nullok md5
password sufficient pam_krb5.so use_authtok
password sufficient pam_ldap.so use_authtok
password required   pam_deny.so

# session
session required    pam_unix.so
session optional    pam_krb5.so
session optional    pam_ldap.so

ただし、他のサービスでのcommon-auth/common-account/common-password の取り込み位置がそれぞれのauth/account/passwordタスクエントリの最後になるように調節する必要がある。

autofs の設定

Debian etch / Ubuntu 7.10 は、まだautofs ver 4.x 系なので、rfc2307bisで定義されている automountMap/automountオブジェクトクラスは使えない。従って、nisMap/nisObject オブジェクトクラスのレコードを Open Directory 上に登録しておく必要がある。

/etc/default/autofs

...
LDAPURI=ldap://XX.XX.XX.XX
...
LDAPBASE="dc=example,dc=com"
...

追記

Open Directory の設定のまとめ 2008Q1

2007年11月23日

nscd がちょっと詰まる

LDAPサーバをLeopard Server のOpen Directory を使い、新しめのCentOS/Fedora をクライアントにした場合、ls コマンドとかが不定期に固まる症状が出た。それ以外にも、automount+NFS4を組み合わせるとログインがちょっと固まった。

ログにはたくさん LDAPサーバを再接続してるよん〜って出ている。

Nov 10 05:54:25 centos5 nscd: nss_ldap: reconnected to LDAP server ldap://xx/ after 1 attempt
Nov 10 06:02:12 centos5 rpc.idmapd[1589]: nss_ldap: reconnected to LDAP server ldap://xx/ after 1 attempt

はて?

再接続してるならば、良いじゃない。

でも、時々固まる??

何故に?

調べてみると、LDAP サーバ/クライアントの idle_timelimit の値がサーバの方が小さいためのようである。

クライアントがサーバから強制切断されると、何故に固まるようである、、、バグ?

ちなみに、Leopard Server のOpen Directory の idle_timelimit が 300 秒がデフォルトになっており、新しめのCentOS/Fedoraのauthconfig が勝手に 3600秒に設定してくれる。

なので、

/etc/ldap.conf

...
timelimit 60
idle_timelimit 300
...

を付け加えると、症状が収まる。

なんだかなぁ

追記

Open Directory の設定のまとめ 2008Q1

2007年11月21日

Leopard の ssh の Kerberos認証の不具合?

ssh の公開鍵認証はいい。

ただ、ホームディレクトリを automount で Kerberos化した NFS をマウントする場合は利用できない。 そんなあなたのために ssh+GSSAPI+Kerberos を使うといい。

sshd_config と.ssh/config に下記設定をする。

GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

あら不思議、チケットを持っていたら、認可され、チケットが転送されて、証明書キャッシュに保存され、Kerberos化されたNFSサービスがよろしくアクセスできる。

サーバ側がLeopard だと、認可され、チケットが転送され、何故か証明書キャッシュには保存されない。なので、Kerberos化されたNFSサービスは使えない。。。

で、再度チケットを取得するとKerberos化されたNFSが使えるようになる。

なんか設定が足らんのか、そのうち直るかなぁ。。。

これが振る舞いが無ければ automountMap を Solarisと共存できるのに、、、。

でも、MacOSXで sec=krb5/krb5i/krb5p が使えるようになったのって凄いっすね。UNIX認定を受けた恩恵か!?

LinuxのNFSv4とNFSv3でエクスポートポイントを共通化

全てサーバが隈無くNFSv4で統一できたら悩むことはないのだが、NFSv3までしかサポートしないサーバとかがまだ多くある。

Linux NFSv4 で1つ混乱する振る舞いがある。過渡的な状況かもしれないが、どうなるだろかなぁ。

Linux NFSv4では、クライアントから見えるNFSv4の疑似ファイルシステムが fsid=0 を指定した特定のエクスポートポイントをルートとしたディレクトリのツリーになっている。結果、サーバ側の/etc/exports で記述されるディレクトリと実際にクライアントが見るディレクトリが異なることになる。

かつ、fsid=0が指定されたディレクトリのツリー内のエクスポートポイントはNFSv4でのみ、それ以外はNFSv3でのみで利用が可能になっているらしい。。。へたれ実装と言われかねないなぁ。

実際、Solaris 10では、疑似ファイルシステムのルートは実際のルートだし、NFSv3/NFSv4は共有設定ファイルでは区別は無いし、、、そうあるべくある感じだし。。。まぁいいかぁ。

automount を使う場合、NFSv3とNFSv4が同じエクスポートポイントに見えるようにしなければ混乱の元になる。 Linuxには seamless という単語が無いのかぁ、、、。

サンプル

/export/home をNFSv3/NFSv4の両方で同じエクスポートポイントで共有する場合

NFSv4の疑似ファイルシステムを作成

/etc/fstab

...
# for nfs4
/export/home    /srv/nfs4/export/home   none    bind
...

シェルで

# mkdir -p /srv/nfs4/export/home
# mount /srv/nfs4/export/home
exports を書く

/etc/exports

# for NFS3 Clients

/export/home \
    *(rw,sync,insecure,no_subtree_check) \
    gss/krb5(rw,sync,insecure,no_subtree_check) \
    gss/krb5i(rw,sync,insecure,no_subtree_check) \
    gss/krb5p(rw,sync,insecure,no_subtree_check) \

# for NFS4 Clients
/srv/nfs4   \
    gss/krb5(rw,sync,fsid=0,crossmnt,insecure,no_subtree_check) \
    gss/krb5i(rw,sync,fsid=0,crossmnt,insecure,no_subtree_check) \
    gss/krb5p(rw,sync,fsid=0,crossmnt,insecure,no_subtree_check)


/srv/nfs4/export/home   \
    gss/krb5(rw,sync,fsid=1,insecure,no_subtree_check) \
    gss/krb5i(rw,sync,fsid=1,insecure,no_subtree_check) \
    gss/krb5p(rw,sync,fsid=1,insecure,no_subtree_check)

で、nfsサービス群を再起動。Kerberozied NFS の設定もしとく。

テスト
# mount -t nfs -osec=krb5i server:/export/home /mnt
# mount -t nfs4 -osec=krb5i server:/export/home /mnt2
# mount
server:/export/home on /mnt type nfs (rw,sec=krb5i,addr=XX.XX.XX.XX)
server:/export/home on /mnt2 type nfs4 (rw,sec=krb5i,addr=XX.XX.XX.XX)

めでたく、同じエクスポートポイントが見えました。。。Linux NFSv4 めぇ!

追記

Open Directory の設定のまとめ 2008Q1

2007年11月20日

Linux の NFS ver 3 で、Kerberos化は?

GSSAPI は下層モジュールの Sun RPC の認証方法のお話なので、 Linux の NFS ver 3 でも sec=mode の指定が可能な気がする。

で、ちょっとだけ試してみた。

NFSサーバとして2種類

  1. Solaris 10 の NFS ver3 + sec=krb5
  2. Debian/Linux etch の NFS ver3 + sec=krb5 (??)

NFSクライアントとして3種類

  1. Solaris 9
  2. CentOS 5
  3. MacOSX Server 10.5

用意した。

NFSサーバの1. は問題なく個々のクライアントでマウント接続が出来るが、NFSサーバの 2. は、どうもマウント接続を受け付けない。。。

Linux 側の設定は、fsid=0とは無関係な所で

/etc/exports

...
# for NFS3 Clients
/srv/nfs/home       *(rw,sync,insecure,no_subtree_check)
/srv/nfs/home       gss/krb5(rw,sync,insecure,no_subtree_check)
/srv/nfs/home       gss/krb5i(rw,sync,insecure,no_subtree_check)
/srv/nfs/home       gss/krb5p(rw,sync,insecure,no_subtree_check)
...

パッケージは

# dpkg --list | grep nfs
ii  libnfsidmap2                     0.18-0                              An nfs idmapping library
ii  nfs-common                       1.0.10-6+etch.1                     NFS support files common to client and serve
ii  nfs-kernel-server                1.0.10-6+etch.1                     Kernel NFS server support

どうだろう。 NFS ver 4 では問題なくできるのだがぁ。

今のところ、Kerberos化したNFSサーバはLinuxではNFS4のみ。クライアントでは、NFSv3でもNFSv4でも可能らしい。

/etc/exports 設定を見直したら、LinuxでもNFSv3サーバ/NFSv4サーバのKerberos化が可能だった。

2007年11月18日

Linux の autofs とLDAPの関係はどうなってる

Linux の autofs の LDAPインタフェースは何度か変遷があるようなので調べてみた。

基本は、Network Service Switch の設定ファイル /etc/nsswitch.conf で、検索方法に LDAP を追加すれば良い。。。

...
automount: files ldap
...

それだけで済めばいいなぁ〜。

LDAP スキーマ

automount として使われる schema は3種類ある。

1 2 3
Map Object nisMap automountMap automountMap
Map Attribute nisMapName ou automountMapName
Entry Object nisObject automount autmount
Entry Attribute cn cn automountKey
Value Attribute nisMapEntry automountInformation automountInformation
  1. RFC2307 で定義されている。
  2. Netscape Directory Server 4.11 Solaris Extensions NIS Extension Guide に記載がある。古くから使われていた奴っぽい。
  3. RFC2307bis に記載がある。最後に落とされた項目らしい。でもオフィシャルで定義されてるところは知らない。。。

マップ名の書式

autofs のマップ名の書式は異常なほど癖がある。古いバージョンでは 1. しか使えなかった。

  1. ldap:[servername:]basedn
  2. ldap:[//servername/]basedn
  3. ldap:mapname
  4. mapname

4. のマップ名書式は nsswitch.conf に記載してある検索順序で読み出すのだが、マスターマップ名でしか(マスターマップ内ではない、、)機能しなかった期間が結構あった。。。 (prefixに/etc/をつけた)ファイルマップの中に +mapname があれば、files の次の検索順序にある方法で読み出すのが正解かなぁ。

autofs の変遷

RedHat7.2/7.3/8/9/Fedora1
  1. autofs ver 3.x
  2. LDAP v2 での匿名バインド??。OpenLDAPがサーバの場合では、bind_v2 bind_anon_dn の許可が必要。
  3. サーバ、検索ベースは、/etc/openldap/ldap.conf を参照
  4. マスターマップ名は auto.master で固定
  5. LDAP schema は、1. => 2. の順で検索
  6. マップ名書式は、1. のみ
Fedora2/Fedora3
  1. autofs ver 4.x
  2. LDAP v3 での匿名バインド。
  3. サーバ、検索ベースは、/etc/openldap/ldap.conf を参照
  4. マスターマップ名は auto.master で固定
  5. LDAP schema は、1. => 2. の順で検索
  6. マップ名書式は、1. と 2.
Fedora4/Fedora5
  1. autofs ver 4.x
  2. LDAP v3 での匿名バインド。
  3. サーバ、検索ベースは、/etc/openldap/ldap.conf を参照
  4. マスターマップ名は任意で指定可能 (デフォルトは auto.master )
  5. LDAP schema は、1. => 2. => 3. の順で検索
  6. マップ名書式は、1. と 2.
CentOS4
  1. autofs ver 4.x
  2. LDAP v3 での匿名バインド。
  3. サーバ、検索ベースは、/etc/openldap/ldap.conf を参照
  4. マスターマップ名は任意で指定可能 (デフォルトは auto.master )
  5. LDAP schema は、1. => 2. => 3. の順で検索可能だったものに固定。
  6. マップ名書式は、1. と 2. と 3. と 4.
Fedora6/Fedora7/Fedora8/CentOS5
  1. autofs ver 5.x
  2. LDAP v3 での匿名バインド。
  3. サーバ、検索ベースは、/etc/openldap/ldap.conf を参照
  4. マスターマップ名は任意で指定可能 (デフォルトは auto.master )
  5. LDAP schema は、1. or 2. or 3. を指定可能 (デフォルトは1. )
  6. マップ名書式は、1. と 2. と 3. と 4.

まとめ

autofs ver 5.x でまともな実装になったなぁ〜。でも、pam_ldap/nss_ldap とLDAP繋がりで共通の設定ファイルとかあったらいいのにぃ〜。

追記

Open Directory の設定のまとめ 2008Q1

2007年11月16日

NFSv4とKerberosを組み合わせる

どうもNFSはパケットだだ漏れ、認証もへったくれもない、スピード狂のネットワークファイルシステムのイメージは拭えない。ただ、Linux のNFSv3では AUTH_SYSぐらいしか使えなかった(使わなかった?)のも大きいかも。

NFSv3 から NFSv4 への移行に合わせて、まともなKerberos認証を組み合わせてみた。 丁度、OpenDirectory にはもれなく、即運用可能なKerberosサーバ群がついてくるので、、、。

前提として

  • NFS サーバ/クライアントは、Fedora2以上/CentOS4以上である。
  • NFS サーバ/クライアントになるマシンのKerberos のクライアント設定(/etc/krb5.conf)が完了してる。
  • NFS サーバ/クライアントにはユーザアカウント情報がある。
    • /etc/passwd ファイル内であれ、LDAPサーバ上であれ、あればいい。

参考

NFSv4 のドメイン設定

NFSサーバ/クライアントの両方で、下記ファイルを編集してrpcidmapdを再起動

/etc/idmapd.conf

...
Domain = example.com
...

nfs用のサービスプリンシパルの登録

KDCにNFSサーバ/クライアントのサービスプリンシパルの登録し、それぞれをkeytabに保存。暗号化/ソルトをdes-cbc-crc:normal に限定するのがミソらしい。

# kadmin -p diradmin
Authenticating as principal diradmin with password.
Password for diradmin@EXAMPLE.COM:
kadmin: add_principal -randkey nfs/server1.example.com@EXAMPLE.COM
...
kadmin: add_principal -randkey nfs/client1.example.com@EXAMPLE.COM
...
kadmin: ktadd -k /tmp/server1.keytab -e des-cbc-crc:normal nfs/server1.example.com@EXAMPLE.COM
...
kadmin: ktadd -k /tmp/client1.keytab -e des-cbc-crc:normal nfs/client1.example.com@EXAMPLE.COM

できた keytab をそれぞれのマシンの /etc/krb5.keytab にコピーする

rpc.gssd を有効化

/etc/sysconfig/nfs

...
SECURE_NFS=yes
...

で起動。

# /etc/init.d/rpcgssd start
...
# ps `pidof rpc.gssd`
  PID TTY      STAT   TIME COMMAND
 2644 ?        Ss     0:16 rpc.gssd
#  lsmod | grep rpc
rpcsec_gss_krb5        12873  7
auth_rpcgss            42465  4 rpcsec_gss_krb5
sunrpc                142973  10 nfs,lockd,nfs_acl,rpcsec_gss_krb5,auth_rpcgss

ただし、Fedora2だけは事前に rpcsec_gss_krb5 をロードしておく必要がある。。。どうでもいいけど。

NFSv4 のサーバの設定

/etc/exports

/srv/nfs4       gss/krb5(rw,sync,fsid=0,crossmnt,insecure,no_subtree_check)
/srv/nfs4       gss/krb5i(rw,sync,fsid=0,crossmnt,insecure,no_subtree_check)
/srv/nfs4       gss/krb5p(rw,sync,fsid=0,crossmnt,insecure,no_subtree_check)

/srv/nfs4/home       gss/krb5(rw,sync,insecure,no_subtree_check)
/srv/nfs4/home       gss/krb5i(rw,sync,insecure,no_subtree_check)
/srv/nfs4/home       gss/krb5p(rw,sync,insecure,no_subtree_check)

適当にディレクトリを作成して、nfsを起動

# mkdir -p /srv/nfs4/home
# mount --bind /path/to/home /srv/nfs4/home
# /etc/init.d/nfs restart
...
# exportfs
/srv/nfs4/home  gss/krb5
/srv/nfs4/home  gss/krb5i
/srv/nfs4/home  gss/krb5p
/srv/nfs4       gss/krb5
/srv/nfs4       gss/krb5i
/srv/nfs4       gss/krb5p

クライアントでNFSv4のマウント

これで最後で root 権限で

# mount -t nfs4 -o sec=krb5 server1:/home /mnt
# mount | grep home
server1:/home on /mnt type nfs4 (rw,sec=krb5,addr=XX.XX.XX.XX)

一般ユーザでKerberosレルムに認証されている状態であれば、NFS上のファイルが触れる。。。

# su - user1
% klist -5
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_5002)
% ls /mnt
ls: cannot access /mnt: Permission denied
% kinit
Password for user1@EXAMPLE.COM:
% klist -5
Ticket cache: FILE:/tmp/krb5cc_5002
Default principal: user1@EXAMPLE.COM

Valid starting     Expires            Service principal
11/16/07 03:34:16  11/16/07 13:34:16  krbtgt/EXAMPLE.COM@EXAMPLE.COM
    renew until 11/17/07 03:34:17
11/16/07 03:34:20  11/16/07 13:34:16  nfs/server1.example.com@EXAMPLE.COM
    renew until 11/17/07 03:34:17
% ls /mnt
lost+found user1 user2 user3
% touch /mnt/user1/a
% ls -l /mnt/user1/a
-rw-r--r-- 1 user1 users 0 Nov 16 03:34 /mnt/user1/a

以上。

あぁ忘れていた。

とりあえずSELinux が有効になってる場合、いろんなアクセスが阻止されるので、Disabled か Permissive にした方がよい。。。SELinux めぇ!

追記

Open Directory の設定のまとめ 2008Q1

2007年11月10日

netatalk で Kerberos 認証

だいぶ前に設定できたのだが備忘として書いておこう。

Debian/etch 環境の netatalk は DHX認証のプラグインが含まれていないので、GSSAPI 経由で Kerberos v5 を使う。

前提として、

  • netatalkサーバはクリアテキスト認証でのファイル共有が可能
  • Kerberos のクライアント設定(/etc/krb5.conf)が完了してる。
    • ユーザは既に特定のレルムからKerberos のチケットが入手できる。
    • netatalk サーバが動いてるマシンのデフォルトのレルムが上と同じ。でもサービスプリンシパルの登録はしていない。

使っている Open Directory だと MIT Kerberos なので、kadminはそれようなのを使うべし。

kadmin で管理者でログインして、サービスプリンシパルを登録して、そのサービスプリンシパルが入った keytab を作成する。

# kadmin -p diradmin
Authenticating as principal diradmin with password.
Password for diradmin@EXAMPLE.COM:
kadmin:  addprinc -randkey afpserver/machine.example.com@EXAMPLE.COM
...
kadmin: ktadd -k /tmp/krb5.keytab afpserver/machine.example.com@EXAMPLE.COM

できた keytab をマシンの /etc/krb5.keytab にコピーする。別のサービスプリンシパルがあれば、ktuil とかで追加すると吉。

認証方法の指定を /etc/default/netatalk では行わず、afpd.conf から行うようにする。

/etc/default/netatalk

...
AFPD_UAMLIST=""
...

/etc/netatalk/afpd.conf

...
- -tcp -uamlist uams_gss.so -k5service afpserver -k5keytab /etc/krb5.keytab -k5realm EXAMPLE.COM -fqdn machine.example.com:548
...

Linux でもローカルKDC?とでのKerberos認証が提供されるのだろうかねぇ。

追記

Open Directory の設定のまとめ 2008Q1

Leopard はサーバが無くともKerberos認証つかってるらしい?

ふと、sudo klist -k とかすると、サーバでも無いのにサービス鍵が登録されている。

Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   3 afpserver/LKDC:SHA1.####@LKDC:SHA1.#### (Triple DES cbc mode with HMAC/sha1)
   3 afpserver/LKDC:SHA1.####@LKDC:SHA1.#### (ArcFour with HMAC/md5)
   3 afpserver/LKDC:SHA1.####@LKDC:SHA1.#### (DES cbc mode with CRC-32)
   3 cifs/LKDC:SHA1.####@LKDC:SHA1.#### (Triple DES cbc mode with HMAC/sha1)
   3 cifs/LKDC:SHA1.####@LKDC:SHA1.#### (ArcFour with HMAC/md5)
   3 cifs/LKDC:SHA1.####@LKDC:SHA1.#### (DES cbc mode with CRC-32)
   3 vnc/LKDC:SHA1.####@LKDC:SHA1.#### (Triple DES cbc mode with HMAC/sha1)
   3 vnc/LKDC:SHA1.####@LKDC:SHA1.#### (ArcFour with HMAC/md5)
   3 vnc/LKDC:SHA1.####@LKDC:SHA1.#### (DES cbc mode with CRC-32)

ファイル共有や画面共有とかのスタンドアーロンな認証でも、Kerberos 認証に移行するらしい。AFP/SAMBA/VNCとかは、パスワード認証不可なのか??

まぁ、セキュリティ的には安全性の高い方向への舵取りなんだろうな。

Kerberosのセキュリティ情報とかは、Leopard では結構重要な悪い知らせになるのだろうなぁ。

ローカルのKDCのレルム名はどう算出するのだろう? Bonjour ? 、、、そのうち情報が出てくるのかなぁ。

追記 (2007/11/30)

専門家では、peer-to-peer Kerberos とか呼ばれているらしい。本当か!?

ローカルKDCのレルム名は、システムキーチェーン /Library/Keychains の中にあるカスタム証明書「com.apple.kerberos.kdc」の Fingerprint のSHA1の値を使っているらしい。

LKDC:SHA1.<証明書com.apple.kerberos.kdcのfingerprintのsha1値>

秘密鍵とか公開鍵とかがなんか使ってるのかなぁ。

Leopard では、KDCデーモン krb5kdc を生成する kdcmond がレルム名やサーバ名等々をBonjour に登録するらしい(manを見る限り)が、、、、どうも取り方がわからん。

追記 (2008/08/28)

LKDC の レルム名は、次のように特殊な名前のTXTレコードの問い合わせを使うらしい。

# dns-sd -Q _kerberos.hostname.local txt

avahiではこの形の問い合わせや通知が出来ないので、もうひねり加えないと使えない模様である。

2007年11月7日

Leopard が netatalk サーバを自動的に見つられる設定

Leopard は、いい意味でも悪い意味でも、過去の遺産をばっさり切り捨てたツンなOSである。

SLP によるサービス検索機能がなくなってしまったらしく、 netatalk は AFPサーバ機能を SLP 通知しているので見つけられなくなってしまったらしい。

そんな人は、avahi を使えとか言われるが、設定方法があまり載っていない。。。

Debian/etch だと avahi-daemon は設定が何もなく?困るし。。。

avahi でサービスを通知する方法

ドキュメントを読めばよく、sshサービスのサンプルもついてくる。

/etc/avahi/services/ssh.services

<?xml version="1.0" standalone='no'?>
<service-group>
<name replace-wildcards="yes">Remote Terminal on %h</name>
    <service>
        <type>_ssh._tcp</type>
        <port>22</port>
    </service>
</service-group>

avahi-daemon を再起動させると、Leopard の「ターミナル」の「新規リモート接続」のリストに自動的に追加される。

netatalk を通知するには、AFPのサービスタイプ(http://www.dns-sd.org/ServiceTypes.html を参考)を指定して、

/etc/avahi/services/afp.services

<?xml version="1.0" standalone='no'?>
<service-group>
<name replace-wildcards="yes">%h</name>
    <service>
        <type>_afpovertcp._tcp</type>
        <port>548</port>
    </service>
</service-group>

ついでに Samba と区別ができなくなるので、

/etc/avahi/services/smb.services

<?xml version="1.0" standalone='no'?>
<service-group>
<name replace-wildcards="yes">Samba on %h</name>
    <service>
        <type>_smb._tcp</type>
        <port>139</port>
    </service>
</service-group>

Finder のサイドバーの共有のリストに、samba/netatalk のエントリが追加され、ちょっといい感じになります。

追記

Open Directory の設定のまとめ 2008Q1

OpenDirectory で Feodra/CentOSを 認証

Open Directory を立ち上げるのは非常に簡単である。 例えば、インストールするとき標準構成とかを選べば、勝手に OpenDirectory のマスターが出来上がるし、それ以外の構成でもGUIのツールを使い、LDAPの基本DNやKerberosのrealm名を指定して数クリックで完了する。

これだけで、LDAPサーバとKerberosサーバ群が直に使える状態になるのは、なんというか、、、楽だ。

CentOS5/Fedora7 の認証

authconfig を使えば、簡単にできる。同様なGUIの管理ツールauthconfig-gtk があるのでこっちを使ってよいかも。

  • ユーザ情報には、LDAPサポートを有効にして、LDAPの設定情報に OpenDirectory の検索ベースとIPアドレスを指定する。
  • 認証には、Kerberosサポートを有効にして、Realm /KDC/管理サーバに、OpenDirectoryのKerberos領域とIPアドレスとポート番号(KDCは88/管理サーバ749)を指定する。

上記に設定で書き換わるのは、次のファイル群なので面倒な問題が起きた場合これらのファイルを眺めればいい。

  • /etc/nsswitch.conf
  • /etc/krb5.conf
  • /etc/pam.d/system-auth
  • /etc/ldap.conf

大体、RedHat7くらいから同様な設定で行けたみたいだ。。。知らんかった。。。(RedHat6.2とかだともう一捻りが必要だ、、、多分知らんでもいいと思う。)

2つ問題点

Open Directory から提供されるうち基本的な部類の情報に プラットホーム依存なものがある。

  • ログインシェル
  • ホームディレクトリ

どのプラットホームに共通してあるシェルは、/bin/sh と /bin/csh くらいだが、bash がなければ別途パッケージをいれ、/bin/bash にシンボリックリンクを張れば、/bin/bash を指定できるので、大した問題では無い。

残るのは、ホームディレクトリをどうするねん。。。 ネットワークファイルシステムはどれにするとか、 オートマウントを使うか使わないかとか、、、それはプラットホーム依存ばりばりなんだなぁ。。。

で、Leopard で実装された autofs がLDAPからマップ情報をとれるので、これは面白いことになってきたって話。。。。(続く)

追記

Open Directory の設定のまとめ 2008Q1

祝 Leopard Server げっと、、、10日後

10日くらい前に予約注文したでゲットした MacOSX Server 10.5 (Leopard Server)をいじくり倒してちょっと寝不足気味である。 それで、今3度目にクリーンインストールの真最中。

まぁ、前バージョンに比べて、RADIUS サーバ / autofs / NFS4 の機能が追加や、管理ツールが一層に磨きがかかっているに違いないと、わくわくしながら触っていたのだが。

ちょっと寝不足気味。

autofs

最初は autofs を中心に触ってみた、いい感じだ。 Open Directory サーバ上のマップ情報を読んでくれる。

追加用のGUIが無さそうなので、適当な LDAP 管理ツール (Apache Directory Studio )とかで、cn=automountMap,dc=example,dc=com 以下に次のレコードを追加する必要がある。

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:/srv/nfs/home
automountKey: fileserver

ワークグループマネージャで、/home/fileserver/username をホームに指定すれば、いい感じである。

MacOSX が忘れ去られしまった /home の地位がちょっとだけ向上できてうれしい。

NFS4

NFS4 はまだ実験的実装でまだ安定的にサポートできていないみたい。ちょっと読み違いだなぁ。

、、、で嫌なことを思い出した

MacOSX 全般でファイル名を UTF8 NFD のエンコードで扱えるように、UTF8 NFD <-> UTF8 NFC の変換をよろしくやっている。NFS だけ例外で素で通して何もしてくれない。。。

Linux や他のUnixとの相互運用時に引っかかるところ、普通は NFS をあきらめ samba/netatalk で逃げる、、、つまりautofs/NFS がどんなに賢くなっても意味ないじゃん

まぁ、他のUnixは捨てって言えればいいのだがぁ。

ちょっと思い出して疲れた。

RADIUS サーバ

まだ、触れていません。。。

追記

Open Directory の設定のまとめ 2008Q1

2007年4月27日

Linux on i915GMm-HFS での電源OFFの不具合?

Debian 4.0 が無事に正式にリリースになって半月あまり。testing時代の中途半端な状態の etchに放置していたi915GMm-HFS のバージョンアップを実行した。

いつの頃からか shutdown -h now で、カーネルまで落ちるが電源が落ちない現象があった。 etchは正式版でないと思って見過ごしていたが、やっぱり直っていなかった。。。

以前、同じマザーで Linux の ACPI で、電源断ができない問題があったらしい。記述をみる限り、2.6.14以上であれば問題無いが、それ以後でも似た症状が発生しているらしい。また、Fedora 5 の掲示板でも、同じような報告もある

いろいろ弄くった結果、どうもサウンドドライバの不具合のように見える。BIOSで内蔵サウンドを無効にすると、素直に shutdown 後に電源が落ちるようになる。。。

サーバ用途にしか使わないので、無効でもいいかぁ。。。

ただし、サーバ用途でも一時的にしか立ち上げて使わないので WOL が効かないとキツいので、試行錯誤してみる。

載ってるチップMarvell 88E8053のドライバ sky2 は結構安定して使えるが、 WOL 対応は2.6.21からのようで etch 標準の2.6.18では使えないらしい。。。

そこいらのWOL対応NICを突っ込んで様子を見てみるか。。。

2007年3月21日

emacs のフレームを仮想ディスクトップの上下左右に飛ばす

FVWM を使っていたころ、実画面のサイズの縦横が定数倍になった仮想ディスクトップとして使える機能があった。

blog20070321_metacity_desktop
当時から 1つの emacs プロセスで複数のフレームを、別々の画面に割り当てて使っていた。Ctrl+十字カーソルで画面を切替えることが出来るので、プログラムを開発するときに結構便利であった。

複数のフレームを配置するとき、何度かキーを叩きマウスぐりぐりするのが、相当面倒だった。

なので、emacs の 1つのキーシーケンスで、複数のフレーム生成して上下左右に飛ばすカスタマイズをしていた。

このカスタマイズが出来たので、 最終的には emacs の8フレーム、ターミナル、ブラウザを配置する形になった(右のイメージ)。

上のカスタマイズの肝は、仮想ディスクトップ上の geometry を指定すれば、任意の位置に配置することが出来ることだった。

FVWM は勿論 afterstep や sawfish の古いバージョンとかに共通した機能だったが、Gnome が標準で使っている metacity では仮想ディスクトップの実現方法がワークスペース?に変わってしまった。

幸いワークスペースは二次元的に配置が出来るので、以前と同様な使いかたが出来る。 唯一出来ないのは、emacs から別のワークスペースにフレームを飛ばすやりかたが分からなかった。

確か、特定のHints の値を変更すれば良かった気がするが、当時追っかけたら、 emacs から変更できる Hintsの型は 文字列だけだったような、そうでないような理由から面倒くさくて、ほったらかしにしていた。

完全に移行出来なかったが、最近 wmctl という外部プログラムを知って、取り組んでみたら上手くいった。

だいぶ幸せだ。

(global-unset-key "\C-z")
(define-key global-map "\C-z51" 'moi::make-frame-3)
(define-key global-map "\C-z52" 'moi::make-frame-6)
(define-key global-map "\C-z50" 'moi::delete-frame-6)

(setq moi::desktop-max-x 4)

(defun moi::move-frame (frame x y)
  (let ((wid (frame-parameter (or frame (selected-frame)) 'outer-window-id))
     (desk (int-to-string (+ (* moi::desktop-max-x y) x))))
    (call-process
     "wmctrl" nil nil nil "-i"
     "-r" wid "-t" desk)))

(defun moi::make-frame (x y)
  (let* ((fpar (frame-parameters))
     (bw  
      (if (string-match "^20" emacs-version)
          (cdr (assoc 'border-width fpar))
        0))
     (left (+ x bw (eval (cdr (assoc 'left fpar)))))
     (top  (+ y bw (eval (cdr (assoc 'top fpar)))))
     (frame (make-frame)))
    (sleep-for 0.09)
    (modify-frame-parameters frame `((top + ,top) (left + ,left) ,(cons 'font "fontset-standard")))
    (sleep-for 0.09)
    frame))

(defun moi::make-frame2 (x y)
  (let ((frame (moi::make-frame 0 0)))
    (moi::move-frame frame (+ x 1) (+ y 2))
    frame))

(defvar moi::make-frame-6-alist nil)

(defun moi::make-frame-3 ()
  (interactive)
  (if (not moi::make-frame-6-alist)
      (setq moi::make-frame-6-alist
        (list
         (moi::make-frame2 1 0)
         (moi::make-frame2 0 1)
         (moi::make-frame2 1 1)
         ))))

(defun moi::make-frame-6 ()
  (interactive)
  (if (not moi::make-frame-6-alist)
      (setq moi::make-frame-6-alist
        (list
         (moi::make-frame2 1 0)
         (moi::make-frame2 -1 0)
         (moi::make-frame2 0 1)
         (moi::make-frame2 0 -1)
         ;;(moi::make-frame2 1 1)
         (moi::make-frame2 -1 1)
         (moi::make-frame2 1 -1)
         (moi::make-frame2 -1 -1)
         ))))

(defun moi::delete-frame-6 ()
  (interactive)
  (while moi::make-frame-6-alist
    (delete-frame (car moi::make-frame-6-alist))
    (setq moi::make-frame-6-alist (cdr moi::make-frame-6-alist))))

2007年3月18日

Pukiwiki の整形ルールの説明は正しいのか?

ここ最近、Pukiwiki ベースの文書を変換するRubyスクリプトを書いているが、Pukiwkiの整形ルールの言ってることがイマイチ正しくない。

例えば、インライン要素の一つである行末に~を書いた行末改行の説明には、「次の行の行頭書式は無効になり」とか記述があるが、そんなことは無いとか、、、等々(2007/03現在)。

だれも、本当の Pukiwiki が受け付ける書式の本当の姿は知らないのかぁ、、、。

ssh の警告?

いつからかは分からないけれども ssh で次のような警告が出ていたようだ。

Warning: No xauth data; using fake authentication data for X11 forwarding.

コンソールでは無視してたと思うが、emacs で M-x svn-status とかでリポジトリが svn+ssh://… の場合に警告として出てきて驚く。

FAQになっているらしく、

xauth generate :0 . trusted

で良いらしい。

2007年3月16日

Eclipse の更新時にミラーを選択するのが面倒

eclipse の更新時にミラーサイトを選択させるダイアログが出るが、今まで手動で選択してきた。とっても面倒だった。

が、設定にミラーを自動的に選択する項目があった。。。ちょっと幸せ

2007年3月15日

Debian/etch で Gnome Power Managerをつかってサスペンドする

Ubuntu で整理されたお陰かどうか分からないが、Power Manager が整理されつつある。そろそろ、Debian/etch でも使えるんでないかとやってみる。

apt-get install acpid acpi-support gnome-power-manager

すると、Gnomeの通知スペースにバッテリ状況を表す電源管理アイコンが表示される。またメニューに出てくる項目を選択すると サスペンド/ハイバネーションが出来るようになる。

で、メニューから選択すると、、、、なんかエラー表示がでて動かない。

エラーの理由が全く示されていないだけでなく、どこにも手掛かりになる情報が示されず、、、FAQのページを確認することを促される。

対処の方法が分かりませんって状態になってしまった。

どっかのログファイルにでも追加情報が出ているのかと思ったが、何もない。 なんとWin○○sっぽくなったのだろうか。

一晩調べてみて、熟考の結果うまく動くようになった。

従来の流れでは、

(acpiのイベント)
=> acpid でフック
=> イベント種別から /etc/acpid/events 以下の設定でスクリプトを選択
=> 大抵 /etc/acpid/suspend.sh が呼ばれる。

なので、 /etc/acpid/suspend.sh を自分のPCに合わせて変更する。

Gnome Power Manager を使う場合は、

(acpiのイベント)
=> acpid でフック
=> acpi-support パッケージにより、キーイベントに変換され、/dev/inputXに渡される。
=> Xサーバ君がキーイベントを受ける
=> gnome-power-manager がキーイベントを受け取り?、
    ディスクトップのユーザ設定に応じて処理を決めて、
    サスペンド/ハイバネーションの要求を dbus 経由でHALに出す。
=> HAL で、スクリプト
   /usr/lib/hal/scripts/linux/hal-system-power-suspend-linux を呼び出す
=> 上記のスクリプトから、acpi-support で作成された /etc/acpid/suspend.sh が呼ばれる

acpi-support を作ってくれる人が頑張ってる限り、なんもしなくても大丈夫なんだなぁ。

HAL側のサスペンド/ハイバネーションのインタフェースorg.freedesktop.Hal.Device.SystemPowerManagement を 呼び出す為には、rootユーザ権限かpowerdevグループ権限が必要である。これは、Debian特有っぽい。

gnome-power-manager がこいつの問題に引っかかって、うまくサスペンドしなかったらしい。 次のコマンドをユーザ権限でサスペンド出来なければ、権限の問題っす。

dbus-send --system --print-reply   --reply-timeout=2000 \
           --dest=org.freedesktop.Hal \
           /org/freedesktop/Hal/devices/computer \
           org.freedesktop.Hal.Device.SystemPowerManagement.Suspend

こいつは、FAQの2番目に上げられている。でも、FAQに載ってるメッセージは出てこないぞ、、、。

対処は、powerdev グループにユーザを追加して再起動。。。ちょっと快適

2007年3月14日

フォント名の冠の HG, HGP, HGS とは?

冠の数文字の英字が異なるだけのフォントが良くある。

HGP平成明朝体
HGS平成明朝体
HG平成明朝体

こいつの違いはなんだ?

リコーが販売しているフォント集とかOffice製品に含まれている。で、解答はFAQにもなっており、

HGP〜 =半角・全角プロポーショナルピッチ
HGS〜 =半角のみプロポーショナルピッチ仕様です。
HG〜 =固定ピッチ

だそうだ。

ついでに serif/sans-serif の違いはひげ付き/ひげ無しなので、 ブラウザに表示用にフォントに設定するとすれば、

serif = HGP/HGS の明朝体
sans-serif = HGP/HGS のゴシック体
monospace = HG のどれか

にすればよさげかなぁ。

AX300 と一緒に LocationFree を使う

ロケフリと騒いでいたあるポットキャストの番組を聞いて以来、耳を離れなくなって、買ってしまった。

で、ロケフリからAVマウスを使ってリモコンで機器を操作できるのだが、今使っている AX300 はリストに含まれていない。その場合、学習リモコンで覚えさせることができる。。。でも、十字キーの方向をワンアクション記憶させるのは出来なく、カーソルの左右移動が複数飛んでしまって、ちょっとダメぽ。

ただ、学習データはPSPの場合、メモリスティックの MSSONY¥LF¥RC_DATA に落とせてば使えるらしい。

まぁ、2011年まで使い切るかなぁ

2007年3月7日

Linux クライアントからIPSec Tunnel接続をする

昨日からの続きで、IPSec-VPNにLinuxクライアントで繋いでみる。

まぁ、Linuxでもやりたいことは、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータ:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:クライアントPC:192.168.150.201/32

な感じだけども、、、 参考なるそうなページを検索すれど、IPSec トランスポートモードだったり、ルータ間のIPSecトンネルだったり、PPTP使っていたりと、イマイチよさげな情報は無し。

基本から組み立てて行かねばなんないのかぁ。

IPSecとは AH + ESP + IPcomp + IKE だそうだが、使う側が理解すべきなのはもっとある。難解なのはウサギとカメの陰謀だと思う。

  • IPSec を利用する通信はどれかを Security Policy Database (SPD)で指定する。このとき transport/tunnel モード等も指定する。
  • IPsec を利用する通信のセキュリティパラメータをSecurity Association Database(SAD)で指定する。暗号化方法や鍵等が含まれる。
  • SPD は setkey ツールで指定する。
  • SAD は setkey ツールを使って手動で指定していできるが、大抵はIKEを利用する。racoonやisakmpd とかのIKEデーモンを使って自動的に指定する。
  • IKEを利用する場合は、事前共有鍵、PKI、Kerberosとかの認証とSAの種別を指定する。

順番に設定すれば良いのだが一番悩むのはIPSecを利用する通信をどう作るのか?

何?禅問答みたいなこと言っているのだろう?

俺もそう思う。

ルータ間の接続では、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータA:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:ルータB:192.168.2.1
<---->
Outer Domain:192.168.2.0/24

になっているので、ルータB 上を通過する通信 192.168.1.0/24 <=> 192.168.2.0/24 が発生させることはそんなに難しいことではない。ルータBがOuter Domainのデフォルトゲートウェイであれば良く、大抵そんなもんだ。

もう一つ心に留める必要があるIPSec Tunnelの挙動として、SPD にマッチした通信は勝手に横取りされて、トンネルで指定された端点間のIPSecのパケットとして流されてしまいます。そう!何処を流れるハズだったには関係なく!!

クライアントPCの場合を同様に考えると、通信を192.168.1.0/24 <=> 192.168.150.201/32 をいかに発生させるかが鍵だと思う(だれもそんなこと言っていないので間違ってるかも)。

ルータAにはRTX1100を使っているので、tunnel デバイスへのルーティングとかは設定してある。

ip route 192.168.150.201 gateway tunnel 1

クライアントPCで、考えられる設定は3種類です(もっとあるかも)。

  • iptunnel を使う方法
  • 疑似デバイス dummy を使う方法
  • ip alias を使う方法

iptunnel を使う方法

iptunnel add ipsec0 mode ipip remote 1.1.1.1
ifconfig ipsec0 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 dev ipsec0

実際にはIPSecに横取りされるので、特に ipip 以外でも良く、対向の端点アドレスもなんでも良い。

こいつは良く例に上げられている。FreeBSD/NetBSDの場合 gif0 とか使っている。

疑似デバイス dummy を使う方法

modrpobe dummy
ip link set dummy0 name ipsec0
ifconfig ipsec0 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 dev ipsec0

dummyは来るパケットを全部破棄する疑似デバイスで、昔SLIPとかで使っていたみたい。好き者が、ネットワーク検証とかで使っているのしか見たこと無いなぁ。

こいつを使っている例は見たことが無い。偶然出来ただけなのかも。

ip alias を使う方法

ifconfig eth0:1 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 gw 192.168.150.201

こいつを使っている例は見たことが無い。どこかに落とし穴があるかも。

上のどれでも良いと思う。というか推奨とか何処にも書いていない、、、、多分陰謀だ。

本当は、iptunnel の mode にipsec-tunnel とかがあって、SPDにtunnelモードの設定が追加された時点で自動的に追加されるのが親切な気がする。。。

そう言えば RTX1100から、VPN通信用のIPアドレスを動的に割り振れないので、固定して考えていたので3つ上げたが、正当な方法が別にありそうである。。。絶対陰謀だ。

取り敢えず、どれかの方法を決めたあとは簡単

/etc/ipsec-tools.conf で、SPDを作成

#!/usr/sbin/setkey -f
flush;
spdflush;

spdadd 192.168.150.201 192.168.1.0/24 any -P out ipsec
            esp/tunnel/YY.YY.YY.YY-XX.XX.XX.XX/require;

spdadd 192.168.1.0/24 192.168.150.201 any -P in ipsec
            esp/tunnel/XX.XX.XX.XX-YY.YY.YY.YY/require;

/etc/racoon/psk.txt に事前共有鍵を

XX.XX.XX.XX * (RTX1100と同じ文字列)

/etc/racoon/racoon.conf に、IKEデーモンの設定

path pre_shared_key "/etc/racoon/psk.txt"

remote XX.XX.XX.XX {
   exchange_mode aggressive;
   my_identifier fqdn "PCNAME"
   proposal {
       encryption_algorithm aes;
       hash_algorithm md5;
       authentication_method pre_shared_key;
      dh_group modp1024;
   }
}

sainfo anonymous {
    pfs_group modp1024;
    encryption_algorithm aes;
    authentication_algorithm hmac_md5;
}

てな具合で、クライアントPC から Develop Domain に ping を打つと、クライアントPCのログに、

racoon: INFO: initiate new phase 1 negotiation: YY.YY.YY.YY[500]<=>XX.XX.XX.XX[500]
racoon: INFO: begin Aggressive mode.
racoon: NOTIFY: couldn't find the proper pskey, try to get one by the peer's address.
racoon: INFO: ISAKMP-SA established YY.YY.YY.YY[500]-XX.XX.XX.XX[500] spi:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
racoon: INFO: initiate new phase 2 negotiation: YY.YY.YY.YY[500]<=>XX.XX.XX.XX[500]
racoon: INFO: IPsec-SA established: ESP/Tunnel XX.XX.XX.XX[0]->YY.YY.YY.YY[0] spi=xxxxxxxx(0xXXXXXXX)
racoon: INFO: IPsec-SA established: ESP/Tunnel YY.YY.YY.YY[0]->XX.XX.XX.XX[0] spi=xxxxxxxx(0xXXXXXXX)

が出れば、IPSec Tunnel のできあがり。

2007年3月5日

RTX1100 でIPSec-VPNを構築する

IPSecを使ってVPNを構築をしようとRTX1100を購入したのだが、買った満足感でそんな事をすっかり忘れて放置していた。だが、勿体ないお化けが出てきたので、RTシリーズの設定事例集を参考にIPSec-VPNを設定してみた。

VPNを構築する方法が多々あるようだが、

  • IPSec トランスポートモード
  • IPSec トンネルモード
  • L2TP over IPSec
  • PPTP
  • IP-IP
  • GRE
  • etc

で、今回構築してたのは IPSec トンネルモードっす。

現在のネットワーク構成は、次の通り。

  • ルータはPPPoEによりInternet に接続されている。
  • ルータの配下にはHome/Developのドメインがある。
  • ルータのWAN側には固定のIPアドレスが割り振られている。
  • Home ドメインには192.168.0.0/24 が、Develop ドメインには192.168.1.0/24 が割り振られている。
  • Home, Develop => Internet はルータ上のNAT変換により通信できる。
  • Home, Develop はルータ上で適当なフィルターを切ってある。

blog20070305-network-diagram

で、お外のPCからIPSecでDevelopドメインと疎通できれば良いのだが、 Home ドメインからからIPSec接続でDevelopドメインと疎通しても、 一応目的を達成できる。

クライアントに関しては、Windows とLinuxを考えている。 ついでに言うならば、Windows 用のものはNET-G Secure VPN Clientを既に購入している。ヤマハのVPNクライアントソフトは、こいつのOEM版らしいので、今ならばこいつを使うのも可だと思う。Windows 標準のIPSec では、IKE の mainモードしか対応してないっぽいので、動的IPを持つ場合はうまくいかないそうな。

やりたいことは、端点のクライアントPCに仮想IPアドレスとして192.168.150.201 を付与して、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータ:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:クライアントPC:192.168.150.201/32

な感じかなぁ。

ヤマハの設定例を参考にしてRTX側での設定は、

# インタフェースの設定
ip lan1 address 192.168.0.1/24
ip lan2 address 192.168.1.1/24

# PPPoEの設定
pp select 1
pppoe use lan3
... (ISPに応じた設定、固定IP XX.XX.XX.XX をもらう)
ip pp nat descriptor 1
pp enable 1

# NAT設定
nat descriptor type 1 masquerade
nat descriptor address inner 1 192.168.0.1-192.168.0.254 192.168.1.1-192.168.1.254 192.168.150.201
nat descriptor masquerade static 1 1 192.168.1.1 udp 500
nat descriptor masquerade static 1 2 192.168.1.1 esp

# IKE
ipsec auto refresh on
ipsec ike encryption 1 aes-cbc
ipsec ike group 1 modp1024
ipsec ike pre-shared-key 1 text *    (事前共有鍵)
ipsec ike remote address 1 any
ipsec ike remote name 1 PCNAME      (クライアントの名前)
ipsec sa policy 101 1 esp aes-cbc md5-hmac

# Tunnel 設定
tunnel select 1
ipsec tunnel 101
ip route 192.168.150.201 gateway tunnel 1
tunnel enable 1

ここでは、クライアントの名前を PCNAME で、仮想IPは 192.168.150.201 と考えている。 複数クライアントの同時接続を考えているならば、tunnel 設定を増やしていけば良い。

設定例を参考にパラメータを合わせれば、問題なくVPN接続は疎通する。 はまりポイントとしては、ルータ側のNAT処理の内側アドレスに対向アドレスを追加していないと、インターネットとの疎通が取れなくなる。これは、FAQにもなっており、クライアントソフトの設定でも回避できるそうなぁ。

2007年3月4日

知らぬ間に Raid が再構築!!

Linux のソフトウェアRAIDを使っているファイルサーバが、何故か負荷が高い気がしてたので、ログを見てみると

Mar  4 01:06:02 aquarius kernel: md: syncing RAID array md0
Mar  4 01:06:02 aquarius kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.
Mar  4 01:06:02 aquarius kernel: md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reconstruction.
Mar  4 01:06:02 aquarius kernel: md: using 128k window, over a total of 32009408 blocks.
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md1 until md0 has finished resync (they share one or more physical units)
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md3 until md0 has finished resync (they share one or more physical units)
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md1 until md3 has finished resync (they share one or more physical units)
Mar  4 01:14:28 aquarius kernel: md: md0: sync done.
Mar  4 01:14:28 aquarius kernel: md: syncing RAID array md3

って、何か知らんけど、RAID の再構築をなさっておられます!!

可なり焦ったけれども、良くログを見直すとその直前に cron スクリプトが動いてることを発見。

Mar  4 01:06:02 aquarius /USR/SBIN/CRON[27227]: (root) CMD ([ -x /usr/share/mdadm/checkarray ] && [ $(date +%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --all --quiet)
Mar  4 01:06:02 aquarius kernel: md: syncing RAID array md0
Mar  4 01:06:02 aquarius kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.

checkarray とは何ぞや、、、。

なんと、第一日曜日の1:06 に実行される checkarray が冗長性のあるRAIDをエラーチェックするそうな。 Linux君は大雑把なメッセージを吐くので、直ぐには再構築とチェックを区別できないそうな。

詳しく区別したい場合は、

# echo /sys/block/md3/md/sync_action
check

で確認でき、チェックを行っていますねぇ。 HDDが逝ってしまった訳では無いようです。

いつからそんな風になったんだぁ、、、。

2007年3月2日

イヤホンのケーブルの縛り方

イヤホンのケーブルがうねうねして絡まることが多かったが、縛り方のよさげなサイトとを見つけた

2007年3月1日

今更ながらIPv6のアドレス付けとは?

IPv6がぼちぼちコンシューマのサービスレベルまで落ちて来始めたので、再度勉強して見ようかと、ローカルマシン間(A,B)で ping を打ってみました。

A:~# ping6 fe80::222:XXXX:XXXX:XXXX
connect: Invalid argument

あれ、対向のPCのアドレスで間違いないのになぁ

B:~# ifconfig eth0 | grep inet6
inet6 addr: fe80::222:XXXX:XXXX:XXXX/64 Scope:Link

って、エラーだぁ、、、何故だろう。

色々な所で宣伝されているようにIPv6 アドレスは 128 bit であり、全ての機器に一意に割り振ってもまだ余るハズではなかったのか〜〜〜!

実は上の例ではAが複数NICを持ち、Linux の iputils のping6を使っている場合にエラーになる。ただ、inetutils の ping6 では普通に疎通する。実装によりけりである。

IPv6のリンクローカルアドレスと疎通する場合、送受信するインタフェースを指定しなければ一意に通信経路を指定することが出来ないので、追加でスコープ番号(インターフェース番号)を指定するらしい(1)。

分かっている人はチャンと理解して、こっそりほくそ笑んでいることなんだろう。ワシは今までほんと知らなかった。

# ping6 -I eth0 fe80::222:XXXX:XXXX:XXXX
or
# ping6 fe80::222:XXXX:XXXX:XXXX%eth0

実装によってはエラーになったりする、、、なんじゃい。

えっと、サイトローカルは廃止されたんかい、何処へ行けばいいの?

iPod nano を購入

今持っている一世代前の iPod は、Videoが見られなかったり、携帯電話と比べると手に収まりが悪かったり、と不満があった。 なので、今の世代のiPodかnanoを購入しようかと迷ったが、Nike+iPodが使える nano に決めて Apple Store 注文した。

配送業者: BAX GLOBAL PTE LTD

って、海外から配送されるみたい。直接のリンクはないが、お問い合わせ伝票番号からBAXのサイトで Shipment TRACKING してみると、台湾から香港経由で成田に上陸している模様、、、そこから日本の配送業者に送られるのかなぁ。

2007年2月23日

アプリが利用している Rails を最新版にする

あるアプリを書いてる間に使っている Railsのバージョンが上がってしまった。

この場合は、config/environment.rb 内の RAILS_GEM_VERSION変数を使いたいバージョンにしてから、

rake rails:update

だそうだ(参照HowtoUpgrade)。 後は、テストを走らせるだけ、、、ふむ。

HDDの不良クラスタを対処する

半年前から不良クラスタが発生したHDDが手元にある。捨てる前に、正常に読める部分は消去して捨てようと思ったが、まだ消去できていない。

それは堪え性が無いからだ。

やることは簡単で

# badblock -v -w -o badblock_list.txt /dev/sdb

で済む。

これは不良クラスタを内容を破壊的に検査するコマンドなので、これを問題なく実行できれば、内容を消去できる。

だが、ちょっと不良クラスタの量が多すぎると、、、カーネルが固まったり、デバイスが勝手に取り外されたりする。

大抵のシステムではDisk にエラーが発生すると数回リトライして諦めるようである(本当か?)。無駄なリトライが原因で不良クラスタ部分の検査には時間がかかる。それ以外にも不幸なことが起きるらしい。

不良クラスタの位置を調べるにも相当難儀なことだ。また、ディスクのファームによって代替クラスタが割り当てられて不良クラスタでなくなる場合もちらほら出て検査に再現性が無い場合もある。

多量の不良クラスタが発生した場合はHDDを物理的に破壊することが一番簡単なんだろうなぁ。

取り敢えずは badblock_list.txt ぐらいは取っておきたい。でもこのHDDの容量は300Gだし、、、はれほれひれはれ。

2007年2月20日

RWiki 2.1.1 をインストールしてみる

ときどき Ruby のレファレンスマニュアルを配布・公開されてるサイトが落ちることがあり、ちょっと不便を噛み締めていた。

ただ最新のRD形式のソースが tarball で配布されているので、こいつと RWiki を何とかすれば、ローカルでビューすることが出来るのでちょっとやってみた。

RWiki 2.1.1 の立ち上げは相当めんどくさい。

dRubyベースのアプリサーバ rwiki.rb がバックエンドに必要らしいのに気付くまで小一時間かかった。それ以前に、公式サイトの情報が異様に発散していてサイトの袋小路に小二時間ほど迷ってしまった。

次に、RWikiが Ruby-GetText-Package を利用しているのだが、debian etch に含まれる 1.7.0 と gem から取れる 1.9.0 とは相性が悪いのか全く動かない。これにも気付くのに、小三時間かかった。

で、手順は以下の通り。

依存パッケージをインストール

debian etch で不足分のパッケージをインストール

apt-get install rdtool

もっと必要かも、、

rwiki の取得

RAAのrwiki から最新版のリンクを辿ってソースを取得し、 展開する。

tar xfz rwiki-2.1.1.tar.gz -C $(rwiki-src-parent-dir)

ドキュメント読む

rd/install.rd を熟読する、、、小四時間。

rwiki をインストール

適当なディレクトリを指定してインストールスクリプトを走らせる。

 install.rb -d $(rwiki-lib-top)

でも、rwiki.rb 等々はまだ展開したソースにあるので、展開したソース群は削除しない、、、何故なのかは聞かない約束なのかなぁ。

rwiki の設定をして立ち上げる

cd $(rwiki-src)/site
vi rw-config.rb    # 取り敢えず設定をする
                   # $(rwiki-lib-top) がロードパスに含まれるように細工する。
ruby -Ke -dv rwiki.rb

で、Exceptionのメッセージ がだらだら出力されて、静かになったら良いらしい。

もしRuby-GetText-Package をインストールしているならば、$(rwiki-lib-top)/rwiki/gettext.rb をちょっと細工する

インタフェースを設置

取り敢えずCGI動くところに、inteface/rw-cgi.rb をリネームしたりして置けばよい。面倒ならば、inteface/rw-webrick.rb を起動して、http://hostname:1818 をアクセスすれば良い。

ruby interface/rw-webrick.rb

こんな感じ、でもCGIの方が良いかも。

マニュアルを設置

tar xfz man-rd-ja.tar.gz
cp man-rd-ja/*.rd $(rwiki-src-top)/rd

で、rwiki.rb を再起動すると、キャッシュ作ってるとかのメッセージがだらだら出力されて、静かになったら良いらしい。 ただし、どのページから読めるかは不明なので、小五時間くらい、クリック猿になるとトップページが分かるので、大事にブックマークする。

想像を絶する難物だなぁ。みんな使っているのかぁ

QWERTY配列ってなに?

Linux のインストールの最中に、キーボード配列を指定する場面がある。よく考えもせずにおまじない的に QWERTY とか指定したのだが、イマイチすっきりしなかった。調べたところ、左上のアルファベットの並びがその由来らしい。

ヨーロッパの製品でTの横がZになっている製品とかあったりする。

他にも色々あって、

  • QWERTY – 英語圏、日本語
  • Dvorak – 英語圏のもう一つの勢力
  • QWERTZ – ドイツ語圏、チェコ語圏
  • AZERTY – フランス語圏

など。Qwerty以外の配列は見たこと無いので、新鮮だ。

あと、101キーボードとかの種類もあるが、大雑把に言えば

  • 101 – 英語のキーボード
  • 106 – 日本語のキーボード(日本語特有の変換キー)
  • 109 – 日本語+ゲーツキーあり
かなぁ。

2007年2月19日

P_BLOG から Typo への移行

最近 Rails を使った Blog システムを自作しようと試みていたのだが、車輪の再発明をしてる気がしてならないので、同様なシステムが無いか調べてみた。

typo がよさげである。

編集途中のプレビューが横にリアルタイムに表示されて、記事の見栄えを確認するために思考を中断しなくても済むのがグッとである。それ以外はあまり癖のないシステムである。

こいつを使うための問題は、P_BLOGで書きためた記事をTypoに移行させる方法である。

コピペとかは勘弁して欲しいので、頭を絞ってみた。

Typo のトップページに、Desktop Clients というページへのリンクがある。こいつを眺めると、どうも最近のBlog事情は、Webインタフェースだけなく、ネーティブな投稿専用アプリがあるらしい。その中心にあるのが、XMLRPC上に定義された BloggerAPI / metaWeblog / MovableTypeAPI / Atom API とかいうプロトコールらしい。

専用アプリは高機能のものもあり、markdown/textileとかのシンプルなフォーマットを、平易に作成出来たりする、、、昔のNifty サーブとかではやった高機能クライアントみたいなものかぁ、、、歴史は巡るのか

すっかり、波に乗り遅れているなぁ〜〜。

プロトコールさえ実装されれば、特定のプログラム言語に依らずに操作できるので、Ruby でちょっとしたスクリプトを書いて、XMLRPC経由での移行をチャレンジしてみた。

  1. P_BLOGXMLRPCモジュールをインストールする。
  2. Typo 4.0.3 をインストールする。
  3. Typo 4.0.3 に含まれている actionpack ではちょっとこけるので修正する(current では修正されている)
  4. 移行プログラムtransition_from_p_blog.rbを走らせる。

これでおしまい、、、XMLRPCを話せると良いことあるなぁ!

2007年2月16日

ssh アクセスの制限する

専用サーバを借りている当初からパラパラと brute force attack を受けていたので、気になっていたので対策を立ててみた。

iptables を使う場合、ipt_recent/ipt_hashlimitの2種類の方法があるらしい(他にもあるかも)。 ipt_recentは CentOS 4 のカーネルに標準に入っているので、こいつを使ってみる。

ただ巷では、ipt_recent はバグ#415(1,2)があったらしく、その不具合の修正が 2.6.18 取り込まれたそうである。 ただ、CAN-2005-2872,CAN-2005-2873 という名前が付いている結構深刻そうな不具合らしいので、現在のサーバ環境にも当てはまるか注意する必要がありそうだ。

で、CentOS 4は 2.6.9 のままでパッチがやたら当たっているので、問題ないのかなぁ? RHELの changelog を見る限り #167703(CAN-2005-2872)/#189127 の fix としてkernel-2.6.9-42.ELまでに修正は入っているようだ。で、CAN-2005-2873 はどうかと言えば、パッチを見る限りどうも一緒に対応したようである。取り敢えず、yum update で最新版にしていれば安心なようである。

でもって、SSH接続を60秒に5回以上行うホストは10分間拒絶する感じにすると下記のようになる。 あまりにもしつこいホストはdenyhost とに登録しおく感じ。

iptables -N attacked
iptables -A attacked -m recent --name evilhost --set \
         -j LOG --log-level INFO --log-prefix "brute force attack: "
iptables -A attacked -j REJECT
 
iptables -N check_ssh
iptables -A check_ssh -m recent --name tcpssh --set
iptables -A check_ssh -m recent --name tcpssh --rcheck \
         --seconds 60 --hitcount 5 -j attacked
 
iptables -N safehost
iptables -A safehost -s 127.0.0.1 -j ACCEPT
 
iptables -N safeonly
iptables -A safeonly -j safehost
iptables -A safeonly -j REJECT
 
iptables -N denyhost
iptables -A denyhost -s xx.xx.xx.xx -j REJECT
 
iptables -A INPUT -j safehost
iptables -A INPUT -j denyhost
iptables -A INPUT -m recent --name evilhost --rcheck \
         --seconds 600 -j REJECT
iptables -A INPUT -p tcp --syn --dport 22 -j check_ssh
iptables -A INPUT -p tcp --dport xxx -j safeonly

余計なサービスを一切立ち上げていないので、いいのかなぁ。 何か頑張ってない感じが出ているなぁ〜。

さて、evilhostなのど名前を付けたリストには何個のIPアドレスを覚えており、登録したIPアドレスのタイムスタンプ履歴はいくつまで覚えているのでしょうか?

無限?、、、まさか

モジュールの引数に最大値を引き渡せて、デフォルトでは履歴は20個、リストあたり100 IPアドレスまで記録できるそうなぁ。リストがあふれた場合は、古い履歴を持つリストから削除されると思う(ipt_recent.cのソースはちょっと分かりづらいので詰めていないけど)

2007年2月14日

単一テーブル継承

あるテーブルで、複数の用途で使うがカラムがほとんど同じモデルがたまにある。 整数型のカラム名 namespace で、用途分けをしたりする。 ActiveRecord には、こんな用途のために単一テーブル継承が使われるらしい。 特定モデルのテーブル定義にカラム名に `type`を含め。そいつから派生したモデルの名前が、このカラムに勝手に入るようになる。

使ってみたが、お気楽で使えたええなぁ。

belongs_to の引数 :polymorphic も見ると、方向性がそっちなのかと思いつつ。。。ええかなぁ

2007年2月9日

ActiveRecord は効率が良いのか?

ActiveRecord を使い始めて、山にぶち当たってしまった。

こいつには特定のカラムの値を更新する update_attribute とかいうメソッドがある。こいつが作るSQL文が、全部のカラムを更新するようにダラダラ長くなる。それ以外でも、関連とか使うと特定のカラムのみ変更する場面があるのだが、ここでも全部のカラムを更新するようにダラダラ長いSQL文を作ってくれる。

例えば、掲示板の発言と非公開フラグを一つのテーブルに作り、管理者が発言を制御しようとロジックを組んだとしよう。管理者が、公開・非公開を変更するたびに、非公開フラグと発言内容が更新されるSQL文が発行される訳だ。。。重い。

とにかく、こいつが作る update 文をちょーーーーダサイ。

こいつはテーブルの設計に織り込まないと行けないのか、、、あふぅ。

2007年2月6日

OpenDirectory を使ってみる

一応、MacOSX Server 10.4 とかを入手していたので、今更ながら OpenDirectoryで認証サーバの統合をやってみた。

結構癖があったが、RedHat 7.2〜9/Fedora Core 1〜6, Solaris 9/10, Windows を配下に置くことが出来た。

そのうちメモをまとめておこう。

Rails を覚えると Wiki が作りたくなるらしい

Rails が覚えると習作として、Wiki や Blog のアプリを作りたがるらしい。が、できあがったアプリで運用しているところを探すと結構少ないことに気付く。

何でだろう?

車輪の再発明になるからやらないとか、セキュリティを気にかけないと行かないとか、サーバ用意するのが面倒とか、、、。

既存のサービスを使った方が、内容に注力できるからなんだろうなぁ〜。

Cocoa Emacs 24.3 構築 (2013/03版)

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