2013年8月25日日曜日

dovecot dbox形式 ”Alternate Storage”について

前回の続きです。
Dovecotのdbox形式のメールBOXフォーマットには、Alternate Storage機能があります。


具体的には、通常のメールBOXを配置しているディスク(またはパーティションやディレクトリ)とは別に、もう一つ代替となるディスク(またはパーティションやディレクトリ)を用意しておけば、その領域もメールBOXとして利用できるようになる機能です。
この機能を使えば、メールBOXのディスクが圧迫してきたので、古いメールを後から追加したディスクに退避させようといった事も可能になります。

この機能は、mail_locationに以下のように(青字の部分を追加で)指定するだけで利用できます。
※評価は、CentOS6.4(x86_64) + dovecot2.2.5 + システムアカウントで、/dev/sdb1を/archiveとしてマウントした状態で行っています

mail_location = sdbox:~/dbox:ALT=/archive/%n


以下、実際の操作例です。
 → 既読メールの移動を実施してみます

サンプルとしてuser01ユーザのメールBOXにメールが10通あり、全て既読の状態です。
# find /home/user01/dbox/
/home/user01/dbox/
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.10
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.7
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.2
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.6
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.8
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.4
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.5
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.1
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.3
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.9
/home/user01/dbox/dovecot-uidvalidity.52127e52
/home/user01/dbox/dbox-alt-root
#

この状態から既読メールをAlternate Storageに移動させるには以下のように実行します。
# doveadm altmove -u user01 seen

結果、user01ユーザのメールBOXは以下のような状態になります。
 →既読メールの10通は/archive/user01ディレクトリ以下に移動しています
# find /home/user01/dbox/ /archive/user01
/home/user01/dbox/
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/dovecot-uidvalidity.52127e52
/home/user01/dbox/dbox-alt-root
/archive/user01
/archive/user01/mailboxes
/archive/user01/mailboxes/INBOX
/archive/user01/mailboxes/INBOX/dbox-Mails
/archive/user01/mailboxes/INBOX/dbox-Mails/u.8
/archive/user01/mailboxes/INBOX/dbox-Mails/u.1
/archive/user01/mailboxes/INBOX/dbox-Mails/u.9
/archive/user01/mailboxes/INBOX/dbox-Mails/u.6
/archive/user01/mailboxes/INBOX/dbox-Mails/u.4
/archive/user01/mailboxes/INBOX/dbox-Mails/u.10
/archive/user01/mailboxes/INBOX/dbox-Mails/u.3
/archive/user01/mailboxes/INBOX/dbox-Mails/u.2
/archive/user01/mailboxes/INBOX/dbox-Mails/u.7
/archive/user01/mailboxes/INBOX/dbox-Mails/u.5

#

※この機能は、dbox-alt-rootファイルが、シンボリックリンクになることで実現しています。
# ls -l /home/user01/dbox/dbox-alt-root
lrwxrwxrwx 1 user01 user01 15 Aug 25 23:02 /home/user01/dbox/dbox-alt-root -> /archive/user01/
#

なお、移動したAtteanate Storageのメールを元に戻すには以下のように実行します。
# doveadm altmove -r -u user01 all


以上、今回は手動で既読メールを移動させる操作例をあげましたが、バッチ処理でより複雑な条件での操作も可能なので、詳しくは下記を参照してください。

http://wiki2.dovecot.org/Tools/Doveadm/Altmove
http://wiki2.dovecot.org/Tools/Doveadm/SearchQuery

2013年8月20日火曜日

dovecot dbox形式

Dovecotには、独自のメールBOXフォーマットが存在します。
※Maildir形式のように1通のメッセージを1つのファイルとして保存するsdbox形式、mbox形式のように複数のメッセージを1つのファイルとして保存するmdbox形式(ただし、ある程度のサイズで複数のファイルに分割されます)の2種類です。


設定は特に難しいところはなく、sdbox形式の場合を例にするとmail_locationに以下のよう指定するだけで利用できます。
※評価はCentOS6.4(x86_64) + dovecot2.2.4 + システムアカウントで行っています

mail_location = sdbox:~/dbox


実際にメールを格納するとMaildir形式とは異なりメールそのものは、u.1やu.2のような名前で保存され、メールが未読でも既読でもSeenフラグなどが付くことがありません。

# find ~user01/dbox/
/home/user01/dbox/
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.3
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.1
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.2
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/dovecot-uidvalidity.51ac2f97
#

1通のメールは以下のようになります。
Maildir形式と比較するとメッセージの前後に追加の情報が付くようです。

# cat /home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.5
2 M1e C51ac33f6
N          0000000000000277

Return-Path: <user101@mail.example.com>
X-Original-To: user01@mail3.example.com
Delivered-To: user01@mail3.example.com
Received: from mail.example.com (R-538.mshome.net [192.168.137.1])
        by mail3.example.com (Postfix) with SMTP id 8AD6E3FF6B
        for <user01@mail3.example.com>; Mon,  3 Jun 2013 15:13:08 +0900 (JST)
From: user101 <user101@mail.example.com>
To: user01@mail3.example.com
Subject: test
Date: Mon, 03 Jun 2013 15:13:08 +0900
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <E1CE60216AB962user101@mail.example.com>
test

R51ac33f6
V288
G87ca8705f633ac51190a000048c9b678

#


今回の最終的なdovecotの設定は以下になります。
# doveconf -n
# 2.2.4: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.14.1.el6.x86_64 x86_64 CentOS release 6.4 (Final)
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = sdbox:~/dbox
passdb {
  driver = pam
}
protocols = pop3
ssl = no
userdb {
  driver = passwd
}
#


またMTAにpostfixを利用する場合は、そのままだとメールBOXに配送ができないので、DovecotのLDAかLMTPなどを利用して配送を実施する必要があります。
※LDAとLMTPについては、今後書きたいと思います

一例を挙げておきます。
システムアカウントを利用してDovecotのLDAで配送をするなら、以下のように設定します。

mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"


2013年8月5日月曜日

dovecot passwd-fileについて

今回は、Dovecotの認証データベースの1つであるpasswd-fileについてです。


