2009年03月10日

●squidですべての要求を上位プロキシ経由で転送するconf

インターネットにダイレクトアクセスできない場所から、どうしてもインターネットに出る必要があったので、別の場所にsquidでプロキシサーバーを作って、そこを経由させてインターネットに出るようにしたのだが、初めてsquidを使ったので、イマイチ動作がよく分らずconfの書き方にちょっと苦労した。

画像やhtml単体は落ちてくるのに、その他のところはタイムアウトしてしまう。
ログを見ていると、hogehoge.txtやhogehoge.jpgはsquidが取りに行って渡しているのに、「?」や「/」で終わったりするURLはダイレクトアクセスさせている。
最初はMIMEタイプの問題かと思ったのだが、どうもそうではないらしい。
基本的にsquidってのは、今回のように代理サーバーや中継サーバー用途というよりは、キャッシュサーバーを想定して作られているので、特に明示的に指定せずにconfを書くと、静的コンテンツだけがsquid経由でクライアントに渡される仕様になっているようだ。

ということで、すべてのクライアント要求をsquid自身が取りに行き、かつ上位プロキシを経由する設定を書いてみる。

squidではない上位プロキシを指定し、クライアント192.168.1.0/24と192.168.2.1にのみ転送し、これらへの転送をすべてsquidが行う。(ダイレクトアクセスさせない)

acl 1net src 192.168.1.0/24 
acl host1 src 192.168.2.1 

http_access allow 1net
http_access allow host1

never_direct allow 1net
never_direct allow host1

http_access deny all
htcp_access deny all

#待ち受けポートは8080
http_port 8080

#上位プロキシ(proxyserver:8080)を指定する
cache_peer proxyserver parent 8080 0 proxy-only

2008年11月28日

●色々なデーモンのデバッグモード

色々なサーバーを作っていて一回コンパイルしてconf設定してすぐにちゃんと動けば申し分ないけど、ほとんどの場合は一度では動かない。
confを書き換えたり、オプション変えてコンパイルしなおしたりと試行錯誤が必要になってくる。

で、サーバーが思ったように動かない時に詳細なログ吐かせて何が問題になっているのかを特定するために、各デーモンのデバッグモードでの起動、あるいはデバッグログを出力させての起動が必須になる。

といういことで、各デーモンのデバッグオプションを書いてみた。
バックグラウンドで動かさずにフォアグラウンドで起動して標準出力に大量のログを吐くタイプと、
フォアグラウンドには出ないけど、ログには詳細なデバッグ情報を各タイプと2タイプある。

フォアグラウンドに出ずにログが詳しくなるタイプ
tail -f ログ みたいな感じでリアルタイムにデバッグするのがよい。

postfix
/etc/postfix/master.cf
の該当デーモンに -v をつけるとsysologに大量のログが出力される

smtp inet n - n - - smtpd -v
smtps inet n - n - - smtpd -v

などとしておいて、メールを送信してみる。


dovecot
指定したログに大量のデバッグ情報が出力される。指定していない場合はsyslog。
dovecot.conf

#メールプロセスのデバッグを有効
mail_debug = yes
より詳細なログ出力
auth_verbose = yes
# 認証がらみの詳細なログ出力。
auth_debug = yes
#パスワードと使われたやり取りが記録
#auth_debug_passwords = yes

てな感じでpop3やimapを使ってみる。


以下はフォアグラウンドで動作させて標準出力にログを吐かせるタイプ。

proftpd
/usr/local/proftpd/sbin/proftpd -n -d 10
-nでデーモンでなくフォアグランドで動作させ、-dでデバッグレベルを指定する。
標準出力に詳細なログが垂れ流し…

おまけのbind9
/usr/local/bind/sbin/named -c /etc/named.conf -u named -t /usr/local/bind -d 10 -g
-gでデバッグモードでフォアグラウンドで動く -dでデバッグレベルの指定

しかし、デバッグログを見るたびに、デーモンソフトウェアたちは見えないところで頑張ってるねんなーと思うのであった。

2008年11月27日

●apache1.3にmysql認証を追加

apacheでのユーザー認証と言えばBasic認証かDigest認証やけど、仮想ユーザー統一の一環として、
ベーシック認証の問合せ先をパスワードファイルだけではなく、mysqlも参照出来るようにしてみた。

作業としてはapache1系mod_auth_mysqlを追加するという事になる。

CFLAGS="-native -mt -fast" ./configure --enable-rule=SHARED_CORE --enable-module=so --prefix=/usr/local/apache --enable-module=auth_digest --enable-module=digest

ってな感じコンパイルされているapacheに、モジュールとしてmod_auth_mysqlを組み込む
mod_auth_mysqlのソースディレクトリで、
/uasr/local/apache/bin/apxs -c -L/usr/local/mysql/lib/mysql -R/usr/local/mysql/lib/mysql -I/usr/local/mysql/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c

と直接mod_auth_mysql.cをコンパイルするとmod_auth_mysql.soが生成されるので、
sudo /uasr/local/apache/bin/apxs -i mod_auth_mysql.so
でファイルがコピーされる。

confには


LoadModule mysql_auth_module libexec/mod_auth_mysql.so
AddModule mod_auth_mysql.c
#モジュールを読み込む


<Directory /export/web/hogehoge >
AuthMySQLEnable On
 AuthName "enter username and password"
 AuthType Basic
 AuthMySQLHost ホスト名
 AuthMySQLDB DB名
 AuthMySQLUser 接続ユーザー
 AuthMySQLPassword パスワード
 AuthMySQLUserTable テーブル
 AuthMySQLNameField username
 AuthMySQLPasswordField password
 AuthMySQLPwEncryption crypt
 AuthMySQLUserCondition mailuse='1'
 require valid-user
#SELECT username,password FROM DB名.テーブル WHERE mailuse='1';
#と展開され、
#入力されたユーザー名とパスワードと照合される。

</directory>


と書けば/export/web/hogehogeはmysqlによるbaseic認証となる。
当然、AllowOverrideでAuthConfigが許可されているディレクトリでは、.htaccessとかにも書いてもよい。

2008年11月26日

●proftpdでlocalhost意外のmysqlに接続する場合の注意点

mail,ftp,webをmysql内のユーザーDBに統合出来たと言う事で、土偶家の外向きサーバーを家向きサーバーから完全に隔離して、Solarisコンテナ内の別ゾーン内に閉じ込めるべく別環境に移行させた。

それに伴って、各デーモンの問い合わせ先となるMYSQLのデーモンも別のまた別の隔離されたゾーン内に閉じ込めたのだが、postfixでもdovecotでローカルホストではない別のホストへのmysql接続が正常動作しても、proftpdだけ全く動かなくなった。
proftpdでmysqlの問合せ先をlocalhost意外にした場合デーモン自体が起動しないのだ。

これは困ったと言う事で色々調べていると、どうやらinetd経由では起動しなかったものがStandAloneではちゃんと動く。
これは仕様なのかバグなのだろうか?
もしかしたら完全にリードオンリーでマウントされているsolarisコンテナ内のゾーン内でのファイルシステムでの運用に問題があったり、confでのsqlのソケットの指定にパーミッションやら何やらの関係で問題があったのかもしれないけど、まぁ動いたのでこれでよしとする。
又気が向いたらデバッグするかもしれない。

2008年11月25日

●postfix 2.5.5 dovecotでsmtp-auth + mysqlによる仮想ユーザー運用

先日cyrus-SASLによるSMTP-AUTHとSMTP/TLS対応のpostfixを作ったが、これをsmtp-authにdovecoのSASLを利用し、仮想ユーザーの参照元をmsqlにするためにコンパイルしなおした。

ネット上に色々情報があるけど、一番参考になったのは、やっぱり本家のドキュメント
Cyrus-SASL対応と比べてDovecotのSASLの良い点は、Cyrusの場合はpostfixのバイナリにCyrusのライブラリをリンクさせる必要があるけど、Dovecotは認証に専用のデーモンプロセスを使うのでコンパイル時にフラグを一つ追加するだけで済む事である。
たしかにヘッダとライブラリ検索パスを指定しつつフラグも追加するよりはエレガントで、かつライブラリをリンクしないと言う事はリンク先のライブラリのバグを取りこむ可能性が一つ減ったという事も言えるのであろう。

以下で、Dovecot-SASLとMysql、SMTP/TLS対応のバイナリのコンパイル、設定の手順、いくつかの注意点を書いてみる。
例の如く、Solaris10 U6 spac版にgccを使わずSun Studio 12のコンパイラでの実装である。

C++のコンパイルオプションで、最適化オプションに-fast -native -mt 、ヘッダ検索パス、SASL対応と、TLS対応、Mysql対応を指定、
外部ライブラリの検索パスとランパス、TLSとmysqlのリンカオプションを指定、


