ユーザ毎のオープンファイル数変更(Debian)

2010年9月29日

tomcatで「java.net.SocketException: Too many open files」エラーが発生したのでその対処。
自前のtomcatはsuでwww-dataユーザで起動しているため、www-dataユーザでのオープンファイル上限が制限されている。rootであれば「ulimit -n」で設定すればよいが、www-dataユーザの場合、大きい値を指定すると「error setting limit (Operation not permitted)」エラーが発生し設定できない。
「ulimit -n」で指定できる上限を大きくするには以下の設定を行う。

/etc/security/limits.conf

www-data         hard    nofile          16384

/etc/pam.d/su

session    required   pam_limits.so

ちなみにシステム全体のオープンファイル上限は以下で設定されている。

/proc/sys/fs/file-max

808478

smartdのエラー(Debian/lenny)

2010年9月19日

雷による停電で自宅ファイルサーバの電源が落ちた。
ログにsmartdのエラーログが出力されていたので調査したときの備忘録。

/var/log/syslogに残されていたエラーログ

起動直後に/var/log/syslogに以下のエラーが残されていた。


Aug 28 01:18:03 loach smartd[13949]: Monitoring 0 ATA and 4 SCSI devices
Aug 28 01:18:04 loach smartd[13949]: Device: /dev/sdd, 1 Currently unreadable (pending) sectors
Aug 28 01:18:04 loach smartd[13949]: Sending warning via /usr/share/smartmontools/smartd-runner to root ...
Aug 28 01:18:04 loach smartd[13949]: Warning via /usr/share/smartmontools/smartd-runner to root: successful
Aug 28 01:18:04 loach smartd[13949]: Device: /dev/sdd, 1 Offline uncorrectable sectors
Aug 28 01:18:04 loach smartd[13949]: Sending warning via /usr/share/smartmontools/smartd-runner to root ...

/dev/sddに「uncorrectable sectors」があると。。。
購入したばかりなのにorz

/dev/sddの調査

とりあえず調べてみる。以下を参考にさせていただいた。
Yasuo's Weblog » Offline uncorrectable sectorsを修復

/dev/sddのテスト


# smartctl --test=short /dev/sdd
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Wed Sep  1 03:33:51 2010

Use smartctl -X to abort test.

2分待てと書いてあるので待つ。

テスト結果表示


# smartctl -l selftest /dev/sdd
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%      3812         -

あれ?エラーなしで完了だって。うーん、ログのエラーはなんだったんだろう?
その後エラーが発生しないので様子をみることにする。

ついでにエラー時に自分のメールアドレスにメールを送るよう設定する。

/etc/smartd.conf


DEVICESCAN -m hogepage@example.com -M exec /usr/share/smartmontools/smartd-runner

Debian(lenny)にRAID追加

2010年9月2日

インストール時にソフトウェアRAIDの設定をすることは多々あるが、追加でRAIDの設定をすることはあまりないので、その備忘録。

1.fdisk

追加したHDDをfdiskにてパーティーション作成。

fdisk /dev/sdc
fdisk /dev/sdd

パーティーションタイプはfd(RAID)に設定。
以下のパーティーションを設定。
両方プライマリの1,2,3を作成

■/dev/sdc
/dev/sdc1
/dev/sdc2
/dev/sdc3
■/dev/sdd
/dev/sdd1
/dev/sdd2
/dev/sdd3

2.mdデバイス作成

すでにmd0,md1は使用中なので、md2でraid作成

# mdadm --create /dev/md2 --level=raid1 --raid-devices=2 /dev/sdc1 /dev/sdd1
# mdadm --create /dev/md3 --level=raid1 --raid-devices=2 /dev/sdc2 /dev/sdd2
# mdadm --create /dev/md4 --level=raid1 --raid-devices=2 /dev/sdc3 /dev/sdd3

3.RAIDの状態をみる

# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sdc3[0] sdd3[1]
      293154048 blocks [2/2] [UU]

md3 : active raid1 sdc2[0] sdd2[1]
      488287552 blocks [2/2] [UU]

md2 : active raid1 sdc1[0] sdd1[1]
      195318144 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      486433728 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      1950708 blocks super 1.2 [2/2] [UU]

unused devices: 

※[UU]となっていれば正常。[_U]や[U_]の場合、片肺となっているので早急にリペアが必要。
※上記はsync後の結果であるが、sync中は「[=======>.............] resync = 36.0%」などとsyncの状況がわかるようになっている。

また、以下のコマンドでも状態を見ることができる。