特徴は、以下のようになります。

  • /etc/passwdと(ほぼ)同じ書式で記述ができる(⇒ extra_fieldが追加できる
  • 認証で必要な箇所だけ記述すれば利用できる(下記の設定例を参照ください)
  • システムアカウントにもバーチャルアカウントにも利用できる


以下、設定例です。
※評価はCentOS6.4(x86_64) + dovecot 2.2.4で行っています。


システムアカウントで利用する場合

※SSHのパスワードなどと、メールのパスワードを別にしたい場合に有用です

1./etc/dovecot/usersを以下のように作成します。
user01:{PLAIN}password
user02:{PLAIN}password

2.passwd-fileを利用する為の設定

/etc/dovecot/conf.d/10-auth.conf:
※以下の行を有効にします
!include auth-system.conf.ext
!include auth-passwdfile.conf.ext

/etc/dovecot/conf.d/auth-system.conf.ext:
※以下の行だけ有効にします
userdb {
  driver = passwd
}

/etc/dovecot/conf.d/auth-passwdfile.conf.ext:
※以下の行だけ有効にします
passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

最終的な全体設定は以下のようになります。
# doveconf -n
# 2.2.4: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.14.1.el6.x86_64 x86_64 CentOS release 6.4 (Final)
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = maildir:~/Maildir
passdb {
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
  driver = passwd-file
}
protocols = pop3
ssl = no
userdb {
  driver = passwd
}


バーチャルアカウントでの利用する場合

下記ではメールBOXなどの情報をstaticに持たせています


1./etc/dovecot/usersを以下のように作成します。
user01@example.com:{PLAIN}password
user02@example.jp:{PLAIN}password

2. passwd-fileを利用する為の設定

/etc/dovecot/conf.d/10-auth.conf:
※以下の行を有効にします
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext

/etc/dovecot/conf.d/auth-passwdfile.conf.ext:
※以下の行だけ有効にします
passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

/etc/dovecot/conf.d/auth-static.conf.ext:
※以下の行だけ有効にします
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%d/%u
}
※vmailユーザはあらかじめ以下のように作成しておく必要があります
# groupadd -g 5000 vmail
# useradd -g 5000 -u 5000 -s /sbin/nologin vmail

最終的な全体設定は以下のようになります。
# doveconf -n
# 2.2.4: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.14.1.el6.x86_64 x86_64 CentOS release 6.4 (Final)
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = maildir:~/Maildir
passdb {
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
  driver = passwd-file
}
protocols = pop3
ssl = no
userdb {
  args = uid=vmail gid=vmail home=/home/vmail/%d/%u
  driver = static
}


以上で、/etc/dovecot/usersに記述した2ユーザーでアクセスするとメールBOXは
以下のようになります。

# pwd
/home/vmail
# ls -l
total 8
drwx------ 3 vmail vmail 4096 Aug  5 00:06 example.com/
drwx------ 3 vmail vmail 4096 Aug  5 00:05 example.jp/
# find .
.
./example.jp
./example.jp/user02@example.jp
./example.jp/user02@example.jp/Maildir
./example.jp/user02@example.jp/Maildir/dovecot-uidvalidity.51fe6dce
./example.jp/user02@example.jp/Maildir/maildirfolder
./example.jp/user02@example.jp/Maildir/dovecot.index.log
./example.jp/user02@example.jp/Maildir/dovecot-uidlist
./example.jp/user02@example.jp/Maildir/dovecot-uidvalidity
./example.jp/user02@example.jp/Maildir/tmp
./example.jp/user02@example.jp/Maildir/cur
./example.jp/user02@example.jp/Maildir/new
./.bash_logout
./example.com
./example.com/user01@example.com
./example.com/user01@example.com/Maildir
./example.com/user01@example.com/Maildir/maildirfolder
./example.com/user01@example.com/Maildir/dovecot.index.log
./example.com/user01@example.com/Maildir/dovecot-uidlist
./example.com/user01@example.com/Maildir/dovecot-uidvalidity
./example.com/user01@example.com/Maildir/tmp
./example.com/user01@example.com/Maildir/cur
./example.com/user01@example.com/Maildir/new
./example.com/user01@example.com/Maildir/dovecot-uidvalidity.51fe6de3
./.bash_profile
./.bashrc
#


2013年7月14日日曜日

Dovecot Enterprise Editionについて

2018/01/08追記:いつのまにかリポジトリにアクセスできなくなったので、問い合わせをしました。
         以下のような返信をもらいました。
         要するに一般ユーザーには、同エディションは提供されないようです。
We have done some maintenance for expired accountsbecause we no longer have webshop and we don't provide dovecot-eerepository access without valid support contract with us.

Next year we disable all accounts without active support contract withus but start providing Dovecot Communition Edition packages for free. Wesend information about this change later.


2016/01/14追記: Dovecot Enterpriseについて(2016年1月現在)という記事を追加しました。

2014/07/01追記: ライセンス更新のお知らせがこないのでサイトを覗きにいったら、今現在は$0で提供されているようです。



今回は商用版dovecotについてです。


結論から先に書いてしまうと、(あたりまえですが)サポートを必要としない限り
購入するメリットは一切ありません。

なのに何で購入したかというと、商用版にはAmazon S3やDropboxをメールボックスのストレージとして
利用するための”Dovecot Object Storage Plugin”なるものがありドキュメントだけでも
読んでみたいと思ったからです。
#実際には、1ヵ月のデモライセンスと簡素なドキュメントがおまけでついてきました


商用版dovecotの導入

以下のサイトからまずは、商用版dovecotのリポジトリへのアクセスキーを購入します。

http://shop.dovecot.fi/

するとユーザ名とパスワードがメールで送られてくるので、/etc/yum.repos.d/dovecot.repoとして保存します。
[dovecot]
name=RHEL $releasever - $basearch - Dovecot Solutions
baseurl=https://username:password@yum.dovecot.fi/default/stable-2.2/el$releasever-$basearch
gpgkey=https://yum.dovecot.fi/RPM-GPG-KEY.dovecot
gpgcheck=1

次に、以下のどちらかを選択して導入します。

・ 新規にdovecotを導入する場合
   
 # yum install dovecot-ee

・ dovecotが既に導入されていて、アップデートする場合

 # yum update 


後はいつもどおりにdovecotを設定すれば普通に使えます。


Object Storage Pluginについて

試しにDropboxにメールを保存してみましたので、手順を書いておきます。
ただし、ドキュメントがあまりにも貧弱で、自分もひとまず動作が確認できただけという
状態です。なので、この内容を試す場合はあくまでも自己責任でお願いします。


a) Object Storage Pluginに必要なパッケージの導入

# yum install dovecot-ee-obox dovecot-ee-license

b) デモライセンスの登録

ライセンスがメールで送られてくるので、/var/lib/dovecot/dovecot-license.txtと
して保存します。

c) dropboxのマイアプリへdovecotを登録

https://dropbox.dovecot.fi/

上記URLにアクセスし、dovecotがdropboxにアクセスできるように許可をします。
登録が完了すると設定ファイルとして追加すべき内容が表示されます。



