google

最近のトラックバック

他のアカウント

Powered by TypePad

メイン

2008年4月

2008年4月26日 (土)

はじめに ~ Gentoo Linux で 自宅サーバのすすめ

タモチャンドットコムの自宅サーバは今3世代目。2世代目から新しくサーバを立ち上げようと思ったのは単にハードディスクが調子が悪くなったからで す。じゃあせっかくだからソフトウェアRAIDでいいからRAID1を組んで・・・。それで俺もとりあえず安心、ということでした。

OSは何にしようか、というところで悩みました。最初はRedHatっぽいFedora Coreか、学生時代使っていたKONDARA Linuxを引き継いだMOMONGA LINUXか。旧ブログにその辺を書いたところK.O.や鬼軍曹(←大学時代の俺のLinux軍曹、いや先輩)がGentoo(ジェンツー、と読むらし い)Linuxがお勧め、だと。

Gentoo Linuxとは何ぞや、と。立ち読みした(後に購入)「はじめてのGentoo Linux(ソフトバンクパブリッシング・田中秀樹著)」によると、”日曜大工的OS”だとか、”インストールの難しさ=楽しみの源”だとかと書いてあ る。もののホームページによると、「Portageは馬鹿RPMと違って超楽、でもコンパイルに時間がかかる。まして、OSのインストールなど少なくとも 3日はかかる。」あ、そう。そんなにおれはひまじゃないぞ。日曜だって場合によっては仕事してんだぞ、と思って会社で(こっそり)でたばかりの Fedora Core 4のイメージを焼いた。

しかし、鬼軍曹にあおられてしまった・・・Fedoraにすることをブログで告げると「つまんねぇ」と。そのまま俺はアドレスバーにうったのだった。
http://www.gentoo.gr.jp/
と・・・

回線

思い立ったが吉日!さあ,いきなりはじめます.まずは家にインターネットを引きましょう.これを見てるなら,多分もう引いてあるでしょう.でも,本 格的にサーバを立てたいのなら,常時接続が基本.フレッツADSL・ISDN,あるいはフレッツ光などがいいのではないでしょうか.私はフレッツ光,マンションタイプにしました.これから先は,フレッツ光であることを前提に話を進めさせていただきます.

フレッツ光・マンションタイプでは光回線終端装置は外にあり、そこから既設の電話線でVDSLを引くので工事という工事はないのですが、たとえばインターフォンと電話を共用するような設備がある場合は工事が必要です。

ちなみに実家にいるときはBフレッツ(今はもう死語?)ファミリータイプでした。申し込んでから1ヶ月強で工事をしてくれました.工事は1時間ぐら いで終わりました.青い光ファイバを外から引っ張って,屋内にある光終端装置につける程度の工事です.速度は速いときで5Mbpsぐらいでした.遅いよう な気がしますが・・・.ADSLよりは劇的に早くなったので良しとします.

ルータ

ブロードバンドルータを決めます.自宅サーバ運営で必要な機能は

  • 静的IPマスカレード
  • ファイアウォール機能
  • PPPoE接続機能

しかも,ブロードバンドの場合は

  • 高スループット

も考慮に入れる必要があります.私はマイクロ総合研究所製のものにしました.設定が少々面倒くさいところがありますが,パケットフィルタリングが細かく設定できるところが嬉しいです.高機能,高スループットで最高のルータだと思います.

現在では無線LAN内蔵のものなど様々ですが、自宅サーバ運営で必要な機能はほぼ標準でついているといってもいいので、今お持ちのもので十分可能だと思います。

プロバイダ

プロバイダは固定IPをくれるところがいいです.今は結構増えてきています.最近では1IPなら格安で固定IPをもらえます。http://www.flatray.com/static-ip/index.htmlに,固定IPを提供しているプロバイダの一覧があります.

私は朝日ネットと契約しています。本当に安いし、しかし安定しています。地方に住んでいる方は地方限定のプロバイダが格安で提供している場合もあるので、そちらもチェックしてみるとよいかもしれません。

将来的にはたくさん固定IPを、しかも格安でもらえるような環境になってもらいたいものです・・・。

ただ、今はダイナミックDNS(DDNS)という仕組みもあり、必ずしも固定IPが必要というわけではありません。これは、プロバイダと再接続した 際に、固定IPじゃないと接続のたびにIPが変わってしまう事もあるのですが、この変ったIPを常にDNSに通知しつづける機能です。

ドメイン名

ドメイン名を取ります.私はお名前.comでとりました..jpドメインでなければ意外と格安で手に入ります。

ドメイン名取得はSEO的も有利ですし、とにかく格好いい!「いやぁ~メールアドレス短いでしょ。」なんていうことも・・・。固定IPなら、持っておくことをお勧めします。

SEO的見地からすると、あまりこだわりがないのであればキーワードを盛り込んだドメイン名がいいでしょう。たとえば「linux- server.com」「zitaku-server.com」「gentoo-server.com」など。お店経営でしたら「nihonsyu- kan.com」「flower-house.com」など。でも通常は自分の名前や、サイトの名前にこだわった名前を付けるでしょう。

もし,DNSを管理するのが面倒ならば,DNS登録も同時にやってくれるレジストリがあるので,そこを狙うのがいいでしょう.独自ドメイン取得情報は参考になります.

本体

Gentoo Linuxをインストールするサーバ機のスペックを紹介します。

  • Dell Dimension XPS T550改
  • CPU : PentiumIII 550MHz
  • Mem : 192MB
  • HDD : 20GB × 2 (Software RAID1)

かなりの低スペック。でも、自宅サーバならこれくらいでもかなり動きます。ご自宅に眠っている廃マシン+秋葉原で購入した安いパーツを集めれば一台 完成です。私はオークションで購入しました。ネットワークの速度にこだわりたければGigabit Ethenetカードを用意するといいでしょう。1,500円くらいで購入できます。本体の大きさは特に拡張するつもりが無ければ小さいほうがいいと思い ますし、なるべく静音のほうがいいです!!うるさいと眠れない・・・。

RAIDを組みたい場合は同じ製品を2台そろえたほうが無難でしょう。また、今回はSoftware RAIDにしましたが、ハードウェアで行ったほうがそれはいいと思うので、raidカードの購入をお勧めします。ただ、Linux対応ドライバがあるかを 確認してから購入しましょう。

瞬停も含めて、停電がおきやすい地域であれば、無停電電源装置の購入をお勧めします。自宅サーバでも、一応サーバですので・・・。

OS

Linux,特に今回はGentoo Linuxにします.Linuxは製品版ではない、ほとんどの場合,OSもサーバソフトウェアも無料です.Windowsはセキュリティ面でちょっと不安があります.世界的に見ても,UNIXベースのサーバのほうが圧倒的に多いと思いますから,Linuxに慣れることはのちのち有利になるかもしれません.

Linuxにはディストリビューションと 呼ばれる、いわばパッケージングされたLinuxが多数存在します。Gentoo Linuxはソフトウェアを1からコンパイルして最適化を好んだディストリビューションです。ですがコンパイルに時間がかかる!しかしそれに代えがたい Portageという強力なパッケージ管理を行える仕組みがあるので、選んだ次第です。ほかにもたくさんありますので、自分に最適だと思うディストリ ビューションを探してみてください。

提供するサービスとそのサーバソフトウェア

  • DNS:BIND9.0
  • FTP:vsftpd
  • SSH:OpenSSH
  • Web:Apache2.0
  • メール:PostFix&Courier-IMAP
  • プロキシ:squid
  • NTPサーバ:ntpd

とします.telnetはセキュリティ上提供しません.ソフトウェアは世界標準といっても過言ではないものを選んでいます.使われていないものを 使っても将来役に立たなさそうですから・・・.FTPとメールサーバに関しては人気が結構分かれるところなので、設定しやすそうなものを選んでみてくださ い。

OS - Gentoo Linuxのインストール

さて、Gentoo Linuxのインストールをはじめるのですが、とりあえずインストールCDをダウンロードします。CDのみでインストールする方法と、インストールCDは とっても小さい容量で、ネットワークを利用しながら、その都度必要なパッケージをダウンロードしながらインストールする方法があり、それぞれで必要なCD が異なります。今回はネットワークを利用したインストール方法を採用します。2.c. GentooインストールCDをダウンロードして、CDに焼いて、ブートしますからイメージをダウンロードします。

