2009年12月25日金曜日

postfixでVirtualアカウントの管理をMySQLで

どうも、俺@仕事中です。
今日はPostfix(2.5.5)のvirtual_mailbox_mapsについてです。
しかもそれをMySQLで管理しちゃおう!という話です。

そもそもvirtual_mailbox_mapsというのは、簡単に説明するとその名の通り
そのサーバのアカウントにないアカウント(仮想アカウント)のメールをメールボックスに保存するというものです。
今回はMySQLを利用しますので、postfix-2.5.5ソースをDLして、まず
# tar zxvf postfix-2.5.5.tar.gz
# cd postfix-2.5.5
# make makefiles AUXLIBS='-L/usr/local/lib -L/usr/local/mysql/lib/mysql -lssl -lcrypto -lmysqlclient -lz -lm' CCARGS='-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_TLS -I/usr/local/include -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"'
(パスは環境に合わせてね)のコマンドを打ちます。
ここでlibmysqlclient.soが見つからないぜ!的なエラーが出る場合は、
-L/usr/local/mysql/lib/mysqlのパスが正しいかどうか確認し、それも合っている場合は、
# vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib/mysql
を追加(パスは適宜合わせてね)。で、
# ldconfig -v
# make upgrade
でもう一度 make makefiles を打ちます。次に、
# make && make install(全てEnter)
でインストール完了です。
次に、main.cfの編集です。
# vim /etc/postfix/main.cf
fallback_transport = virtual # ローカルに存在しないアカウント宛の処理
virtual_mailbox_base = /usr/local/virtual # 適宜あわせてね
virtual_mailbox_maps = /etc/postfix/virtual_mailbox_mysql
virtual_uid_maps = static:10000
virtual_gid_maps = static:1000
を追加します。

続いてグループ、ユーザの作成。
# groupadd -g 10000 vgroup
# useradd -u 10000 -g vgroup -d /usr/local/virtual -s /sbin/nologin vuser


次は、virtual_mailbox_mysqlの設定。
# vim /etc/postfix/virtual_mailbox_mysql
hosts = localhost
dbname = mailsystem
user = mysql_user
query = SELECT concat(name,'/') FROM mail_account WHERE active=1 AND domain='%d' AND name='%u'

で、これをhash化します。
# postmap /etc/postfix/virtual_maibox_mysql


続いてMySQLの構築。今回はMySQLは自サーバで稼動しているものとします。
# mysql -h localhost
mysql> create database mailsystem;
mysql> create table mail_account (
id int not null auto_increment,
name varchar(128) not null default '', # virtual_accountの名前
password varchar(128) not null default '', # virtual_accountのPass
domain varchar(128) not null default '', # サーバドメイン
active tinyint(1) not null default 0, # 利用する/しないのフラグ
primary key (id)
);

INSERT INTO mail_account (name, password,domain,active) values ('username','password','mydomain.jp',1);
テーブル操作権限等は適宜指定してください。

では、postfix起動します。
# /usr/sbin/postfix start

これで、MySQLに入れたアカウント宛のメールであれば、/usr/local/virtual以下へ配送されます。

ちなみに、配送の確認をするには
# postmap -a "username@mydomain.jp" mysql:/etc/postfix/virtual_mailbox_mysql

とやって、対象の結果(今回で言うと username/)が返って来ればOKです。
何も表示されない場合は、何か間違えてます。

めでたし、めでたし!お(・∀・)め(・∀・)で(・∀・)と(・∀・)う!

2009年12月16日水曜日

PostgreSQL8.xで外部サーバから接続 めも

お久し、俺@仕事中です。

postgreSQL8.4.1を使ってて少しハマったのでメモφ(`д´)メモメモ...

タイトルの通り、外部サーバ<192.168.0.11>から自サーバ<192.168.0.10>(ローカル接続)のpostgreSQLへ接続しようとしてできませんでした。
 $ telnet 192.168.0.10 5432
Trying 192.168.0.10...
telnet: connect to address 192.168.0.10: Connection refused
これはpostgreSQLのバージョン8以降からpostgresql.confに設定漏れがあったことが原因でした。

# vim $PGDATA/postgresql.conf
------------------------------------------
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost', '*' = all
これは、どのネットワークインターフェースアドレスで接続を許可するか、を設定する項目だそうです。
デフォルトでは「localhost」になっているので、自サーバからの接続のみ許可となっているので
listen_addresses = 'localhost,192.168.0.10'
とするとローカル接続の外部サーバから接続できます。
全て許可する場合は
listen_addresses = '*'
とします。

インターフェースのアドレスを確認するのは、おなじみの
# /sbin/ifconfig
でできますね。


以上でえええす。

2009年12月2日水曜日

iptablesの設定メモ

こんばんわ、俺@家で音楽鑑賞中です。

今年も残り1ヶ月切ってしまいましたね。
今年の元旦に神社で心に誓った目標の何割が達成できたでしょうか?
ちなみに僕は10の目標のうち4しか達成できませんでしたよ。・゚・(ノε`)・゚・。ウワーン