d) /etc/dovecot/conf.d/11-object-storage.confの作成

 c)の手順で表示された内容をもとに作成します。

mail_prefetch_count = 10
mailbox_list_index = yes
mail_uid = vmail
mail_location = obox:%d/%u:INDEX=~/:CONTROL=~/
mail_plugins = $mail_plugins obox
metacache_upload_interval = 5 mins
metacache_close_delay = 0 min
ssl_client_ca_file = /etc/pki/tls/cert.pem
plugin {
  obox_fs = fscache 100G:/var/lib/dovecot/cache:dropbox:https://XXXXXX:XXXXXXX@dropbox/
}

pluginの設定としては以上で、後は、メールの配送用にLMTPなりをセットアップすれば完了です。
Dropboxには以下のように保存されます。









使ってみた感想としては。。

・LTMPでメールを配送するのも、POPやIMAPでメールを取得するにも非常に時間がかかるのが気になります。
 → 単に設定が悪いだけかもしれませんが、S3QLと比較すると非常に遅いです

・突然サーバが死んでもメール自体はなくならないので安心です。




2013年6月23日日曜日

yum インストールねた

yumのインストールで、自分が多用するものを2つピックアップしてみます。


パスでインストールするものを指定する


インストールしたいコマンド名、またはライブラリ名そのものは分かってはいるが、パッケージ名が分からないような場合に利用します。
以下は、partprobeコマンドをインストールする例です。
(partprobeコマンドはCentOS5では、partedパッケージに含まれます)

# yum install /sbin/partprobe
Loaded plugins: fastestmirror, protectbase
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package parted.i386 0:1.8.1-30.el5 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
===============================================================
 Package       Arch     Version           Repository     Size
===============================================================
Installing:
 parted       i386     1.8.1-30.el5       base           542 k
Transaction Summary
===============================================================
Install       1 Package(s)
Upgrade       0 Package(s)
Total download size: 542 k
Is this ok [y/N]:



ダウンロードしてきたRPMを依存関係を解消しつつインストールする


標準のリポジトリ以外のRPMパッケージなどをダウンロードし、rpmコマンドでインストールしようとしたら依存関係が原因でインストールに失敗するような場合に利用します。

以下は、AWS関連のRPMをダウンロードしてインストールする例です。
依存関係でrubyとruby-libsがインストールされます。


# yum localinstall ec2-ami-tools.noarch.rpm
Loaded plugins: fastestmirror, presto
Setting up Local Package Process
Examining ec2-ami-tools.noarch.rpm: ec2-ami-tools-1.4-0.9.noarch
Marking ec2-ami-tools.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package ec2-ami-tools.noarch 0:1.4-0.9 will be installed
--> Processing Dependency: ruby for package: ec2-ami-tools-1.4-0.9.noarch
--> Running transaction check
---> Package ruby.x86_64 0:1.8.7.352-10.el6_4 will be installed
--> Processing Dependency: ruby-libs = 1.8.7.352-10.el6_4 for package: ruby-1.8.7.352-10.el6_4.x86_64
--> Processing Dependency: libruby.so.1.8()(64bit) for package: ruby-1.8.7.352-10.el6_4.x86_64
--> Running transaction check
---> Package ruby-libs.x86_64 0:1.8.7.352-10.el6_4 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================
 Package                Arch          Version             Repository        Size
=========================================================================
Installing:
 ec2-ami-tools        noarch        1.4-0.9             /ec2-ami-tools.noarch   680 k
Installing for dependencies:
 ruby                    x86_64      1.8.7.352-10.el6_4   updates             533 k
 ruby-libs               x86_64      1.8.7.352-10.el6_4   updates             1.6 M
Transaction Summary
==========================================================================
Install       3 Package(s)
Total size: 2.8 M
Total download size: 2.2 M
Installed size: 8.1 M
Is this ok [y/N]:



2013年6月11日火曜日

CentOS6.4で最新DovecotをRPMで導入する

2018/01/08追記: 元記事のサイトは全く更新されておらず、最新のdovecotを導入する事はできないので、「Dovecot community repositoriesが公開されました」を参照してください


2016/05/04追記: 「CentOS6.x 最新のpostfixとdovecotをRPMで導入する」も参照ください


最近知ったのですが、http://repos.fedorapeople.org/なるサイトがあって、
ここにdovecotやpostfixの最新版のRPMが転がってます。

RPMそのものを落として利用しても良いでしょうし、リポジトリ用ファイルも
用意されているので、そちらを利用しても良いでしょう。

例えば、CentOS6.4の環境で、リポジトリ用ファイルを用意してインストールするには以下のようにします。
 ※既にdovocotがインストールされている環境では、yum updateするだけで最新になります
 ※別途、依存関係でepelリポジトリも必要になるので先にセットアップしておいてください
    # rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm


# cd /etc/yum.repos.d/
# wget http://repos.fedorapeople.org/repos/mstevens/dovecot/epel-dovecot.repo
# yum install dovecot

2013年6月9日日曜日

rsyslog $AllowedSenderについて

今回は、”$AllowedSender"ディレクティブについてです。

このディレクティブは、ログサーバとしてrsyslogを稼動させた場合に、シスログを受け取るべき
ホストやネットワークを制限する為に使います。
※なんでもかんでも送られてきたシスログを受け取ってはまずいので


まずは正しい記述からです。
TCPとUDPの両方に制限が必要な場合、以下のようにそれぞれを分けて記述する必要があります。

$ModLoad imudp
$UDPServerRun 514
$AllowedSender UDP, 127.0.0.1, *.example.jp, 192.168.0.0/24

$ModLoad imtcp
$InputTCPServerRun 514
$AllowedSender TCP, 127.0.0.1, *.example.jp, 192.168.0.0/24



次に、結構良く見かける間違った記述についてです。

※TCPとUDPを一行で設定できると考えたのだと思うのですが、以下のように
  記述してるケースです。
$AllowedSender TCP, UDP,127.0.0.1, *.example.jp, 192.168.0.0/24

この場合の”UDP”部分はホスト名として扱われてしまい、ログにもその旨が表示されます。

rsyslogd: DNS error: Can't resolve "UDP"
ryslogd: Hostname "UDP" WON'T be added to ACL.

で、厄介なことに$AllowedSenderのデフォルトは、"all allowed"なので、この場合は
UDPに全く制限がかかっていない事にご注意ください。。





2013年5月19日日曜日

Postfix Tips: all@なメールアドレスの利用を社内だけに限定して利用したい

全社員を含むエイリアスとして、all@example.comのようなメールアドレスを利用するケースもあると思います。

ただ、このメールアドレスに外部からスパムやウィルス付きメールが届くと、全社員にそれらが届くことになるので、利用できる(メールを送れる)範囲を社内だけに限定します。