export CCARGS="-fast -native -mt -DUSE_SASL_AUTH -I/usr/sfw/include -DUSE_TLS -DHAS_MYSQL -I/usr/local/mysql/include/mysql"
export AUXLIBS="-L/usr/sfw/lib -R/usr/sfw/lib -L/usr/lib -R/usr/lib -L/opt/sfw/lib -R/opt/sfw/lib-lssl -lcrypto -L/usr/local/mysql/lib/mysql -R/usr/local/mysql/lib/mysql -lz -lm -lmysqlclient"
dmake makefiles
dmake

ドキュメントでは、「-DDEF_SERVER_SASL_TYPE=\"dovecot\"」を指定するとデフォルトでDovecotが使われると書いてあったけど、土偶の環境ではmake時にエラーで止まったので、コンパイラオプションで指定せず、後からconfで指定した。

以下でconfの重要な部分を書く。
ローカルへのメール配信は、実ユーザーが存在しなければmysqlに問い合わせる。
外部へのリレー要請ではSMTP認証でdovectに問い合わせを行い、認証されればリレー許可する。
SMTP認証とローカル配信対象リストは全く別物であるところに注意である。まぁ当たり前か。

main.cf


smtpd_sasl_type = dovecot
#SASLにDovecotを

smtpd_sasl_path = private/auth
# dovecotと通信するソケットの指定、dovect.confのsocket listenの位置を書く。
# ドキュメントに則ってスプールからの相対パスで書いた。

smtpd_sasl_security_options = noanonymous
#anonymouse接続を拒否

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,check_relay_domains
#外部へリレー許可するリスト、permit_sasl_authenticatedがSMTP-AUTHで許可されたものとなる

local_recipient_maps = $virtual_mailbox_maps unix:passwd.byname
#ローカル受信者の検索テーブルの指定
#仮想メールボックス、実ユーザーの順で書いた。

fallback_transport = virtual
#存在しないローカルアドレスへのリレー要請をvirtualに
#local_recipient_mapsで指定してるからいらんかも

#以下で仮想ユーザ(メールボックス)の指定
#それぞれファイルを指定して、ファイル内でDBとクエリを指定する。
virtual_mailbox_base = /
virtual_mailbox_maps = mysql:/etc/postfix/virtual-account.cf
virtual_uid_maps = mysql:/etc/postfix/virtual-uid.cf
virtual_gid_maps = mysql:/etc/postfix/virtual-gid.cf

以下からmysqlへの問い合わせの設定、詳しい書式はこの本家のドキュメントを参照されたし。
virtual-account.cf


hosts = ホスト名
user = 接続ユーザー
password = パスワード
dbname = DB名
table = テーブル

#以下の三つの項目は、
#user@domain.comへと配信要求が来た場合、
#SELECT CONCAT(mailrootdir,"/Maildir/") FROM DB名.テーブル WHERE username="user" and mailuse='1' ;
#と展開される

select_field = CONCAT(mailrootdir,"/Maildir/")
#メール配信先を指定する、SQL文concatで文字列を結合し、/home/user/Maildir/などと展開される。
#最後に/をつけるとMaildir形式、スラッシュ無しだとmailbox形式になる、微妙にはまった。

where_field = username
additional_conditions = and mailuse='1'


virtual-uid.cf


hosts = ホスト名
user = 接続ユーザー
password = パスワード
dbname = DB名
table = テーブル

#以下の三つの項目は、
#user@domain.comへと配信要求が来た場合該当メールボックスにUIDを設定するために使われるようである、
#SELECT uid FROM DB名.テーブル WHERE username="user" and mailuse='1' ;
#と展開される
select_field = uid
where_field = username
additional_conditions = and mailuse='1'

virtual-gid.cfは略。
とこんな感じで、dovectと同じテーブルを読み、メール環境が統合できる。

2008年11月24日

●mysql対応、openssl対応のDovecotのコンパイル@Sun Studio 12@Solaris10 U6 spac

MTAであるpostfixがsmtp認証を実現するための外部機能として、以前まではCyrus SASLを選択するしかなかったのだが、バージョン2.3からDovecot SASLなるものに対応していることを最近知った。

ということで、その時初めて知ったDovecotについて調べてみると、どうやら単なる認証機能を提供するSASLではなく、pop3とimapを提供するMDAであるらしい。
ユーザーデーターベースとして、UNIXシステムの実ユーザーに対する認証からpam、LDAP、Mysqlなどに対応し、それらの複数を同時に実装できるのが何よりも良い感じである。
メジャーで事実上標準的なMDAであるQpopperとかCourier-IMAPより歴史的には浅いけど、Postfixと連携させて使うことを前提に、しかも実ユーザーでなく、仮想ユーザーでの運用も追加して考えれば良い選択であろう。

これでメールサーバーのMTAの部分とMDAの部分が実ユーザーだけでなくMysql上のDBにある仮想ユーザーも加えて運用させることができた。

以下でSolaris10 U6 spac版にgccを使わずSun Studio 12のコンパイラで実装した手順を書いてみる。

コンパイラオプションで最適化コードとヘッダ、ライブラリ検索パスとランパスを指定、
コンフィグオプションは以下の通り、
mysqlサポート、opensslサポートを追加、それぞれ/usr/local/mysql/ /usr/sfw/にインストールされているものとする。


export CFLAGS="-native -mt"
export CPPFLAGS="-I/usr/sfw/include/openssl -I/usr/local/mysql/include/mysql"
export LDFLAGS="-L/usr/local/mysql/lib/mysql -L/usr/sfw/lib -R/usr/local/mysql/lib/mysql -R/usr/sfw/lib"

./configure --prefix=/usr/local/dovecot --with-mysql --with-ssl=openssl --disable-ipv6 && dmake


普段、土偶はSUNのC++の最適化オプションは「-native -mt -fast」を利用しているが、コンパイラオプションに「-fast」をつけると、コンパイルは通るものの、出来たバイナリはpop接続すると

Nov xx xx:32:55 host dovecot: [ID 762087 mail.info] Dovecot v1.1.6 starting up
Nov x xx:32:55 host dovecot: [ID 107833 mail.crit] Panic: file istream.c: line 84: assertion failed: (stream->eof)
Nov xx xx:32:55 host dovecot: [ID 398108 mail.error] Raw backtrace: 0x26894 -> 0x29a94 -> 0x3111c -> 0x2f2f0 -> 0x27a24 -> 0x27b24
-> 0x22c64 -> 0x22ebc -> 0x1f02c -> 0x15a88

って感じのエラーを吐いて落ちてしまう。
SUNのドキュメントには「IEEE 標準の浮動小数点演算を使用しているプログラムには、-fast を指定しないでください。計算結果が違ったり、プログラムが途中で終了する、あるいは予期しない SIGFPE シグナルが発生する可能性があります。」って書いてあるのでそれだろうか?
RSA暗号の強度は因数分解の難しさがである上に、複合化するにはガウスの時計計算機とフェルマーの小定理を使うので計算結果が狂うということだろうか?とにかく-fastオプションでなく、-native -mtオプションだけだとちゃんと動作した。

で、confファイルはこんな感じのものが認証に関わる部分、
dovecot.conf


mail_location = maildir:~/Maildir
#ユーザーデータベースとパスワードデータベースに外部DBを、指定した外部ファイルで指定、
#postfixのスプールディレクトリにユーザーとグループを指定してSASLソケットを提供
auth default {
  mechanisms = plain login
  userdb sql {
   args = /usr/local/dovecot/etc/dovecot-mysql.conf
  }
  passdb sql {
   args = /usr/local/dovecot/etc/dovecot-mysql.conf
  }
  passdb pam {
  }
  passdb passwd {
  }
  userdb passwd {
  }
  socket listen {
   client {
    path = /var/spool/postfix/private/auth
    mode = 0660
    user = postfix
    group = postfix
   }
  }
}

dovecot-mysql.conf
でDBのやらそのクエリを指定する。


driver = mysql
connect = host=ホスト名 dbname=DB名 user=ユーザーt password=パスワード
#パスワードのハッシュ方式を指定 MD5-CRYPTとかPLAINとかが使える。
default_pass_scheme =CRYPT

#ユーザーDBの参照クエリ
# %uでユーザー名を指定され、
# カラム名homeにMaildirのあるディレクトリ、(一般的にはホームディレクトリやね)
# uidにuid gidにgidが得られるようなクエリを指定する。
user_query = SELECT mailrootdir AS home ,uid ,gid FROM table WHERE username="%u" and mailuse='1'

#パスワードDBの参照クエリ
# %uでユーザー名を指定され、
#カラム名usetとしてユーザー名が、
#カラム名passwordとして指定した方式でハッシュ化済のパスワードが得られるようなクエリを指定する。
password_query = SELECT username AS user ,password FROM table WHERE username='%u' and mailuse='1'

