ご家庭でLinuxサーバー♪ Since 2000/04/15 Update 2001/09/11 |
RedHat 7.0版
|
★☆★☆★暫定版ですぅ☆★☆★☆
公開中でも間違いに分かった時点で直していきます。ご注意ください。
2000年4月にRedHat6.1でLinuxの勉強をしながらホームサーバーを立ち上げ、ケーブルモデムを介した常時接続という環境でのファイヤーウォール、IPマスカレード、DNSサーバ、SAMBAとNetaTalkによるWin、Macの共有ディレクトリなどを実現してきました。しかし、2001年2月6日(グローバルIPを取得してわずか数日)にハッキングされトロイを仕掛けられたため、システムを放棄、新規にインストールし直すことにしました。私のような一般人がLinuxサーバーを使いこなすにはまだまだ勉強することがたくさんありますね(笑)。
RedHat6.1インターネットサーバー構築入門(ローカス。ISBN4-89814-095-5)
Linuxメンテナンスブック(ソフトバンク。ISBN4-7973-1030-8)
日経Linux 2000年10月号「コマンド逆引大全」
RedHat6.1ネットワーク構築術(オーム社。ISBN4-274-06364-X)
DNS&BIND(オーム社。ISBN4-900900-91-5)
Linuxサーバー構築運用実践ガイド(日経BP。ISNB4-822-2315-9)
日経バイト 2000年5月号〜8月号「Linuxビ ジネスソリューション」
ネットワーク侵入検知(ソフトバンク。ISNB4-7973-1253-X)
クラッカー迎撃完全ガイドLinux版(インプレス。ISBN4-8443-1360-6)
Tripwire for Linux(オーム社。ISBN-87311-041-6)
マシン環境は
Mother | ASUS P2B-D Rev1.04(Coppermine不可) |
CPU | Pentium II 300 / Dual構成 |
Memory | 256Mb |
Video | Millenium II(推測) |
HDD | IBM DTLA-307030 (30.5GB) / 2台 |
CDROM | NEC (ATAPI、2倍速) |
NIC | Adaptec ANA-6944A/Qualtec TX (100Base-TX/10BaseT) |
SCSI Host | Tekram DC-390(00/09/12追加) |
SCSI HDD | FireBall 1GB (00/09/12追加) |
バージョンを7.0にした理由ですが、旧環境の6.Xを使えば設定をそのまま使えて楽だったのですが、ソフトRAIDを有効にしたインストールではハングアップしてしまうため断念。また、このころリリースされた7.1ならカーネルも新しい(2.4)し、この時点までのエラッタも解決されているので魅力的だったのですが、NICのドライバのtulipが新しいカーネルに合わせて更新されており、これがANA-6944Aをサポートしていないため、これも断念。消去法で7.0に落ち着きました。(実はここまてたどり着くのに1ヶ月半もかかっています(T.T) 災厄としか言いようのないアクシデントが延々と続いたものですから)。
RedHat社のダウンロードページ(http://www.jp.redhat.com/download/)からたどってミラーサイトからISOイメージをダウンロードしました。2枚組の構成です。当時は回線が128Kbだったので一晩かかりました。これをCD-Rに焼き、インストールCDを作成します。 ブータブルCDなので当該機のBIOS設定でCDブート可能にしておき、CDからブートさせます。
※参考にした図書は日経バイト2000年5月〜7月号 「Linux ビジネス・ソリューション」。
実際にインストールする前に、これから構築しようとする家庭内LANの概要を決めておきます。各マシンに与えるIPアドレスとマシンのホスト名。そして、利用するサービスです。IPアドレスは本来インターネットに繋がるすべてのマシンが固有の値を持ち、かち合ってはいけないのですが、それではIPアドレスが足りなくなるので、ローカルネットワーク内に限り、インターネットの世界からは見えないことを前提にローカルアドレスを使うことが認められています。同じIPアドレスが異なるローカルアドレスで使われることになりますが、インターネットの世界からは見えないため、混乱することはありません。
一般的には小規模なLANでは"192.168.X.X"というアドレスがローカルアドレスとして使われています。例えばマシンA="192.168.1.1"、マシンB="192.168.1.2"、マシンC="192.168.1.3"といった風です。わが家では次のような構成になっています。
アドレスの範囲はDNSやホームページの表示(Apache)、共有ネットワークフォルダ(Samba)などで制限を掛けたり許可を与えたりするのに使われるので、まとめやすいような付け方をするべきでしょう。例えば"192.168.A.B"のAの部分はNICごとに。また、Bの部分は自分のマシンは1〜9、家族のマシンは10〜19などと決めると後の設定が楽になります。 また、0と255は特殊な意味を持つため割り振ることはできません。
インストールの種類はカスタムインストールを選択します。バーティションを手動で設定したいので、Fdiskを使います。
マウントポイント | パーティションタイプ | デバイス名 | サイズ |
/boot | Linux Ext2 | hda1 | 101M |
設定しない | Linux Ext2 | hdc1 | 101M |
swap | RAID(hda5,hdc5) | md1 | 258M |
/ | RAID(hda6,hdc6) | md0 | 1004M |
/var | RAID1(hda7,hdc7) | md2 | 1004M |
/usr | RAID1(hda8,hdc8) | md3 | 3004M |
/home | RAID1(hda9,hdc9) | md4 | 23940M |
パッケージグループはPrinter,X-Window, Gnome,SambaServer, WebServer, DNSServer, PostgreSQLServer, Development, KernelDevelopment, Utilitiesにチェックを入れました。あとはインストーラ任せですが、rootのパスワードはできるだけ破りにくいものを入力します。私個人の考えでは家庭サーバーの場合、企業と異なり侵入は外部からが圧倒的に多いと思われますので、複雑なパスワードを作り、それをメモしておくのが現実的ではないかと思います。ネットワークの設定でIPアドレスを入力する項目があります。ルータとして使うのでNIC(イーサネットカード)は2枚以上ささっていると思いますが、インターネット側(プロバイダ側)のケーブルが接続されるNICのIPアドレスは、グローバルアドレスをもらっているのであればそれを入力しますが、本稿が対象としているDHCPでプライベートアドレスを配布されるCATV接続の場合は、ローカルアドレスとして認められる適当な値をいれておきます。また、デフォルトゲートウェイはDHCPの場合、空白にしておきます。
必要のないサービス(と、よく分からないサービス^_^;;)は停止させました。"chkconfig --list"と打つと、登録されているサービスとランレベルごとのon/offが表示されます。またランレベル3,4,5でアプリケーションfooを停止させたい場合は"chkconfig --level 345 foo off"とします。端末が日本語に設定されていると表示が日本語になります。英語で出したいときは"LANG=en"と打ち込めば英語の表示になります。戻す時は"LANG=ja_JP.eucJP"です。
インストール直後の状態と、その意味を調べると次のようになりました。
サービス | ランレベルごとの状態 | 変更 | コメント |
anacron | 0:off 1:off 2:on 3:on 4:on 5:on 6:off | -> off | cron(8)を補う意図で書かれたプログラムです。 |
httpd | 0:off 1:off 2:off 3:on 4:on 5:on 6:off | on | |
apmd |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | -> off | このデーモンは APM BIOS 1.2 イベントをサポートしている。 しかし複数の電池の取り扱いなど、より高度な機能はサポートしていない。 また最近の PC ハードウェアにある ACPI サポートとの連携は、まだできない。 |
syslog |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | カーネルとシステムログ記録デーモン |
crond |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | /etc/rcや/etc/rc.lacal等からスケジュール通りにコマンドを実行する |
netfs |
0:off 1:off 2:off 3:on 4:on 5:on 6:off | on | NFS, SMB , and NCP (NetWare) ファイルシステムのマウント |
network |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | 但し、初期化設定を実行するためのスクリプトファイルも中にはあり、その代表例が「network」です。これはデーモンは起動しませんが、実行すると「ネットワークの設定」を反映させてネットワークを使える状態にします。 |
random |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | 乱数生成 |
rawdevices | 0:off 1:off 2:off 3:on 4:on 5:on 6:off | on? | |
arpwatch |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | イーサネットアドレスとIPアドレスの対応の監視 |
atd |
0:off 1:off 2:off 3:on 4:on 5:on 6:off | on | atによってキューに入れられたジョブを実行する(cronは毎回に対して、atは一度だけ) |
named |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | -> on | インターネットドメインネームサーバ |
canna | 0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | |
xfs |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | xfsはXフォントサーバのことで、Xのサーバプログラム自体にフォント の管理をやらせないんで、XFree86じゃないサーバにもX-TTがネットワーク越しに使えて便利です。 |
keytable |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | キーテーブル(起動時に設定されているキーマップをロード |
FreeWnn | 0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | |
gpm |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | 仮想コンソールでのカット&ペーストユーティリティーとマウスサーバ |
ipchains | 0:off 1:off 2:on 3:on 4:on 5:on 6:off | -> off | デーモンでの起動は不便なのでdhcpcd-eth0.exeで行う |
pcmcia |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | -> off | PCMCIAカードを使うためのデーモン |
kdcrotate |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | ケルベロス関連 |
kudzu | 0:off 1:off 2:off 3:on 4:on 5:on 6:off | on | |
linuxconf | 0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | |
lpd |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | ラインプリンタデーモン |
nfs |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | Linux クライアントから Linux サーバーのファイルシステムを利用可能とするものです。 |
nfslock | 0:off 1:off 2:off 3:on 4:on 5:on 6:off | -> off | |
sshd |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | インターネット上のデータのやりとりを暗号化するソフトの一つがSSHdです。 |
identd |
0:off 1:off 2:off 3:on 4:on 5:on 6:off | on | ユーザ名の認証を行う。 |
portmap |
0:off 1:off 2:off 3:on 4:on 5:on 6:off | -> off | RPCポートを管理・nfs を利用する場合に portmap が起動されている必要があります。 |
postgresql | 0:off 1:off 2:off 3:off 4:off 5:off 6:off | on | |
rstatd |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | rstatd サービスは、システムのパフォーマンス情報を提供します。このサービスは、危険な情報ソースですから、/etc/inetd.conf で無効にしておく必要があります。 そうしない場合は、認証を必要とする安全なバージョンをインストールしてください。 |
rusersd |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | リモートホストからのコマンドrusersを受け付けるデーモン |
rwalld |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | リモートホストからのコマンドrwallを受け付けるデーモン |
rwhod |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | リモートホストからのコマンドrwhoを受け付けるデーモン |
smb |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | ->on | SMBサーバ |
sendmail |
0:off 1:off 2:on 3:on 4:on 5:on 6:off | on | メールサーバ |
rhnsd |
0:off 1:off 2:off 3:on 4:on 5:on 6:off | ->off | Red Hat Linux 7.0には新たに創設されたソフトウェア自動更新サービスRed HatNetworkを監視し、セキュリティパッチ等を自動的にインストールする「Update Agent」が含まれている。今回のバグはこのUpdate Agentoの中の常駐型プログラムrhnsdがいらなくなったファイル記述子を開放しないことに起因している。 |
xinetd |
0:off 1:off 2:off 3:on 4:on 5:on 6:off | on | Redhat Linux 7 で多く知られるようになったスーパーサーバープログラムである xinetd は inetd の拡張版とも言えるものですが、その設定や利用法などはかなり違いがあります。例えば、後述しますがアクセス制限の設定なども xnetd は TCP Wrapper を使う必要がありません。ここではそのスーパーサーバープログラムxinetd に触れてみます。xinetd の設定ファイルは /etc/xinetd.conf です。そして各種デーモン (telnetや ftp) の設定ファイルは /etc/xinetd.d 以下に置いてあります。 |
ypbind |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | IS バインドプロセス NIS ドメインのサーバーを検索して取得した情報をbinding ファイルに保存する |
yppasswdd |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | NIS パスワード更新デーモン NIS (YP) 環境下でのユーザーによる パスワード変更を可能にする |
ypserv |
0:off 1:off 2:off 3:off 4:off 5:off 6:off | off | NIS サーバ Network Information Service (NIS) は、 データベースとそれらを扱うプロセスとからなる シンプルなネットワーク検索サービスである |
xinetd based services: | |||
finger | on | -> off | |
linuxconf-web | off | off | |
rexec | off | off | |
rlogin | on | on | (ローカルネットワークに限定できれば) |
rsh | on | on | (ローカルネットワークに限定できれば) |
swat | off | on | (ローカルネットワークに限定できれば) |
ntalk | off | off | |
talk | off | off | |
telnet | on | -> off | |
chargen | off | off | |
chargen-udp: | off | off | |
daytime | off | off | |
daytime-udp | off | off | |
echo | off | off | |
echo-udp | off | off | |
time | off | off | |
time-udp | off | off |
アプリケーションのインストールにはアプリケーション本体以外に設定ファイルやヘルプファイル、ツールなど多くのファイルが必要になり、ライブラリなどとの整合性などいろいろと面倒です。RedHat系列ではrpmというパッケージ管理システムが採用されており、インストールするファイルのバージョン管理や整合性などのチェックをしてくれます。詳しい内容はhttp://www.linux.or.jp/JF/JFdocs/RPM-HOWTO.htmlを参考にしてください。
ネットなどで必要なアプリケーションを探す時にはCPUアーキテクチャに注意します。intel系なら"i386"とファイル名に拡張子がついているものを選びます。
インストールするときは"rpm -ihv パッケージ名"と打ち込みます。アンインストールするときは"rpm -e パッケージ名"。また、システムにインストール済みのもののみをアップデートしたいときは"rpm -Fvh パッケージ名"とします。もちろん、パッケージ名にはワイルドカードも使えます。またオプションの"vh"はインストール経過を表示するオプションです。
私の場合、利用しているプロバイダがCATVでプライベートIPをDHCPで配布する方式のため、dhcpcを利用できるようにします。パッケージグループの設定ですでにインストールされているはずですが、"rpm -qa |grep dhcpc"と打ち込み、dhcpcが表示されなければインストールCDから手動でインストールする必要があります。dhcpcdをインストールすると、/etc/dhcpcというディレクトリを作り、そこにdhcpcd-eth0.infoを作ります。dhcpcd-eth0.exeを同じところに作っておけば、IPの変更時にそれを実行してくれます。実行属性をつける("chmod a+x dhcpcd-eth0.exe")ことを忘れないように。 また、/etc/resolv.confはdhcpcdによってバックアップが作られてから書き換えられ、コマンド終了時に戻されます。私はipchains(ファイヤーウォールなど)の設定もここでしました。また、ブート時に起動させるため/etc/rc.d/init.d/dhcpcddを作りました。これをchkconfigで登録("chkconfig --add dhcpcdd")してアクティブ("chkconfig --level 345 dhcpcdd on")にします。
これで、ネットスケープなどが使えるようになるはずです。以降はRedHatのエラッタのページを見ながらアップデート作業にかかります。
せっかくまっさらのシステムですので、今のうちにできるだけアップデートしておきます。運用に入ってカスタマイズされたシステムをアップデートすると、苦労した設定が元に戻ってしまったりして面倒です。なによりハッキングに強いシステムにするためにもアップデートしておきましょう。
http://www.jp.redhat.com/download/にバグフィックスのための情報とrpmファイルが公開されています。ただ、英語のエラッタのページに比べ更新が遅れがちですので、できれば英語ページでの更新をお勧めします。それぞれのアップデートに解決方法が明記されています。ほとんどが"rpm -Fvh ファイル名"ですが、カーネルアップデートに関しては実行の前に必ず「Red Hat Linux システムの Linux カーネルをアップグレードする方法(http://www.jp.redhat.com/support/errata/kernel_upgrade/kernel-upgrade.html)」をよく読んで理解してから行ってください。rpmコマンドでアップデートしただけだと、再起動できなくなります。
hdaとhdcのイメージを一致させるため、ddコマンドで内容をコピーします。(日経バイト2000/07 p140参照)
"dd if=dev/hda1 of=/dev/hdc1"
ブートブロックもコピーします。
"dd if=/dev/hda bs=512 count=1 of=/dev/hdc"
これで、クラッシュなどでドライブhdaが死んでもhdcに接続し直せば立ち上げが可能です。できるなら、この時点でシステムのバックアップを取っておきます。私の場合はルート直下のディレクトリごとにアーカイバで固め(tar -cvzf backupfile.tar.gz backupdir)、/homeに保存して置きました。後にSambaでWindows機と繋がってからWin機のCD-Rに移しましたが、もちろんLinux機にCD-Rを設置することもできるそうです。
Linuxサーバをルータとして働くということは、プロバイダと家庭内LANの間に立ってパケット(データの一塊り)の交換をするということです。LAN側のマシンが送るデータをプロバイダ側に渡し、その返答をプロバイダ側から該当マシンに返すといった交通整理のルールをルーティングといいます。 我が家では192.168.3.2のアドレスを振ったネットワークカードから来たパケット192.168.3.XXをCATV側に接続したネットワークカードに渡してやればいいのですが、DHCPでアドレスをもらっているため固定のIPではないため、一意に決められません。
実は前述のdhcpdはゲートウェイの設定もやってくれるはずなのですが、なぜかうまくいかなかったのでデフォルトの値を無効にします。
/etc/sysconfig/networkをviで眺めると次のようになってました。
NETWORKING=yes
HOSTNAME=MyComputer
GATEWAY=192.168.3.254
GATEWAYの項目をコメントアウトして無効にします。それから"/etc/rc.d/init.d/network restart"と"/etc/rc.d/init.d/dhcpcdd restart"を続けて実行します。確認のため"route"コマンドを実行すると
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 * 255.255.255.0 U 0 0 0
eth1 172.16.0.0 * 255.255.0.0 U 0 0 0
eth0 127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
と、デフォルトがDHCPでプロバイダからもらったIPとインターフェースを指していることがわかります。
インストール時にDNSパッケージを選択しているので、すでにrpmインストールされています。プロバイダが提供するDNSをそのまま使ってもまったく問題はないのですが、DNSサーバーは過去に問い合わせのあった名前を一定時間キャッシングしていますので、自前で構築しておけば少しでもアクセスが早くなるものと期待できます。
設定はゾーンファイルを記述しnamed.confへ登録します。/etc/named.confをエディタで開き、私の場合は以下を追加しました(ほんとは".net"にすべきなのだけど、ローカルIPなのでいいことにしてます^_^;)。
zone "ootasuido.co.jp"{
type master ;
file "ootasuido.co.jp.zone" ;
} ;
zone "3.168.192.in-addr.arpa"{
type master;
file "192.168.3.rev";
};
そして、/var/named以下に"ootasuido.co.jp.zone"と"192.168.3.rev"を記述します。
"/etc/rc.d/init.d/named restart"したのち"tail -n 20 /var/log/messages"でログを見ます。"master zone "ootasuido.co.jp" (IN) loaded (serial 2001020301)"のようになっていれば成功です。
デフォルトのDNSをローカルに設定します。"vi /etc/resolv.conf"して、
nameserver 127.0.0.1
search ootasuido.co.jp
と書き換えます。これで、問い合わせはローカルに構築したDNSにされます。"chkconfig --list named"でオンになっていないときは、再起動時にサービスが起動するようにchkconfigで登録しておきます。
固定IPならその値をファイヤウォールに記述すればよいのですが、変動IPなのでdhcpcデーモンから変数でもらってこなくてはなりません。そのため、chkconfigで起動されるスクリプトを止めて(chkconfig --level 2345 ipchains off)、自前で用意します。
また、透過プロキシを一緒に導入します。端末からHTMLブラウザを使う場合、回線の負荷を下げたりスピードアップするためにプロキシサーバーを使うのが効果的ですが、そのためにはブラウザをプロキシ経由してアクセスするように設定しなくてはなりません。それで問題なければ結構ですが、ノートパソコンのように出先と環境が変わる場合、いちいち変更するのも大変です。また、ネットワーク上のPCの数が多い場合も設定が大変です。
透過プロキシは流れるパケットを横取りし、自動的にキャッシュしてくれるためブラウザ側での設定が不必要というとても都合のいいプロキシです。squidを使うことによって実現できます。ただし、対応するプロトコルはhttpのみです。
squidはインストールディスクのdisk2に入っています。"rpm -ihv squid-2.3.STABLE4-1.i386.rpm"でインストールできます。うまくいったら"chkconfig --level 345 squid on"を実行して再起動時に組み込まれるようにしておきます。
/etc/squid/squid.confを編集します。
cache_mem 16 MB ----------------------------------cache memory -> 16MB
cache_dir ufs /var/spool/squid 500 16 256 ---------------cache size -> 500MB
log_fqdn on -----------------------------------------fqdn logging
acl ootasuido src 192.168.3.0/255.255.255.0
http_access allow ootasuido ----------------------------ootasuidoのみにアクセスを許可
httpd_accel_host virtual -------------------------------透過プロキシにする
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
そして、"/etc/rc.d/init.d/squid start"で起動させます。squidのほうはこれでいつでもキャッシングしてくれるのですが、肝心のパケットをsquidに渡すように設定しないと透過プロキシになりません。その設定はipchainsでやります。
まず、外部からのパケットを家庭内のネットワークに流すためフォワーディングをオンに設定するのですが、私の知識不足で設定ファイルが分からず、やむなくxwindowのツール(Network configuration)でforwarding ipv4をONに設定しました。
次はコマンドラインから次のように打ち込みます。(ただし、192.168.3.Xは自分のネットワークの設定にあわせて適宜変えてください)
/sbin/ipchains -A input -p tcp -s ! 192.168.3.2 -d 0/0 80 -j REDIRECT 3128
/sbin/ipchains -A forward -s 192.168.3.0/24 -d 0/0 -j MASQ
ここでサーバ自身のアドレス(192.168.3.2)を禁止しているのは、後にhttptサーバを立てたときにパケットがループするのを防ぐためです。2行目がIPマスカレードの設定で、プロバイダから割り当てられたIPが一つでも複数の端末からホームページがアクセスできます。
この時点でもう透過プロキシが完成しています。ネットワーク上のブラウザからなるべく画像の多いホームページをアクセスしてみてうまくアクセスできるかどうか確認してみます。また、ブラウザのローカルキャッシュをクリアしてから同じページを閲覧して、squidの透過キャッシュが効いていることを確認します。さらに、squidのログ/var/log/squid/access.logでもHITしていることを確認できます。
それと、ftpのマスカレードのため次のモジュールを/etc/rc.d/rc.localに追加します(このへんはよく理解してませんが^_~;;)。
#Loading IP Masqualade Modules
/sbin/modprobe ip_masq_ftp
ipchainsで設定したパケットフィルタリングのルールは再起動すると消えてしまいますので、起動スクリプトに書き込んでおきます。"/etc/rc.d/rc.local"は起動時の最後に実行されるスクリプトですが、ここに書いてもオーケーですし、私の場合はdhcpcデーモンの立ち上げ時に実行されるようにしています。
ファイヤウォールはパケットフィルタリングを使って条件に合わないパケットを遮断し、ローカルネットワークを外部から守る仕組みです。ipchainsを使ってフィルタリングルールを記述しますが、ルール中にDHCPでもらったIPを使いたいのでdhcpcデーモンによって起動されるdhcpcd-eth0.exe中へ記述しました。
フィルタリングの骨組みは日経バイト2001年4月号を参考にしました。
ファイヤウォールを設置すると、使えなくなるサービスがでてきたりしますので、その都度穴を開けていきます。たとえばDNSを立ち上げたのにファイヤウォールを立てたら名前解決できなくなりましたが、これはポート53を閉じていたためでした。また、逆に積極的に閉める場合もあります。CATV内の他人の共有フォルダが覗けることが話題になったりしますが、NetBIOSが使用するポート135〜139,145を閉めると外から自分のネットワーク上の共有フォルダが見えなくなります。
ローカルネットワーク上のWindowsマシンのために共有フォルダをLinux機に設置します。常時稼働のサーバーなら大変便利な機能です。これに加えMacintoshからも読めるようにnetatalkも動かせばLAN上のWin、Mac機でデータを共有できシームレスな環境が得られます。
パッケージグループでSambaServerが選択されているのでsambaはインストールされているはずです。"rpm -qa|grep samba"で確認できます。
SAMBAの設定はコンソールからは"/etc/samba/smb.conf"をエディタで修正することで行えますが、swatというGUIを使って設定する方法もあります。そのためにはいくつかの設定が必要になります。
まず、swatのサービスが起動できるようにcheckconfigを調べます。"chkconfig --list swat"で"swat オン"と表示されればオーケー。そうでないときはオンになるように設定します。swatサービスはxinetdというネットからの要求に必要なサービスを起動するデーモンから呼ばれます。
次に自ドメイン内のブラウザからアクセスできるように"/etc/xinetd.d/swat"を編集します。アクセスに使用する端末を"only_from += eva00.ootasuido.co.jp"のように追加します。そして"/etc/rc.d/init.d/xinetd restart"すれば登録した端末からswatが使用できるようになります。
sambaで設定しなければならない項目は結構多く、特にWin、Mac混在でしかも同じファイルを複数ユーザーで共有する場合はエンコーディングやcreate maskなどの設定が重要です。たとえばグループAに属するaaaという人が作ったファイルを同じグループAに属するbbbという人に読み書きを許可するにはcreate maskのグループ属性のrとwのビットが立っていなければなりません。また、writable = yesとなっていないと削除はできるのに上書きはできなくなります。ファイル名の変更などもできないので分からないうちは大変混乱します。swatを使いGUIで設定した場合でもその結果は "/etc/samba/smb.conf"に格納されます。ちなみにうちの場合の設定はこうです。
そして、肝心のユーザーの登録。ユーザー名はLinuxのユーザー名でなければなりません。新しいユーザーを登録するときははじめLinuxにユーザー登録してからsambaに登録するこになります。Windows2000機からアクセスする場合、Win側のユーザー名、パスワードが同一であればマイネットワークをダブルクリックし、サーバーを開き、目的のフォルダを開けばいいのですが、違う場合はユーザー名とパスワードを聞かれます。パスワードの長さですが、Netatalkを使ってMacintoshとも共有するつもりであればのMac側の制限のため8文字より長いパスワードが使えません。セキュリティのためにはMac専用のユーザーを用意しておく方がいいでしょう。
インターネット上の時間サーバーから時間をもらってOSが正確な時間を刻むようにします。が、私はこれでハマってしまい、今ひとつ理解できていません。
redhat linux 6.xの時はxntpというタイムクライアントが同梱されていましたが、7.0からはntpというパッケージになっていました。最初のインストール時にすでに導入されておりどのグループかは不明です。
"/etc/ntp.conf"をエディットし時間サーバー名とドリフトファイル名、ログファイル名を加えます。空のドリフトファイルをtouchコマンドで作成したのち"/etc/rc.d/init.d/ntpd start"でデーモンを起動します。再起動時のため"chkconfig --level 345 ntpd on"も設定しておきます。"ntptrace"コマンドでntpデーモンの状態が分かるということなのですが、"*Not Synchronized*"などとでます。ここでファイヤウォールでパケットが止められていることに気がつき、ntpパケットを通すようにルールを追加しました。が、それから時間のずれが30秒以内に収まらず、訳分からないので、6.2で使っていたxntpへ乗り換えることにしました。
ntpパッケージを削除し、xntpをrpmインストールします。やることはntpのときと一緒です。このときのログがこれです。旧システムのログを見返してみると時刻が安定するまで3日くらいかかっているので、このまま放っておくことにしました。
appletalkをLinuxで実現してくれるのがnetatalkです。私はここからダウンロードしました。インストールしたらコンフィグファイルを書き換えて見せるフォルダを設定します。
guestに見せるフォルダ
[AppleVolumes.system]
/home/ootasuido ootasuidoログインユーザに見せるフォルダ
[AppleVolumes.default]
~ <---チルダのみはログインユーザのホームディレクトリを示す
/home/nerv nerv access=@nerv <--グループnervのみに許可
といった感じです。また、ユーザのパスワードは8文字までしか使えません。
ファイヤウォールのLAN側にappletalkが通る穴を開けるのですが、ここを開ければオーケーという情報が見つけられなかったのでポート表を参考に、穴を開けてはnetatalkを再起動してnbplkupでクライアントが見えるのを確認しました。結果、548のtcpだけ開いていればセレクタからちゃんと見え、アクセスもできることが分かりました。公開するフォルダのパーミッションはグループアクセスできるように0770にしておきます。
書き込みをテストしたところ、あるユーザーが共有フォルダに書き込むと他のユーザーが使えなくなるようになりました。ネットで調べてみたところ、次のような情報を見つけました。「afp_openforkは、resource folkのハンドリングを行います。openがPermission deniedで失敗してます。対処法は、AppleDoubleおよび、含まれるファイルのpermissionを確認変更する。」ということです。
ここまでの作業で、ファイヤウォール、dhcpクライアント、dnsサーバ、透過プロキシ、共有フォルダを提供できるようになりました。端末の保護(外から共有フォルダをのぞかれたり、端末を乗っ取られたりといった不正アクセス)とインターネットブラウジングの高速化、複数端末間のファイル、フォルダの共有ができ格段に便利になったと思います。本当ならディスク二重化の有効性を確かめるため、片肺起動とリカバリ後のディスクの同期まで確かめたいのですが、まだやっていません。
次は、私の苦い思い出でもある(^_^;;)不正アクセス対策をしたいと思います。すでにファイヤウォールが設置されていますが、それだけではすべての不正アクセスは防ぐことができません。そこで、ポートスキャン対策としてPortsentryを、ファイル書き換え検出としてtripwireを導入します。
過去にトロイを仕掛けられたサーバーも最初はポートスキャンと執拗なログインから始まりました。ログがそのまま残っているのでスキルの低い、いわゆるスクリプトキディの仕業だったのでしょう。
今回導入したportsentryは雑誌(日経バイト2000/06 P77)や本(ネットワーク侵入検知)などでも紹介されています。外部からのポートスキャン(ステルススキャンも含む)を検出し、さらにそのポートを閉じることまでやってくれる優れものです。
導入はそれほど難しくなく、tarボールを解凍した後README.installを読めば大体分かるのですが、大まかには"make linux"してから"make install"すると"/usr/local/psionic/portsentry"ディレクトリにできます。"portsentry -tcp"と起動すればtcpを、"-udp"ならudpをチェックします。"/etc/rc.d/rc.local"ファイルの末尾に"/usr/local/psionic/portsentry -tcp"と"/usr/local/psionic/portsentry -udp"の2行を書き加えておくといいでしょう。ログは/var/log/messagesへ出力されるので、時々チェックしておきます。グローバルIP接続しているとおびただしい量のログが見られます。他のマシンを使ってsaintというセキュリティチェックツールを使ってみると、portsentryが有効に働いていることがわかります。
「ネットワーク侵入検知」やオライリーの本「tripwire for UNIX」で紹介されるtripwireは対象となるファイルやディレクトリをチェックし、書き換えがあったかどうかを調べるツールです。ここにちょうど最新版(2.3-55)のrpmがあったのでこれを使いました。
tripwireの設定についてはRedHatの公式リファレンスガイドがあるので参考にしてください。
tripwireのキモはポリシーファイルの設定です。当初付属するポリシーファイルは自分の環境とは異なる部分がかなりあります。監視するディレクトリとファイルの追加と削除をして、チェックを実行し、エラーを見ながら修正していきます。