以下、設定例です。


/etc/postfix/main.cf:
mtpd_recipient_restrictions = permit_sasl_authenticated,
                               permit_mynetworks,
                               reject_unauth_destination,
                               ・・・
                               check_recipient_access hash:/etc/postfix/all_access
    ・・・

/etc/postfix/all_access:
all@example.com     permit_sasl_authenticated,permit_mynetworks,reject

編集が完了したら、変更を適用します。
# postmap /etc/postfix/all_access
# postfix reload


このように設定することにより、

  • SMTP認証に成功したユーザからの接続
  • 社内のIPアドレスが登録されているであろうmynetworksからの接続

以外からは、all@example.comへはメールが送れなくなります。




2013年4月21日日曜日

Postfwdでmynetworksからの接続情報をログに出力

postfwdを使ってもう※ひとねた※書いてみます。

postfixの場合、mynetwoksからの接続は、基本的にpermit_mynetwoksで無条件にリレーを許可されます。
mynetwoksに記述されているネットワークあるいはIPアドレスが少ないなら、mynetwoksからの接続である事を判断出来ますが、その数が非常に多くなった時はログを見てもmynetworksからの接続だとすぐに判断がつかないケースが出てきます(扱うドメインが多ければさらに判断が難しくなります)。

前置きが長くなりなしたが、今回は通常ログに出力されないそれらの情報を一手間かけてログに出してみます。



postfwdのルールセット


itemのclient_addressに、postfixのmynetworksパラメータで指定している値を指定します。
※ネットワークアドレス、IPアドレスはご自身の環境で読みかえてください

ログに出力するだけなので、actionには全てdunnoを指定しています。



 例1:カンマ区切りで複数指定する場合
id=MYNETWORKS
  action=dunno permit_mynetworks was matched
  protocol_state==RCPT
  client_address=192.168.0.0/24, 192.168.1.0/.24, 10.0.x.x


例2: リストを含むテキストを指定する場合
id=MYNETWORKS
  action=dunno permit_mynetworks was matched
  protocol_state==RCPT
  client_address==file:/etc/postfix/mynetworks.txt
  client_address==file:/etc/postfix/mynetworks2.txt
  …
/etc/postfix/mynetworks.txt:
192.168.0.0/24
192.168.1.0/24
10.0.x.x

 例3: key=value形式のリストを含むテキストを指定する場合
      ※postfixで既に利用しているマップテーブルを再利用するような場合に便利です
id=MYNETWORKS
  action=dunno permit_mynetworks was matched
  protocol_state==RCPT
  client_address==table:/etc/postfix/mynetworks.txt
  client_address==table:/etc/postfix/mynetworks2.txt
  …
/etc/postfix/mynetworks.txt:
192.168.0.0/24    OK
192.168.1.0/24    OK
10.0.x.x           OK


postfix側での設定

smtpd_client_restrictionsでposfwdでの評価を行うように設定します。

smtpd_client_restrictions = check_policy_service inet:127.0.0.1:10045
smtpd_recipient_restrictions = permit_mynetworks
                               reject_unauth_destination
                          …

(注意)以下のように指定した場合、permit_mynetwoksでpostfixでの評価が完了してしまうので、その下のpostfwdによる評価は行われず、ログが出力されません。

smtpd_recipient_restrictions = permit_mynetworks
                               reject_unauth_destination
                               check_policy_service inet:127.0.0.1:10045




動作確認

これで以下のようにログが出力されるようになります。
※青字の部分が新たに出力されるようになった部分です


Apr 21 16:37:00 cent6 postfix/smtpd[2279]: connect from unknown[192.168.0.11]
Apr 21 16:37:00 cent6 postfwd2/policy[2148]: [RULES] rule=0, id=MYNETWORKS, client=unknown[192.168.0.11], sender=<user01@example.com>, recipient=<testuser@example.net>, helo=<mail.example.com>, proto=SMTP, state=RCPT, delay=0s, hits=MYNETWORKS, action=dunno permit_mynetworks was matched
Apr 21 16:37:00 cent6 postfix/smtpd[2279]: 8A5A321A6E: client=unknown[192.168.0.11]
Apr 21 16:37:01 cent6 postfix/cleanup[2285]: 8A5A321A6E: message-id=<F2CE3E63028A7Buser01@example.com>
Apr 21 16:37:01 cent6 postfix/qmgr[1801]: 8A5A321A6E: from=<user01@example.com>, size=487, nrcpt=1 (queue active)
Apr 21 16:37:01 cent6 postfix/smtpd[2279]: disconnect from unknown[192.168.0.11]
Apr 21 16:37:02 cent6 postfix/smtp[2287]: 8A5A321A6E: to=<testuser@example.net>, relay=mail.example.net[xx.xx.xx.xx]:25, delay=1.5, delays=1.4/0.02/0.04/0.12, dsn=2.0.0, status=sent (250 2.0.0 r3L7b27w006351 Message accepted for delivery)
Apr 21 16:37:02 cent6 postfix/qmgr[1801]: 8A5A321A6E: removed




2013年4月17日水曜日

Postfwd(postfix用ポリシーサーバ) その他メモ


前回までにまとめられなかった事を追記します。


ルールセットの記述の方法について(補足)

前回、ルールセットは下記のように";"(セミコロン)で区切って記述すると書きましたが、
id=SIZE001; protocol_state==END-OF-MESSAGE; action=DUNNO; size<=1000000
id=SIZE100; protocol_state==END-OF-MESSAGE; action=HOLD message too large

これを下記のように記述する事もできます。
id=SIZE001
action=DUNNO
protocol_state==END-OF-MESSAGE
size<=1000000
id=SIZE100
action=HOLD message too large
protocol_state==END-OF-MESSAGE 

好みの問題だとは思いますが、ぱっと見てわかりやすい記述をルールセット毎に採用すれば良いと思います。



postfwd2コマンドのオプションについて


良く利用するオプションをあげてみます。

●マニュアルを表示させる

# postfwd2 -m


※その際にpostfwd2コマンド内部で指定されているpagerを変更しておくと便利だと思います
 (マニュアルが長いので、lessの方が使い勝手が良いと思います)

(変更前)
our($cmd_pager)     = "more";

(変更後)
our($cmd_pager)  = "less";


●postfwd2デーモンの停止

# postfwd2 -k


●設定ファイルの読み直し

# postfwd2 --reload


●統計情報を見る

※ログにも同じ情報が定期的に出力されています

# postfwd2 --dumpstats