2008年11月13日

●postfix 2.5.5 でのSMTP/TLS @OpenSolaris

以前のエントリー「postfix 2.5.5 でのCryus-SASLでのSMTP-AUTH @OpenSolaris」でCyrus-SMTPを使ったSMTP-AUTHを実装したPostfixのビルド方法を書いたけど、更にそれにSMTP/TLSを実装する方法を書いてみる。

このSMTP/TLSなる技術は、本来ならSMTPの他ホストへのリレーにユーザー認証を取りいれ、更にその認証からメール送信までの経路をSSLで暗号化するということでセキュリティーを向上させようという趣旨である。とはいっても、実際通常の使い方をする分には通信経路の暗号化は必須ではない。

自宅サーバーでメールサーバーを運用していると、自宅サーバーから送信したメールが問答無用でスパムメール扱いされる事が多いのは本当に腹立たしい。
これを自宅のISPのSMTPにリレーしてもらうには「Outbound Port25 Blocking」なる技術もあるにはあるけど、私のように自宅ISPにSMTPリレーしてもらえない状況の人もいる。(WilcomADSLでオプション扱いのメール契約していないなど。)

という場合、外部のSMTPを使う事になるわけやけど、一番てっとりばやくスパム扱いされにくく安心出来そうなSMTPと言えばGmailが妥当なところであろう。
しかし、GmailはタダのSMTP-AUTHではなくTLSでのAUTHを要求してくるので、これに対応する事で、GmailのSMTPを経由してメール送信が出来る。

こんなメール乱世な御時勢を生きる、真っ当な自宅メールーサーバーなハッカー諸氏にとっても必須の技術といってもいいであろう。

ここでは、のCryus-SASLでのSMTP-AUTHを動作させた状態を前提として、それにTLSでの暗号化技術を乗せて、送信時にgmailへリレーするようにするまでを書いてみる。

postfixのインストール(太字がSMTP/TLSの部分)
opensslのヘッダファイルssl.hが/usr/sfw/include/opensslにあり、libssl.soとlibcrypto.soが/usr/sfw/libにある場合


export CCARGS="-DUSE_CYRUS_SASL -DUSE_SASL_AUTH -I/usr/local/include/sasl2 -I/usr/include/pcre -DUSE_TLS -I/usr/sfw/include"
export AUXLIBS="-R/usr/local/lib -L/usr/local/lib -L/usr/sfw/lib -R/usr/sfw/lib -lssl -lcrypto"
make tidy
make makefiles
make
#make install

次にサーバー秘密鍵と証明書+公開鍵の作成
#cd /etc/postfix
秘密鍵の作成
#openssl genrsa -out server.key 1024

証明書+公開鍵の作成
#openssl req -new -x509 -key server.key -out server.crt

#chmod 400 server.key server.crt


続いてpostfixの設定
/etc/postfix/main.cf


#daemn設定
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/postfix/server.key
smtpd_tls_cert_file = /etc/postfix/server.crt

#smtp送信設定

smtp_sasl_auth_enable = yes
smtp_sasl_tls_security_options = noanonymous
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_password_maps = dbm:/etc/postfix/sasl_passwd 
#(hashやbtree、cdbが良い人はお好みで)


gmail認証情報ファイルの作成
/etc/postfix/sasl_passwd

[smtp.gmail.com]:587 Gmailアカウント@gmail.com:パスワード
と記述。

gmail認証情報ファイル検索テーブル作成
#cd /etc/postfix
#postmap dbm:sasl_passwd (hashやbtree、cdbが良い人はお好みで)
sasl_passwd.pagとsasl_passwd.dirが出力されたのを確認
#chmod600 /etc/postfix/sasl_passwd*

動作確認

telnet llocalhost 25

220 サーバー名 ESMTP Postfix
ehlo localhost ←入力
250-サーバー名
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN


STARTTLSの行があるのを確認したのち、
sendmailコマンドでどこぞにメールを送信してテストしてみる。

2008年11月11日

●postfix 2.5.5 でのCryus-SASLでのSMTP-AUTH @OpenSolaris

最近新しくOpenSolaris 2008.05で家のサーバーを作っており、cyrus-saslでpam認証するSMTP-AUTHつきのpostfixをコンパイルしたのだが、なぜかちゃんとSMTPが動作しない。
手順はほぼ前にあげたエントリの通り。前は上手くいったのに…
コンパイルしたバージョンは2.5.5なのだが、ポート25に接続しても、ログに「warning: unsupported SASL server implementation: cyrus」と出るだけでうんともすんとも言わない。
うーんなんてこったい。
ちなみにコンパイル時のオプションはCCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl2 -I/usr/include/pcre" AUXLIBS="-L/usr/local/lib -lsasl2 -R/usr/local/lib"とこんな感じで特に問題はなさそう。
CCARGSの最後のインクルードパスの指定は、ccがdict_pcre.cのコンパイル中にprce.hが無いとかぬかしたので追加してある。根性で捜して来いよと。プンプン。

んーまいったなーとソースコードについてきたドキュメントを読んでいると、「Building Postfix with Cyrus SASL support」の項目に



(for Cyrus SASL version 2.1.x):

% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -lsasl2"



とか書いてある。
-DUSE_CYRUS_SASL ってオプションが増えてるやんけー

なんやねんそれーということで、同じ文書をよく読むと"Support for the Dovecot version 1 SASL protocol is available in Postfix 2.3 and later. "ってことらしく、2.3からはSASL AUTHに「Cryus-SASL」
と「Dovecot SASL」を使えるようになったようだ。
SMTPでSASL-AUTHをするようビルドするには「USE_SASL_AUTH」としたうえで、「DEF_SERVER_SASL_TYPE=\"dovecot\"」と「USE_CYRUS_SASL」のどちらか、あるいは両方を指定するようだ。
そういえば、前にコンパイルしたのは2.2やったしね。

ということで、


gmake tidy
CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl -I/usr/include/pcre"
AUXLIBS="-L/usr/local/lib -lsasl2 -R/usr/local/lib"

gmake makefiles
gmake


てな感じでコンパイルして上手くいった。

しかし、初めて見た「Dovecot SASL」なるものを調べていると、Cryus-SASLが認証方法を一つしか選べないのに対して、Dovecot SASLは複数のものを同時に使えるようだ。
例えば、最初にpamでローカルユーザーを調べ、いなければLDAPに聞きに行き、そこにもいなければmysqlに聞きに行けるということも可能ということらしい。
土偶家ではメールのユーザーは全員実ユーザーに関連付けられていて、メールしか使わないユーザーはシェルを使えなくしてあるのやけど、この「Dovecot SASL」を使うとローカルユーザーすら作らなくてもよいではないか。
ということで、「Dovecot SAS」対応しておけば、confだけで切り替えることが出来るらしいので、とりあえずもう一度コンパイルしなおしておくのも良い感じである。

更に、Postfix TLS Supportなるドキュメントを見れば、以前は実装する為にはソースにパッチ充てたりとややこしかった、認証時のSSL暗号化のTLSサポートも結構簡単になったようである。
「Dovecot SAS」とあわせて、これは一丁チャレンジしてみるかな。これでgmailにリレーしてもらえるやん。
久しぶりにsolaris熱メラメラである。

2008年09月24日

●apache-tomca+apacheで web+Java Servletを作る

先日仕事でJava Servletが動くサーバーを作ったのだが、実行環境であるapache-tomcat自体はバイナリパッケージを落としてきて展開するだけ、と激しく簡単である。
しかしこれではapacheと同じポートで同時に使えない。
どうせなら同時にapacheも使いたいので、apacheとTomcatを連携させるために、ネット上の情報を探したのだが、apache-tomcatを使うだのjakarta-tomcatを使うだのと二通りの情報が錯綜していて良くわからんかった。
そもそもapache-tomcatとjakarta-tomcatの違いがはっきりしなかったのやけど、色々調べた結果、結局この二つは同じ物を指していて、apache-tomcatの古い呼び方がjakarta-tomcatであると便宜的に理解しておいても大丈夫そうだ。

ややこしい話やけど、apache内のjakartaプロジェクト内のtomcat製作プロジェクトで作られたものがjakarta-tomcatで、後にtomcatプロジェクトが格上げされてapache直下のjakartaプロジェクトと同じ位置に来たのでapache-tomcatとなったと言う事らしい。どちらも作っているものは同じである。
apache-tomcatもjakarta-tomcatもどちらもJava Servletである。