インストールCDからブートすると・・・いきなりコマンドライン面が。いまどきコマンドうってインストールか・・・。とびびります。さらに、カーネル指定にキーマップを日本にしないとキーボード配列がおかしくて、非常に作業しづらくなります。

boot:gentoo dokeymap
>> Loading keymaps...
Please select a keymap from the following list by typing in the
appropriatename or number.
Hit Enter for the default "us/41" US English keymap.
...
<< Load keymap: jp

起動して、

livecd root#

が出たら準備完了。通常なら、1. Gentooをインストールするにしたがって行っていけば大丈夫、かと思います。

なお、Gentoo Linuxは用途?目的?によってインストールの方法が若干異なります。インストールの段階がStage1,2,3とあり、どの段階からはじめることも可 能です。Stage1ががっつりカスタマイズ派、Stage3は簡単インストール派、みたいな感じです。2.b. GentooインストールCDを 参考にしてください。ぼくはStage1から始めましたが、Stage2でなんだかんだとコンパイルしなければならず、恐ろしく時間がかかり、インストー ル完了まで本当に3日かかりました。本当はそんなに時間がかからないのですが、コマンドうって放置、コマンドうって放置、ということを繰り返さないといけ なくなるはずです。おそらくStage3でもいいでしょう・・・おそらく。

今回行ったイレギュラーな物としては、Software RAID1を組んだ、というところでしょうか。まず、パーティションの切り方を決定します。

  • / 3GB
  • /var 5GB
  • /usr 3GB
  • /home 8GB
  • swap 128MB

/varと/homeは後々のことを考えて,分けたほうがいいです./varにはログとメール,/homeにはユーザのデータが記憶されています. swapはメモリと同じぐらいの大きさをとります.また、Gentoo LinuxにはPortageという、強力なパッケージ管理を行うシステムがあるのですが、これは/usrまたは/varでパッケージを管理するので、少 し多めに取っておきます。/usrか/varは後で設定可能ですが、デフォルトは/usrです。

つぎに、パーティションを切り、Gentoo/x86 インストールの Tips & Tricksを参考にして、RAIDの設定を行います。

livecd linux # modprobe raid1
livecd linux # mknod /dev/md0 b 9 0 ←/dev/md0の作成
livecd linux # mknod /dev/md1 b 9 1
livecd linux # mknod /dev/md2 b 9 2
livecd linux # mdadm --create /dev/md0 --level=1 --raid-devices=2 \
/dev/hda1 /dev/hdb1 ←raid作成
livecd linux # mdadm --create /dev/md1 --level=1 --raid-devices=2 \
/dev/hda2 /dev/hdb2
livecd linux # mdadm --create /dev/md2 --level=1 --raid-devices=2 \
/dev/hda3 /dev/hdb3
livecd linux # mdadm --detail --scan > /etc/mdadm.conf
↑confファイルの書き出し
livecd linux # reiserfsck --check /dev/md0 
↑ちゃんとできてるかをチェック。ここではreiserfs使用
livecd linux # reiserfsck --check /dev/md1
livecd linux # reiserfsck --check /dev/md2
livecd linux # mount /mnt/gentoo/ /dev/md2
livecd linux # mount /mnt/gentoo/boot /dev/md0
livecd linux # mkswap /dev/md1
livecd linux # swapon /dev/md1
livecd linux # cp /etc/mdadm.conf /mnt/gentoo/etc/mdadm.conf
↑confファイルのchroot後用コピー
livecd linux # mknod /mnt/gentoo/dev/md0 b 9 0 
↑/dev/md0のchroot後用作成
livecd linux # mknod /mnt/gentoo/dev/md1 b 9 1
livecd linux # mknod /mnt/gentoo/dev/md2 b 9 2

そして、chroot。さらに、GRUBの設定を以下のように行います。まず、grub.confの設定です。

default 0
timeout 30
splashimage=(hd0,0)/grub/splash.xpm.gz
#通常起動用
title=Gentoo Linux 2.6.11-gentoo-r11
root(hd0,0)
kernel /kernel-2.6.11-gentoo-r11 root=/dev/md2
#hdbが破壊したとき用
title GentooLinux 2.6.11-gentoo-r11 raclass-critics-hda
root(hd0,0)
kernel /kernel-2.6.11-gentoo-r11 root=/dev/hda2
#hdaが破壊したとき用
title GentooLinux 2.6.11-gentoo-r11 raclass-critics-hdb
root(hd1,0)
kernel /kernel-2.6.11-gentoo-r11 root=/dev/hdb2

つぎにMBRにgrubをインストールします。

livecd linux # grub
grub> root (hd0,0)
grub> setup (hd0)
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

また、インストールの締めの部分でアンマウントするところがあるインストールの締めの部分でアンマウントするところがあるのですが、私がやったときになかなかうまくいきませんでした。なので、無理やりはずしました。

livecd linux # umount /mnt/gentoo/home /mnt/gentoo/boot /mnt/gentoo/proc 
livecd linux # umount -d /mnt/gentoo

ネームサーバ BIND9

では,いよいよソフトウェアを入れていきます.まずはDNSを担当するBINDを入れていきます.BINDはバージョン9を入れます.

# emerge bind

BIND9は内部からは内部向けの名前引き、外部からは外部向けの名前引きをしてくれます.これが,IPアドレスを一つしかもらえないホームサーバ にとってはありがたいからです。たとえばこれが行えないと、自宅内から自分のサーバの名前解決を行おうとすると外部向けのIPアドレスが返ってきて、アク セスができなくなるからです。/etc/named.confには以下のような設定を行ってみます。

options {
//辞書ファイルをどこに置くか?
directory "/var/bind";
};
//対内部用名前引きの設定
view "internal"{
//この設定をどのIPに効かせるか
match-clients {192.168.0.0/24; 127.0.0.0/8;};
recursion yes;

zone "." IN {
type hint;
       file "named.ca";
};
//ローカルホスト順引き
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
//ローカルホスト逆引き
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
//内部LAN用順引き
zone "tamochan.com" IN{
type master;
notify no;
file "tamochan.com.local.zone";
};
//内部LAN用逆引き
zone "0.168.192.in-addr.arpa" IN{
type master;
notify no;
file "0.168.192.rev";
};
};

//外部公開用
view "external"{
match-clients {any;};
recursion no;

//外部用順引き
zone "tamochan.com" IN{
type master;
notify no;
file "domain";
};

};

外部用の逆引きは,プロバイダの都合上,してくれないので,記述していません.

個々の辞書ファイルですが,外部向きの設定ファイル(上の設定ファイルに合わせると,/var/bind/domain)は、

$TTL 43200
@         IN      SOA     dns.tamochan.com.       tamori.tamochan.com.    (
                                                  2002022501;serial
                                                  28800;refresh
                                                  14400;retry
                                                  3600000;expire
                                                  86400;minimum   )
dns       IN    A       211.133.147.90
@         IN    NS      dns.tamochan.com.
//メールサーバ
@         IN    MX 10   mail.tamochan.com.
//エイリアスの設定
www       IN    CNAME   dns.tamochan.com.
ftp       IN    CNAME   dns.tamochan.com.
mail      IN    CNAME   dns.tamochan.com.

ちなみに、内部向けDNSは、外部向きの設定ファイル(上の設定ファイルに合わせると,/var/bind/tamochan.com.local.zone)は、

$TTL 43200
@       IN      SOA     dns.tamochan.com.       tamori.tamochan.com.    (
                                                2005071401
                                                28800
                                                14400
                                                3600000
                                                86400   )
dns       IN    A       192.168.0.***
@         IN    NS      dns.tamochan.com.
@         IN    MX 10   mail.tamochan.com.
www       IN    CNAME   dns.tamochan.com.
ftp       IN    CNAME   dns.tamochan.com.
mail      IN    CNAME   dns.tamochan.com.

細かい部分は他所に譲るとして,結構重要なのは,上で行くとserial.これはシリアル番号で,変更を行った際には必ず,さらに大きな番号をつけておきます.変更した日付(YYYYMMDD)+2桁の通し番号としておくと,大きな番号になっていきます.また,忘れがちなのがdns.tamchan.com.の最後のピリオド.本当に忘れます.