[STATS] postfwd2::cache 1.34: 8 queries since 0 days, 00:25:18 hours
[STATS] Requests: 0.0/min last, 0.3/min overall, 6.2/min top
[STATS] Hitrates: 40.0% requests, 0.0% dns, 0.0% rates
[STATS] Contents: request=2

[STATS] postfwd2::policy 1.34: 6 requests since 0 days, 00:25:18 hours
[STATS] Requests: 0.00/min last, 0.24/min overall, 6.15/min top
[STATS] Dnsstats: 0.00/min last, 0.00/min overall, 0.00/min top
[STATS] Hitrates: 50.0% ruleset, 33.3% parent, 16.7% child, 0.0% rates
[STATS] Timeouts: 0.0% (0 of 0 dns queries)
[STATS]   4 matches for id:  SIZE001
[STATS]   2 matches for id:  SIZE100


2013年4月13日土曜日

Postfwd(postfix用ポリシーサーバ) ルールセットの作成

前回の続きで、ルールセットを実際に作成してみます。

オンラインドキュメントのEXAMPLEに設定例がたくさん載っているので、そちらも参考にされてください。

書式

[ <item1>=<value>; <item2>=<value>; ... ] action=<result>

  • item=値と指定し、1つのルールセットに複数の条件を※1行で※指定する場合はセミコロンで区切ります
  • 必ず、actionを一つ含む必要があります
  • itemとactionの記述の順番は特に決まりがありません(どのような順番で指定しても大丈夫です)

itemについて

itemとしてしては、以下のものが指定できます。



actionについて

actionとしては、以下のものが指定できます。





ルールセットの作成例

ここでは、メッセージサイズをトリガーにメールをHOLDする例をあげてみます。

  /etc/postfix/postfwd.conf:
# 1. 10MB以下だったら何もしない
# 2. 10MBを超えたら、HOLDする
id=SIZE001; protocol_state==END-OF-MESSAGE; action=DUNNO; size<=10000000
id=SIZE100; protocol_state==END-OF-MESSAGE; action=HOLD message too large

 設定を反映するには、次のように実行します。
/usr/local/sbin/postfwd2 --reload

 連携するpostfixでは以下のように設定を追加します。

  /etc/postfix/main.cf:
  ※メッセージサイズのルールのなので、smtpd_end_of_data_restrictionsで指定します
smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10045



動作確認

実際にメールを配送して動作を確認します。

<id=SIZE001のルールが適用された場合: holdされずに配送された場合>
青字の箇所が実際の判定部分で、actionとしてDUNNOが適用されて、その後、配送処理が行われています。

Apr  8 00:40:32 cent6 postfix/smtpd[1731]: connect from unknown[192.168.0.11]
Apr  8 00:40:33 cent6 postfix/smtpd[1731]: 095AF2267C: client=unknown[192.168.0.11]
Apr  8 00:40:34 cent6 postfwd2/policy[1719]: [RULES] rule=0, id=SIZE001, queue=095AF2267C, client=unknown[192.168.0.11], sender=<user01@example.com>, recipient=<testuser@example.jp>, helo=<example.com>, proto=SMTP, state=END-OF-MESSAGE, delay=0s, hits=SIZE001, action=DUNNO
Apr  8 00:40:34 cent6 postfix/cleanup[1737]: 095AF2267C: message-id=<ACCE33A63DDA9Ftoshiaki@example.com>
Apr  8 00:40:34 cent6 postfix/qmgr[1671]: 095AF2267C: from=<user01@example.com>, size=475, nrcpt=1 (queue active)
Apr  8 00:40:34 cent6 postfix/smtpd[1731]: disconnect from unknown[192.168.0.11]
Apr  8 00:40:36 cent6 postfix/smtp[1740]: 095AF2267C: to=<testuser@example.jp>, relay=mail.example.jp[1xx.33.69.11]:25, delay=3.5, delays=1.4/0.01/2/0.03, dsn=2.0.0, status=sent (250 ok:  Message 12768477 accepted)
Apr  8 00:40:36 cent6 postfix/qmgr[1671]: 095AF2267C: removed



<id=SIZE100のルールが適用された場合: holdされた場合>
青字の最初の1行目が判定部分で、actionとしてHOLDが適用され、次の2行目でpostfixがHOLDの処理を実行しています(メールの配送は行われていません)。

Apr  8 00:41:14 cent6 postfix/smtpd[1731]: connect from unknown[192.168.0.11]
Apr  8 00:41:14 cent6 postfix/smtpd[1731]: 1F7262267C: client=unknown[192.168.0.11]
Apr  8 00:41:14 cent6 postfix/cleanup[1737]: 1F7262267C: message-id=<ADCE33A6566291toshiaki@example.com>
Apr  8 00:41:15 cent6 postfwd2/policy[1719]: [RULES] rule=1, id=SIZE100, queue=1F7262267C, client=unknown[192.168.0.11], sender=<user01@example.com>, recipient=<testuser@example.jp>, helo=<example.com>, proto=SMTP, state=END-OF-MESSAGE, delay=0s, hits=SIZE100, action=HOLD message too large
Apr  8 00:41:15 cent6 postfix/smtpd[1731]: 1F7262267C: hold: END-OF-MESSAGE from unknown[192.168.0.11]: <END-OF-MESSAGE>: End-of-data message too large; from=<user01@example.com> to=<testuser@example.jp> proto=SMTP helo=<example.com>

Apr  8 00:41:15 cent6 postfix/smtpd[1731]: disconnect from unknown[192.168.0.11]


2013年3月17日日曜日

rsyslog + MySQL

2014/11/07追記: ”データベースの作成の箇所”に赤字でコメントを追加


シスログをMySQLに書き出す方法です。

今回の環境はCentOS6.4+rsyslogのVer7.2.6になり、こちらの記事のようにリポジトリを用意してある前提で話を進めます。


rsyslog-mysqlパッケージの導入

リポジトリに用意されているパッケージをインストールします。

[root@cent6 ~]# yum install rsyslog-mysql


データベースの作成

インストールしたrsyslog-mysqlパッケージに、シスログをMySQLに書き出す為に必要なデータベースとテーブルを作成するSQL(青字の部分)が含まれているので、今回はそれをそのまま利用します。
(2014/11/07追記:)
・SystemEventsテーブルのIDはint型で定義されていますが、受け取るログが多いと直ぐにあふれます。最初からbigint型にしておいたほうが良いと思います。
・デフォルトのMyISAMで運用していたら、比較的簡単に壊れました。最初からInnoDBにしておいたほうが無難です。
[root@cent6 ~]# rpm -ql rsyslog-mysql
/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-mysql-7.2.6
/usr/share/doc/rsyslog-mysql-7.2.6/createDB.sql
[root@cent6 ~]#

