snbhsmt_log

ネットワークとコンピュータ、その他いろいろ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

bind9 サービスを正しく停止させる

リブート時に bind サービスの停止が [FAILED] となっていたので 調べると、ランレベル 6 で明示的に停止処理を実行する様にしていなかった事が 原因だった。 chkconfig コマンドで停止処理を正しく登録して対処した。

  • CentOS 4.3
  • bind 9 (RPM)

FAILED となった直接の原因は /etc/rc.d/init.d/named 中で実行される rndc stop での以下のエラー。

rndc: connect failed: network unreachable

調べてみると、rndc stop する前に ネットワーク・インターフェース lo が UP していなかった。

lo        Link encap:Local Loopback
          LOOPBACK  MTU:16436  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2366 (2.3 KiB)  TX bytes:2366 (2.3 KiB)
BIND9 の named は rndc との通信に 127.0.0.1 の 953/tcp ポートを LISTEN しているが、この lo が UP していないので rndc が named に 接続できなかった様だ。

では何処で lo が down しているのか ? リブートの処理順序を追っていく。 リブートのランレベルは 6 なので、まず /etc/rc.d/rc 6 が実行される。 この中から /etc/rc6.d/K* stop が実行され、その後 /etc/rc6.d/S* start が実行される。 今回の場合 /etc/rc6.d には K*named が無かった。

$ ls /etc/rc6.d
K05anacron  K25sshd     K35winbind  K54dovecot  K90network   K99microcode_ctl
K05atd      K30postfix  K40smartd   K60crond    K92iptables  S00killall
K15httpd    K35smb      K50xinetd   K88syslog   K95kudzu     S01reboot
この後 S00killall start の処理で /var/lock/subsys に named が あるので /etc/init.d/named stop が実行される。 よって、lo が down するのは此処より前になる。 そうやって調べて行くと K90network stop の処理で ネットワーク・インターフェースを /sbin/ifdown していた。

という事で K90network の前に named を停止する事が重要であった。 そしてこの事はランレベル 0, 1 でも言える。 /etc/rc.d/init.d/named には停止時の番号が 45 と書かれて いるので、以下の様に実行しておくべきだった。

# /sbin/chkconfig --level 2345 named on
# /sbin/chkconfig --level 016 named off
# ls /etc/rc.d/rc?.d/*named
/etc/rc.d/rc0.d/K45named  /etc/rc.d/rc3.d/S55named  /etc/rc.d/rc6.d/K45named
/etc/rc.d/rc1.d/K45named  /etc/rc.d/rc4.d/S55named
/etc/rc.d/rc2.d/S55named  /etc/rc.d/rc5.d/S55named
スポンサーサイト

Dovecot の login_dir の値を変更

起動時に、rm コマンドが /var/run/dovecot/login はディレクトリだと コンソールにエラー出力していたので対処した。 原因は rc.sysinit が /var/run 以下をファイルとして削除するため。

/var/run/dovecot/login ディレクトリは Dovecot が認証プロセス用に UNIX ドメイン・ソケットを作成する場所。