あとは、

dns # rc-update add named default

とし、起動時に自動的にデーモンも起動するようにしてください。

また、セカンダリDNSを用意します。tamochan.comでは xname.org を使っています。ここは、利用無料で、しかもプライマリDNSとしても利用可能です。

まず、トップページのLoginの下のcreate a new userをクリックします。入力フォームが現れますので、

  • login(アカウント名)
  •  
  • your valid email(メールアドレス)
  •  
  • new password(パスワード)
  •  
  • confirm password(パスワードを再入力)
  •  
  • Advanced interface(これにだけチェックを入れる)
  •  
  • I have read and I understand・・・(使用許諾。チェックを入れる)

を入力します。メールが届きますので、指定されたURLをクリックすると本登録されます。

本登録後、トップページのLoginにアカウント名、パスワードを入力してログインします。画面上部のCreate zoneをクリックし、

  • zone→ドメイン名を入力
  • secondaryを選択
  • Createをクリック、別画面に遷移
  • modification interfaceをクリック
  • primary name server IP→自分のDNSのIPを入力
  • allow transfers from→Master onlyを選択
  • Modifyをクリック

これで、セカンダリの設定が終了です。Modifyクリック後、設定を追加する部分が表示されるので、指示に従って/etc/bind/named.comと/var/bind/domainを書き換えます。

数時間後、画面上部のView zoneをクリックし、serialが現在のシリアル番号になっていれば正常に動作しています。

以上、設定したらドメインのレジストリ(ドメイン名を取ったところ)に、自分のDNSとセカンダリDNSを登録します。お名前.comでは「サービス設定」の「ネームサーバー登録」で登録します。これで自分のドメインの問い合わせは自分のところにくるようになります。

FTPサーバ vsftpd

RedHatで構築時にはProFTPDでしたが、別なソフトウェアも試してみようということで今回はvsftpd(very secure ftpd)。名前がいいよね。とっても安全ってところが。

# emerge vsftpd

で、vsftpdをインストールします。そうすると、/etc/vsftpd/vsftpd.confなる設定ファイルが出現するので、それを編集します。特に注意すべきところを書きに記します。

# デーモンとして立ち上げるときは下記2行をYESとします。
background=YES
listen=YES

# anonymousを拒否するので、NOとします。
anonymous_enable=NO


# Make sure PORT transfer connections originate from port 20 (ftp-data).
# タモチャンドットコムではパッシブモードを推奨なのでNO
connect_from_port_20=NO
# かわりに、下記を記述
pasv_enable=YES
pasv_address=192.168.0.20
listen_port=21
pasv_min_port=10020
pasv_max_port=10024

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# /etc/vsftpd/vsftpd.chroot_listに記述されているユーザ以外は、
# 自分のホームディレクトリ以上には移動できないようにする。
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

ちなみに、設定ファイル内で指定した/etc/vsftpd/vsftpd.chroot_listは、ただ、ユーザ名を列挙すればいいものです。

tamochan
tamori
tamo

設定後、rc-updateを用いて、デーモンが起動時にも自動的に起動するようにします。

dns # rc-update add vsftpd defau

FTPサーバ ProFTPD

第2世代目のRedHat Linux時代の情報です。

FTPサービスを実現するソフトウェアにProFTPDがあります.RPMでインストールすると設定ファイルは/etc/proftpd.confです.この設定を見ていきます.

# This is the ProFTPD configuration file
# 起動時に最初に表示させるメッセージ
ServerIdent                     on "tamochan.com FTP Server ready."
#アドミニストレータのメールアドレス
ServerAdmin                     root@tamochan.com
#ined経由で起動するので,standaloneではなくて,inetd
ServerType                      inetd
DefaultServer                   on

# Use pam to authenticate by default
AuthPAMAuthoritative            on

# Do not perform ident lookups (hangs when the port is filtered)
IdentLookups                    off

# Port 21 is the standard FTP port.
Port                            21

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                           022

# Chmod isn't allowed by default
#AllowChmod                     on

# Default to show dot files in directory listings
LsDefaultOptions                "-a"

# See Configuration.html for these (here are the default values)
#MultilineRFC2228               off
#RootLogin                      off
#LoginPasswordPrompt            on
#MaxLoginAttempts               3
#MaxClientsPerHost              none

# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances                    30
# Set the user and group that the server normally runs at.
User                            nobody
Group                           nobody

# Normally, we want files to be overwriteable.
<Directory /*>
  AllowOverwrite                on
</Directory>

#anonumous(匿名)は受け付けないようにするため,コメントアウト.
# A basic anonymous configuration, no upload directories.
#<Anonymous ~ftp>
  # Uncomment the following line to allow anonymous access
  #RequireValidShell            off
#  AllowChmod                   off

#  User                         ftp
#  Group                                ftp
#  AccessGrantMsg               "Anonymous login ok, restrictions apply."

  # We want clients to be able to login with "anonymous" as well as "ftp"
#  UserAlias                    anonymous ftp
#
  # Limit the maximum number of anonymous logins
  #  User                         ftp
#  Group                                ftp
#  AccessGrantMsg               "Anonymous login ok, restrictions apply."

  # We want clients to be able to login with "anonymous" as well as "ftp"
#  UserAlias                    anonymous ftp
#
  # Limit the maximum number of anonymous logins
#  MaxClients                   10

  # We want 'welcome.msg' displayed at login, '.message' displayed in
  # each newly chdired directory and tell users to read README* files.
#  DisplayLogin                 welcome.msg
#  DisplayFirstChdir            .message
#  DisplayReadme                        README*

  # Limit WRITE everywhere in the anonymous chroot
#  <Limit WRITE>
#    DenyAll
#  </Limit>

#</Anonymous>

FTPはinetdを経由して起動します.inetdとは,一つのプロセスでいろんなポートを見張っていて、クライアントからの通信が来た場合に初 めてサーバを実行してくれる便利な仕組みのことです.そこで次に,このinetdの設定をします.RedHatでは,inetdのさらに強力な管理機能を 持つxinetdになっています.設定ファイルは/etc/xinetd.d/proftpdです.

# default: off
# description: The ProFTPD FTP server serves FTP connections. It uses \
#       normal, unencrypted usernames and passwords for authentication.
service ftp
{
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/in.proftpd
        log_on_success          += DURATION USERID
        log_on_failure          += USERID
        nice                    = 10
        disable                 = no
}

曲者はdisableでしょうか.デフォルトではyesになっていますが,noにしないと,起動しません.

Webサーバ apache

Apacheはいわずと知れたウェブサービスを提供するソフトウェアです.今では最新版として2.0が出ています.インストール後,デーモンを立ち 上げ,127.0.0.1にアクセスするとすぐに「It worked!」などという画面がすぐに出てくれます.ただ,外部に公開するにはいくつか設定を変更しなくてはなりません.まず、 /etc/apache2/httpd.confの変更するべき一部を抜粋して紹介します.

# emerge apache2

でインストールして、設定です。emerge apacheとすると、apache1がインストールされるので注意してください。ここはお好みです。

#サーバの管理者のメールアドレス
ServerAdmin webmaster@tamochan.com
#サーバの名前
ServerName www.tamochan.com
#http://www.tamochan.comのルートディレクトリ.まずはじめに参照するディレクトリ.
DocumentRoot "/home/webmaster/public_html"    

#/home/*/public_htmlの設定.CGIやSSIが動くようにしてある.
<directory home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    #CGIの実行を許可
    Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI
  #SSIの実行を許可
    Options +Includes
    <Limit GET POST OPTIONS PROPFIND>
    Order allow,deny
    Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS PROPFIND>
      Order deny,allow
      Deny from all
    </LimitExcept>
</Directory>

#CGIのファイルを設定   
AddHandler cgi-script .cgi
#SSIのファイルを設定
AddType text/html .shtml
AddHandler server-parsed .shtml

#790行くらい。
DefaultLanguage ja

#815行くらい。AddLanguageがたくさん並んでるが、jaを一番上に。
AddLanguage ja .ja

#850行くらい。jaを先頭に。
LanguagePriority ja en ca cs da de el eo es et fr he hr it ko
ltz nl nn no pl pt pt-BR