以下のように実行(インポート)します。
※この作業で、「Syslog」データベース、その中に2つのテーブルが作成されます


[root@cent6 ~]# mysql -u root < /usr/share/doc/rsyslog-mysql-7.2.6/createDB.sql
[root@cent6 ~]# mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Syslog             |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)
mysql> use Syslog;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------------+
| Tables_in_Syslog       |
+------------------------+
| SystemEvents           |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)
mysql>




ログ出力用ユーザの作成

rsyslogからMySQLへアクセスする為のユーザを以下のように作成します。
※ここでは、ユーザ名をrsyslog、パスワードをpasswordとして作成しています

mysql> grant all privileges on Syslog.* to rsyslog@localhost identified by 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>select host,user,password from mysql.user where user='rsyslog';
+-----------+---------+-------------------------------------------+
| host      | user    | password                                  |
+-----------+---------+-------------------------------------------+
| localhost | rsyslog | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+-----------+---------+-------------------------------------------+
1 row in set (0.00 sec)
mysql>



rsyslogの設定

/etc/rsyslog.confにMySQLにシスログを出力する為の設定(以下の2行)を追記します。
※下記では、全てのログをMySQLに出力するよう設定しています
※MySQLに出力する為の書式は、:ommysql: / 接続ホスト / データベース名 / ユーザ名 / パスワード となります

module(load="ommysql")
*.*     :ommysql:localhost,Syslog,rsyslog,password

設定を追加したら、rsyslogを再起動します。



動作確認

rsyslogの再起動が完了すると、MySQLにログが格納されるようになります。
[root@cent6 ~]# mysql Syslog
mysql> show tables;
+------------------------+
| Tables_in_Syslog       |
+------------------------+
| SystemEvents           |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)
mysql> select * from SystemEvents \G
*************************** 1. row ***************************
                ID: 1
        CustomerID: NULL
        ReceivedAt: 2013-03-17 23:34:43
DeviceReportedTime: 2013-03-17 23:34:43
          Facility: 5
          Priority: 6
          FromHost: cent6
           Message:  [origin software="rsyslogd" swVersion="7.2.6" x-pid="18401" x-info="http://www.rsyslog.com"] start
        NTSeverity: NULL
        Importance: NULL
       EventSource: NULL
         EventUser: NULL
     EventCategory: NULL
           EventID: NULL
   EventBinaryData: NULL
      MaxAvailable: NULL
         CurrUsage: NULL
          MinUsage: NULL
          MaxUsage: NULL
        InfoUnitID: 1
         SysLogTag: rsyslogd:
      EventLogType: NULL
   GenericFileName: NULL
          SystemID: NULL
1 row in set (0.00 sec)
mysql>



2013年3月8日金曜日

SSH パスフレーズの変更

暗号鍵にアクセスする為のパスフレーズを変更する方法です。


元のパスフレーズがわかる場合

$ ssh-keygen -p
Enter file in which the key is (/home/user01/.ssh/id_rsa):   <-鍵の場所が聞かれる
Enter old passphrase:  <-古いパスフレーズを入力
Key has comment '/home/user01/.ssh/id_rsa'
Enter new passphrase (empty for no passphrase): <-新しいパスフレーズを入力
Enter same passphrase again:               <-新しいパスフレーズを入力
Your identification has been saved with the new passphrase.
$


元のパスフレーズがわからない場合

$ ssh-keygen -t rsa -f .ssh/id_rsa -N "新しいパスフレーズ"
Generating public/private rsa key pair.
.ssh/id_rsa already exists.
Overwrite (y/n)? y  <-上書きについて確認される
Your identification has been saved in .ssh/id_rsa.
Your public key has been saved in .ssh/id_rsa.pub.
The key fingerprint is:
b9:6e:a5:bc:6d:db:80:ed:56:cd:bb:d9:73:39:e4:c8 root@pm02
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|         .       |
|        S    o   |
|         +. . o. |
|       .ooo.. +..|
|       .+ooo E.B.|
|       .o++.. o.=|
+-----------------+
$

※こちらのケースでは、秘密鍵と共に公開鍵も更新されるので、..ssh/authorized_keysの更新も忘れずに。

2013年3月4日月曜日

postfwd (postfix用ポリシーサーバ)

2013/03/04: 初版
2013/04/07: 「起動スクリプト」の赤字部分の箇所を追加(というか修正)



postfwdは、perlで書かれたpostfix用ポリシーサーバーで、複数の条件を組み合わせたACLが作成可能なので、postfix単体では実現できなかったSPAM対策に利用する事ができます。

今回は、そのセットアップについて記載します(といっても難しいところはないのですが)。
#評価環境はCentOS6.3
#postfwdには、version1 と version2が存在しますが、今回はversion2を利用


事前準備

動作に必要な下記のperlモジュールをインストールしておく。
・Net::Server::Daemonize
・Net::Server::Multiplex
・Net::Server::PreFork
 →上記3つはEPELリポジトリのperl-Net-Server含まれるので、そちらをインストールした
・Net::DNS
 →Baseリポジトリからperl-Net-DNSをインストールした


インストール

tarボールの中に、version1とversion2の両方のものが含まれているが、今回はversion2用のものを任意のディレクトリにコピーする形でインストールを実施する。
※なお、設定ファイルpostfwd.cfはひとまず空ファイルで用意しています

[root@cent6 ~]# wget http://postfwd.org/postfwd.tar.gz
[root@cent6 ~]# tar zxf postfwd.tar.gz
[root@cent6 ~]# cd postfwd-1.34/
[root@cent6 postfwd-1.34]# cp sbin/postfwd2 /usr/local/sbin
[root@cent6 postfwd-1.34]# cp bin/postfwd-script.sh /etc/rc.d/init.d/postfwd2
[root@cent6 postfwd-1.34]# touch /etc/postfix/postfwd.cf


起動スクリプトの修正

インストールした状況に合わせて、以下のように修正する。
→修正後のdiff出力を参照ください

[root@cent6 postfwd-1.34]# vi /etc/rc.d/init.d/postfwd2
[root@cent6 postfwd-1.34]# diff -u bin/postfwd-script.sh /etc/rc.d/init.d/postfwd2
--- bin/postfwd-script.sh       2010-11-15 07:03:42.000000000 +0900
+++ /etc/rc.d/init.d/postfwd2   2013-04-07 21:45:26.224068602 +0900
@@ -3,22 +3,27 @@
 # Startscript for the postfwd daemon
 #
 # by JPK