で、apacheとTomcatを連携させて同じポートで動かす、つまり、apacheの特定のディレクティブだけtomcatで動作させるためには、apache + Tomcat Connectors + Tomcat(apache-tomcat)という構成すれば良い。
イメージとしては、apacheとtomcatが個別に動いていて、apacheへの特定のディレクティブへのアクセスを、apacheのモジュールであるTomcat Connectorsがリバースプロキシの様な働きをしてTomcatの特定のポートから転送するといった動作のようだ。(想像)

環境は OpenSolaris 200805
コンパイラはsunstudioexpress(SunStudio11ベース?)
apache_1.3.41 apache-tomcat-6.0.18 tomcat-connectors-1.2.26
apacheとtomcat-connectorsのみソースからインストール

とりあえずapacheを

./configure --enable-rule=SHARED_CORE --enable-module=so --prefix=/usr/local/apache
って感じの --enable-module=so つきでコンパイル、ポート80で動かす。

Tomcatをどこぞに展開して、bin/startup.sh で起動、
server.xmlのAJPプロトコルのバージョンと動作ポートを確認、
<!-- Define an AJP 1.3 Connector on port 8009 -->
 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 
なのでajp13 ポート8009となる。


どちらもちゃんと動いていればtomcat-connectorsのインストール

tomcat-connectors-1.2.26-srcのコンパイル

$ cd tomcat-connectors-1.2.26-src/native/
$./configure --with-apxs=/usr/local/apache/bin/apxs
$make
#make install
とすれば
apacheのlibexecディレクトリにモジュールmod_jk.*がインストールされる

ただし、solarisの場合、
/usr/ccs/bin/make
/opt/SUNWspro/bin/dmake
/opt/SunStudioExpress/bin/dmake
では如くコンパイルエラーが出るようだ。
gnuのmakeを使えばちゃんと通るので入ってなければ入れる。


apacheのconfディレクトリに移動
httpd.conf に以下を追加


LoadModule jk_module libexec/mod_jk.so

<IfModule mod_jk.c>
  JkWorkersFile conf/tomcat.conf
  JkLogFile logs/mod_jk.log