#870行くらい。ISO-8859-1をコメントアウト。
#AddDefaultCharset ISO-8859-1
#Charsetはhtmlファイルを優先にする。
AddDefaultCharset Off

#一番最後。バーチャルホストの設定は/etc/apache2/vhosts.d/vhosts.confに書く。
#
# Gentoo VHosts
#
# For Gentoo we include External Virtual Hosts Files.
# Please see vhosts.d/00_default_vhost.conf for the default virtual host.
#
Include /etc/apache2/vhosts.d/vhosts.conf

次に、後述するバーチャルホストの設定を行います。/etc/apache2/vhosts.d/vhosts.confで、

#バーチャルホストの設定
#まずはNameVirtualHostにサーバのIPを設定
NameVirtualHost 192.168.0.22
#もし,http://tanpopo.tamochan.comでアクセスしてきた場合
#ドキュメントルートは/home/tanpopo/public_htmlに設定
<VirtualHost 192.168.0.22>
    ServerAdmin tanpopo@tamochan.com
    DocumentRoot /home/tanpopo/public_html
    ServerName tanpopo.tamochan.com
    #ログの出力先
    ErrorLog /var/log/httpd/error_log
    CustomLog /var/log/httpd/access_log common
</VirtualHost>

CGIやSSIの設定が少々面倒くさいといったところでしょうか.ユーザに好評なのがヴァーチャルホストの設定.ユーザのホームページがhttp: //***.tamochan.comのような,チルダなしのアドレスで公開できます.ヴァーチャルホストの設定後は,違う名前でもアクセスできるよう に,/var/named/domain(正引きファイル)に,たとえば次の一行を足しておきます.

tanpopo	IN	CNAME	dns.tamochan.com.

また、phpの設定を追加するときは、/etc/apache2/httpd.confで、

#phpモジュールを読む
LoadModule php4_module modules/libphp4.so
#.phpの動作を宣言
AddType application/x-httpd-php .php
#index.phpがデフォルトページになるように
DirectoryIndex index.html index.html.var index.php

SSLを使いたい場合は、まずapache2がSSL対応になっていることが前提です。/etc/make.confのUSEフラグにsslを追加してコンパイルしなおす必要があります。

今回は、サーバが自前で認証局になる方法を紹介します。/etc/apache2/sslなるディレクトリを作成し、そこにサーバの秘密鍵と証明書 要求(CSR)を作成します。/etc/apache2/sslに移動して、まずはserver.keyというサーバの秘密鍵を作ります。

# openssl genrsa -des3 -rand /var/log/messages -out server.key 1024
10441 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
.......................................................++++++
.......++++++
e is 65537 (0x10001)
Enter PEM pass phrase (パスワード入力)
Verifying password - Enter PEM pass phrase: (再度パスワード入力)

次にCSRの作成です。server.csrというファイルで作成します。

$ openssl req -new -key server.key -out server.csr
Using configuration from /etc/ssl/openssl.cnf
Enter PEM pass phrase:(サーバの秘密鍵で入れたパスワード)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:(日本ならと入力)
State or Province Name (full name) [Some-State]:(自分の住所などを入力)
Locality Name (eg, city) []: (入力)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:  (入力)
Organizational Unit Name (eg, section) []: (入力)
Common Name (eg, YOUR name) []: (入力)
Email Address []:  (入力)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(ただEnterを押す)
An optional company name []:(ただEnterを押す)

次にapache2の設定です。/etc/apache2/modules.d/41_mod_ssl.default-vhost.conf で、

・・・・
<IfModule mod_ssl.c>
##
## SSL Virtual Host Context
##

#バーチャルホストの設定。https://でアクセスするとここにアクセスされる。
<VirtualHost 192.168.0.20:443>

#   General setup for the virtual host
DocumentRoot "/var/httpd/https"
ServerName www.tamochan.com:443
ServerAdmin webmaster@tamochan.com
ErrorLog /var/log/apache2/ssl_error_log
<IfModule mod_log_config.c>
        TransferLog logs/ssl_access_log
</IfModule>
・・・・
#CSRファイルのありか
SSLCertificateFile /etc/apache2/ssl/server.csr
#サーバ秘密鍵のありか
SSLCertificateKeyFile /etc/apache2/ssl/server.key

さらに、起動オプションの設定です。/etc/conf.d/apache2 で、ヴァーチャルホスト、SSL、SSLヴァーチャルホストを有効にする設定です。

APACHE2_OPTS="-D DEFAULT_VHOST -D SSL -D SSL_DEFAULT_VHOST"

設定後、rc-updateを用いて、デーモンが起動時にも自動的に起動するようにします。

dns # rc-update add apache2 default

WebDAV

この設定手順はapache1.3用で、第2世代RedHatサーバで行ったものです。

WebDAVとは(簡単に言うと)HTTPでファイル転送を行う,FTPに変わるものと注目されるファイル共有プロトコルです.コネクションが単一 方向なので,どうもファイアウォールでFTPが邪魔される,ということも無くなるようです.また,サーバサイドでの処理,一本のコネクションでの処理とい うメリットもあります.なお,ここで紹介する設定例はapache1.3用です.ご了承ください.

まず,apacheに必要なモジュールが入っているか確認します.mod_so.cが入っていれば利用可能です

% httpd -l
Compiled-in modules:
  http_core.c
  mod_so.c
SUExec: enabled; valid wrapper /usr/sbin/suexec

rpmを探してきてインストールしましょう.パッケージによってはすでに入っていることもあるようです.以下のコマンドで確認してみましょう.私はすでにインストール済みでした.入れた覚えはないのですが….

% rpm -qa | grep mod_dav

いよいよhttpd.confの設定です.

#以下の2行はあらかじめ書いてあるかもしれません
LoadModule dav_module modules/libdav.so
AddModule mod_dav.c

#ロックデータベースの設定.どこに設定してもいいが,ディレクトリに
#httpdプロセスのユーザ権限で書き込み可能でなくてはならない.
DAVLockDB /usr/local/apache/DAVLock

#Aliasの設定.設定した方がいいかも.
#エイリアス先はpublic_html以下はさけた方が無難.
Alias /dav "/home/httpd/davhome"

#指定のディレクトリに対してWebDAV可能にする.
<Location /dav>
DAV on
</Location>

httpdの再起動を忘れずに.ここまででとりあえず可能です.Windowsだと,「ネットワークプレイスの追加」により利用可能です.上の設定 例だとホスト名http://www.tamochan.com/davで設定します.XPだと,ドライブ名を割り当てることもできます.

しかし,ここまでだと誰でもファイルを閲覧可能です.ここで,.htaccessファイルにより認証設定を行います.以下に.htaccessの設定例を示します.

AuthUserFIle /usr/local/apache/pass.pwd #パスワードファイル名.後述.
AuthGroupFile /dev/null #認証用グループファイル
AuthName DAVhome #認証ダイアログ表示用文字列
AuthType Basic #認証タイプ
<LimitExcept GET OPTIONS>
Require user tamochan
</LimitExcept>

GET,OPTIONS以外の操作は認証が必要という設定でした.次にパスワードの設定です.以下のコマンドによりパスワードを入力してください.

% htpasswd -c /usr/local/apache/pass.pwd tamochan

さらに,.htaccessが動くようにhttpdの設定です.httpd.confに以下の設定を加えてください.

<Directory /home/httpd/davhome>
AllowOverride Limit AuthConfig
</Directory>

これで,(WinXPではなく)Win2000ではアクセスすると認証画面が表示されます.WinXPではなぜか認証画面が出ても認証されません.

さらに,このままだと日本語のファイル名を持つものを登録するとファイル名が文字化けしてしまいます.よって,mod_encodingというモジュールを導入します.これはWinXPの認証問題と日本語の問題を一気に解決してくれるものです.

まず,WebDAV Resourcesからソースアーカイブをダウンロードします.適当に展開します.

次にコンパイルですが,まず展開されたディレクトリの直下にlibディレクトリがあるので,そこの中からコンパイルです.

% cd lib
% ./configure
% make
% make install

これについては詳しいことはあまり述べないことにします.次に本体のコンパイルです.