+# chkconfig: 35 75 25
+# description: postfwd is written in perl to combine complex postfix restrictions
+#              in a ruleset similar to those of the most firewalls.
 PATH=/bin:/usr/bin:/usr/local/bin
 # path to program
-#PFWCMD=/usr/local/postfwd/sbin/postfwd2
-PFWCMD=/usr/local/postfwd/sbin/postfwd
+#PFWCMD=/usr/local/postfwd/sbin/postfwd
+PFWCMD=/usr/local/sbin/postfwd2
 # rulesetconfig file
 PFWCFG=/etc/postfix/postfwd.cf
 # pidfile
-PFWPID=/var/tmp/postfwd.pid
+#PFWPID=/var/tmp/postfwd.pid
+PFWPID=/var/tmp/postfwd2-master.pid
 # daemon settings
 PFWUSER=nobody
 PFWGROUP=nobody
 PFWINET=127.0.0.1
-PFWPORT=10040
+#PFWPORT=10040
+PFWPORT=10045
 # recommended extra arguments
 PFWARG="--shortlog --summary=600 --cache=600 --cache-rbl-timeout=3600 --cleanup-requests=1200 --cleanup-rbls=1800 --cleanup-rates=1200"
@@ -40,7 +45,7 @@
        stop*)          ${PFWCMD} --interface=${PFWINET} --port=${PFWPORT} --pidfile=${PFWPID} --kill;
                        ;;
-       reload*)        ${PFWCMD} --interface=${PFWINET} --port=${PFWPORT} --pidfile=${PFWPID} -- reload;
+       reload*)        ${PFWCMD} --interface=${PFWINET} --port=${PFWPORT} --pidfile=${PFWPID} --reload;
                        ;;
        restart*)       $0 stop;
[root@cent6 postfwd-1.34]#




自動起動の設定と起動

[root@cent6 postfwd-1.34]# chkconfig --add postfwd2
[root@cent6 postfwd-1.34]# chkconfig postfwd2 on
[root@cent6 postfwd-1.34]# /etc/rc.d/init.d/postfwd2 start
Starting postfwd2...
[root@cent6 postfwd-1.34]#



状態確認


[root@cent6 ~]# ps -fC postfwd2
UID        PID  PPID  C STIME TTY          TIME CMD
nobody    1201     1  0 23:51 ?        00:00:00 /usr/local/sbin/postfwd2 --shortlog --summary=600 --cache=600 --cache-rbl-timeout=3600
nobody    1202  1201  0 23:51 ?        00:00:00  postfwd2::cache
nobody    1203  1201  0 23:51 ?        00:00:00  postfwd2::policy
nobody    1204  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1205  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1206  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1207  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1208  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1209  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1210  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1211  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1212  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
nobody    1213  1203  0 23:51 ?        00:00:00  postfwd2::policy::child
[root@cent6 ~]#

[root@cent6 postfwd-1.34]# netstat -antp | grep postfwd2
tcp        0      0 127.0.0.1:10045             0.0.0.0:*                   LISTEN      1288/ postfwd2:
[root@cent6 postfwd-1.34]#



また、メールログには以下のように出力されている。

Mar  3 23:51:13 cent6 postfwd2/master[1200]: postfwd2 1.34 starting
Mar  3 23:51:13 cent6 postfwd2/master[1201]: Started cache at pid 1202
Mar  3 23:51:13 cent6 postfwd2/master[1202]: 2013/03/03-23:51:13 postfwd2::cache (type Net::Server::Multiplex) starting! pid(1202)
Mar  3 23:51:13 cent6 postfwd2/master[1201]: Started server at pid 1203
Mar  3 23:51:13 cent6 postfwd2/master[1203]: 2013/03/03-23:51:13 postfwd2::server (type Net::Server::PreFork) starting! pid(1203)
Mar  3 23:51:13 cent6 postfwd2/master[1202]: Binding to UNIX socket file /var/tmp/postfwd2-cache.socket using SOCK_STREAM#012
Mar  3 23:51:13 cent6 postfwd2/cache[1202]: ready for input
Mar  3 23:51:13 cent6 postfwd2/master[1203]: Binding to TCP port 10045 on host 127.0.0.1#012
Mar  3 23:51:13 cent6 postfwd2/policy[1203]: critical: no rules found - i feel useless (have you set -f or -r?)
Mar  3 23:51:13 cent6 postfwd2/policy[1203]: ready for input



以上で、セットアップは完了です。
設定ファイルpostfwd.cfが空ファイルなので、実際は何の役にも立ってませんが.....
#設定は、次回書こうと思います。


2013年2月24日日曜日

yum リポジトリの保護(protect)


複数のリポジトリを併用する場合、同一パッケージがバージョン違いで複数用意されてしまう事があります。
→ 通常何も指定をしなければ、バージョンのより新しいものがインストールやアップデートの対象になってしまいます。

この状態を回避する為に、利用しないリポジトリ側でexcludeオプションを指定する事が多々あるかと思いますが、より運用しやすい方法として利用したいパッケージが含まれるリポジトリ側でprotectを設定する手もあります


以下、その手順です。

1.yumのプラグインパッケージをインストールする。

RHEL6系の場合 → yum-plugin-protectbase
RHEL5系の場合 → yum-protectbase


2.protectをかけたいrepoファイルに以下を追記する。

protect=1


以上で設定は完了です。
これで、protectをかけたリポジトリに含まれるパッケージは、他のリポジトリの状態に影響を受けなくなります。


また、protectをかけたリポジトリは、以下のようなメッセージ(青字の部分)が表示されるようになります。

[root@node01 ~]# yum update
Loaded plugins: fastestmirror, protectbase
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
27 packages excluded due to repository protections
Setting up Update Process
No Packages marked for Update
[root@node01 ~]#

2013年2月17日日曜日

Fedora18 systemctlコマンド と [TAB]キー

2013年1月にリリースされたFedora18についてのメモです。


SysVinitからsystemdにデーモンの制御が移って、今まで/etc/rc.d/init.d/<デーモン名> restart のよう操作に慣れ親しんでいたのに、新たにsystemctlコマンドによる操作を覚えなくてはいけなくなった。


ところが、serviceコマンドを利用するとRHEL( or CentOS)の5や6と同等の操作ができるようになっています。
しかも[TAB]キーを利用すれば補完まで行ってくれるようになっています。

例)sshdの再起動

[root@fc18 ~]# service ss  ←[TAB]を入力する事で”sshd”と補完される
[root@fc18 ~]# service sshd restart
Redirecting to /bin/systemctl restart  sshd.service ←systemctlコマンドへリダイレクト
[root@fc18 ~]#


chkconfigコマンドも同等の操作が行えるようになっています。