#Tomcatの/examples以下を転送
  JkMount /examples/* tomcat

</IfModule>

tomcat.conf を新規作成して以下を追加


worker.list=tomcat
worker.tomcat.port=8009
worker.tomcat.host=localhost
worker.tomcat.type=ajp13

apche再起動
tomcat再起動

2008年08月27日

●Javaな密林に植林 / 時は既に新世紀

仕事でJava Servletで動作するWEBアプリケーションなサーバーを作る事になって、Apache Tomcatを触る必要が出てきた。
おまけにそのWEBアプリはPostgreSQLも必要とするらしい。

今まで私はApacheとPHPの人やったけど、仕事で今まであえて避けてきたMysqlやらtexやらを使う必要が出てきて、結果としてこれもまあまあ使えるようになった。
で、「mysqlとTexはまぁまぁ得意」と言えるようになったら、今度はまた避けていたJavaとPostgreSQLまで触ることになって、また密林の未体験ゾーンに足を踏み入れることになった。

いくらSolarisやらNetBSDやらが好きで、家で趣味の一環として色々なシステムを作ってみても、MysqlやTexには仕事の必要に駆られてしか手を出さなかった。
PostgreSQLはまだMysqlと同じ括りになるとしても、今回のJavaなどは一人では絶対手を出そうとしなかったもののひとつだろう。
Sun Microsystems は大好きやけど、その開発物であるJavaはあまり好きになれなかったのだ。

とりあえずよくわからんながらも、Webにあるマニュアルを見ながらApache TomcatとPostgreSQLなサーバーを作ったけど、動作原理がまったくわからんのでとてつもなく不安である。
こればっかりは勉強するしかない。
confがxmlで記述されているのはちょっとしたカルチャーショックであった。ってJavaの話と言うよりはTomcatの話やね…

「時は正に世紀末」と歌っていた人がいたけど、その世紀末は過ぎて新世紀である。
もう今時、Java周辺をちょっとでも齧っとかんとあかんやろうかなぁ、と思っていたところなので「渡りに船」ならぬ「WebサーバーにJava Servlet」、「SolarisにTomcat」と言ったところだろう。(意味不明)

最近、仕事で今まで手を出さなかった分野に投入されることが多く、大変ながらも中々刺激的で楽しい。
そのうちに組み込みアプリとかデバイスドライバの開発を頼まれるのではないかとビクビクしている。

2007年10月07日

●Movable Typeをlighttpd + FastCGI +PHP +Perlで

当ブログのWEBサーバーをapache2からlighttpdに変えてみた。
でもって、PHP、PerlをFastCGIで動かしてみる。
確かに、管理画面と投稿が早い。

MovabletypeのPerlスクリプトをFastCGI上に乗せるやり方やらラッパーやらはweb上にいろいろな方法が解説されていたけど、結局ココのやり方が一番いい感じ。
これを参考にして作った、PerlとPHPをFastCGIで動かすconfは以下で。

lighttpd.conf のFastCGIの該当部分はこんな感じ。

fastcgi.server = (
  ".fcgi" => (
        "localhost" => (
                "socket" => "/lighttpd_path/fcgi-fastcgi.socket",
                "bin-path" => "/MTpath/fcgi-perl",
                "bin-environment" => (
                        "PERL5LIB" => "/MTpath/lib",
                        "MT_HOME" => "/MTpath",
                        "MT_CONFIG" => "/MTpath/mt-config.cgi"
                )
        )
  ),
   ".php" => (
        "localhost" => (
                "socket" => "/var/lighttpd/php-fastcgi.socket",
                "bin-path" => "/usr/local/bin/php-cgi"
        )
   )
)

上のfcgi-perl は参照したサイトのdispatch.fcgiと同じ。

これで *.fcgi はFastCGIとして動く。
Movabletype関連のcgiを拡張子fcgiでシンボリックリンクを張ってfcgiとしてアクセスして動かす。
mt.fcgi, mt-comments.fcgi, mt-tb.fcgi, mt-search.fcgi, mt-view.fcgi, mt-atom.fcgiとすれば良いようだ。
ラッパーのおかげで、再構築するとブログ内のcgiのリンクがすべてfcgiに書き換わるうえに、新規投稿、再構築だけでなく、コメントとトラックバック時にもFastCGIが使われるようになるのでなかなか快適。

2007年10月06日

●lighttpd、apacheでないwebサーバー

WEBサーバーと言えばapacheやけど、巷で軽い、早い、柔軟と噂のlighttpdを使ってみた。
さらにFastCGIでPHPとPerlを動かす。

FastCGIをコンパイルした後に…


PerlのFastCGI対応のモジュールとしてFCGIとCGI::Fastを入れる。
CPANなコマンドで言うと、

perl -MCPAN -e 'install FCGI'
perl -MCPAN -e 'install CGI::Fast'
とこんな感じ

PHPのFastCGI対応版は以前のエントリな感じで。

lighttpd本体のインストールは特にややこしい事はなく、

./configure --prefix=/usr/local/lighttpd

#confのコピー
cp doc/lighttpd.conf /usr/local/lighttpd/etc

#rcスクリプトのコピー
cp doc/rclighttpd /usr/local/lighttpd/sbin

●apache1系のコンパイルオプション

apacheのコアプログラムも DSO ライブラリとしてコンパイルする時はこんな感じ。
./configure --enable-rule=SHARED_CORE --enable-module=so --prefix=/usr/local/apache

2007年10月05日

●Sun Studio 11でPHP5をコンパイル

PHP5系のコンパイル apacheのsoモジュールを作った後に、fastcgi対応版も作成。
solari10 sparc 8/07 コンパイラはSun Studio 11

コンパイラの指定
export CC=/opt/SUNWspro/bin/cc
export CXX=/opt/SUNWspro/bin/CC
export F77=/opt/SUNWspro/bin/f77

コンパイルオプションの指定
export CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v8"

ライブラリ検索パスの追加
export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib:
/usr/ucblib:/usr/sfw/lib:/opt/sfw/lib:/usr/dt/lib:
/usr/openwin/lib:/usr/xpeg4/lib:/usr/ccs/lib
(実際は一行で)


#apache1.3系のsoモジュールをインストール
通常のPHPバイナリの他に
/usr/local/apache/libexec/libphp5.so
が生成される。

#with-apxsを指定してconfig
./configure --with-apxs=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --enable-zend-multibyte --enable-mbstring --enable-mbregex
GDを使う場合は追加
--with-gd=/usr/local --with-jpeg-dir=/usr/ --with-png-dir=/usr --with-xpm-dir=/usr --with-freetype-dir=/usr/sfw --with-tiff-dir=/usr --with-xml=/usr --with-zlib=/usr --with-xpm-dir=/usr

#make とmake install
dmake
dmake istall

#fast-cgi版のPHPインストール
apach1.3のsoモジュールを作った後、
lighttpdなどで使用するfast-cgiで動作するバイナリを作る。
通常のPHPバイナリの他に、
/usr/local/bin/php-cgi
が生成される。

#ソースディレクトリ内の生成されたconfigとバイナリを消す

dmake distclean

#enable-fastcgiを指定してconfig

./configure --enable-fastcgi --enable-force-cgi-redirect --enable-discard-path --with-mysql=/usr/local/mysql --enable-zend-multibyte --enable-mbstring --enable-mbregex --enable-discard-path
GDを使う場合は追加
--with-gd=/usr/local --with-jpeg-dir=/usr/ --with-png-dir=/usr --with-xpm-dir=/usr --with-freetype-dir=/usr/sfw --with-tiff-dir=/usr --with-xml=/usr --with-zlib=/usr --with-xpm-dir=/usr

#make とmake install
dmake
dmake istall
(./sapi/cgi/php がcgi-phpの本体なので、
cp ./sapi/cgi/php /usr/local/bin/php-cgi
としても可)

#iniファイルのコピー
cp php.ini-dist cp php.ini-dist /usr/local/lib/php/php.ini

#後は/usr/local/lib/php/php.iniをそれらしく編集
default_charset="UTF-8"
mbstring.language="japanese"
とかはいるんでね?

●Sun Studio 11でmysql5をコンパイル

今更ながら mysql5系 のコンパイル方法を…
solari10 sparc 8/07 コンパイラはSun Studio 11

コンパイラの指定
export CC=/opt/SUNWspro/bin/cc
export CXX=/opt/SUNWspro/bin/CC
export F77=/opt/SUNWspro/bin/f77

コンパイルオプションの指定
export CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v8"

ライブラリ検索パスの追加
export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib:
/usr/ucblib:/usr/sfw/lib:/opt/sfw/lib:/usr/dt/lib:
/usr/openwin/lib:/usr/xpeg4/lib:/usr/ccs/lib
(実際は一行で)

#とりあえずconfigure
./configure --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql --prefix=/usr/local/mysql

#make とmake install
dmake
dmake istall

#mysql用のグループとユーザー
groupadd -g 3306 mysql
useradd -d /usr/local/mysql/var -u 3306 -g mysql mysql

#myqldのDBディレクトリとDBインストール
mkdir /usr/local/mysql/var
chown mysql:mysql /usr/local/mysql/var
./scripts/mysql_install_db --user=mysql

#デーモンの起動
/usr/local/mysql/bin/mysqld_safe &

#rootのパスワード変更
/usr/local/mysql/bin/mysqladmin -u root password '新しいパスワード'

2007年10月04日

●op25b環境でPostfixのメール再送間隔を設定してみた

最近土偶サーバーが配信している「お天気メール」が15分以上遅れることが多い。
土偶家が加入しているプロバイダは「Outbound port 25 Blocking」を採用しているので、土偶家のメールサーバーは内部ネットワークから外部ネットワークへのメール送信時に、プロバイダーのSMTP経由しなければいけない状態になっている。
で、ログやらメールキューを見ていると、プロバイダのSMTPサーバーが接続された時に、時々「今無理やしまた後から試してね。」てな感じで土偶メールサーバーの接続を拒否していた。
土偶の環境ではリレーホストがプロバイダのSMTPサーバーになっているので、リレーホストの無いSMTPサーバーのようにエラーのキューは後回しにして次のキューをというわけには行かず、この状態になると先頭のキューが処理されるまで全てのメールキューが待ち状態になってしまう。
拒否された一通の後の全てのメールがその影響をこうむって遅延してしまうわけである。

拒否されてはいるものの今までメールが遅延はしても非着になった事は無いので、次の接続時には拒否されずに送信出来たということなのやろう。
この遅延時間が、数秒とか最悪数分ならまだいいものの、ログを見る限り16から20分ほどの遅延とちょっと長すぎる。
そういうわけで再送信までの間隔を変更しようと調べてみた。

結果、Postfixは相手SMTPがエラーになった場合、「minimal_backoff_time」に設定された値だけ待った後に再送信を繰り返し、それが「maximal_backoff_time」の値になると、以後は「maximal_queue_lifetime」の値になるまで、「maximal_backoff_time」間隔でリトライする。という仕様になっているらしい。
デフォルトではminimal_backoff_time=1000s、maximal_backoff_time=4000s、main.cfに明示的な設定は無いものの、postconfコマンドで見ると確かにそうなっている。
つまりエラーがあると16.6666...分後にリトライするようだ。

時間的にも土偶サーバーの遅延時間と合致する。でもってこれでは長すぎるので、main.cfにはとりあえず、minimal_backoff_time=60s maximal_backoff_time=600s maximal_queue_lifetime=6000sと書いておいた。
送信エラーがあった場合1分間隔で10分までリトライし、それ以降は10分ごとに1時間までリトライする。
という感じである。
とやって見たものの、それほどメールの遅延は改善されていないっぽい…

「Outbound port 25 Blocking」なISP内の野良メールサーバのメールの遅延に困っている人は試してみてはいかがだろうか?
postfix reload した後に、postconfでちゃんと値が設定されているのを確認しておこう。

2007年09月13日

●movabletypeでmod_perlは本当に早いか?

このブログをapache上のmod_perlで動かそうと、1.3系apacheとPHPのDSOモジュール、そしてmod_perlモジュールをコンパイルする。
ネット上に溢れる情報どおりに設定してmod_perlは動いた。しかし早いのはperlのCGIを使う管理画面だけで、やたらとメモリを食ってhtmlやphpの応答が遅くなったような気がする。しかも再構築中にブラウザへの返答が無くなる現象が見られるようになった。

perlの初期実行時のオーバヘッドは緩和されたものの、HTTP-KeepAliveが使えなくなったお陰でブラウザによる静的コンテンツの連続読み出しが遅くなり、結果として多数のファイルから成り立っている我がブログの閲覧は遅くなった。
しかも殆どのmod_perlのセッションが、スパムのためにCGIを叩く接続に対する拒否なり廃棄なりの応答や処理に使われているわけで、殆どmod_perlの意味ねーやん。
投稿者が使用する管理画面だけが早く、閲覧者が見る通常の静的コンテンツは遅くなる状態と言うのはいかがなものか。
そういうわけで、我がブログにはmod_perlは必要ないと言う結論に至った。

しかしながら、そのまま元の環境に戻すのもなんなので、mod_perlを使わずに1.3系apacheだけの通常のCGIとして運用するようにした。それでも、2.2系のapacheに比べてメモリ消費量が抑えられている。結果としては、最新版の1.3系apacheへの移行だけ言う事になろうか。

まぁ、久しぶりのソラリス遊びはとても楽しかった。
みんなsolarisではgccつかわずに/opt/SUNWspro/bin/cc使おうぜ。

2007年06月05日

●postfixで OP25B対策 & Submission Port対応

先月の終りくらいから土偶メールサーバーから諸氏に配送しているお天気メールが届かなくなっていたのだが、予想通り、プロバイダのOutbound Port 25 Blocking対策によるものだったので、土偶メールサーバーのPostfixの設定を変更して対応した。

以下は、メールサーバーの送信時にrelayhostとしてSMTP AUTHされた別のメールサーバーをSubmission Portを使って経由するような設定である。

土偶メールサーバーは既にSMTP AUTHをsasl_authで実装しているので、
main.cfに

relayhost=[プロバイダのSMTPサーバー]
smtp_sasl_password_maps = hash:/etc/postfix/conpasswd
smtp_sasl_mechanism_filter = plain, login


んでもってプロバイダの接続アカウント名とパスワードを格納している。/etc/postfix/conpasswdを

プロバイダのSMTPサーバー アカウント:パスワード

と言う書式で書いて、

postmap /etc/postfix/conpasswd

として

/etc/postfix/conpasswd.dir
/etc/postfix/conpasswd.pag

を生成する。
当然、
chmod 600 /etc/postfix/conpasswd*
位はしておこう。

さらに、Submission Portの設定として、master.cfの以下のコメントを外し、

submission inet n - n - - smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

とする。

んでもって、
mailq
でキューを見て、不要なキューを
postsuper -d キューID
として消した後に
postfixをリロードで終了

2006年12月14日

●OpenPneでSMTPを使う

仕事でオープンソースのSNSであるOpenPneを検証した。
インストール自体は特に何の問題もなく簡単に済んだのだがちょっと困った事があった。
それは、招待メールだのお知らせメールだのが送信される際にローカルのメール送信コマンド(PHPのmail関数から呼ばれる)を使うという仕様。
これのおかげでメールが送信できない。

検証したサーバーではセキュリティ上の配慮からリモートだろうがローカルだろうがメール配信という配信をことごとく拒否している。
このホストからメールを送信するにはsmtpサーバーに接続して送信する必要があるのだが、OpenPNEのシステムはデフォルトでSMTP送信に対応していないようだ。

google先生に聞いても答えは無いので、しょうがなくコードを読んで該当箇所を発見。
ちゃんとメールが送信できるようになったので公開してみる。
つーても、全然大したものではないけど…

ソースというかパッケージが解凍されているディレクトリ、
OpenPNEの公式セットアップガイドで言うところの「OPENPNE_DIR」が
/usr/local/OpenPNE だとすると、
/usr/local/OpenPNE/webapp/lib/util/mail_send.php がメールを送信しているスクリプトであり、こいつを編集する。

そのmail_send.phpの60行目

return mail($address, $subject, $body, $headers, $params);



include_once('Mail.php');
$recipients = "$address" ;
$headers = "" ;
$headers['From'] = $from ;
$headers['To'] = "$address";
$headers['Subject'] = "$subject";

$mail_options = array(
'host' => 'SMTPサーバー', // SMTPサーバー名
'port' => 25, // ポート番号
'auth' => false, // SMTP認証 true false
'username' => "", // ユーザー名
'password' => "", // パスワード
'localhost' => 'サーバー名' //送信元サーバーのFQDN名 HELOに使う
);
$mail_object =& Mail::factory("SMTP",$mail_options);
$mail_object->send($recipients, $headers, $body);

#return mail($address, $subject, $body, $headers, $params); //オリジナルをコメントアウト


と書き換えればOK。

修正:2008/02/21 「include('Mail.php');」 を 「include_once('Mail.php');」に 山下様のご指摘よる

2006年10月23日

●子プロセスが産まれへんらしい

シリアスで性質の悪い障害にもかかわらず、ぐぐっても出てこず、かつしょーもない原因でもあり、ハマるにはアホらしいので、記事にする価値はあるだろうと言うことで久々のコンピューター関係のエントリー。
perl 5.8.4 apache 2.2.0 solaris10 最下位モデル位のsun4uでの話。

業務で使っているwebサーバーがちょっと前からエラーを出すようになった。
機器とOSとシステムの選定から構築まで全部俺がやったというと聞こえはいいけど、用はあまっていた古いハードで、俺の趣味を存分に生かして作ったもの。
むちゃくちゃ古いハードに最新のOSと最新のサービスが突っ込んである。
落ちて当然のような気もするけど、愛着もあるので落としたくない。

症状としては掲示板にアクセスすると子プロセスが作れない旨のエラーを出してエラーコード500で止まると言うもの。
毎回落ちるのではなく、時々正常に動作するのが性質が悪い。

最初はDOS攻撃するワームがどこかで動いているのかと思ったけど、apacheのプロセスは死んでいないし、PHPは問題なくちゃんと動いているし、apacheのプロセス上限にきているわけでもない。
エラーを吐くのはperlのCGIのみ。
apacheに残るログは
「(12)Not enough space: couldn't create child process: 12: xxxxx.cgi ~」
「(12)Not enough space: couldn't spawn child process:/xxx/xxx/cgi-bin/xxx/xxx.cgi,~」
って感じ。何が「Not enough space」なのかと言うと、どうやらメモリらしく、子プロセス作られへんくらいに、実メモリ、仮想メモリを使い切ってるということらしい。

考えてみればこんな状態でも細々と息絶え絶えにでも動いているsolarisとsparcすげーと感心するも、とりあえずファイルベースのswapを割り当ててやるとまともに動き出した。

solarisの場合なら、

# mkfile 256m /export/swap
# swap -a /export/swap
で/export/swapとして256mのswap領域を追加。

# swap -l
# swap -a
でちゃんと追加されているのを確認。

再起動したら元に戻るので、適時/etc/vfstabに追記して起動時に/sbin/swapaddされるようにしてやる。
/etc/vfstabには

/export/swap - - swap - no -
と追加。

/sbin/swapaddが自動実行されるように

# ln -s /sbin/swapadd /etc/rc2.d/S99swap.add
ってのは強引か?

現象としては過負荷なので、本来なら隙を見て物理メモリを追加してやるか、ディスク増設してswap領域作ってやるの正道やと思うけど、手を加えるほどの価値のあるハードでもないので、別マシンにIIS+windowsでサーバーを作り直し、ドメイン統合認証を使いたいという色気が出てきた。

2006年05月20日

●snmpのシステム関係のMIB

cpu-day.png
MRTGを入れる度に検索してるので書き残しておく。
つーか、MIBツリーなんか絶対覚えられんぞ…
Solaris上の(Linuxとかでも同じ)Net-SNMPデーモンからデフォルトで所得出来るMIB情報。MRTGとかで所得するとシステム監視に役に立ちます。

ということで冒頭の画像はNet-SNMPのMIB情報から所得し、MRTGで生成した土偶サーバーでのこの24時間ほどのCPU負荷グラフでした。

Net-SNMPから所得出来るシステム関係のMIB情報

実メモリ
1.3.6.1.4.1.2021.4.5.0 memAvailReal.0 int型 合計の実メモリ容量
1.3.6.1.4.1.2021.4.6.0 memAvailReal.0 int型 利用可能実メモリ容量

スワップ
1.3.6.1.4.1.2021.4.3.0 memTotalSwap.0 int型 トータルのスワップ容量
1.3.6.1.4.1.2021.4.4.0 memAvailSwap.0 int型 利用可能スワップ容量

CPU
1.3.6.1.4.1.2021.10.1.5.1 laLoadInt.1 int型 CPU負荷率(1分間の平均)
1.3.6.1.4.1.2021.10.1.5.2 laLoadInt.2 int型 CPU負荷率(5分間の平均)
1.3.6.1.4.1.2021.10.1.5.3 laLoadInt.3 int型 CPU負荷率(15分間の平均)

Net-SNMPがインストールされていれば、
snmpwalk -v 1 -c コミュニティ名 ホスト名 1.3.6.1.4.1.2021.4.5
で表示される。

土偶サーバーでは
CPU負荷が10%を超える事はほとんど無く、

memTotalSwap.0 = INTEGER: 526312
memAvailSwap.0 = INTEGER: 526312
と、スワップをこれっぽっちも使ってない事になる。
何せ実メモリが
memTotalReal.0 = INTEGER: 1048576
memAvailReal.0 = INTEGER: 601200
とトータル1ギガのうち60%が利用可能ということになってる。

5年前ならプロバイダの基幹を背負うに相応しい構成やね(そうか??)

ちなみにこいつを所得するmrtgのconfは、
コミュニティがpublicで対象ホストがlocalhostの場合、

Target[cpu]: 1.3.6.1.4.1.2021.10.1.5.1&1.3.6.1.4.1.2021.10.1.5.2:public@localhost
MaxBytes[cpu]: 100
Unscaled[cpu]: dwmy
Options[cpu]: gauge,nopercent
Title[cpu]: CPU Load Average
PageTop[cpu]: <H1>CPU Load Average</H1>
YLegend[cpu]: load average (%)
ShortLegend[cpu]: %
LegendI[cpu]: 1min
LegendO[cpu]: 5min


Target[mem]: 1.3.6.1.4.1.2021.4.4.0&1.3.6.1.4.1.2021.4.6.0:public@localhost
MaxBytes1[mem]:526312(swapの総容量 memTotalSwap.0の値)
MaxBytes2[mem]:1048576(実メモリの総容量 memAvailReal.0の値)
Unscaled[mem]: dwmy
Options[mem]: gauge,absolute,integer,unknaszero
Title[mem]: Memory Usage
PageTop[mem]: <H1>Memory Usage</H1>
YLegend[mem]: Available Memory
ShortLegend[mem]: Bytes
LegendI[mem]: Swap available
LegendO[mem]: Real available
kilo[mem]: 1024
kMG[mem]: k,M,G,T,P

と言う感じ。

2006年05月06日

●コンパイルオプション集

コンパイルするたびにいつも忘れてるのでメモメモ

  • mysql
    --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql --prefix=/usr/local/mysql
  • apache2
    --enable-mods-shared=most --enable-ssl=shared --prefix=/usr/local/apache2 --enable-so --with-ssl=/usr/local/ssl
  • php4
    --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql --enable-zend-multibyte --enable-mbstring --enable-mbregex
    GDを使う場合は追加
    --with-gd=/usr/local --with-jpeg-dir=/usr/ --with-png-dir=/usr --with-xpm-dir=/usr --with-freetype-dir=/usr/sfw --with-tiff-dir=/usr --with-xml=/usr --with-zlib=/usr --with-xpm-dir=/usr

2006年02月21日

●webmail設置&imapの選び方

うちのサーバーでwebmailができるようにした。
熟考(とうほどでもないが)の結果土偶サーバーで採用されたのは、imapがWU-imap、webmailがSquirrelMailとなった。
Webmailに関してはSquirrelMailの他にActiveMailも候補に上がったのだが、これは職場でも採用しており、どうせならということでSquirrelMailを採用。
つーかロゴのリスがなんか良いという理由が一番かな。
メールアカウント欲しい方は引き続き募集ですえー。webmailもできるでー

で、以下はなぜimapにwu-imapを選んだかのどちらかといえば技術的なポリシーの話になる。
webmailもしくはimap導入予定の方は参考にしてください。

現在土偶サーバーではSMTPサーバーとしてpostfixが稼動している。
SMTPの配信方法はユーザーが問い合わせに来るまでメールスプールにメールをためておくmbox形式と、
ユーザーのホームディレクトリのMaildirディレクトリに直接配信するMaildir形式、さらにホームディレクトリ配信ではないcyrus形式のメールスプールがあるけど、シェル上からmailxコマンドでメールを確認できるのはmbox形式のみとなる。
確かにMaildir形式はセキュリティー的にも耐障害性の面でもmboxやcyrusのメールスプールに比べて有利なんやけど、日常的にSolarisのシェルを使う人間にとってははなはだ不便になるので土偶サーバーではmbox形式を採用している。
imapはユーザーが接続するとそのスプールを読みに行き、ホームディレクトリ上のMaildirにコピーして閲覧できるようにするシステムであるけど、(SMTPがMaildir配信の場合は直接Maildir上を読む)
シェルでーメールを読む場合もあればメールソフトを使って読む場合もあるので、土偶サーバーで採用されるべきimapの条件とすれば。
SMTPの配信形式を,シェル上のmailxコマンドでメールが読めるmbox形式を扱うために、配信方法をMaildir形式、もしくはcyrusのスプール形式に変えなくてもよい。
であり、
妥協点はメールの受信にAPOPも使用しているので、imapは内部ネットワーク内でしか使用せず、ユーザー名とパスワードの送信時に暗号化にそれほど気を使う必要はない。
ということになる。

で、具体的なimapの選択になるわけやけど、主にimapの有名どころはほぼ三つといってしまっていいと思う。
カーネギーメロン大学の開発プロジェクトによるCyrus IMAP
Courier-mtaの派生物のひとつ(なのか)のCourie-imap
ワシントン大学に開発プロジェクトのあるwu-imap
Cyrus-imapはCyrus-saslを使っている場合に、メールのみのユーザーとパスワードを共有できるので一番愛称がいいんやろうけど、先に述べたようにスプール形式がcyrusという独自形式でmailxコマンドが扱えないので却下。
ただ、シェルにログインしてメールを読むことがなく、システムユーザー以外で運用を考えるとこのCyrus-imapが最適だと思う。通信経路をすべて暗号化できることも大きなアドバンテージとなる。
認証方式での安全性を取ればこのIMAPになる。

Courie-imapはMildir配信のSMTPにのみ対応したimapで、最近はやりのようである。
メールのユーザーのホームディレクトリに直接配信するMaildir配信のどこがよいのかというと、共有スペースであるスプール上にメールを置くことで、SMTPサーバーやその他デーモンの乗っ取りなどで他人にメールを読まれるというリスクと、スプールがクラッシュすればすべてのメールが失われる、というリスクをある程度避けることができる。
これはImapの機能というよりはSMTPの機能にあたるわけで、courie-imapはそのセキュアなSMTPに対応したimapとなる。
システムレベルでのセキュリティーを考慮すればこのimapやけど、mbox形式ではなくシェルからメールを読むのに苦労するので却下。

wu-imapはIMAPのrfcの著者が開発元にいることもあり、Imap自体のリファレンス的な部分があるようだ。smtpでいえばsendmailの位置にあるような感じやけど、sendmaiほどの脆弱性は聞かない。
平文でアカウント&パスワードを流すけど、ローカルネットワーク上の運用なので、これはそれほど無問題。
これといった特別な機能はない代わりにunixを日常的に使う人には親和性が高いように思える。ということでこれが採用理由。

なんだかどこかの技術文書みたいになったけど、imapの運用を考えている人の参考になれば幸いです。
ただ、大きな勘違いをしているかもしれないので、間違えてるところがあったら教えてください。

2006年02月20日

●SMTP-AUTH@OpenSolaris

OpenSolarisでのSMTP-AUTHの作り方。
以前postfix+saslauthdでのSMTP-AUTHなメールサーバーの構築の仕方を書いたけど、ちょっとわかりにくい部分と自分でも理解できていなかった部分があったのでまとめてみた。なるべく詳細に書いてみる。

メールアカウント欲しい人はいうて貰えばじゃんじゃん発行しますえー

目指すべきところ:
外部とのやり取りもできるセキュアなメールサーバーの構築。

条件:
1、localhostからは認証なしでメール送信(リレー)許可。
2,当然ながら自ドメイン宛も無条件でメール受信(リレー)許可。
3,外部(サブネット含む)からの接続で自ドメイン以外への送信(リレー)はSMTP-AUTHで認証後に許可。
4,SMTP-AUTHはローカルシステムのユーザー&パスワードを使用。
5,条件4を満たすために/etc/shadowもしくはpamを使った認証が必要。

制限事項:
1,条件:4を満たすために認証方法は「PLAIN LOGIN」しか使用できないが、通常のSMTPは平文でユーザー名とパスワードを流しているのに引き換え、
PLAINはBase64エンコードされた状態で送信されるので、これでいいと諦める。
DIGEST-MD5 CRAM-MD5のどちらか、あるいは両方を使うためにはローカルシステムではなく、外部認証が必要となる。

使用したソフトウェア
smtpサーバーpostfix-2.2.8
/etc/shadowもしくはpam対する認証デーモン:cyrus-sasl-2.1.21

概要:
postfixはsendmailとは違ってrootではなく指定したユーザー&グループ権限で動作するsendmail互換のセキュアなサーバーである。
低権限のユーザーで動作するpostfix単体では/etc/shadowやpamを使って認証を行うことができないので、
cyrus-saslという認証デーモンを動作させ、postfixがそのデーモンに問い合わせを行う形でSMTP-AUTHを実現する。

コンパイル条件:
CコンパイラはSunStudio11のSUN Cを使用:

cyrus-sasl-2.1.21のコンパイル
インストールディレクトリは/usr/local/sasl2


コンパイラの指定
$export CC=/opt/SUNWspro/bin/cc
$export CXX=/opt/SUNWspro/bin/CC
$export F77=/opt/SUNWspro/bin/f77

コンパイルオプションの指定
export CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v8"

ライブラリ検索パスの追加
$export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib:/usr/ucblib:
/usr/sfw/lib:/opt/sfw/lib:/usr/dt/lib:/usr/openwin/lib:
/usr/xpeg4/lib:/usr/ccs/lib
↑実際は一行

ソースコードの解凍
Makefile作成
$ ./configure --with-saslauthd=/var/cyrus --with-pwcheck=/var/cyrus --enable-login --disable-otp --disable-krb4 --disable-gssapi --disable-anon --with-dblib=none --enable-static --disable-digest --disable-srp --prefix=/usr/local/sasl2 --with-openssl=/usr/local/ssl

コンパイル
$dmake
インストール
#dmake install

シンボリックリンク作成
#ln -s /usr/local/sasl2/lib/* /usr/local/lib/
#ln -s /usr/local/sasl2/include/* /usr/local/include/
/

confの作成
#vi /usr/local/sasl2/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list:plain login
allowanonymouslogin: no
allowplaintext: yes

データベースディレクトリ作成
mkdir /var/cyrus

デーモンの起動
#/usr/local/sasl2/sbin/saslauthd -a pam
(/usr/local/sasl2/sbin/sasalauth -a shadowsの方が推奨されている)

postfix-2.2.8のインストール



postfixの動作するユーザーとグループの作成
groupadd postfix
groupadd postdrop
useradd -d /dev/null -s /bin/false -g postfix postfix

コンパイラの指定
$export CC=/opt/SUNWspro/bin/cc
$export CXX=/opt/SUNWspro/bin/CC
$export F77=/opt/SUNWspro/bin/f77

saslauth対応のコンパイルorリンカオプションの指定
$export CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl"
$export AUXLIBS="-L/usr/local/lib -lsasl2 -R/usr/local/lib -R/opt/sfw/lib"
(LDFLAGS CFLAGSは無視されるようだorz)

ソースコードの解凍
Makefileの作成
$dmake makefiles
コンパイル
$dmake

インストール
#dmake install
いろいろ聞かれるのでそれらしく答える。

confの作成
特に設定すべき項目のみを記す。
vi /etc/postfix/main.cf

#saslauthを使って認証する
smtpd_sasl_auth_enable = yes

#saslauthでの匿名接続を拒否。
smtpd_sasl_security_options = noanonymous

#リレー許可の条件:saslauth認証されたホスト,$mynetwokで指定されたネットワーク,$relay_domainsで指定された宛先
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,check_relay_domains

#自ドメインの定義
mydomain = 自ドメイン名

#メール送信元として使用されるドメイン(@以下)
myorigin = $mydomain


#mynetworkの形式
mynetworks_style = host

#mynetworkの定義
mynetworks = localhost

#メール送信サーバーして使われる(システム)ホスト名
myhostname = それらしい名前を書く。ホスト名でいいかも。

#自ホスト充てのメールとして受け取る宛先
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

#リレーを許可する宛先(ドメイン
relay_domains = $mydestination


デーモン起動
/usr/local/postfix/sbin/postfix start

2006年01月21日

●認証システムは清く正しく美しく

新しいさらに詳細なエントリーを投稿しました。
以下の内容は古いものになります。

以前までメールサーバーの送信時の認証システムをpostfix&DracdでPOP befor smtpで運用していた。
メカニズムとしてはPOPでメールの受信に成功したリモートホストのIPアドレスをsyslogから読んで、データベースに登録し、そのデータベースにあるホストからのメールの送信を許可するというもの。
これはなんというか、いかにも後付け感というか、増設感があって無理やりっぽくてなんかもひとつカッコよくないし美しくない。
ほかの認証システムにはSMTP-AUTHという技術があり、これは送信時にSMTPサーバーで認証するというもので非常にスマートな方法だが、以前から何度も挑戦するもコンパイルに失敗していて諦めていた。
で、とうとうこれに成功したので、(しかもSUNのccで)インストールの方法を書いてみる。
環境はultra5 + solaris10(デベロッパー)+ SunStudio11 で postfix-2.2.8+cyrus-sasl-2.1.21をビルド

必要条件:openssl(solaris10でデフォルトでインストールされているopensslではライブラリが足りないので、ソースからコンパイルのこと)

postfixでのSMTP-AUTHに必要なもの
postfix(もちろん) cyrus-sasl-2

コンパイルの方針

コンパイラはSunのccで
cyrus-sasl2 は/usr/local/sasl2 以下に、postfixは/usr/local/postfix以下に。

前準備
postfixの動作するユーザー postfix グループpostfix postdropを作っておく


まずsaslのインストール


$export CC=/opt/SUNWspro/bin/cc
$export CFLAGS='-I/include -I/usr/sfw/include -I/usr/include -I/opt/sfw/include -I/opt/SUNWspro/include -I/usr/local/include'
$export LDFLAGS='-L/usr/lib -L/lib -L/usr/sfw/lib -L/opt/sfw/lib -L/usr/local/lib'
$export F77=/opt/SUNWspro/bin/f77
$export CXX=/opt/SUNWspro/bin/CC

解凍したソースツリー上で
$ ./configure --with-saslauthd=/var/cyrus --with-pwcheck=/var/cyrus --enable-login --disable-otp --disable-krb4 --disable-gssapi --disable-anon --with-dblib=none --enable-static --disable-digest --disable-srp --prefix=/usr/local/sasl2 --with-openssl=/usr/local/ssl --prefix=/usr/local/sasl2

$dmake

make時に
/opt/SUNWspro/bin/cc -DHAVE_CONFIG_H -DSASLAUTHD_CONF_FILE_DEFAULT=\"/usr/local/sasl2/etc/saslauthd.conf\" -I. -I. -I.. -I. -I. -I. -I./include -I./include -I./../include -I/include -I/usr/sfw/include -I/usr/include -I/opt/sfw/include -I/opt/SUNWspro/include -I/usr/local/include -c `test -f 'auth_getpwent.c' || echo './'`auth_getpwent.c
"/usr/include/crypt.h", line 36: syntax error before or at: (
"/usr/include/crypt.h", line 36: syntax error before or at: const
"/usr/include/crypt.h", line 36: syntax error before or at: )
"/usr/include/crypt.h", line 36: warning: syntax error: empty declaration
cc: acomp failed for auth_getpwent.c
gmake[3]: *** [auth_getpwent.o] Error 2
gmake[3]: Leaving directory `/home/bbr/src/cyrus-sasl-2.1.21/saslauthd'
gmake[2]: *** [all] Error 2
gmake[2]: Leaving directory `/home/bbr/src/cyrus-sasl-2.1.21/saslauthd'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/home/bbr/src/cyrus-sasl-2.1.21'
gmake: *** [all] Error 2

というエラーが出たが、/usr/include/crypt.hなどというファイルはないので、ソースツリー以下のsaslauthd/auth_getpwent.cのcrypt.hをインクルードしている行をコメントアウトしたらコンパイルが通った。無理やりっぽいけどちゃんと動くので問題なし。
具体的には #include <crypt.h> を /* #include <crypt.h> */ に書き換える。