$ ls -F /var/run/dovecot
auth-worker.1790=  dict-server=  login/  master.pid
エラーメッセージが quota の処理の後に出ているのと、消そうとしているのが /var/run の中だという事から /etc/rc.d/rc.sysinit の中を探すと以下が見つかった。 これだと rm -f /var/run/dovecot/login しようとして確かにエラーになる。
# Clean up /var.  I'd use find, but /usr may not be mounted.
for afile in /var/lock/* /var/run/* ; do
        if [ -d "$afile" ]; then
           case "$afile" in
                */news|*/mon)   ;;
                */sudo)         rm -f $afile/*/* ;;
                */vmware)       rm -rf $afile/*/* ;;
                */samba)        rm -rf $afile/*/* ;;
                *)              rm -f $afile/* ;;
           esac
        else
           rm -f $afile
        fi
done

認証プロセス用の UNIX ドメイン・ソケットを /var/run/dovecot/login ディレクトリに 作成する事は、Dovecot の設定ファイル dovecot.conf の login_dir で指定されている。

login_dir = /var/run/dovecot/login
なのでこれを以下の様に変更する。
login_dir = /var/run/dovecot-login
こうすると、認証プロセス用 UNIX ドメイン・ソケットは /var/run/dovecot-login ディレクトリ中に作成されるようになり、/etc/rc.d/rc.sysinit での処理は rm -f /var/run/dovecot-login/* となるのでエラーが出なくなる。

  • CentOS 4.3
  • dovecot-1.0.rc1.tar.gz

chroot した bind の syslog 出力を SELinux で許可

syslogd のオプションに -a /var/named/chroot/dev/log を追加したら /var/log/message に以下のログが出たので、audit2allow を用いて SELinux のポリシーを変更する。

Jul 23 00:20:56 delany kernel: audit(1153581656.851:2): avc:  denied  { search }
 for  pid=3201 comm="syslogd" name="named" dev=hda5 ino=676501 scontext=root:sys
tem_r:syslogd_t tcontext=system_u:object_r:named_zone_t tclass=dir

OS は CentOS 4.3 。 targeted ポリシーなので selinux-policy-targeted-sources パッケージをインストールしておく。

まず、permissive モードにする。

# setenforce permissive
syslogd を起動、停止する。 この操作で SELinux のポリシーに引っかかってエラーログが出ているはず。
# /sbin/service syslog start
# /sbin/service syslog stop
enforcing モードに戻す。
# setenforce enforcing
以下のように実行すると直近の permissive モードにして以降のエラーログから このエラーが出なくなるための設定を出力してくれる。
# audit2allow -d -l
allow syslogd_t named_conf_t:dir { add_name remove_name search write };
allow syslogd_t named_conf_t:sock_file { create setattr unlink };
allow syslogd_t named_zone_t:dir search;
出力された設定内容を syslogd.te ファイルの末尾に追記する。
# cd /etc/selinux/targeted/src/policy/domains/program
# vi syslogd.te
ポリシーをアップデートする。
# cd /etc/selinux/targeted/src/policy
# make reload
これで以下の様に syslogd が UNIX ドメイン・ソケットを作成する事が出来る様になった。
# ls -Z /var/named/chroot/dev/log
srw-rw-rw-  root     root     user_u:object_r:named_conf_t     log
とか書いてるが、SELinux についてまったくの勉強不足で、 audit2allow が出力した設定の意味をあまり理解していない。 これだと syslogd が bind の設定ファイルをいじれる事にしてるんじゃないだろうか。

Samba 用に iptables を設定

Samba をインストールして、クライアントから利用できるようにパケットフィルタ (iptables) を設定。 このホストは ワークグループ構成で LMB, WINS サーバになっている。 この他に ESTABLISHED, RELATED なパケットを通す必要がある。 445 番ポートは Windows 2000/XP が使う。 逆にこれ以外のクライアントが無ければ 139 番ポートは必要無いのかな ?

MYHOST='192.168.0.1'
MYNET='192.168.0.0/24'
BCAST='192.168.0.255'

iptables -A INPUT -s $MYNET -d $MYHOST -p udp --sport 137 --dport 137 -j ACCEPT
iptables -A INPUT -s $MYNET -d $BCAST  -p udp --sport 137 --dport 137 -j ACCEPT

iptables -A OUTPUT -s $MYHOST -d $MYNET -p udp --sport 137 --dport 137 -j ACCEPT
#iptables -A OUTPUT -s $MYHOST -d $BCAST -p udp --sport 137 --dport 137 -j ACCEPT

iptables -A INPUT -s $MYNET -d $MYHOST -p udp --sport 138 --dport 138 -j ACCEPT
iptables -A INPUT -s $MYNET -d $BCAST  -p udp --sport 138 --dport 138 -j ACCEPT

iptables -A OUTPUT -s $MYHOST -d $MYNET -p udp --sport 138 --dport 138 -j ACCEPT
#iptables -A OUTPUT -s $MYHOST -d $BCAST -p udp --sport 138 --dport 138 -j ACCEPT

iptables -A INPUT -s $MYNET -d $MYHOST -p tcp -m multiport --dport 139,445 --syn -m state --state NEW -j ACCEPT

たぶんこれでも完璧ではないので引き続き見直しが必要。 って言うかややこしすぎるのでさっさと WebDAV に移行したい。

  • CentOS 4.3
  • samba-3.0.10-1.4E.6 (RPM)

Samba が couldn't find service xxx とログ出力する

かなり前から Samba が以下の様なメッセージをログ出力している。

[2006/07/17 04:08:41, 0] smbd/service.c:make_connection(800)
  hammerof (192.168.0.5) couldn't find service publi
これは共有名 public 中のファイルをアクセスした時のもので、オープンすると 4 回、 クローズすると 1 回出ている。 共有名は public なのに publi となっているのも意味不明。

このログは何なのだろうと思いつつも、なんの不具合もないので調べなかったが、 今日ウェブで以下のページを見つけた。
http://www.gatago.com/linux/samba/14518229.html
どうやら Windows 2000 以降のクライアント側のバグらしい。 多分実害はないが、このメッセージはログ・レベル 0 なので出力を停止できない。

WinXP から Samba のアクセスが遅い

CentOS で Samba を動かし、Win XP からアクセスしてみたら ファイル・オープンがとても遅い。 iptables をオフにしてみたら早くなったので、何かを遮断してしまっているのだろうとか と思い XP からの通信ログを取ってみたら 80 番ポートにアクセスしている。

Jul 17 04:40:23 delany kernel: iptables accept: IN=eth0 OUT= 
MAC=00:e0:18:01:8e:84:08:00:46:2a:d8:b2:08:00 SRC=192.168.0.5 
DST=192.168.0.1 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=14871 DF 
PROTO=TCP SPT=3301 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
なんでそんな事してるのか解らないが、-j DROP しているので、 たぶんタイムアウトを待ってて遅いのだろうという事で、 とりあえず -j REJECT --reject-with tcp-reset して対処しておく。

Dovecot が保存する CRAM-MD5 認証用パスワード

チャレンジ・レスポンス型の認証 (CRAM-MD5, APOP など) では、 その認証方式の性質上、サーバに保存するパスワードは平文のままで なければならないと思っていた。 しかし、Dovecot が CRAM-MD5 認証用に保存するパスワードは平文ではない。

$ dovecotpw -s HMAC-MD5
Enter new password: secret
Retype new password: secret
{HMAC-MD5}cd3ba7deaad6e5ca23448ba42e379747a9e0f7f1fbc00c8a81bbaac395731b56
この HMAC-MD5 という物はハッシュ値のようだが、 この文字列は HMAC-MD5 値では無く、HMAC-MD5 算出途中の値らしい。

この値は以下の様に求められている。

HMAC-MD5 とは MD5 の HMAC なので、まず MD5 について言うと、 MD5 の多くの実装は MD5Init, MD5Update, MD5Final の 3 つの処理からなる。 MD5Init と MD5Final は最初と最後に 1 度だけ実行され、 MD5Update は MD5 値を求めようとするデータの 64 バイト毎に繰り返し実行される。 MD5 のアルゴリズムを以下とすると、

MD5(X, Y)
データが 64 バイト以下の場合、その処理は以下の様になる。
1: MD5Init()
2: MD5Update(X)
3: MD5Update(Y)
4: MD5Final()

一方 HMAC のアルゴリズムは以下で、

H(K XOR opad, H(K XOR ipad, text))
HMAC-MD5 の場合、上記の H が MD5 になる。 そして CRAM-MD5 では上記の K がパスワード、text がチャレンジ文字列なので 結果以下となる。
MD5(password XOR opad, MD5(password XOR ipad, challenge))
するとこちらの処理は以下となる。
1: MD5Init()
2: MD5Update(password XOR ipad)
3: MD5Update(challenge)
4: MD5Final()              <--- この結果が MD5(X, Y) の Y
5: MD5Init()
6: MD5Update(password XOR opad)
7: MD5Update(Y)
8: MD5Final()              <--- これで HMAC-MD5 値が完成

この手順を考えてみると、challenge は認証が開始されるまで不明だが password はサーバ側に保存する物なので、 2 と 6 は予め計算しておくことが可能だと解る。 そしてこの 2 と 6 の結果を連結したものが Dovecot が CRAM-MD5 認証用に 保存しているパスワードだ。

MD5 のアルゴリズムについて詳しく無いので、 この MD5Final する前の状態でも一方向ハッシュとしての性質を 備えているのかどうか判らないが、もしそうなら、この値から元のパスワードを 知る事はできない。 ただし、パスワードファイルの内容とチャレンジ文字列から HMAC の計算を続行し、CRAM-MD5 における authenticate コマンドの レスポンスを返す事が出来そうなので、わざわざ計算途中の値を保存しても 意味無いと思うのだけど。

ちなみに APOP は MD5(challenge, password) なので同じ事はできない。

参考:
HMAC: メッセージ認証のための鍵付ハッシング
MD5 メッセージダイジェストアルゴリズム
IMAP4 and CRAM-MD5 Authentication

Top

HOME

snbhsmt

Author:snbhsmt
Google Profiles

http://www.ksky.ne.jp/~snbhsmt/

全ての記事を表示する

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。