% cd ..
(コメント)apxsというコマンドのパスとiconv_hookライブラリの
(コメント)パスの指定をしてください.
% ./configure --with-apxs=/usr/sbin/apxs --with-iconv-hook=/usr/local/lib
% make
% make install

さらに,httpd.confの設定です.

LoadFile /usr/local/lib/libiconv_hook.so
LoadModule encoding_module modules/mod_encoding.so

<IfModule mod_headers.c>
        Header add MS-Author-Via "DAV"
</IfModule>

<IfModule mod_encoding.c>
        EncodingEngine    on
        NormalizeUsername on
        SetServerEncoding     UTF-8
        DefaultClientEncoding JA-AUTO-SJIS-MS SJIS

        AddClientEncoding "cadaver/" EUC-JP
</IfModule>

httpdを再起動して確認してください.

メールサーバ Postfix

メールサーバソフトウェアにはPostfixを使用しました。第3者中継対応には今回はSMTP AUTHを利用しました。まず、SMTP AUTHに対応したPostfixにするためにはコンパイル前にUSEフラグに saslを追加します。

emergeコマンドでPostfixをインストールしたら、/etc/postfix/main.cfの設定です。saslに関係する部分とスパ ムメール対策が特に注目すべき点です。、ブラックリストに載っているホストやつじつまの合わないヘッダを持つメールをはじく設定などがされています。

#キューをためるディレクトリ
queue_directory = /var/spool/postfix

#メールオーナー
mail_owner = mail

#ホストネーム
myhostname = mail.tamochan.com

#ドメイン
mydomain = tamochan.com

# myorigin パラメータにはローカルで送信されたメールがどのドメインから
# 来るように見えるかを指定
myorigin = $mydomain

#このマシンが自分自身が最終目的地だとみなすドメインのリストを指定
mydestination = $myhostname, localhost.$mydomain, $mydomain,
mail.$mydomain, www.$mydomain, ftp.$mydomain

#エイリアスのファイル
alias_maps = hash:/etc/aliases

#/sbin/newaliacesを実行したとき,どんなデータベースを作るか
alias_database = hash:/etc/aliases

#メールをためるディレクトリ
mail_spool_directory = /var/spool/mail

#このメールシステムがどのクライアントから
#リレーを受けるか、またはどの目的地にメールをリレーするかを制限
relay_domains = $mydestination

#SMTPを受け付けるアドレス
mynetworks = 192.168.0.0/16, 127.0.0.0/8, 211.133.147.90/32

#ユーザの、メールを受ける場所。/home/***/.maildir/以下にメールが保存される。
home_mailbox = .maildir/

#わかんないドメインからのメールは拒否
smtpd_sender_restrictions = reject_unknown_sender_domain

#送信を許可する最大のファイルサイズ
message_size_limit = 1024000

#メールの寿命
maximal_queue_lifetime = 12h

#ここらへんからsmtp auth(sasl)の設定
smtpd_recipient_restrictions = permit_sasl_authenticated,
                               permit_mynetworks,
                               reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = no
allow_mail_to_commands = alias,forward,include

#スパムメール対策。reject_rbl_clientの後ろにかかれている
#データベースに登録されているホストからは受け付けなくなります。
smtpd_client_restrictions = permit_mynetworks,

        reject_invalid_hostname,
        reject_non_fqdn_sender,
       reject_non_fqdn_recipient,
        reject_unknown_sender_domain,
        reject_unknown_recipient_domain,

        reject_rbl_client bl.spamcop.net,
        reject_rbl_client blackholes.mail-abuse.org,
        reject_rbl_client dynablock.wirehub.net,
        reject_rbl_client korea.services.net,
        reject_rbl_client opm.blitzed.org,
        reject_rbl_client relays.ordb.org,
        reject_rbl_client relays.visi.com,
        reject_rbl_client sbl.spamhaus.org,
        reject_rbl_client sbl-xbl.spamhaus.org,

        permit

送信を許可する最大のファイルサイズも設定しておいたほうが,メール爆弾などが送られなくてすみます.マシン起動時にデーモンも起動する設定を行いましょう。

# rc-update add postfix default

次に、SASLでパスワード認証を行えるようにします。/etc/sasl2/smtpd.confを下記のように編集します。

pwcheck_method: pwcheck

pwcheckを起動し、デフォルトでサーバ起動時に自動で立ち上がるようにします。

# /etc/init.d/pwcheck start
# rc-update add pwcheck default

一番トラフィックが多いのはメールになってくると思います.きちんと設定しなければ損害賠償!なってこともあるかもしれないので,慎重に設定をしてください.なお,第三者中継のチェックはhttp://www.nanet.co.jp/rlytest/relaytest.htmlでやってくれますので,公開する前に試してみてください.

スパムメール対策 Spamassassin

あまり望ましくないことですが、運営していると外部にメールアドレスが漏れたりしてスパムメールが頻発してくるようになることがあります。そういうときの強い見方がSpamAssassinです。これをMTAに組み合わせて使うことにより、強力なスパムフィルタにより自動的にスパムメールと思われるメールを廃棄してくれます。今回はデーモン(spamd)を起動しておいて、一回ずつ呼び出して処理するという手法を紹介します。

次に、デーモンとして動かすための準備をします。以下のスクリプトを用意します。(すでに/etc/init.d/spamdとして入っていると思いますが、念のため紹介します。)

#!/bin/sh
#
# spamassassin This script starts and stops the spamd daemon
#
# chkconfig: 2345 80 30
#
# description: spamd is a daemon process which uses SpamAssassin to check
#              email messages for SPAM.  It is normally called by spamc
#        from a MDA.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Source spamd configuration.
if [ -f /etc/sysconfig/spamassassin ] ; then
        . /etc/sysconfig/spamassassin
else
        SPAMDOPTIONS="-d -c -a -m5 -H"
fi

[ -f /usr/bin/spamd -o -f /usr/local/bin/spamd ] || exit 0
PATH=$PATH:/usr/bin:/usr/local/bin

# See how we were called.
case "$1" in
  start)
# Start daemon.
echo -n "Starting spamd: "
daemon spamd $SPAMDOPTIONS
RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/spamassassin
        ;;
  stop)
        # Stop daemons.
        echo -n "Shutting down spamd: "
        killproc spamd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/spamassassin
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  condrestart)
       [ -e /var/lock/subsys/spamassassin ] && $0 restart
       ;;
  status)
status spamd
;;
  *)
echo "Usage: $0 {start|stop|restart|status|condrestart}"
exit 1
esac

exit 0

(このスクリプトをspamdとして保存し実行権限を与え、)デーモンとして起動するようにします。

# chmod +x spamd
# rc-update add spamd default

TLECより、設定ファイルをダウンロードし利用します。これを/etc/mail/spamassassin/local.cfとして保存します。

次に、Postfixのフィルタとしてのスクリプトを用意します。要するに、メールを受け取ったり発信したりする都度にこのスクリプトを実行するようにさせるわけです。様々なHPを参考に、私は以下のようなスクリプトを作成しました。

#!/bin/bash
#SpamAssasin filter with Postfix

#FILE PATH
RM=/bin/rm
INSPECT_DIR=/var/spool/filter
OUTPUTFILE=out.$$

SENDMAIL=/usr/sbin/sendmail
KILLFILE=/var/log/spammail
SPAMASSASSIN=/usr/bin/spamc
#Exit codes from <sysexits.>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

#Move to Work Dir
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist : exit $EX_TEMPFAIL; }

#Clean up when done or when aborting
trap "$RM -f $OUTPUTFILE" 0 1 2 3 15
cat | $SPAMASSASSIN -x > $OUTPUTFILE

#メールのヘッダにspamdによってつけられる"X-Spam-Status: Yes"
#があるなら、KILLFILEに捨てる。
spamflag=`less $OUTPUTFILE | grep -c 'X-Spam-Status: Yes'`
if [ $spamflag = 1 ]; then
cat $OUTPUTFILE >> $KILLFILE
#それ以外なら処理。
else
$SENDMAIL "$@" < $OUTPUTFILE
fi
exit $?

さらに、Postfixのmain.cfに、フィルタの定義を追加します。改行がありますが、実際は一行です。