# mdadm -D /dev/md2
/dev/md2:
        Version : 00.90
  Creation Time : Sat Jul  3 00:38:11 2010
     Raid Level : raid1
     Array Size : 195318144 (186.27 GiB 200.01 GB)
  Used Dev Size : 195318144 (186.27 GiB 200.01 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 2
    Persistence : Superblock is persistent

    Update Time : Wed Sep  1 06:25:36 2010
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           UUID : 7bf135d5:ce8b14b0:fb6507ae:de7f930d (local to host loach)
         Events : 0.14

    Number   Major   Minor   RaidDevice State
       0       8       33        0      active sync   /dev/sdc1
       1       8       49        1      active sync   /dev/sdd1

4.ファイルシステム作成

-jオプションはext3 ジャーナルを持ったファイルシステムを作成する。

# mkfs -j /dev/md2
# mkfs -j /dev/md3
# mkfs -j /dev/md4

5.mount

# mount /dev/md2 /mnt/mac
# mount /dev/md3 /mnt/data
# mount /dev/md4 /mnt/public

6./etc/mdadm/mdadm.confの設定

今回設定したmd2,md3,md4デバイスを恒久的に使用できるようにする。
/etc/mdadm/mdadm.confに設定する内容は以下のコマンドで取得できる。

# mdadm -Ds
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=01.02 name=loach:0 UUID=8da4b8a3:7e1e7cbe:24c2b2cb:6646ae87
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=00.90 UUID=f44f1fc0:07501725:92c56874:2756cb86
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=00.90 UUID=7bf135d5:ce8b14b0:fb6507ae:de7f930d
ARRAY /dev/md3 level=raid1 num-devices=2 metadata=00.90 UUID=4c223ab7:fd469f57:fb6507ae:de7f930d
ARRAY /dev/md4 level=raid1 num-devices=2 metadata=00.90 UUID=1003566b:fd7a6a99:fb6507ae:de7f930d

/dev/md0,/dev/md1はシステムインストール時に設定済みなので、/dev/md2~/de/md4までを新規に/etc/mdadm/mdadm.confへ追加した。

また、障害発生時に特定メールアドレスにメールを送信するよう設定。

MAILADDR hogepage@example.com

接続されたSATAのHDDの情報を見る方法(Linux)

2010年5月12日

・接続されたSATAのHDDの情報を見る


# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: Hitachi HDP72505 Rev: GM4O
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: Hitachi HDP72505 Rev: GM4O
  Type:   Direct-Access                    ANSI  SCSI revision: 05

・その他システム情報(ネットワークチップの確認など)


# lspci
00:00.0 Host bridge: Intel Corporation 82945G/GZ/P/PL Memory Controller Hub (rev 02)
00:02.0 VGA compatible controller: Intel Corporation 82945G/GZ Integrated Graphics Controller (rev 02)
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 01)
00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 01)
00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 01)
00:1c.3 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 4 (rev 01)
00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #1 (rev 01)
00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #2 (rev 01)
00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 (rev 01)
00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #4 (rev 01)
00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 01)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev e1)
00:1f.0 ISA bridge: Intel Corporation 82801GB/GR (ICH7 Family) LPC Interface Bridge (rev 01)
00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 01)
00:1f.2 IDE interface: Intel Corporation 82801GB/GR/GH (ICH7 Family) SATA IDE Controller (rev 01)
00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 01)
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)

[warn] NameVirtualHost *:80 has no VirtualHosts

2010年2月10日

Debian(lenny)でVirtualHostの設定をしたら、以下のエラーが。。

# /etc/init.d/apache2 restart
Restarting web server: apache2[Tue Feb 09 18:08:18 2010] [warn] NameVirtualHost *:80 has no VirtualHosts
 ... waiting .[Tue Feb 09 18:08:20 2010] [warn] NameVirtualHost *:80 has no VirtualHosts

/etc/apache2/ports.confで以下の設定がすでにしてあり、自分で書いたNameVirtualHost 設定とバッティングしてた。

NameVirtualHost *:80

どちらかをコメントアウトすることで解決。

レンタルサーバ(sakura)にawstats(with GeoIP)インストール

2010年1月31日

1.ユーザランドへのインストール方針

レンタルサーバ(sakura)にGeoIPプラグインを有効にしたawstatsをインストールしたのでそのメモ。

日本用にカスタマイズされたawstasが以下のサイトで公開されている。
AWStatsをFreeBSDで動かす

sakuraのようなレンタルサーバでは、ユーザランドでの動作となるので以下のような工夫が必要となる。

  • 必要なPerlモジュール(CPAN利用)のユーザランドへインストール
  • GeoIP(IPから接続元の地域がわかる)のユーザランドへのインストール
  • awstats.plに上記モジュールのパス追加

2.CPANを利用して必要モジュールインストール

・ホームディレクトリ下にlocalとlocal/srcを作成

$ cd ~
$ mkdir -p local/src

・CAPN初期設定

まずは初期設定。

$ perl -MCPAN -e shell

質問に答える。とりあえず全部デフォルト。
/home/USERNAME/.cpan/CPAN/MyConfig.pmが設定ファイル。これを編集。ここを参考にした。