で、今日はiptablesの簡単な設定方法をメモします。
解説サイトは山のようにあるのですが、結構みなさん複雑な事書かれているので
チョチョイっと設定する人向けのメモです。

まずは設定の確認。
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- localhost.localdomain anywhere
ACCEPT all -- 192.168.0.0/24 anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:omirr
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- localhost.localdomain anywhere
ACCEPT all -- 192.168.0.0/24 anywhere
ACCEPT all -- xxx.xxx.xxx.xx/28 anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:tproxy
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
一部のIPは伏せてあります。
僕のテストサーバ、思ったより色々設定されてありましたw誰だこんなんしたやつw

まぁ、大きく分けて3つあります。
「Chain INPUT」・・・入ってくるパケットに関するもの。
「Chain FORWARD」・・・転送されていくパケットに関するもの。
「Chain OUTPUT」・・・出力されるパケットに関するもの。

設定する順番は
1)ポリシーを設定
2)ルールを一旦削除(クリア)
3)ルールを設定
4)設定を保存
5)iptables再起動
です。

ではまず1)ポリシーを設定。
簡単なiptablesという事なのでINPUTは許可(ACCEPT)、FORWARDは破棄(DROP)、OUTPUTは許可(ACCEPT)と言う事にします。
FORWARDは滅多な事じゃないと使わない(ルータにするとか)ですし、OUTPUTはサーバからの出力なので上記の方法で良いと思います。
// 書式は iptables -P [チェイン] [ターゲット]
// チェインのポリシーを指定のターゲットに設定するという意。
# iptables -P INPUT ACCEPT
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
これでOK。

次に2)ルールを一旦削除します。現在の設定を変更せずに追加とかした人はココやらなくても良いです。
# iptables -F
OK。
これで一旦設定を見てみると、
# iptables -L
Chain INPUT (Policy ACCEPT)
target  prot opt source     destination

Chain FORWARD (Policy DROP)
target  prot opt source     destination

Chain OUTPUT (Policy ACCEPT)
target  prot opt source     destination
になるはずです。

次に3)ルールを設定。
// 書式は iptables -A [チェイン] -p [プロトコル] -s [送信元] -j [ターゲット] --dport [ポート範囲の指定]
// 他にオプションはたくさんあるけど、これくらい使えばとりあえずOK。
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
と書けば、80番ポートに対するtcpプロトコルは通すよ!という意味です。ちなみに、
# iptables -I INPUT 3 -p tcp --dport 80 -j ACCEPT
だと、INPUTチェインの上から3番目に、80番ポートに対するtcpプロトコルは通すルールを挿入!という意味です。
さらには、
# iptables -A INPUT -p tcp -s 192.168.0.0/28 --dport 80 -j ACCEPT
と書けば、INPUTチェインの80番ポートに対するtcpプロトコルの192.168.0.0/28からのパケットは通すぜ!という意味になります。
まぁ、こんな感じでどんどんと
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT // ssh接続はACCEPT
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT // POPはACCEPT
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT // SMTPはACCEPT
# iptables -A INPUT -p icmp -j ACCEPT // PINGはACCEPT
# iptables -A INPUT -i lo -j ACCEPT // 自サーバからはACCEPT(-iはインターフェースの指定)
# iptables -P INPUT DROP // 他の接続は全てDROP
とこんな感じです。

次は4)設定を保存します。
# service iptables save
これはサーバ再起動されたら設定がリセットされてしまうので、保存しておくのです。

次に5)iptables再起動します。(念のために)
# service iptables restart
OK!こんなもんです(´゚艸゚)∴


ちなみにルールを設定する時に
# iptables -A 
と「-A」を多用しましたが、他にも
# iptables -I [チェイン] 番号
で挿入。
# iptables -R [チェイン] 番号
で書き換え(置換)
# iptables -D [チェイン] 番号
で削除ができますので、あしからず。

以上、おやすみー。