filter unix - n n - - pipe user=filter argv=/usr/local/bin/sa_filter.sh -f \
        ${sender} -- ${recipient}

次にmain.cfのsmtpの部分を書き換えます。改行がありますが、実際は一行です。

smtp      inet  n       -       n       -       -       smtpd \
        -o content_filter=filter:

Postfixを再起動し、きちんと動作するか確認します。

なお、、spamassassinの学習にも書いたように、最初はspam、ham両方のメールを学習させてください。させないと、うまくベイジアンフィルタが働かないようです。

参考:http://www.sonorilo.net/spamassassin。ありがとうございました。

IMAP/POP3サーバ Courier-Imap

今回はCourier-Imapを使ってみました。前のサーバがmbox方式(1ユーザ1ファイルでメールを扱う)だったので、maildir方式(1メール1ファイルでメールを扱う)に変換しました。変換方式はhttp://asshole.dip.jp/mb2md.phpを参考にしました。

emergeでインストールしたあと、ユーザのディレクトリにメールを扱うディレクトリを作成します。Postfixのmain.cfにかかれている home_mailbox = .maildir/ で指定されているユーザのディレクトリに移動して、

# maildirmake .maildir

を実行します。.maildirが作成されます。今後ユーザのディレクトリが作成されるたびに実行するのが面倒な場合は/etc/skel/(ユーザのディレクトリの雛型)に移動して上記コマンドを実行しておくと便利です。

設定は/etc/courier-imap 下にありますが、ほとんど触らなくても大丈夫です。下記の部分くらいでしょうか。imapd、pop3dファイル内で、

#Hardwire a value for ${MAILDIR}
MAILDIR=.maildir
MAILDIRPATH=.maildir

のように、自分の環境とMAILDIRがあっているか確認してください.

Postfix&Qpopper

ここの記述は第2世代RedHat Linuxでの設定方法です。

一番重要なのがメールでしょう.ここはしっかり設定しないと,スパムメールの発信元などになりかねないので,気をつけます.

tamochan.comは"POP before SMTP"というものを採用しています.SMTPには本来, 認証手続きがないために,外部からのメールのリレーを許可すると,スパムメールのようなメールの不正中継に使われてしまう恐れがあります.だからといって メールのリレーを許可しないと外部からSMTPが使えなくなるので,たとえば自宅にメールサーバがあって,外出先から自宅のアカウントでメールを出した い,なんてときには不便です.そこで,外部のマシンがPOP接続をした場合,その後数分間は同じマシンからの SMTPリレーを許可することで,あたかもSMTPにユーザ認証機能が付いているかのようにするのが"POP before SMTP"です.(一部,PostfixとAPOP,POP before SMTPより引用)

今回はは,SMTPを提供するものにPostfix,POP3を提供するものにQpopper,POP before SMTPを提供するものにはDRACをそれぞれ利用します.

まずはDRACのインストール.http://mail.cc.umanitoba.ca/drac/よりDRACをダウンロードし,解凍します.

% tar xzvf drac.tar.Z

次にDRACのMakefileを編集します.

INSTALL = install
EBIN = /usr/sbin
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C -DREQ_HASH
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
TSTLIBS = -L. -ldrac
RPCGENFLAGS = -C -I
MANADM = 8

rpc.dracd.c を編集します.

#define DBFILE "/etc/postfix/dracd.db"
#define ALFILE "/etc/postfix/dracd.allow"

dracd-setup.linux を編集します.ここでは,POP認証の有効期限を60分に設定しています.

"daemon rpc.dracd&"の行を"daemon rpc.dracd -e 5&"に変更.

コンパイルとインストールを行います.

% make
% make install
% make install-man
% cp dracd-setup.linux /etc/rc.d/init.d/dracd
% ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc3.d/S78dracd
% ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc5.d/S78dracd
% ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc6.d/K22dracd

DRACの最後の仕上げは,Qpopperのインストール時に必要なライブラリを自分でインストールします.

% cp libdrac.a /usr/lib/

つぎは,Qpopperのインストールです.まず,ソースのRPMを探してきて,インストールします.

% rpm -ivh qpopper-4.0.3-0vl1.src.rpm

QpopperをDRAC対応にするため,specファイルを編集します.

% cd /usr/src/redhat/SPECS
% vi qpopper.spec

(%buildセクションに追加)
  --prefix=/usr \
  --enable-bulletins=/var/spool/mail/bulletins \
  --enable-specialauth \
  --with-pam=qpopper \
  --with-popuid=pop \
  --enable-apop=/etc/pop.auth \
  --enable-drac    (←これを追加)

(%preセクションのuseraddにオプションを追加)
/usr/sbin/useradd -M -g pop pop -c "Pop Account" -d /dev/null -s /dev/null

rpmを作成します.

% rpm -bb qpopper.spec

Qpopperの仕上げとして,作ったQpopperをアップデートします.

% cd /usr/src/redhat/RPMS/i386
% rpm -Uvh qpopper-4.0.3-0vl1drac.i386.rpm

いよいよPostfixのインストールです.RPMでインストールすると,設定ファイルは/etc/postfix/main.cfです.それでは見ていきましょう!主なものを抜粋です.

#キューをためるディレクトリ
queue_directory = /var/spool/postfix

#メールオーナー
mail_owner = mail

#ホストネーム
myhostname = mail.tamochan.com

#ドメイン
mydomain = tamochan.com

# myorigin パラメータにはローカルで送信されたメールがどのドメインから
# 来るように見えるかを指定
myorigin = $mydomain

#このマシンが自分自身が最終目的地だとみなすドメインのリストを指定
mydestination = $myhostname, localhost.$mydomain, $mydomain,
mail.$mydomain, www.$mydomain, ftp.$mydomain

#エイリアスのファイル
alias_maps = hash:/etc/aliases

#/sbin/newaliacesを実行したとき,どんなデータベースを作るか
alias_database = hash:/etc/aliases

#メールをためるディレクトリ
mail_spool_directory = /var/spool/mail

#このメールシステムがどのクライアントから
#リレーを受けるか、またはどの目的地にメールをリレーするかを制限
relay_domains = $mydestination

#SMTPを受け付けるアドレス
mynetworks = 192.168.0.0/16, 127.0.0.0/8, 211.133.147.90/32

#POP before SMTPを動かす設定
smtpd_recipient_restrictions =
permit_mynetworks,
check_client_access btree:/etc/mail/dracd,
check_relay_domains

#わかんないドメインからのメールは拒否
smtpd_sender_restrictions = reject_unknown_sender_domain

#送信を許可する最大のファイルサイズ
message_size_limit = 1024000

#メールの寿命
maximal_queue_lifetime = 12h

POP before SMTPを動かす設定を忘れないようにします.また,送信を許可する最大のファイルサイズも設定しておいたほうが,メール爆弾などが送られなくてすみます.

一番トラフィックが多いのはメールになってくると思います.きちんと設定しなければ損害賠償!なってこともあるかもしれないので,慎重に設定をしてください.なお,第三者中継のチェックはhttp://www.nanet.co.jp/rlytest/relaytest.htmlでやってくれますので,公開する前に試してみてください.

プロキシサーバ squid

基本的にはインストールすればすぐに動きますが、メモ程度に。以下の記述をすればプロキシとしての機密性が高くなります。記述を追加する前とあとで診断くんで確かめてみてください。

header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all

ただし、外部に公開する場合は設定をきちんと行うべきです。私は自宅内でしか利用していませんが・・・。

NTPサーバ ntpd

このNTPサーバも、プロキシサーバ同様、ローカルネットワークでしか使用していませんが、LAN内の時刻の同期というのは大事だと思います。たと えば(ハードウェア的に)複数のサーバを動かしていた場合には同期を取っておかないとログの比較などの作業に意味がなくなってきてしまいます。

emergeでntpdをインストール後、/etc/ntp.confに以下の2行を書きます。

server [外部のntpサーバ]
driftfile       /var/lib/ntp/ntp.drift

上記設定は、外部との接続がない場合の簡易的な設定です。公開する場合は(するべきでないが)接続相手の制限などを記述する必要があります。

デーモンを起動する前に、サーバ内の時刻をある程度あわせます。大幅にずれている場合、ntpdを動かしても同期してくれません。以下は、ntpdateを利用した時刻の合わせ方です。