# dmake instal
#ln -s /usr/local/sasl2/lib/* /usr/lib/

#vi /usr/local/sasl2/lib/sasl2/smtpd.conf

pwcheck_method: saslauthd
allowanonymouslogin: no
allowplaintext: yes

#mkdir /var/cyrus
#chmod 700 /var/cyrus
# chown postfix /var/cyrus



postfixのインストール


$export CC=/opt/SUNWspro/bin/cc
$export CFLAGS='-I/include -I/usr/sfw/include -I/usr/include -I/opt/sfw/include -I/opt/SUNWspro/include -I/usr/local/include'
$export LDFLAGS='-L/usr/lib -L/lib -L/usr/sfw/lib -L/opt/sfw/lib -L/usr/local/lib'
$export F77=/opt/SUNWspro/bin/f77
$export CXX=/opt/SUNWspro/bin/CC

解凍したソースツリー上で
$ gmake makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lsasl2 -lm -lz"
(LD_LIBRARY_PATHを設定していると起こられるのではずしておく)

$ dmake
# gmake install
#vi /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, che
ck_relay_domains, reject
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

を追加。(その他の設定は各自で調べてください)
/usr/loca/postfix/sbin/postfix start

動作確認:
telnet ホスト 25
として、

220 メールサーバー名 ESMTP Postfix
ehlo test ←ここは入力する
250-メールサーバー名
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN CRAM-MD5
250-AUTH=LOGIN PLAIN CRAM-MD5
250 8BITMIME