例)sshdの自動起動off
[root@fc18 ~]# chkconfig sshd off ←ssの後に[TAB]を入力する事で”sshd”と補完される
情報:'systemctl disable sshd.service'へ転送しています。
rm '/etc/systemd/system/multi-user.target.wants/sshd.service'
[root@fc18 ~]#


あと、上記デーモンなどの制御以外にも[TAB]が随所で利用できるようになっているようです。

例えば、yum install postまで入力して[TAB]を2回入力すると候補が表示されるようになりました。
(これで、yum list | grep ~ などしてパッケージ名を調べる必要すらなくなりました。)


[root@fc18 ~]# yum install post[TAB][TAB]
postal.x86_64                         postgresql-ip4r.x86_64                postgresql-plruby-doc.x86_64
poster.x86_64                         postgresql-jdbc.noarch                postgresql-plruby.x86_64
posterazor.x86_64                     postgresql-libs.i686                  postgresql-pltcl.x86_64
postfix-perl-scripts.x86_64           postgresql-libs.x86_64                postgresql-server.x86_64
postfix-sysvinit.noarch               postgresql-odbc.x86_64                postgresql-table_log.x86_64
postfix.x86_64                        postgresql-pgpool-II-devel.i686       postgresql-test.x86_64
postgis-docs.x86_64                   postgresql-pgpool-II-devel.x86_64     postgresql-upgrade.x86_64
postgis-jdbc.x86_64                   postgresql-pgpool-II-recovery.x86_64  postgresql.i686
postgis-utils.x86_64                  postgresql-pgpool-II.i686             postgresql.x86_64
postgis.x86_64                        postgresql-pgpool-II.x86_64           postgresql_autodoc.noarch
postgresql-contrib.x86_64             postgresql-pgpoolAdmin.noarch         postgrey.noarch
postgresql-dbi-link.noarch            postgresql-plparrot.x86_64            postler.x86_64
postgresql-devel.i686                 postgresql-plperl.x86_64              postr.x86_64
postgresql-devel.x86_64               postgresql-plpython.x86_64
postgresql-docs.x86_64                postgresql-plpython3.x86_64
[root@fc18 ~]# yum install post


さらに別の例を挙げれば、rpmコマンドでもインストールされているパッケージに関しては、[TAB]を2回入力すれば候補が表示されます。下記は、openの後に[TAB]を2回入力した時の出力です。

[root@fc18 ~]# rpm -q open[TAB][TAB]
opencc           opencv           openldap         openssh          openssh-server   openssl-libs
openconnect      openjpeg-libs    openobex         openssh-clients  openssl          openvpn
[root@fc18 ~]# rpm -q open


2013年2月6日水曜日

postfix DB参照先の冗長化

postfixでルックアップテーブルとしてMySQLやPostgreSQLを指定した場合、クエリーの投げ先として複数ホストを指定する事で、参照先を冗長化できる。


<構成例>
relay_recipient_maps = proxy:mysql:/etc/postfix/mysql_relay_recipent_maps.cf
hosts = db01.example.jp db02.example.jp db03.example.jp
user = user01
password = password
dbname = mail
query = SELECT username FROM mailbox WHERE username='%s' AND status='active'


ただし、このように複数ホストを指定した場合に注意することがある。

それは、postfixは指定されたホストにランダムにクエリーをかけるので、どのホストにクエリーをかけても同じ答えが返ってくるようにすることです。

あたり前の話ですが、上記の例のように3台のホストを指定してあっても、実際のデータが1台にしか存在しない場合、データが存在しない他の2台のホストにクエリーがいってしまうと意図した結果がpostfixに返ってきません。
#認証で利用していたなら、認証失敗となってしまいます

2013年1月7日月曜日

DRBD 8.4.x の”volume”について

DRBD8.4からVolumeという新しいコンセプトが取り入れられたので、試してみる。
 →1つのリソースで複数のDRBDデバイスを扱える(詳細はドキュメントを確認してください)。


検証は、前回の環境に/dev/sdcを増設して行っています。



設定ファイルの編集

●node01とnode02で実施



/etc/drbd.d/r0.res:


前回の設定に赤字の部分を追記


resource r0 {
        volume 0 {
                device    minor 0;
                disk      /dev/sdb1;
                meta-disk internal;
        }
        volume 1 {                               
                device    minor 1;                 
                disk      /dev/sdc1;                
                meta-disk internal;          
        }        
        on node01 {
                address   10.0.0.91:7789;
        }
        on node02 {
                address   10.0.0.92:7789;
        }
}


metaデータの領域を作成

●node01とnode02で実施

# drbdadm create-md r0/1   ←★resouce 0 の volume 1を指定
Writing meta data...initializing activity logNOT initializing bitmapNew drbd meta data block successfully created.
#

DRBDの再起動

●node01とnode02で実施


# /etc/rc.d/init.d/drbd restart
Stopping all DRBD resources: .
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]
#

再起動後、状態を確認すると以下のようになる。

# drbd-overview
0:r0/0  Connected Secondary/Secondary UpToDate/UpToDate         C r-----
1:r0/1  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
#



初回フル同期スキップを実施

●どちらかのノードで実施(以下では、node01で実施)

[root@node01 ~]# drbdadm new-current-uuid --clear-bitmap r0/1


作業後、状態を確認すると以下のようになる。

[root@node01 ~]# drbd-overview
0:r0/0  Connected Secondary/Secondary UpToDate/UpToDate C r-----
1:r0/1  Connected Secondary/Secondary UpToDate/UpToDate C r-----
[root@node01 ~]#


DRBD領域のマウントまで

●稼動系にしたいノードで実施(以下では、node01で実施)
※追加したDRBD領域を/data2にマウントする


[root@node01 ~]# drbdadm primary r0
[root@node01 ~]# mkfs.ext4 /dev/drbd1  ←★あたらしく追加したDRBD領域をフォーマット
[root@node01 ~]# mkdir /data2
[root@node01 ~]# mount /dev/drbd0 /data
[root@node01 ~]# mount /dev/drbd1 /data2
[root@node01 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              18G  1.2G   16G   8% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/sda1             194M   63M  122M  34% /boot
/dev/drbd1            5.0G  138M  4.6G   3% /data2
/dev/drbd0            5.0G  138M  4.6G   3% /data
[root@node01 ~]#
[root@node01 ~]# drbd-overview
0:r0/0  Connected Primary/Secondary UpToDate/UpToDate C r----- /data  ext4 5.0G 138M 4.6G 3%
1:r0/1  Connected Primary/Secondary UpToDate/UpToDate C r----- /data2 ext4 5.0G 138M 4.6G 3%
[root@node01 ~]#