# ntpdate [外部のntpサーバ]

その後、ntpdを起動します。

# /etc/init.d/ntpd start
# rc-update add ntpd default

LANにあるパソコンに桜時計などを入れ、時刻同期を試してみてください。

SSH

リモートでサーバを管理するために,従来はtelnetを使っていました.しかし,telnetは通信内容が暗号化されないため,パスワードなどが 容易に盗聴できました.そこで,SSH(Secure SHell)を採用するところが多くなってきています.パケットをすべてRSAまたはDSAという方法で暗号化して送るため,盗聴しにくくなっています. また,SSHにはポートフォワードという便利な機能もあるため,利用しない手はありません.

RSA方式を採用するものがSSH1,DSA方式を採用するものがSSH2となります.暗号強度的にはDSA方式のほうが有利です.両方に対応しているものがOpenSSHです./etc/ssh/sshd_configが設定ファイルになります.

#       $OpenBSD: sshd_config,v 1.38 2001/04/15 21:41:29 deraadt Exp $

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

# This is the sshd server system-wide configuration file.  See sshd(8)
# for more information.

Port 22
Protocol 2,1
#ListenAddress 0.0.0.0
#ListenAddress ::
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
ServerKeyBits 768
#ポートフォワードなどでつなぎっぱなしにしたいときは0
LoginGraceTime 0
KeyRegenerationInterval 3600
#root(管理者)でのログインを拒否
PermitRootLogin no
#
# Don't read ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes
StrictModes yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd yes
#AllowUsers tamori
#PrintLastLog no
KeepAlive yes

# Logging
SyslogFacility AUTH
LogLevel INFO
#obsoletes QuietMode and FascistLogging

#RhostsAuthentication no
#
# For this to work you will also need host keys in /usr/local/etc/ssh_known_host
s
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
#
RSAAuthentication yes
#平文パスワードの拒否
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no

# Uncomment to disable s/key passwords
#ChallengeResponseAuthentication no

# Uncomment to enable PAM keyboard-interactive authentication
# Warning: enabling this may bypass the setting of 'PasswordAuthentication'
#PAMAuthenticationViaKbdInt yes

# To change Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#AFSTokenPassing no
#KerberosTicketCleanup no

# Kerberos TGT Passing does only work with the AFS kaserver
#KerberosTgtPassing yes

#CheckMail yes
#UseLogin no
#MaxStartups 10:30:60
#Banner /etc/issue.net
#ReverseMappingCheck yes

平文パスワードの拒否はnoにしておいたほうがいいでしょう.クライアントには秘密鍵,サーバ側には自分のホームディレクトリに.sshというディレクトリを作り,中に公開鍵を置きます.

ルータの設定

さぁ,いよいよ外部に公開!そこで最後の仕上げとして,ルータの設定をします.必要な設定は静的NATです.これは,インターネット側から配信され たIPフレームを,プロトコルやポート番号に応じて内部LANの特定のIPアドレスへ転送する機能です.今回はサーバのアドレスを 192.168.0.100として,設定をしてみます.

  • ftp-data 20/tcp -> 192.168.0.100
  • ftp 21/tcp -> 192.168.0.100
  • ssh 22/tcp -> 192.168.0.100
  • smtp 25/tcp -> 192.168.0.100
  • dns 53/tdp -> 192.168.0.100
  • dns 53/udp -> 192.168.0.100
  • http 80/tcp -> 192.168.0.100
  • pop3 110/tcp -> 192.168.0.100
  • imap4 143/tcp -> 192.168.0.100
  • https 443/tcp -> 192.168.0.100

試しに,ポートスキャンをかけてみます.http://210.143.99.143/~p-sec/pscan.htmlからかけてみて,余計なポートは開いていませんか?確認してみてください.

logcheck

日々の管理は,やはり/var/log以下のログを随時チェックすることが大事ですが,膨大なログを,逐一チェックするのは大変に手間のかかる作業です.

しかし,我々には大きな見方がいます.その名はlogcheck.大事なログだけを抜粋して設定時間おきにメールで送ってきてくれます.

RPMで入れて,早速設定します.まず,どのログファイルチェックするかを設定します./usr/bin/logcheck.shを編集します.以下に抜粋を示します.

$LOGTAIL /var/log/messages > $TMPDIR/check.$$
$LOGTAIL /var/log/secure >> $TMPDIR/check.$$
$LOGTAIL /var/log/maillog >> $TMPDIR/check.$$
$LOGTAIL /var/log/router >> $TMPDIR/check.$$
$LOGTAIL /var/log/httpd/error_log >> $TMPDIR/check.$$

次に,どんなログが大事で,どんなログがいらないかを設定します.特に,いらないログを設定することは大事です.一杯送られてきたら意味がないです から・・・.この設定は/etc/logcheck以下にありますが,今回はいらないログの設定を示します./etc/logcheck/ignoreに は,「こんな文字列があるものは,いらない!」という設定をすることができます.

authsrv.*AUTHENTICATE
cron.*CMD
cron.*RELOAD
cron.*STARTUP
ftp-gw.*: exit host
ftp-gw.*: permit host
ftpd.*ANONYMOUS FTP LOGIN
ftpd.*FTP LOGIN FROM
ftpd.*retrieved
ftpd.*stored
http-gw.*: exit host
http-gw.*: permit host
mail.local
named.*Lame delegation
named.*Response from
named.*answer queries
named.*points to a CNAME
named.*reloading
named.*starting
netacl.*: exit host
netacl.*: permit host
popper.*Unable
popper: -ERR POP server at
popper: -ERR Unknown command: "uidl".
telnetd.*ttloop:  peer died
tn-gw.*: exit host
tn-gw.*: permit host
x-gw.*: exit host
x-gw.*: permit host
xntpd.*Previous time adjustment didn't complete
xntpd.*time reset
root 1
named.*Cleaned
named.*USAGE
named.*NSTATS
named.*XSTATS
ntpd.*ntpd
ntpd.*precision
ntpd.*using
ntpd.*frequency
ntpd.*: synchronisation lost
postfix/pickup.*: uid=
postfix/cleanup.*: message-id
postfix/nqmgr.*: from=
postfix/local.*: to=
postfix/smtp.*250
postfix/smtpd.*: connect from
postfix/smtpd.*: disconnect from
postfix/smtpd.*client
sshd.*: Connection closed by
sshd.*: Accepted rsa
PAM_pwdb.*: (login) session opened
PAM_pwdb.*: (login) session closed
named.*bad referral
named.*Lame server on
popper.*: login
popper.*: Stats:
xinetd.*pop3

.* というのはワイルドカードです.上手に利用して,アタックの早期発見を心がけましょう.

最後に,一時間おきにlogcheckを起動します.cronに書いておきます.

% su
% crontab -e
(この行を追加)
00 * * * * /usr/bin/logcheck.sh

SYSLOG機能を利用したルータのログ管理

私の所有するルータには,SYSLOG機能があります.ログを,指定したIPアドレスに送ってくれる機能です.もしルータにこの機能があるなら,絶対に利用するべきです.

ルータの設定は説明書にお任せして,ここではサーバ側の設定を行います./etc/sysconfig/syslogを編集します.

#Options to syslogd
# -m 0 disables 'MARK' messages.
# -r enables logging from remote machines
# -x disables DNS lookups on messages recieved with -r
# See syslogd(8) for more details
SYSLOGD_OPTIONS="-m 0 -r" <-ここを変更
# Options to klogd
# -2 prints all kernel oops messages twice; once for klogd to decode, and
#    once for processing with 'ksymoops'
# -x disables all klogd processing of oops messages entirely
# See klogd(8) for more details
KLOGD_OPTIONS="-2"

SYSLOGD_OPTIONS="-m 0 -r"の"-r"オプションをつけることで外部からのSYSLOGを受け付けるようになります.最後に,SYSLOGデーモンを再起動すると,/var/log/messagesにルータのログが記録されていきます.

% /etc/init.d/syslog restart

Gentoo Linuxの強力なパッケージ管理(emerge と glsa-check)を利用したアップデート