などと帰ってきたらPLAIN CRAM-MD5でのAUTHを許可しているということなので成功。

no SASL authentication mechanisms などとsyslogにあがる時はsaslのライブラリが読めていない可能性大。

2006年01月17日

●zopeは何が良いのか良くワカラン

気づいたらいつの間にかこんな時間。(現在0:40過ぎ)
ご飯食べてオヤジのノーパソセットアップして、pythonとzopeのコンパイルしてたらいつの間にか時間が過ぎていた。

ZopeのREADMEにはGNUmakeが必要と書いてあって二の足を踏んだけど、ここは当然SUNのdmakeでmakeしてみた。もちろん CC=gccでなく CC=/opt/SUNWspro/bin/cc で。
make時に警告吐きまくって危ぶまれたものの、結局最後まで通った。ちゃんとバイナリできたし、ちゃんと動作しているようだ。
で、その際にプチはまりかけたところを書いてみる。

Solaris10+Sparc+Sun Studio 11でZope-2.9.0をconfigureする際に、
./configure --prefix=/usr/local/zope --with-python=/usr/local/bin/python ってやると

./configure: test: unknown operator /usr/local/zope

というエラーで止まり、Makefile が生成されない。
見た感じライブラリとかヘッダがないとかいうありがちなエラーではなく、引数が引数ではなくコマンドとしてconfigureスクリプト内で解釈されているとか、"と'の扱いの違いとかで分割されて二つになる引数がひとつとして渡されてるとか、なんかしょーもなさそうなエラーの予感。
で、結局原因はconfigureスクリプトの不備にあったようで、configure スクリプトの一行目、インタプリタを指定する部分が、デフォルトでは #!/bin/sh になってるけど、これを#!/bin/bash に書き換えてやるとちゃんと動作した。(一応スクリプト内のsedもgsedに書き換えておいた)
/bin/shがbashのシンボリックリンクになってるLinuxではちゃんと動作するのやろうけど、非GNUツールが満載してあるsolarisではちゃんと動かん。
ちゃんとshネイティブのスクリプト書かんかい。と。
結局苦労してzope入れてみたものの、特に使い方がわからんのですぐ消した。

結局仕事帰って来てもやってることぜんぜん変わらんやん…
見る人が見ると虚しい人生に見えるのやろけど、まぁ本人(俺)は(それなりに)楽しくやってるからええとするか。