'make_install_arg' => qq[SITEPREFIX=$ENV{HOME}/local],
'makepl_arg' => qq[INSTALLDIRS=site INSTALL_BASE=$ENV{HOME}/local LIB=$ENV{HOME}/local/lib/perl5],
'mbuildpl_arg' => qq[./Build --install_base $ENV{HOME}/local],
'urllist' => [q[ftp://ftp.u-aizu.ac.jp/pub/CPAN], q[ftp://ftp.kddilabs.jp/CPAN/]],

※TIPS:間違えた場合はCAPN>o conf init で初期化できる。

自分の環境はbashに変えてあるので.bashrcにパスなどを書き込み

$ echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
$ echo 'export PERL5LIB=$HOME/local/lib/perl5:$HOME/local/lib/perl5/site_perl' >> ~/.bashrc

FreeBSDのportsと連携する仕組みであるBSDPANでエラーがでないよう調整。

$ echo 'export PKG_DBDIR=$HOME/local/var/db/pkg' >> ~/.bashrc
$ echo 'export PORT_DBDIR=$HOME/local/var/db/pkg' >> ~/.bashrc
$ echo 'export INSTALL_AS_USER=' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=$HOME/local/lib' >> ~/.bashrc
$ mkdir -p ~/local/var/db/pkg

設定を有効にする。

$ source ~/.bashrc

・モジュールインストール

$ perl -MCPAN -e shell
CPAN[1]>install HTML::Entities::Numbered
CPAN[2]>install Unicode::Japanese
CPAN[3]>install Jcode

・CAPNを最新にアップデートする。

$ cpan -i Bundle::CPAN

3.GeoIPのインストール

おそらくCPANでもインストールできる(Geo::IP)が、CAPI(高速動作するらしい)を使用したかったのでソースからインストールした。

・GeoIPのCAPI(C言語で書かれたAPI)ダウンロード、インストール

$ cd ~/local/src
$ wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.6.tar.gz
$ tar zxvf GeoIP-1.4.6.tar.gz
$ cd GeoIP-1.4.6
$ ./configure --prefix=/home/USERNAME/local/
$ make
$ make check
$ make install

コマンドがあるので試してみる。
% geoiplookup 124.83.147.202 (www.yahoo.co.jp)
GeoIP Country Edition: JP, Japan

% geoiplookup www.google.com
GeoIP Country Edition: US, United States

・GeoIPのPerlモジュールダウンロード、インストール

$ wget http://geolite.maxmind.com/download/geoip/api/perl/Geo-IP-1.38.tar.gz
$ tar zxvf Geo-IP-1.38.tar.gz
$ cd Geo-IP-1.38
$ perl Makefile.PL LIBS='-L/home/USERNAME/local/lib' INC='-I/home/USERNAME/local/include' PREFIX='/home/USERNAME/local'
$ make
$ make test
$ make install

・GeoIP用最新データダウンロード

GeoIP用データは月に一度更新されるらしい。とりあえず最新版にしておく。

最新版の国別IPデータをダウンロードする。

$ cd ~/local/src
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
$ gunzip GeoIP.dat.gz
$ mv GeoIP.dat ~/local/share/GeoIP/GeoIP.dat

最新版の地域別IPデータをダウンロードする。

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
$ gunzip GeoLiteCity.dat.gz
$ mv GeoLiteCity.dat ~/local/share/GeoIP/GeoLiteCity.dat

※有償版は以下のコマンドで自動アップデート可能
$ geoipupdate -d /home/USERNAME/local/share/GeoIP

4.awstatsのインストール

以下のディレクトリにインストールする。
~/local/awstats-6.95-jp
~/local/awstats-6.95-jp/wwwroot以下をWebに公開することにする(~/local/www/awstatsからのシンボリックリンクを作成)。

・日本用にカスタマイズされたawstatsをダウンロード・インストール

AWStatsをFreeBSDで動かすサイトのawstats695t_jpn.zipを使用する。

awstats.model.confはawstats.HOSTNAME.confなどに変更する。HOSTNAMEのところが各種コマンド実行時の-configオプションの指定と一致するようにする。

$ mkdir awstats-6.95-jp
$ cd ~/local/awstats-6.95-jp
$ wget http://hobbit.ddo.jp/html/awstats695t_jpn.zip
$ unzip awstats695t_jpn.zip
$ cd wwwroot/cgi-bin/
$ cp awstats.model.conf awstats.www.hogepage.net.conf

Perlソースの改行コードがCRLFになってる。これだとInternal Server Errorが発生する。また、windowsで作成したらしいのでパーミッションがおかしい。
以下のように修正。

$ cd ~/local/awstats-6.95-jp
$ find ./ -name *.pl | xargs nkf -w -Lu --overwrite
$ find ./ -name *.pl | xargs chmod 755

・confの設定

awstats.www.hogepage.net.confの編集

#日本語用のawstatsはUTF-8に変換したログを指定。
LogFile="/home/USERNAME/log/access_log.utf8"
#オリジナルのawstats使用の場合はこちらを指定。
#LogFile="/home/USERNAME/log/access_log_%YYYY-24%MM-24%DD-24"
SiteDomain="www.hogepage.net"
DirData="/home/USERNAME/local/awstats-6.95-jp/wwwroot/data"
DirCgi="/awstats/cgi-bin"
DirIcons="/awstats/icon"
StyleSheet="/awstats/css/awstats_bw.css"
Lang="jp"
LoadPlugin="geoip GEOIP_STANDARD /home/USERNAME/local/share/GeoIP/GeoIP.dat"
LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /home/USERNAME/local/share/GeoIP/GeoLiteCity.dat"

GeoIPのPluginは2つ設定してあるが、それぞれ国別、地域別(都道府県など)用のPluginである。

解析データ保存用ディレクトリ、静的なHTML用ディレクトリを作成。

$ mkdir ~/www/awstats/data
$ mkdir ~/www/awstats/html

※awstatsは統計情報を毎回動的にHTML出力するのは負荷になるので、静的なHTMLに変換できる。

・apacheの設定

$ cd ~/www
$ ln -s ../local/awstats-6.95-jp/wwwroot awstats
$ cd awstats
$ cat .htaccess
AddHandler cgi-script pl
AuthUserFile /home/USERNAME/.htpasswd
AuthGroupFile /dev/null
AuthName "awstats login"
AuthType Basic
require valid-user

アクセス制限用アカウント登録。sakuraはDigest認証が使えないのでBasic認証の設定を行う。
$ htpasswd -c ~/.htpasswd admin

・ユーザランドのCPAN、GeoIPモジュールのインクルード

awstats.plの最初の方に以下追加。

use lib '/home/USERNAME/local/lib/perl5';
use lib '/home/USERNAME/local/lib/perl5/site_perl/5.8.9/mach';

またawstats.plの先頭の「#!c:/perl/bin/perl」を削除。

・画面表示

画面表示してみる。
http://HOSTNAME/awstats/cgi-bin/awstats.pl

なんか以下のエラーが。。
 ※error_logが見れない状況では「use CGI::Carp ‘fatalsToBrowser’;」をファイルの先頭付近に記述すると幸せになる。
該当箇所に「};」というゴミがあったので削除。

syntax error at /home/USERNAME/local/awstats-6.95-jp/wwwroot/cgi-bin/plugins/geoip_city_maxmind.pm line 4472
syntax error at /home/USERNAME/local/awstats-6.95-jp/wwwroot/cgi-bin/plugins/geoip_city_maxmind.pm line 4512, near "else"

再度表示。空のアクセス解析画面が表示されればOK

・アクセス解析

オリジナルのawstatsは、以下のコマンドでログを解析する。
/home/USERNAME/local/awstats-6.95-jp/wwwroot/cgi-bin/awstats.pl -config=www.hogepage.net -update

しかし、これではサーチエンジンのキーワードなどが文字化けする場合がある。
付属のawstats.shやawstats.cronにログをUTF-8形式にする方法が載っているが、sakuraのようにログがaccess_log_20100101のような日付形式になっている場合に対応していない。

access_log_20100101のような日付がついかアクセスログに対応できるスクリプトがここにあったので使わせて頂く(感謝)。以下、自分の環境用に書き換えたモノ。

/home/USERNAME/local/awstats-6.95-jp/awstats_cron.sh

#!/bin/sh
# www.hogepage.nt - AWStats

# ENV
PERL5LIB=/home/USERNAME/local/lib/perl5:/home/USERNAME/local/lib/perl5/site_perl
HDIR="/home/USERNAME"
AWDIR=${HDIR}"/local/awstats-6.95-jp"
WWWDIR=${HDIR}"/www/awstats"
HOSTNAME="www.hogepage.net"
DATE=`/bin/date -v -1d +%Y%m%d`
MONTH=`/bin/date -v -1d +%m`
YEAR=`/bin/date -v -1d +%Y`

if [ -f "${HDIR}/log/access_log_${DATE}" ];
then
    # check
    if [ ! -d "${WWWDIR}/html/${YEAR}${MONTH}" ];
    then
        /bin/mkdir ${WWWDIR}/html/${YEAR}${MONTH}
    fi

    if [ -f "${HDIR}/log/access_log.utf8" ];
    then
        /bin/rm -f ${HDIR}/log/access_log.utf8
    fi

    # Can't locate awstats_host.plのエラーが発生するので、${AWDIR}/toolsに移動
    cd ${AWDIR}/tools
    # url decode
    ${AWDIR}/tools/utf8_decode.pl < ${HDIR}/log/access_log_${DATE} \
        > ${HDIR}/log/access_log.utf8

    # update
    ${AWDIR}/wwwroot/cgi-bin/awstats.pl \
        -config=$HOSTNAME -update

    # static report index
    ${AWDIR}/wwwroot/cgi-bin/awstats.pl \
        -config=$HOSTNAME -output -staticlinks \
        -year=${YEAR} \
        -month=${MONTH} > ${WWWDIR}/html/${YEAR}${MONTH}/index.html

    # static report page
    ${AWDIR}/tools/awstats_buildstaticpages.pl \
        -config=$HOSTNAME -lang=jp -year=${YEAR} -month=${MONTH} \
        -awstatsprog=${AWDIR}/wwwroot/cgi-bin/awstats.pl \
        -diricons=/awstats/icon -dir=${WWWDIR}/html/${YEAR}${MONTH}

    # delete logfile
    if [ -f "${HDIR}/log/access_log.utf8" ];
    then
        /bin/rm -f ${HDIR}/log/access_log.utf8
    fi
fi

~/local/awstats-6.95-jp/tools/awstats_host.plの書き換え

$Myhost = "www\.hogepage\.net";

実行してみる。エラーがでなければ成功。

/home/USERNAME/local/awstats-6.95-jp/awstats_cron.sh

/home/USERNAME/www/wordpress/awstats/dataにファイルができていれば成功。

・cronへの登録

% crontab -e
# awstats
30 1 * * *       /home/USERNAME/local/awstats-6.95-jp/awstats_cron.sh > /dev/null

これで毎日01:30にデータが更新される。

Debian(lenny,squeeze)にpostfix,courier-popインストール

2010年1月26日

Debian(lenny,squeeze)にpostfix,courier-popをインストールし、基本的なメールシステムを構築する。

1.基本方針

  • SMTP AUTH対応
  • Maildir使用
  • POPS対応
  • SMTPS対応
  • Submission Port対応
  • Submission PortでのSTARTTLS対応
  • POPとSMTPの認証モジュールは同一のものを使用

2.courier-authdaemonのインストール設定

POPとSMTPの認証モジュールは同一のものを使用したかったのでcourier-authdaemonを使用する。これはcourier-pop,postfix両方で使用できる。

・courier-authdaemonのインストール

# aptitude install courier-authdaemon

・authdaemonrcの設定

# cat /etc/courier/authdaemonrc

# authuserdbを使えばシステムアカウントとメールアカウントを
# 分ける事ができる。今回はシステムアカウントを使用。
#authmodulelist="authuserdb"
authmodulelist="authpam"
・・・
# chrootしたpostfixからも見えるようにしようとしたがこのオプションは無効らしい。
# 本当はこうしたい↓
# authdaemonvar=/var/spool/postfix/var/run/courier/authdaemon
# 少々強引だが/var/spool/postfix/var/run/courierのシンボリックリンクを作成することで対応することに。。
authdaemonvar=/var/run/courier/authdaemon

・courier-authdaemonの再起動

# /etc/init.d/courier-authdaemon restart

3.アカウント追加

・maildirmakeを使えるようcourier-baseインストール

# aptitude install courier-base

・ユーザ作成時にMaildirできるようにしておく

# /usr/bin/maildirmake /etc/skel/Maildir

・ユーザ追加

# adduser --shell /bin/false hoge

参考:authmodulelist=”authuserdb”の場合
今回はauthdaemonrcでauthmodulelist=”authpam”を指定したので関係はないが、参考までにauthmodulelist=”authuserdb”を指定した場合のユーザ追加例を以下に記す。authuserdbを指定した場合は、システムアカウントとメールアカウントを分けることが可能。

・メール用アカウント追加
# adduser -u 1010 --disabled-password --disabled-login test
・userdb作成
# userdb test set home=/home/test mail=/home/test/Maildir uid=1010 gid=1010
 ※/etc/courier/userdbが作成される。
・パスワード設定
# userdbpw | userdb test set pop3pw
# userdbpw | userdb test set smtppw
  ※/etc/courier/userdbの該当箇所にパスワードが設定される。
・DB形式に変換
# makeuserdb
・アカウント削除
# userdb test del

3.courier-popインストール

# aptitude install courier-pop courier-pop-ssl

認証の設定は終わっているので、 courier-pop courier-pop-sslをインストールすればPOPとPOP-SSL(POPS)が使用できるようになる。

4.GUI設定

GUI設定もある模様。

# aptitude install courier-webadmin

一部使用できない機能がある?
また、ほとんど有用な機能がないので削除。。。

# aptitude purge courier-webadmin

5.Postfixインストール

・libsasl2のインストール。これがないとSMTP認証できない。

# aptitude install libsasl2-modules

・Postfixインストール

# aptitude install postfix

6.Postfix設定

・ローカルから送信時のFromで使用されるドメインを指定

# cat /etc/mailname
hogepage.net

・submission port有効

# cat /etc/postfix/master.cf
以下がコメントになっているのでコメント外す

submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

smtpd_client_restrictionsは、SMTPサーバがクライアントからSMTP接続の要求を受けた際に適用するIPアドレスのアクセス制限(デフォルトはすべて許可)。
smtpd_delay_reject = yes(デフォルト)なので、smtpd_client_restrictionsはRCPT TO時に評価される。つまり、この場合だと認証を通ったクライアントのIPのみ、RCPT TO以降のSMTP接続を受け付ける。ここでの設定はサブミッションポートでの設定なので注意(通常の25番ポートの方は適用されない)。

・main.cf編集

# cat /etc/postfix/main.cf

・・・・略
# TLSの設定。証明書はデフォルトのものを使用。オレオレ証明書なので注意
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# 主要な設定
myhostname = mail.hogepage.net  # HELO名などで使用される。
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname  #ローカルからメール配信を行った場合のFromアドレスにつくドメイン名
mydestination = hogepage.net, localhost  #宛先ドメイン。このドメインにきたメールがローカル配送される。
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 xxx.xxx.xxx.xxxx #Relayを許可するIPアドレス。認証無しでもリレーできる。
#mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
#inet_protocols = ipv4
home_mailbox = Maildir/ # mailboxをMaildir形式にする。
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

smtpd_recipient_restrictions はPostfix SMTPサーバが RCPT TO コマンドの場面で適用するアクセス制限(デフォルト: permit_mynetworks, reject_unauth_destination)。 この設定はサブミッションポート(587)と通常ポート(25)両方に適用される。これがあれば、master.cfのsmtpd_client_restrictions設定はいらない気が。。まぁ、二重にチェックしてもいいか。

ちなみに*_restrictionsの評価の順序は以下になる。必須なのはsmtpd_recipient_restrictionsのみ。

  1. smtpd_client_restrictions
  2. smtpd_helo_restrictions
  3. smtpd_sender_restrictions
  4. smtpd_recipient_restrictions

上記でも述べたがsmtpd_delay_reject = yes(デフォルト)だと、RCPT TO時にこれらがすべて評価される。
また、条件にマッチした場合、それ以降のマッチングを行わない。

・SMTP認証設定

認証方式にauthdaemondを指定する。
# cat /etc/postfix/sasl/smtpd.conf

pwcheck_method: authdaemond
authdaemond_path: /var/run/courier/authdaemon/socket
mech_list: plain login

・TIPS:/etc/postfix/sasl/smtpd.confの秘密

pwcheck_methodはauxprop/saslauthd/authdaemondなどがある。
それぞれの設定例を記述する。
(1)auxpropの例
auxpropを使用するといろいろなプラグインが使用できる。pluginにはsqlなどもある。

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: cram-md5 digest-md5 plain login

auxprop_pluginを指定しない場合、デフォルトでsasldbが使用される。

(2)saslauthdの例
saslauthdデーモンを使用する場合。

pwcheck_method: saslauthd
mech_list: plain login

saslauthdの場合、cram-md5やdigest-md5が使用できないことに注意。しかし、mech_listにcram-md5やdigest-md5が指定できてしまうことが混乱を招いている。認証にcram-md5やdigest-md5が使われた場合、saslauthdではなく、auxprop(=sasldb or sasldb2)が使用されてしまうことに注意orz
個人的にはSSLと組み合わせればよい話なので、cram-md5やdigest-md5はいらないと思っている。さらにcram-md5やdigest-md5の場合はサーバ側にハッシュ値でないプレーンテキストでパスワードを保存しておく必要がある。こっちの方が問題だと思う。。

(3)authdaemondの例
これは今回の例。もう一度おさらい。

pwcheck_method: authdaemond
authdaemond_path: /var/run/courier/authdaemon/socket
mech_list: plain login

authdaemondもsaslauthdの場合と同様、cram-md5やdigest-md5が使用できないことに注意。認証にcram-md5やdigest-md5が使われた場合、authdaemondではなく、auxprop(=sasldb or sasldb2)が使用される。

・authdaemonのsocketをpostfixが読めるようにする

まずpostfixユーザをdaemonグループに追加する。
# usermod -G postfix,mail,daemon postfix

・ソケットのハードリンクを行う。

postfixがchrootするのでシンボリックリンクではダメ!


# mkdir -p /var/spool/postfix/var/run/courier/authdaemon
# ln -f /var/run/courier/authdaemon/socket /var/spool/postfix/var/run/courier/authdaemon/socket


※これはauthdaemondを再起動するたびに行わなければならないので起動スクリプトに追加。デーモン起動してからソケット作成まで時間がかかるので3sほどsleepする。
# cat /etc/init.d/courier-authdaemon



・・・
    $daemonscript start
    sleep 3
    ln -f /var/run/courier/authdaemon/socket /var/spool/postfix/var/run/courier/authdaemon/socket

・authdaemonのソケットをauthdaemonとpostfix両方で使用できるようにする

authdaemonのソケットをauthdaemonとpostfix両方で使用できるようにする。
(postfixはchrootするのでこのような工夫が必要となる)
上記の取消線で消した情報のようにソケットのハードリンクを行うのはスマートでないのでこちらに変更した。


mkdir -p /var/spool/postfix/var/run/
mv /var/run/courier /var/spool/postfix/var/run/
ln -s /var/spool/postfix/var/run/courier /var/run/courier

・エイリアス設定

# cat /etc/aliases

mailer-daemon: root
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root

7.Postfix設定

・courier-authdaemonの再起動

# /etc/init.d/courier-authdaemon restart

・Postfixの再起動

# /etc/init.d/postfix restart

これでSMTP認証も使用できるようになった。認証方式は「PLAIN」「LOGIN」方式、SSLを使用するようにして通信が暗号化されるようにする。ここで使用した証明書はいわゆる「オレオレ証明書」であることに注意。今回使用するSSLは暗号化が目的なのでサーバ証明は行わない。

8.Postfix + バーチャルドメイン

今回は必要がなかったので設定しなかったが MySQLやPostfix Adminと組み合わせるとバーチャルドメインにも対応できる。
参考:
Postfix バーチャルドメインホスティング Howto
Postfix+MySQL+Postfix AdminによるバーチャルSMTPサーバの構築

また他のバーチャルドメインに対応するための組み合わせについても調べてみた。

  1. postfix + courier + mysql + postfixadmin(上記の参考URL参照)
  2. postfix + dovecot + mysql + postfixadmin
  3. postfix + (qmail + vpopmail) + qmailadmin
  4. postfix + V.A.P.E.S <-これは使用例がほとんどない

3についてはローカル配送をqmail + vpopmailで行うようである。qmailから移行する人はこの選択肢もありかも知れない。

9.ついでにimap, squirrelmail

・courier-imapインストール

# aptitude install courier-imap courier-imap-ssl

squirrelmailのインストール

# aptitude install squirrelmail
# /usr/sbin/squirrelmail-configure
設定例は以下参照。
玄箱 Debian で WebMail[SquirrelMail編]

ApacheのDigest認証、一部ファイルは認証しない設定方法

2009年11月26日

ApacheのDigest認証設定を行ったのでそのメモ。

1.ユーザ登録

 レルム名:test_realm
 ユーザ名:admin

# htdigest -c /etc/httpd/.htdigest 'test_realm' admin

2.httpd.conf設定

訳あって「/hoge/noauth.php」のみ認証を行わないように設定する。

<Directory /var/www/hogehoe/html/ >
    Options None
    Order allow,deny
    Allow from all
    AuthType Digest
    AuthName "test_realm"
    AuthUserFile /etc/httpd/.htdigest
    Require user admin
</Directory>

<Location /hoge/noauth.php >
    Satisfy any
</Location>

「Satisfy any」の意味は以下の通り。引用元

デフォルトの動作 (All) はクライアントがアドレスによる アクセス制限を満たし、かつ正しいユーザ名とパスワードを入力することを 要求します。Any では、クライアントはホストの制限を満たすか、 正しいユーザ名とパスワードの入力をするかをすればアクセスを許可されます。

Debian(lenny)にproftpdインストール・設定

2009年11月4日

1.基本ポリシー

  • 特定ユーザのみFTPアクセス可能
  • 特定ディレクトリより上位の階層へのアクセス不可
  • LIMITディレクティブでなくTcpWrapperによるIPアドレス制限

2.proftpdのインストール

xinetd経由で使用する。

$ sudo aptitude install xinetd
$ sudo aptitude install proftpd
$ cat /etc/xinetd.d/ftp
service ftp
{
        disable         = no
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = root
        log_on_success += DURATION USERID
        log_on_failure += USERID
        server          = /usr/sbin/proftpd
}
$ sudo /etc/init.d/xinetd restart

3./etc/proftpd/proftpd.confの設定

adminユーザは /var/www/htmlをホームとする。
それ以外のユーザはデフォルトホーム(/home/hogeなど)。
許可するユーザはadminとadmin2。

・・・
DefaultRoot /var/www/html admin
DefaultRoot ~
・・・
<Limit LOGIN>
  Order allow,deny
  AllowUser admin,admin2
  Deny all
</Limit LOGIN>

注意しなくてはいけないのが、以下のようにIPアドレス制限と組み合わせると「または」になってしまう。
しかもapacheのIP制限と記述が似ているがproftpdの場合、条件にマッチした時点で評価終了となりapacheとは動作が異なる。

<Limit LOGIN>
  Order allow, deny
  Allow from 192.168.0.0/24
  Deny from all
</Limit LOGIN>

つまり、「admin,admin2」からのアクセスまたは「192.168.0.0/24」からのアクセス許可となる。
mod_ifsessionなどと組み合わせれば「あるユーザを特定の IP アドレス範囲からだけログインできるように制限できる」らしい。参考
めんどいのでTcpWrapperでIPアドレスの制限は行う。

4.TcpWrapperによるアクセス制限

すべて拒否してから、許可するサービス、IPを記述。

/etc/hosts.deny

ALL: ALL

/etc/hosts.allow

sshd: 192.168.0.0/255.255.255.0
proftpd: 192.168.0.0/255.255.255.0 192.168.1.0/255.255.255.0

PASV(パッシブモード)対応

PASV(パッシブモード)に対応できるようiptables設定。

# modprobe nf_conntrack_ftp
# cat /etc/modules
・・・
nf_conntrack_ftp

※kernel-2.6.20から、ip_conntrack*関連が nf_conntrack*に置き換わっているので注意。

6.接続拒否ユーザの設定

/etc/ftpusersに接続を拒否するユーザを記述。これはPAMの段階で拒否される。/etc/pam.d/proftpdをみると以下の記述がある。

auth       required     pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

CentOS 5.4にvsftpインストール・設定

2009年11月1日

1.基本ポリシー

  • 特定ユーザのみFTPアクセス可能
  • 特定ディレクトリより上位の階層へのアクセス不可
  • TcpWrapperによるIP制限

2.vsftpdインストール

# yum install vsftpd

3./etc/vsftpd/vsftpd.confの設定

# 匿名アクセス禁止
anonymous_enable=NO
# アスキーモード有効
ascii_upload_enable=YES
ascii_download_enable=YES
# シグニチャ隠蔽
ftpd_banner=Welcome to blah FTP service.
# デフォルトでホームの上位はみせない(chroot()する)
chroot_local_user=YES
# chroot_local_user=YESの場合、
#  chroot_list_enable=YES : chroot_listには上位を見せてよい(chrootしない)ユーザを記述
#  chroot_list_enable=NO  : すべてのユーザがchroot()する
chroot_list_enable=YES
# chroot_list_enable=YESなので、ここには上位を見せてもよいユーザを記述する。
chroot_list_file=/etc/vsftpd/chroot_list
# リカーシブ操作(サブフォルダを含む一括アップロード・ダウンロード)を許可
ls_recurse_enable=YES
# /etc/vsftpd/user_listの使用(アクセス許可または拒否)
userlist_enable=YES
# userlist_enable=YESの場合、
#  userlist_deny=YES :アクセス拒否するユーザをuser_listに記述する
#  userlist_deny=NO  :アクセス許可するユーザをuser_listに記述する
userlist_deny=NO
#pamによる認証を行う
pam_service_name=vsftpd
# ユーザーごとの設定ファイルを有効にする。
user_config_dir=/etc/vsftpd/vsftpd_user_conf
#タイムスタンプ時間をローカル時間にする
use_localtime=YES
#TcpWrapper有効
tcp_wrappers=YES

4./etc/vsftpd/user_listの設定

userlist_deny=NOなので、/etc/vsftpd/user_listにはアクセス許可するユーザを記述する。

admin

5./etc/vsftpd/ftpusersの設定

アクセス拒否するユーザを記述。
※/etc/vsftpd/user_listよりも優先される。ftpusersはPAM認証の際、アクセス拒否リストとして使用される。
/etc/pam.d/vsftpdに以下の記述がある。

auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

/etc/vsftpd/ftpusersの内容は以下。このユーザはアクセス拒否される。

root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

6./etc/vsftpd/chroot_listの設定

chroot_list_enable=YESなので上位ディレクトリを見せてもよいユーザを/etc/vsftpd/chroot_listに指定できる。今は上位ディレクトリへのアクセスを許可するユーザはいないので、これは空にする。

7.ユーザごとのホームディレクトリ設定

adminのホームディレクトリを指定する。以下の設定により、adminはログインすると/var/www/htmlがホームディレクトリとなる。

# mkdir /etc/vsftpd/vsftpd_user_conf
# cat /etc/vsftpd/vsftpd_user_conf/admin
local_root=/var/www/html

※/etc/vsftpd/vsftpd_user_conf/USERNAMEには、vsftpd.confに記述できるオプションが指定できる(listen_addressなどの一部オプションは無効)。

次に/var/www/htmlの作成(存在しない場合)とパーミッションの設定を行う。

# mkdir /var/www/html
# chown admin:admin /var/www/html

8.PASV(パッシブモード)対応

PASV(パッシブモード)に対応できるようiptables設定。

# modprobe ip_conntrack_ftp
# cat /etc/sysconfig/iptables-config
・・・
IPTABLES_MODULES="ip_conntrack_ftp"
・・・

※kernel-2.6.20から、ip_conntrack*関連が nf_conntrack*に置き換わっているので注意。

9.TcpWrapperによるアクセス制限

すべて拒否してから、許可するサービス、IPを記述。

/etc/hosts.deny

ALL: ALL

/etc/hosts.allow

sshd: 192.168.0.0/255.255.255.0
vsftpd: 192.168.0.0/255.255.255.0 192.168.1.0/255.255.255.0

10.起動

# /etc/init.d/vsftpd restart
# chkconfig  vsftpd on