セキュリティホールを埋めるためのアップデートはLinuxでは依存関係なんかがあってとても面倒くさいものだとされてきましたが、Gentoo LinuxにはPortageと呼ばれる仕組みで強力なパッケージ管理がされているため、依存関係をほぼ意識することなくアップデートを行えるようになり ました。ここでは、Portageを利用したアップデートを仕方を紹介します。

# emerge --sync

で更新情報のアップデートを行った後、

# glsa-check -t new
dns home # glsa-check -t new
WARNING: This tool is completely new and not very tested, so it should not be
used on production systems. It's mainly a test tool for the new GLSA release
and distribution system, it's functionality will later be merged into emerge
and equery.
Please read http://www.gentoo.org/proj/en/portage/glsa-integration.xml
before using this tool AND before reporting a bug.

This system is affected by the following GLSA:
200510-26 ←この辺から注目
200601-10
200511-14
200605-02
200605-05

というように、セキュリティ関係でアップデートが必要な情報があった場合、その日付が表示されます。さらに、

# glsa-check -l 200601-10
WARNING: This tool is completely new and not very tested, so it should not be
used on production systems. It's mainly a test tool for the new GLSA release
and distribution system, it's functionality will later be merged into emerge
and equery.
Please read http://www.gentoo.org/proj/en/portage/glsa-integration.xml
before using this tool AND before reporting a bug.

[A] means this GLSA was already applied,
[U] means the system is not affected and
[N] indicates that the system might be affected.

200601-10 [N] Sun and Blackdown Java: Applet privilege escalation
( dev-java/sun-jre-bin dev-java/blackdown-jre dev-java/blackdown-jdk ... )

glsa-check -l yyyymm-dd といった文法で、その更新情報の内容が表示されます。必要だと思われたら、

# emerge -u [更新すべきパッケージ名]

とし、パッケージの更新を行います。cronでglsa-checkを動かしておくと、毎日メールなりで更新情報が届けられます。

Gentoo Linuxに玄人志向のGbE-PCI(VT6122)をインストールした時のメモ

家庭内LANをGigabit Ethernetにした時に、Gentoo Linuxサーバに玄人志向のGbE-PCIをインストールした時でメモです。

GbE-PCIは、 VIA製VT6122を搭載した、玄人志向のギガビットのNICです。1000円で購入でき、性能も比較的高評価です。Gentoo Linuxにもインストール可能ですが、私の場合は結構苦労したので、インストール方法を紹介します。なお、カーネルは2.6.16時の記録です。

まず、ドライバをダウンロードします。
VIA Velocity Family Gigabit Ethernet Driver

解凍したら、解凍したディレクトリに移動して、

# make
# make install

で、コンパイルに成功したらラッキー。しかし、私はコンパイルでエラー発生。その場合は、以下の内容を"patch.txt"として保存します。た だし、改行コードなどは「velocity_main.c」ファイルと同じくしなければなりません。私は、Fedora Core5上のFireFoxでコピーした後、gEditでペーストし、保存しました。

--- velocity_main.orig.c        2005-07-22 10:57:16.000000000 +0200
+++ velocity_main.c     2006-05-17 22:14:14.000000000 +0200
@@ -1957,7 +1957,11 @@
#endif
             if(pci_dev_driver(pcid) == &velocity_driver) {
                 if (pci_get_drvdata(pcid))
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+                    velocity_suspend(pcid, PMSG_SUSPEND);
+#else
                     velocity_suspend(pcid, 3);
+#endif
             }
         }
     }
@@ -2001,7 +2005,11 @@
         velocity_save_pci_context(pInfo, &pInfo->pci_context);
         velocity_shutdown(&pInfo->hw);
         pci_disable_device(pcid);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+  power_status = pci_set_power_state(pcid, pci_choose_state(pcid, state));
+#else
         power_status = pci_set_power_state(pcid, state);
+#endif
     }
#else
     pci_disable_device(pcid);

保存後、

# patch < patch.txt

として、「velocity_main.c」にパッチを当てます。

# make
# make install

で、モジュールのコンパイルとインストールが終了。コンパイルできなければ文字コード、改行コードなどを改めてみてください。

ディレクトリ /etc/modules.autoload.d にあるkernel-2.6のファイルに、

velocityget

の一行を書き込みます。これで、起動時にvelocitygetのモジュールが読み込まれます。

# cd /etc/init.d
# cp net.eth0 net.eth1
# rc-update add net.eth1 default

で、再起動時にeth0とeth1が起動するようにし、

# vi /etc/conf.d/net

で、ネットワークの設定を行います.

# /etc/conf.d/net:
# $Header: /home/cvsroot/gentoo-src/rc-scripts/etc/conf.d/net,v 1.7
# 2002/11/18 19:39:22 azarah Exp $

# Global config file for net.* rc-scripts

# eth0とeth1のネットワークの設定
#
iface_eth0="192.168.0.10 broadcast 192.168.0.255 netmask 255.255.255.0"
iface_eth1="192.168.0.20 broadcast 192.168.0.255 netmask 255.255.255.0"

#ゲートウェイをどうするか。インタフェース/デフォルトゲートウェイ
gateway="eth1/192.168.0.1"

再起動してみて、

# /sbin/ifconfig
eth1      Link encap:Ethernet  HWaddr 00:02:2A:DD:05:45
          inet addr:192.168.0.20  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:85241 errors:0 dropped:0 overruns:0 frame:0
          TX packets:119855 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26372969 (25.1 Mb)  TX bytes:45627488 (43.5 Mb)
          Interrupt:9 Base address:0x1800

とし、「HWaddr 00:02:2A:DD・・・」となっているほうが今回インストールしているVT6122のNICとなります。従来ついているNICと逆転するかもしれま せん(従来ついているのがeth0からeth1になったりする)。場合によっては/etc/conf.d/netを所望の設定になるようにさらに設定しな おします。

ハードウェアの選定

特に電気屋さんで今売っているようなハイスペックな物は必要ありませんが、ルータなので攻撃に備えられるような、それなりの物をそろえたほうがいい かも知れません。すぐにメモリが一杯になっちゃうようなスペックは控えられたほうが吉でしょう。私の使っているマシンのスペックを以下に示します。

  • CPU:AMD Duron(tm) processor 1.3GHz
  • MEM:256MB
  • HDD:20GB
  • NIC:VT6122(玄人志向のギガビットNIC) x 2 & M/BオンボードのNIC(100Mbps) x 1

すべて余りパーツでした。NICは計3枚です。WAN(M/BオンボードのNIC(100Mbps))、DMZ(玄人志向のギガビットNIC)、LAN(玄人志向のギガビットNIC)にそれぞれつながります。

OSのインストール

OSは、今回は手軽さを考えてFedore Core 5を利用しました。もっとも、今回参考にさせていただいたネットワークマガジン2006年5月号がFedora Core 5だったって言うのもあるのですが。

それはともかく、Gentoo Linuxと違って気をつけなくてはならない点は、「インストールが簡単=オートメーション=ブラックボックス化してしまう」ということです。サーバや ルータは「必要なものはインストールしない」「インストールされているものが自分でわかっている」というのが、セキュリティホールを作らないうえで重要だ からです。ですので、いくらインストールが簡単といっても気をつけなくてはならないいくつかの点がありますので述べていきます。

「ネットワークデバイス」では

NIC3枚挿しの場合、ちゃんと認識されていればeth0~eth2が表示されているはずです。とりあえずここでは「起動時にアクティブ」のチェックをはずし、起動時にはアクティブにしないようにします。

「Fedora Core のデフォルトのインストールは・・・」では

「必要のないものはインストールしない」という観点からはとりあえず「オフィスとプロダクティビティ」をチェックし、「即時カスタマイズ」をチェッ クすることで、必要のあるもの、ないものを自分でカスタマイズ可能です。今回必要なものは「iptables」ぐらいなものです。時間がある方はこの部分 をしっかり閲覧して、どのようなものがインストールされるかをチェックしてください。面倒くさい方はある程度お任せでもいいかもしれませんが・・・。

「ファイアウォール」では

「Enabled」になっていることを確認し、すべての「Trusted Services」からチェックをはずします。

「システムユーザー」では

「root」以外のユーザを作ったほうがいいでしょう。作業用ユーザをお好みで作成してください。

ネットワークの設定

OSのインストールに成功し、ランレベル5で