Linux Journal 10月号発売中。今月の特集はセキュリティです。
▼▼▼ディストリビューション関連ニュース▼▼▼Linux ディストリビューションの比較 (LinuxNewbie.org)
▼▼▼その他のニュース▼▼▼
●今後開かれる予定のイベント
| September 26-28, 2000 Atlanta, GA www.key3media.com/linuxbizexpo | ||
| October 3, 2000 Burlington, MA October 5, 2000 Vienna, VA www.computerio.com/news/seminar.html | ||
| October 10-14, 2000 Atlanta, GA www.linuxshowcase.org |
Building Dependability in Global Infrastructures Host of the Real-Time and Embedded Systems Forum | October 23-24, 2000 Washington, DC www.opengroup.org www.opengroup.org/rtforum |
|
Embedded Linux Expo & Conference | October 27, 2000 Westborough, MA www.rtcgroup.com/elinuxexpo/index2.html |
ISPCON | November 8-10, 2000 San Jose, CA www.ispcon.com |
| November 13-17, 2000 Las Vegas, NV www.key3media.com/linuxbizexpo |
USENIX Winter - LISA 2000 | December 3-8, 2000 New Orleans, LA www.usenix.org |
|
Pluto Meeting 2000 | December 9-11, 2000 Terni, Italy meeting.pluto.linux.it |
LinuxWorld Conference & Expo | January 30 - February 2, 2001 New York, NY www.linuxworldexpo.com |
|
ISPCON | February 5-8, 2001 Toronto, Canada events.internet.com |
Internet World Spring | March 12-16, 2001 Los Angeles, CA events.internet.com |
|
Game Developers Conference | March 20-24, 2001 San Jose, CA www.cgdc.com |
CeBit | March 22-28, 2001 Hannover, Germany www.cebit.de |
|
Linux Business Expo | April 2-5, 2001 Chicago, IL www.linuxbusinessexpo.com |
Strictly e-Business Solutions Expo | May 23-24, 2001 Location unknown at present www.stricltyebusinessexpo.com |
|
USENIX Annual Technical Conference | June 25-30, 2001 Boston, MA www.usenix.org |
PC Expo | June 26-29, 2001 New York, NY www.pcexpo.com |
|
Internet World | July 10-12, 2001 Chicago, IL events.internet.com |
O'Reilly Open Source Convention | July 23-26, 2001 San Diego, CA conferences.oreilly.com |
|
LinuxWorld Conference & Expo | August 10-14, 2001 New York, NY www.linuxworldexpo.com |
Linux Lunacy Co-Produced by Linux Journal and Geek Cruises | October 21-28, 2001 Eastern Carribean www.geekcruises.com |
SGI エデュケーションサービスは "eLearning for Linux" をリリースした。これはインターネットで提供される Linux コーススイートで自由に Linux OS の基本を学ぶことができる。LPI (Linux Professional Institute) のテストオブジェクトに基づいている。
www.sgi.com/support/custeducation/
Yggdrasil Computing は Linux DVD9-ROM をリリースした。これは世界初の DVD-ROM アーカイブ だ。DVD-9 は最先端の DVD ディスクで二つの金属層からなる。従来の DVD-5 ディスクは CD と同様のシングルアルミレイヤーで容量はほぼ55%だ。
Linux DVD Archives Product Information
How we made a Linux DVD-9 Archive
Good Moning サーバは Linux OS と20のアプリケーションを組込んだフラッシュメモリカードだ。最も障害の起きやすい HDD と OS を切り離している。出荷されているのはインターネットサーバ、DNS サーバ、メールサーバ、e-コマースサーバ、BBS サーバの5種類だ。すべて不必要なサービスは停止してセキュリティの強化を図っている。設定はブラウザ経由もしくは telnet 経由だ。システムのアップグレードは単にフラッシュカードを入れ替えて再起動するか、パッチをダウンロードして当てる。製造元は韓国の Duli Network Corporation, LTD だ。
http://www.duli.net(韓国語)
Webb Interactive Services, Inc. の子会社 Jabber.com Inc. に二人のテクニカルアドバイザが参加した。現在 Red Hat の CTO である Michael Tiemann 氏と Lotus Development Corporation のチーフサイエンティストで研究開発担当の元副社長 Dr. David P. Reed だ。Jabber サーバのダウンロードは 10,000 に達している。XML ベースのインスタントメッセージングプログラムの Jabber はオープンソースで Jabber.org で開発されている。
●Linux のセキュリティは十分かLinux ボックスで動いているサービスを良く知らないなら必要ないサービスを調べてオフにした方がいい。不必要であるにもかかわらず起動されているサービスはクラッカーやスクリプトキッドに侵入の機会を提供するだけだ。OSOpinion の投稿者、Joeri Sebrechts 氏は デフォルトのインストール設定で不必要なサービスを起動したり、アクセスポリシーを "DENY" に設定せずにリリースされている Linux ディストリビューションを厳しく批判している。Windows などからの転向者は知らないうちに危険を抱え込むことになり、しかもこのようなサービスが起動されていることを知らないユーザもいる。
●Linux 関連リンクLinux2order.comは 5,000 以上の Linux ソフトウェアをウェブで提供。
Linux で使う Matrox Millennium G450 のレビュー (Slashdot)
▼▼▼ソフトウェアアナウンスメント▼▼▼ ●CRYPTOAdmin 5.0CRYPTOCard Corp. はウェブサイト、メール、リモートアクセスを保護する CRYPTOAdmin 5.0 を発表した。Apache, iPlanet, Microsoft IIS ウェブサーバを認証されていないアクセスから保護する。WEBGuard はワンタイムパスワードを使用してセキュリティを確保している。対応プラットフォームは Windows NT, Windows 2000, Linux, Solaris だ。
●Loki ゲームSimCity 3000 Unlimited for Linux が現在制作中。デモ
Version 428 of Unreal Tournament for Linux がリリース。README、ダウンロード
Loki ゲームの FAQ
Loki は Timegate Studios と協力して Kohan: Immortal Sovereigns を Linux に移植する。リリース時期は Windows 版とほぼ同じ2000年第1四半期の予定。
●その他のソフトウェアグラフィックレンダリングツール BORG 0.2.90
[news]
[download]
KDE と GNOME の代わり?
GTK+ ベースの XFceを試してみよう。GNOME に近いが機能が少ないので消費するリソースも少なく軽快だ。
pciutils パッケージをインストールしているなら /sbin/lspci が便利。/proc/pci に目を凝らすよりは楽。
●Windows の GUI からLinux のデスクトップにアクセスMI/X (MicroImages X server) がいいでしょう。
http://www.microimages.com/freestuff/mixシェアウェアなら X-WinPro がいいでしょう。Reflection/X よりは安い。
http://www.lab-pro.com●テープライブラリ
amanda がいいでしょう。
●Palm OS エミュレータfreshmeat.netで copilot を探す。その他に ROM が必要。これは Pilot から吸い上げるか Plam Computing developers' サイトから取得できる。
●Linux から BeOS パーティションにアクセス2.4.0 テストカーネルでリードオンリーのアクセスがサポートされている。
今月の HelpDex は ここ をクリックしてください。
暗号化とは鍵がなければ解読することのできない形式にデータを変換することであり、当事者以外には情報を秘匿することでプライバシーを維持する。解読は暗号化の反対で暗号化されたデータを解読することのできる形式に戻すことである。暗号化も解読も鍵という特定の情報を利用する。一つの鍵で暗号化と解読をするものと暗号化と解読に別々の鍵を使用するものとがある。暗号解読は基本的にはハードの問題で大量のコンピュータリソースがあれば理論的には解読することができる。
暗号システムには秘密鍵方式と公開鍵方式とがある。秘密鍵方式とは一つの鍵で暗号化と解読をするもので、代表的なものは1970年代半ばに IBM により開発された DES (Data Encryption Standard) だ。公開鍵方式はユーザが公開鍵と秘密鍵を持ち、公開鍵は暗号化に使用され秘密鍵は解読に使用される。代表的な暗号システムは RSA だ。DSA (Digital Signature Algorithm) でも公開鍵方式を利用しているがこれは署名に使用されている。
秘密鍵システムはメッセージの送受信者が同じ鍵を用いて暗号化、解読をするので鍵を管理する必要があり、他人からは秘密にしておかなければならない。第3者が鍵を入手すれば情報の解読、改変、成りすましなどが可能になる。これを解決するために公開鍵方式が1976年に導入された。公開鍵システムではユーザが公開鍵と秘密鍵のペアを持つ。公開鍵は公開され秘密鍵は秘密に保存される。当事者は鍵を共有することがなく、通信には公開鍵が使用される。解読は対応する秘密鍵を保持するものだけが可能だ。例えば A から B へメッセージを送るときは A は B の公開鍵を使用してメッセージを暗号化して B に送信する。B は自分の秘密鍵を使用してメッセージを解読する。誰でも B の公開鍵を使用して暗号メッセージを B へ送ることができるがそれを解読できるのは B だけだ。
公開鍵システムでは公開鍵は秘密鍵と数学的な関連がある。そのため公開鍵から秘密鍵を見つけることで公開鍵システムを攻撃することは可能だ。それを防ぐには公開鍵から秘密鍵を見つける処理をできるだけ重いものにすればいい。つまり理論的には公開鍵から秘密鍵を計算することは可能だがコンピュータリソースから見れば事実上不可能になる。数字が大きくなれば素因数分解の時間が長くかかる。鍵が大きければ解読時間も長くなる。
PGP は Phil R. Zimmermann 氏が開発したプログラムで通常のチャンネルでセキュアな通信を可能にする。PGP は公開鍵方式の暗号システムでそれぞれ秘密鍵と公開鍵と呼ばれている。公開鍵は PGP ユーザが交換して利用する。PGP を利用するにはまずこの鍵ペアを作成しなければならない。鍵ペアを作成すれば他の PGP ユーザと通信が可能になる。PGP でメッセージを交換するときは交換する相手の公開鍵が必要で、相手も読者の公開鍵が必要だ。
次に鍵ペアを作成する方法を示そう。使用するのは PGP 5.01i。バージョンによっては若干手続きが違うかもしれない。鍵ペアを作成するには次のようにコマンドラインで実行する。
pgpk -g鍵ペア作成段階で次のような質問をされる。
pgpk -x my_username@my_hostname > my_key公開鍵をデータベースに保存するには:
pgpk -a keyfile削除するには次のようにする。
pgpk -r newuser@new_hostname
ファイルを暗号化するには "pgpe" を使用して次のようにする。
pgpe text_file newuser@new_hostnamepgpe のオプションは次のとおり。
メッセージの解読、確認には pgpv を使う。コマンドは次のとおり。
pgpv text_file.pgppgpv のオプションは次のとおり。
Pine で PGP メッセージを自動で扱うにはホームディレクトリの ".pinerc" というファイルの display-filters, sending-filters で始まる行を探して次のように追加する。
# This variable takes a list of programs that message text is piped into
# after MIME decoding, prior to display.
display-filters=_BEGINNING("-----BEGIN PGP MESSAGE-----")_ /usr/bin/pgpv
# This defines a program that message text is piped into before MIME
# encoding, prior to sending
sending-filters=/usr/bin/pgpe -taf _RECIPIENTS_
これは受信したメッセージが PGP で暗号化されていたら "/usr/bin/pgpv" で処理をし、特定の受信者宛のメッセージは PGP で暗号化して送る。Pine はメッセージ送信時に
Send message (unfiltered)?と聞いてくるので Y と入力すれば通常のメールを送信し、 Ctrl-N を入力すれば使用するフィルタを選択できる。pgpe が唯一のフィルタなら
Send message (filtered thru "pgpe")?と聞いてくるので Y を入力しよう。
[Eric は Sun Puppy も描いています。 http://www.sunpuppy.com から見ることができます。]
これは以前更新した記事の再更新です。低コストで本を作るというのは大変なことです。Rick と筆者は現在本作成の HOWTO を書いています。もし HOWTO に付け加えたいものがあれば zing@gnujobs.com までメールを下さい。
今までに使用した道具は次のようなものだ。
気をつけることは本を綴じるときに端からあまり離れないこと。開いたときにうまく開かなくなる。接着剤の使用を最小限に抑え、綴じた跡が残らないようにすることだ。
基本的な考え方はファクスサービスと契約し、ファクスを受け取ったらメールで送信してもらい、pdfファイルに変換してダウンロードするか、ファクスとして印刷する仮想的なファクスを構築します。まず efax.com に登録してアカウントをもらう。
アカウントに送信されるメールは tiff フォーマットの画像ファイを含んでいるので tiff ファイルを抽出しバイナリに戻さなければならない。tiff ファイルが抽出できれば後は好きなように処理することができる。今回は pdf ファイルに変換して簡単にダウンロードできるようにしてみよう。
手順はメールから tiff ファイルを抽出してポストスクリプトに変換し、その後 pdf ファイルに変換する。後は pdf ファイルをウェブサイトに置くだけでいい。実際の手順は次のとおりだ。
### Copy the mail over to a temporary file. cp /var/spool/mail/Username File.mail ### Extract the tiff files. uudeview File.mail ### Let us assume the tiff file is extracted as the name MyFile.tiff ### Convert it to postscript tiff2ps MyFile.tiff > TempFile.ps ### Convert it to pdf ps2pdf TempFile.ps TempFile.pdf ### move it mv TempFile.pdf /www/docs/pdf/TempFile.pdf自動で実行させるには次のようなスクリプトを作成し crontab にジョブを登録する。
#!/usr/bin/perl
## We assume you have uudeview installed.
## We assume you have a public_html directory which your webserver has been
## properly configured to see.
### This perl script is not properly secured since it is possible to make
### a weird configuration for the name of the fax file, which in theory
### could mess up the command line statements. Use at your own risk.
my $User = "Mu_Username";
my $Temp = "/home/$User/Temp/fax";
system "cp /var/spool/mail/$User /home/$User/Temp/";
system "cp /dev/null /var/spool/mail/$User";
system "/usr/bin/uudeview -o -i -d -p /home/$User/tiff/ /home/$User/Temp/fax";
system "cp /dev/null /home/$User/Temp/fax";
my @Old_Pdfs = </home/$User/public_html/pdf/*.pdf>;
my $No = @Old_Pdfs;
foreach my $File (</home/$User/tiff/*.tif>)
{
$No++;
my $Ps = $File;
$Ps =~ s/\.tif/\.ps/g;
$Ps =~ s/tiff/ps/;
system "/usr/bin/tiff2ps $File > $Ps";
### If you want to print this, uncomment
# system "lpr $Ps";
my $Pdf = $Ps;
$Pdf =~ s/\.ps/\.pdf/g;
system "/usr/bin/ps2pdf $Ps $Pdf";
### Either choose to keep the default name of the file or number it
# system "mv $Pdf /home/$User/public_html/pdf/";
system "mv $Pdf /home/$User/public_html/pdf/$No.pdf";
system "rm $Ps $File;";
}
crontab Crontab
in order to get to be automated.
#!/bin/sh 0,15,30,45 * * * * /home/UserName/Cron.pl >> /home/UserName/cron_log 2>&1
これで仮想ファクスを利用し、フォーマットを変換して読むことができる。仮想ファクス番号はコストセーブにもなる。
スクリプトの解説も今回が最後です。以前に配列を使ったスクリプトを書いていたとき、配列の要素の読み出し、印刷などができるのですが配列の要素に格納されたコマンドの実行方法が分からずに始めから書きなおしたことがあります。"eval" を知っていたら苦労はしなかったのですが。今回は "eval" の使い方を説明します。まず cmd という変数を作ります。
cmd='cat .bashrc|sort'
内容は echo コマンドで見ることができますが実行はどうすればいいのでしょうか。Odin:~$ echo $cmd
cat .bashrc|sort
Odin:~$
単に cmd と入力してもエラーになってしまいます。
Odin:~$ $cmd
cat: .bashrc|sort: No such file or
directory
Odin:~$
そういうときに "eval" を使い、"eval $cmd" と入力すれば変数に格納されたコマンドを実行してくれる。格納されたコマンドが一つなら変数名を入力すれば実行されるが、複数のコマンドを実行するには eval を使う。
プログラムの実行中に一時ファイルを利用するのはよくあるが、プログラムが正常に終了しなかった場合には一時ファイルなどが残り、更新されるべきファイルが更新されずに残ってしまうかもしれない。これを回避するために "trap" が利用できる。
#!/bin/bashfunction cleanup ()
{
stty intr "" #
Ignore 'Ctrl-C'; let him pound away...
echo "Wake up,
Neo."
sleep 2; clear
echo "The Matrix
has you."
echo "He's at it again."|mail admin -s "Update stopped by $USER"
# Restore the original
data
tar xvzf /mnt/backup/accts_recvbl
-C /usr/local/acct
# Delete 'tmp'
stuff
rm -rf /tmp/in_process/
# OK, we've taken
care of the cleanup. Now, it's REVENGE time!!!
rm /usr/games/[xs]quake
# Give him a nice
new easy-to-remember password...
chpasswd $USER:~X%y!Z@zF%HG72F8b@Idiot&(~64sfgrnntQwvff########^
# We'll back up
all his stuff... Oh, what's "--remove-files" do?
tar cvz --remove-files
-f /mnt/timbuktu/bye-bye.tgz /home/$USER
# Heh-heh-heh...
umount /mnt/timbuktu
stty intr ^C # Back
to normal
exit
# Yep, I meant to do that... Kill/hang the shell.
}
trap 'cleanup' 2
...
bash にはトラブルシューティングの機能がある。"set" コマンドで設定するスイッチだ。"-nv"、"-x" などのスイッチが便利だろう。障害が発生した行番号が分かる。bash のスイッチを利用するにはスクリプトの最初の行に次のようにオプションを指定すればいい。
#!/bin/bash -nv
...
#include <"stdio.h">
は C プログラマにはおなじみの文だ。これは外部のライブラリの関数をいつでも自由に使うことができる非常に便利な機能だ。bash にも同じような機能がある。ホームディレクトリに .bash_env というファイルを作り、.bash_profile に次の行を入れておけばスクリプトを実行する際に毎回読みこんでくれる。
export BASH_ENV="~/.bash_env"
シェルスクリプトを実行する際に使用する変数を定義しておくと便利だ。スクリプトから利用されるファイルには #!/bin/sh の記述は必要ない。それ自体が実行されるわけではないからだ。
func_list ()
# lists all the functions in Funky
{
# Any time I need
a reminder of what functions I have, what
# they're called,
and what they do, I just type "func_list".
# A cute example
of recursion - a func that lists all funcs,
# including itself.
cat /usr/local/bin/Funky|grep
\(\)
}
getch () #
gets one char from kbd, no "Enter" necessary
{
OLD_STTY=`stty
-g`
stty cbreak -echo
GETCH=`dd if=/dev/tty
bs=1 count=1 2>/dev/null`
stty $OLD_STTY
}
...
#!/bin/bash
. Funky
declare -i Total=0
leave ()
{
echo "So youse
are done shoppin'?"
[ $Total -ne 0
] && echo "Dat'll be $Total bucks, pal."
echo "Have a nice
day."
exit
}
trap 'leave' 0
clear
while [ 1 ]
do
echo
echo "Whaddaya
want? I got Cucumbers, Tomatoes, Lettuce, Onions,"
echo "and Radishes
today."
echo
# Here's where we
call a sourced function...
getch
# ...and reference
a variable created by that function.
case $GETCH
in
C|c) Total=$Total+1; echo "Them are good cukes." ;;
T|t) Total=$Total+2; echo "Ripe tomatoes, huh?" ;;
L|l) Total=$Total+2; echo "I picked da lettuce myself." ;;
O|o) Total=$Total+1; echo "Fresh enough to make youse cry!" ;;
R|r) Total=$Total+2; echo "Real crispy radishes." ;;
*) echo "Ain't got nuttin' like that today, mebbe tomorra." ;;
esac
sleep 2
clear
done
シェルスクリプトを書くならライブラリから始めたほうがいい。そうすれば source コマンドでいつでも利用できる。ここまで付き合ってくれた読者はもうかなり高度なスクリプトが書けるはずだ。後は実際に試してみるだけだ。
これは最良の設定ではないが断続的に接続するホームマシンを複数の人が使う場合には有効だ。週末に弟のマシンに Red Hat 6.2 をインストールした。通常筆者は Debian を使っている。最初の問題はプロバイダへの接続で発生した。プロバイダが認証に CHAP を使っていたからだ。これはアカウントプロバティの「アドバンスド」タブで PPP ですべての認証に対応を選び /etc/ppp/chap-secrets にパスワードを記入して解決した。次の問題は Netscape 以外のメーラーででメールを送るときに発生した。これまで使っていたメーラーは Mutt だ。
sendmail の設定は非常に難しいが簡単に説明しよう。以下の作業は root ですること。
1. "sendmail-cf" のパッケージをインストールする。設定ファイルを修正しないとつかえない。
2. /etc/mail ディレクトリに "genericsdomain" と "genericstable" の2ファイルを作成し、/etc/mail/Makefile の "all:" の行に "genericsdomain.db" と "benericstable.db" を追加する。
3. 自分のドメインネーム(FQDN)を "genericsdomain" に書きこむ。これで semdmail はメールがローカルホストからのものかどうかを判別する。"genericsdomain" に localhost を追加しても影響はないようなので入れておいたほうがいい。
4. 自分のメールアリアスを "genericstable" に書きこむ。例えばこんな具合に。
joe big_time@yahoo.com
zelda gorgeous@cheerful.com
walter walter@worldnet.att.net
5. /etc/mail ディレクトリで make を実行すると db ファイルが作成される。以降変更があったらその都度 make を実行するようにしよう。
6. /etc/sendmail.mc ファイルに次のように追加しよう。場所は FEATURE 項目の最後が分かりやすいだろう。
FEATURE(masquerade_envelope)
FEATURE(genericstable, `hash -o /etc/mail/genericstable')
GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')
7. "m4 /etc/sendmail.mc > /etc/sendmail.cf" コマンドを実行する。これで修正が反映された設定ファイルが作成される。
8. 最後に sendmail を再起動して設定を有効にしよう。
"killall -HUP sendmail"
"kill -HUP <PID>", PID には sendmail のプロセス ID を入れる。
実際に使用し、相手のメールサーバから拒否されたこともない。一度に一人のユーザなら SMTP にも POP にも対応している Netscape で十分だが複数のユーザがいる場合には sendmail は便利だ。
Linux の基本的な設定で Linux マシンのセキュリティを強化する方法を説明しよう。
BIOS レベルでのセキュリティ
フロッピディスクでの起動を許可しないように BIOS にパスワードを設定する。
LILO のセキュリティ
Step 1
/etc/lilo.conf ファイルに "time-out", "restricted", "password" を設定しよう。Linux 起動時にパスワードを入力しなければならなくなる。
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
time-out=00 #change this line to 00
prompt
Default=linux
restricted #add this line
password=<password> #add this line and put your password
image=/boot/vmlinuz-2.2.14-12
label=linux
initrd=/boot/initrd-2.2.14-12.img
root=/dev/hda6
read-only
Step 2
/etc/lilo.conf のアクセス許可を root に限定する。
[root@kapil /]# chmod 600 /etc/lilo.conf
Step 3
/etc/lilo.conf の修正を有効にする。
[Root@kapil /]# /sbin/lilo -v
Step 4
さらに念を入れて /etc/lilo.conf ファイルを修正不可にしよう。
[root@kapil /]# chattr +i /etc/lilo.conf
これで変更もリンクもできなくなる。
スペシャルアカウントを削除する
デフォルトで設定されるユーザやアカウントを削除しよう。lp, sync, shutdown, news, uucp, operator, games, gopher などだ。削除するには次のようにする。
[root@kapil /]# userdel LP
正しいパスワードを使用する
デフォルトでパスワードは最低5文字に設定されているがこれを8文字に変更しよう。/etc/login.defs ファイルを次のように変更する。
root アカウント
"root" は Unix システムの特権ユーザだ。管理者がログアウトしないで席を立ってしまうのは非常に危険だ。そこで一定の時間が経ったらログアウトするように設定しよう。
"HISTFILESIZE=" の後に
TMOUT=3600 を追加しよう。
数字は秒数を表している。これは1時間だ。使用しない状態が1時間続くと自動的にログアウトする。これは個々のユーザのホームディレクトリの ".bashrc" を変更することでも有効になる。その場合は変更したユーザだけに適用される。
Disable all console-equivalent access for regular users
必要のないコンソールアクセスを削除する。
[root@kapil /]# rm -f /etc/security/console.apps/<servicename>
不必要なサービスを無効にする、またはアンインストールする
使わないサービスは無効にするかアンインストールしよう。/etc/inetd.conf ファイルを見て使わないサービスをコメントアウトしよう。方法は行の先頭に "#" を付けるだけだ。inetd を再起動すれば変更が有効になる。ついでにアクセス許可も変更しておこう。
コメントアウトするサービスはそれぞれの環境によって異なるが ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth などだ。
[Root@kapil /]# chmod 600 /etc/inetd.conf
[root@kapil /]# killall -HUP inetd
[root@kapil /]# chattr -i /etc/inetd.conf
TCP_WRAPPERS
TCP_WRAPPERS を使えば外部からのアクセスを制御することができる。TCP_WRAPPERS は "/etc/hosts.allow" と "/etc/hosts.deny" の二つのファイルでコントロールする。基本はすべてのアクセスを拒否して許可するアクセスをリストアップすることだ。
Step 1
/etc/hosts.deny ファイルを開いて次のように修正する。
# Deny access to everyone.
ALL: ALL@ALL, PARANOID
これですべてのサービスへのアクセスが制限され、allow ファイルで許可されたユーザのみがアクセスできるようになる。
/etc/host.allow ファイルにはアクセスを許可するホストを記入する。例えばこんな具合だ。
ftp: 202.54.15.99 foo.com
Step 2
設定がすんだら tcpdchk を実行して設定をチェックする。
[Root@kapil
/]# tcpdchk
システムが表示するメッセージを制限する
ユーザがアクセスしてきたときにログインメッセージなどの情報を表示するのを制限する。例えば telnet でのアクセスに対する表示を変更するには次のようにする。
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
を次のように変更しよう。
telnet stream tcp nowait
root /usr/sbin/tcpd in.telnetd -h
"/etc/host.conf" ファイルを変更する
/etc/host.conf ファイルに次のように追加しよう。
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
最初のオプションはホストネームの解決に DNS を使い、次に hosts ファイルを使用する。
"/etc/services" ファイルの属性を変更する
[root@kapil /]# chattr +i /etc/services
他のコンソールからの root でのログインを禁止する
root でログインできる TTY デバイスは /etc/securety に記載されている。必要のないコンソールはコメントアウトしよう。
スーパーユーザになるのを禁止する
他のユーザが "su" でルート権限を得るのを禁止したり制限するには次のようにする。
/etc/pam.d/su ファイルの先頭に次の行を挿入しよう。
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/Pam_wheel.so group=wheel
これで root 権限を使えるのは wheel グループだけに制限される。
ログ
bash シェルはコマンド履歴を "~/.bash_history" ファイルに記録している。アカウントを有するユーザのホームディレクトリには必ず ".bash_history" ファイルが作成される。コマンド履歴を少なくし、ログアウトするときにファイルを削除するようにする。コマンド履歴のサイズは /etc/profile に規定されている。このサイズを例えば30に変更しよう。
HISTFILESIZE=30
HISTSIZE=30
管理者権限で /etc/skel/Bash_logout ファイルに次の行を追加する。
rm -f $HOME/Bash_history
Control-Alt-Delete キーでのシャットダウンを禁止する
/etc/inittab ファイルの次の行をコメントアウトする。つまり行の先頭に "#" を入れる。
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
"/etc/rc.d/init.d" ディレクトリのスクリプトファイルのパーミッションを変更する
[root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
システム情報の表示を禁止する
Linux マシンにログインするとディストリビューションの名前、バージョン、カーネルバージョンなどが表示される。クラッカーには貴重な情報なので表示しないようにしよう。方法は /etc/rc.d/rc.local ファイルの次の行をコメントアウトする。
# This will overwrite /etc/issue at every boot. So, make any changes
you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
次に /etc ディレクトリにある "issue.net" と 'issue" ファイルを削除する。
[root@kapil /]# rm -f /etc/issue
[root@kapil /]# rm -f /etc/issue.net
不必要な SUID/SGID プログラムを無効にする
プログラムが SETID root に設定されているとユーザは誰でも root 権限でプログラムの実行ができる。管理者としてはこの SUID/GUID プログラムを最小限にすべきだ。まず "s" ビットの立ったすべてのプログラムを見つける。
[root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls lg {} \;
これらのプログラムを無効にするには次のようにする。
[root@kapil /]# chmod a-s [program]
MS-DOS の自己診断プログラムを若干のコードの修正と Linux モジュールを使って Linux に移植する。
自己診断ソフトはデバイスのレジスタにアクセスして情報を得る。リアルモードで動作している MS-DOS ではこれは簡単なことだが、デバイスドライバがカーネルに実装されている Linux ではかなり難しい。ユーザプロセスがシステムに影響するのを抑制しているからだ。今回は Visual C++ で書かれた16ビット MS-DOS 用のプログラムを GNU C++ と Linux OS に移植してみる。
実際にコンパイルしてみるとコンパイルできないのは標準でないシステムコールとインラインのアセンブリコードだ。I/O ポート、メモリなどいくつかのシステムリソースはユーザの root 権限でもアクセスできるが、I/O ポートもメモリも割り込みを制御するのは無理だ。PCI の設定空間にアクセスするのも危険だ。詳しくは [RUB] Chapter 2, 36 ページの Linux Device Drivers section "Doint it in User Space" を参照してください。GNU のコンパイラである GCC はこれらを扱うことができる。一つの Linux モジュールで割り込みハンドラ以外は扱うことができる。
モジュールは一塊のコードでランタイムにカーネルに付加されるオブジェクトファイルだ。モジュールのソースには linux/module.h がと最低二つのファンクション (init_module, cleanup_module) がインクルードされる。ファンクションはカーネルモードで実行されすべてのリソースにアクセスできる。シンボルをエクスポートして他のモジュールの関数を実行することもできる。デバイスノードを持つものはユーザプロセスからアクセスすることも可能だ。
手間を厭わなければ個々のチップ毎にデバイスドライバモジュールを書きローレベルの DOS 診断ルーティンを書きなおせばシステムリソースにアクセスできるが、現実的ではない。そこでカーネルにアクセスする汎用のモジュールを一つ作ってカーネルアクセス機能を提供すれば簡単になる。便宜的に Wormhole ドライバということにしよう。モジュールは I/O ポートのリード/ライト、PCI コンフィグレーションスペースのリード/ライト、BIOS、PCI メモリのリード/ライト、タイムディレーなどの機能を提供する。すべて ioctl(2) を呼べば可能だ。
リクエストパラメータはモジュールが要求するサービスだ。例えば WORM_IOP_R のようなシンボルがそれぞれのリクエストで定義される。それぞれのリクエストは構造体を有し、argp がそれを指している。モジュールのデータ入出力はこの構造体を通して行われる。copy_from_user, get_user_ret はユーザからのデータ取得に、put_user_ret はユーザ空間へのライトを提供する関数だ。
I/O ポートにアクセスするには三つのリクエストがある。それらは
PCI コンフィグレーションスペースは I/O ポートと同じようにアクセスできる。アドレスはバスナンバー、デバイスナンバー、ファンクションナンバーとバイトオフセットを用いる。Wormhole では linux/pci.h に定義されている PCI_BIOS コールを利用している。
ミニマムタイムディレーは一定時間経過後にコントロールを呼び出したプロセスに戻す。割り込みやタスクスイッチのためにタイムディレーは長くなる。DOS の診断プログラムは二つのディレーファンクションがある。一つは18.2 Hz の DOS システムクロックで、Linux モジュールはシステムタイマ割り込みでディレーを提供する。Wormhole の ioctl リクエスト WORM_DELAY_MS はミリ秒を引数に取る。ディレーを越えるとタイムアウトをセットしてスリープする。二つ目のコードはマイクロ秒単位でのディレーを実行する。Linux は <linux/delay.h> で udelay ファンクションを用意している。Wormhole の WORM_DELAY_US はカーネルファンクション udelay にミリ秒数を引数として渡す。
DOS 診断プログラムはプロテクトモードに切り替えることにより 4GB のメモリ空間にアクセスできる。既存のコードは DRAM 上の PCI デバイスメモリと 1M 以下の BIOS 空間にアクセスできる。
Linux ではプロセッサはプロテクトモードで動作しており、メモリ管理ユニットが有効になっている。Linux には vremap というカーネルファンクションがあり仮想メモリと物理メモリのマップを管理する。物理メモリアドレスは DRAM 以上でなければならない。メモリマップデバイスと PCI メモリには ioremap が使用される。Wormhole の WORM-PCIMEM_R と WORM_PCIMEM_W はページをマップし、32ビットか8ビットでの読み書き後ページを開放する。
Wormhole の WORM_BIOSMEM_R と WORM_BIOSMEM_W はカーネルマクロの readb, readl, witeb, writel を使って 1M 以下のシステム BIOS にアクセスする。
DOS 診断プログラムは割り込みハンドラをインストールして割り込みをチェックする。個々の割り込みデバイスはカスタムのハンドラを必要とするため Wormhole ドライバは汎用のサービスを提供することができない。それぞれの割り込み毎にモジュールを作らなくてはならない。さらに Wormhole ドライバはコンテクストスイッチのオーバーヘッドにも制約される。又1度の呼び出しで一つのアクセスしかできない。Wormhole ドライバと Linux ユーザプロセスではリアルタイムの応答に対応できない。又安全のためにカーネルリソースへのアクセスをコントロールしない。
ソースコードは次のとおり
worm.h
worm.c
Makefile
この記事は学校のネットワークをインターネットに接続したときの顛末だ。問題は(多分)どこも同じ。コンテンツとサービスの制限だろう。さらにコンピュータラボのネットワークを別のフィルタで別のセグメントに接続したかった。コンピュータが増えれば問題も増える。

フィルタリングサーバはローカルのウェブサーバも兼ねている。
最初は Linux 標準のルーティングを使おうかと考えた。Linux ボックスを使えば複数のセグメントをルーターを使ってつなぐことができる。必要なのはセグメントの数と同じだけのイーサネットカードだ。後はファイヤウォールを設定して同じセグメントのソース、デスティネーションアドレスを無視し、別なセグメントのアドレスを通せばいい。トラフィックをフィルタすれば衝突を検出するイーサネットのネットワークにも効率的だ。セグメントのノード数が増加すれば衝突が増加し効率が悪くなる。例えば10ノードを有するセグメント三つを Linux のファイアウォールで接続したものは一つで合計30ノードを有するネットワークよりはトラフィックの効率がいい。
簡単なセットアップはクライアントがネットアクセスサーバをプロキシとしフィルタリングサーバをファイアウォールに設定すればいいのだがルーティングをするにはこれでは不充分だ。ISDN がつながるとデフォルトゲートウェイが ISP になってしまう。クライアントからのネットアクセスリクエストはフィルタされて送出されなければならない。
もう一つのアクセス方法は squid プロキシを利用することだ。WinGate プロキシはフィルタリングのときに ISP にメッセージを送ってしまうので WinGate プロキシにぶら下げる形でぶら下げ、squid がリクエストをフィルタしてローカルサーバ宛か WinGate 宛かを判断する。

これ以上のアイディアが出てこないので最後は自分で Java でプロキシデーモンを書いてフィルタをインストールすることにした。必要なプロキシデーモンの機能は次のとおりだ。

言語に Java を使うのはソケットのプログラムが C よりも簡単だからだ。必要なクラスは java.net.*: Socket, ServerSocket, DataInputStream, PrintStream などほとんど揃っている。クライアントの接続を処理するためのプロセスをフォークするのが C と同じ位簡単にできる。大きな違いは別なプロセスではなくスレッドを使うことだろう。筆者の Java プログラムは期待通りに動作した。思ったよりきびきびと動いている。
ソースコードは こちら です。
ウェブサーバはそれを作るのが目的ではなくウェブサービスを構築する土台となるものだ。この記事ではオープンソースの AOLserver を紹介しよう。aolserver はGNU/Linux 上でも動作する。
始めは VaviSoft という Unix プログラマが作った会社だ。彼らは優れたウェブ公開システムをデザインした。NaviServer というウェブサーバは1994年にはマルチスレッドに、スクリプト言語、ビルトインのデータベースコネクティビティを備える。1996年には AOL が自社サイト構築のために NaviServer を利用することに決定したがプログラムを購入するのは同社のやり方ではない。会社すべてを取得したために名前も NaviServer から AOLserver に変更した。その後オープンソースとなり AOLserver 3.1 が2000年9月にリリースされた。
ウェブサーバはツールでありウェブサービスを構築するためのプラットフォームである。ウェブサーバは堅牢性、安定性、スケーラビリティが要求される。AOLserver は堅牢で安定しておりしかもスケーラビリティがある。これは実績が証明している。実際に AOL サイトで使用されており毎秒30,0000ヒットをこなしている。つまりインターネットで実際に使用されてその安定性、スケーラビリティを証明している。
スタティックページの応答では他のウェブサーバと同様に優秀だが、現在はダイナミックコンテンツに関心が集まっている。AOLserver の機能をもう少し細かく見てみよう。ウェブサービスをオブジェクト志向で考えるとウェブサーバはオブジェクトでそのメソッドが URL だ。ユーザは URL を要求してメソッドを起動する。最も単純な場合はウェブサーバがスタティック HTML ファイルを取り出してコンテンツをユーザへ送り返す。複雑な例では HTML ページを生成する。その一つの例が C エクステンション API を使ってウェブサーバを拡張することだ。ほとんどのウェブサーバが対応している。AOLserver も同機能を提供している。AOLserver の組込み PHP のソースのサイズは Apache のそれのほぼ半分だ。API での拡張は時間がかかりエラーが発生しやすい。又ローレベルの言語を使用するのでデバッグも困難な作業だ。
このために CGI プロトコルが作られた。CGI はほとんどのメジャーのウェブサーバが対応している。CGI の原理は簡単だ。ページリクエストが発生するとウェブサーバはプログラムを実行しプログラムはその結果を標準出力に返す。ウェブサーバは標準出力に表示されたものをそのままクライアントに返すだけだ。CGI の利点はプログラマが得意な言語を利用するすることができることだ。そのために開発期間も短縮できる。欠点は遅いことだ。このパフォーマンスを改善するためにウェブサーバは直接実行できるスクリプト言語を搭載するようになった。良く知られているのは Apache の mod_perl や PHP だ。インタプリタをウェブサーバが実行するために別のプログラムをフォークする必要がない。この方法は CGI と同じように短期間で開発が可能だが利用できる言語が限られてしまう。AOLserver はスクリプト言語(Tcl)を統合している。Tcl が好みでなければ PHP, Python, Java を使うことも可能だ。
最後に出てくるのがサーバサイドインクルードと言われるもので、コードが HTML ページに埋め込まれている。ウェブページはサーバにより解析され HTML コードはそのままブラウザに渡され、埋め込まれたコードは実行されその出力に起きかえられてブラウザへ送られる。IIS の ASP ページがこれだ。AOLserver は ADP ページを提供しており、tcl コードを埋め込むことができる。
ウェブサーバに速度と効率を求めるならマルチスレッド対応の AOLserver がいい。Apache 1.3.x, Apache 2.0 もマルチスレッド対応に書きなおされているところだ。プロセスベースのウェブサーバは個々の http リクエスト毎に新しいプロセスを生成しなければならない。スクリプト間でデータを共有することもマルチスレッドなら簡単に実現できる。プロセスベースはそれぞれのプロセスが同じメモリを共有していないので容易ではない。
ダイナミックウェブサービスがデータベースの読み書きをするようになるとデータベースとのインタフェースも必要になる。AOLserver には非常に優れたデータベース接続 API が含まれており、しかも高速だ。他のウェブサーバはデータベースの接続毎にデータベースのオープン/クローズを繰り返すが AOLserver はスタートのときにデータベース接続をオープンしスクリプト間で再利用される。API も標準化されている。つまり 同じ API で複数のデータベースサーバにアクセスできる。データベースを切りかえるときには非常に便利だろう。そのために Oracle, PostgreSQL, MySQL, Informix, Interbase, Solid, DB2 などのドライバが用意されている。
AOLserver は開発者のために基本的なビルディングブロックを提供している。さらに車輪を再発明する代わりにオープンソースを利用できる。(Oracle ベースの ArsDigita Community System (ACS)、OpenACSなど)。
オープンソースではドキュメンテーションが疎かにされがちだが AOLserver にはオンライン、オフライン両方で優れたドキュメントが揃っている。又ユーザ、開発者のコミュニティも活気があり、Python 組込みプロジェクトの PyWX project、XML 機能を追加する nsxml、Java を呼び出す nsjava、Perl モジュールの追加 、サーブレット機能を追加する nstomcat などが活動中だ。
ウェブの進歩は早い。スタティックページと CGI ではユーザの要求に応えきれない。現在はダイナミックデータからのウェブページ作成、ユーザ間でのコラボレーション、ユーザの移動のトラッキングなどが必要とされてきている。AOLserver ならこれらの要求に応える高機能のウェブサービスを構築することが可能だ。
2年前の Linux Gazette に載った記事が発端となり始まった Linux Professional Institute (LPI) だがそのとき予想もしなかった展開を見せ、多くの人たちの支持を得て LPI として Level 1. のテストをするまでになった。ウェブページで援助をいただいた人々へ謝意を表しているがそれでも足りないくらいだ。ここで改めて支持をしてくれた人たちへ感謝したい。LPI の趣旨は公平な認定機関を作り公平で標準的な認定試験をすることだった。ここまでの道のりは険しかったがこれからすべきことも非常に困難なことばかりで、ますます多くの人々の援助がなければ成し遂げるのは難しい。もし援助したい人がいたら wilma@lpi.org まで連絡をして欲しい。皆さんの援助があれば今後の目標も必ず達成できると確信している。