カテゴリー

アクセスカウンター


since 1996/06/14

Count per Day

  • 30今日の訪問者数:
  • 43昨日の訪問者数:
  • 918月別訪問者数:
  • 0現在オンライン中の人数:

OBS構築記録

注意
このページはもう更新していませんが、いろいろ役立ちそうなので残しておきます。
※当時のOBSはかなりCPUパワーが無かったので苦労していますが、最近のは普通のサーバとたいして違わないようです。

OpenBlockSとは?

OpenBlockSぷらっとホームが発売しているサーバです。サーバに必要な機能以外を可能な限り省き、小型化されたサーバです。ネットワークポートx2個、RS-232Cインターフェース、コンパクトフラッシュのインターフェース、IDEのインターフェース(ノート用の小さいコネクタ)のみの入出力機器を備えています。
※現在は複数の機種がある
購入するには直接行くか、通販しかありません(OEMで似たようなものはあるみたいだけど)。
ディスプレイは?キーボードは?と疑問に持つかもしれませんが、すべてネットワーク経由でリモート操作することを前提としているため、そんなものありません。
OSはLinux(Linuxがわからない人はココを読んでもつまんないと思うのであえて書きませんが、まぁパーソナルUNIXです)が搭載されています。
ネットワークの設定を間違えると二度と接続不能になり、使えなくなるのか?というとそうではなく、OSはフラッシュROM(プレステのメモリのようなもの)に記録されてて、起動するたびにRAMに展開されます。RAMは電源を切るたびに消去されるので、再起動するたびに元の設定に戻るという仕組みです。当然、変更した設定はフラッシュROMに書き込むこともできますが、これの容量は小さいので、複雑なことはできません。

OpenBlockSの可能性

OpenBlockSで何ができるか?というところですが、主に以下の目的で使うのが良いんじゃないかな?と思います。

  • ルータ/Firewallとして
  • Linuxの勉強用。
  • 簡易公開サーバ構築用。

ルータとしての用途ですが、はっきり言ってこれにはお勧めしません。OpenBlockS自体は約4万円しますが、一般のブロードバンドルータなどは1万円〜2万円程度で買えます。Firewallとしては意味があるかもしれません。細かいアクセス制御や、アクセスのロギングなどに使えます。ただ、こういう使い方はイマイチ面白くないかもしれません。勉強にはなりますが、、、。
Linuxの勉強用としては非常に有効だと思います。最近のLinuxディストリビューションはイロイロなものが入っていて、さらに自動設定が出来ますので勉強になりません。構築のときはいいですが、障害が出たときなどの問題が出ます。その反面、OpenBlockSは勉強になります。基本的に一般的なディストリビューションは使えません。ぷらっとホームのサイトに非常にシンプルなカーネルイメージがあるのでそれを入手する必要があります。さらに、サーバなどを構築するには、ソースを入手してコンパイルするか、有志によるrpmを使うしかありません。構築するのは非常に厳しいですが、構築が終わったころには一人前のLinux技術者としての第一歩を踏めるでしょう。
簡易公開サーバとしても有効です。特に消費電源量の少なさと、稼動部分が無いことによる静音性が魅力的です。
あえて、「簡易」と書いたのはやはりCPUパワーとメモリ不足の問題でどうしても重いです。イロイロなサービスを稼動させると、ちょっと実用が厳しくなります。
※HDDを増設する場合、2.5inchなので、そこだけちょっとうるさいです。
いづれにしろ、自宅で公開サーバを構築するにはもってこいの筐体といえるでしょう。

HDD購入

上のOpenBlockSとは?に書きましたけど、これ単体ではたいしたことができません。増設記憶装置としてコンパクトフラッシュメモリ(この文を執筆時の相場で256MByte→2万円位かな)か、2.5インチHDDが接続できます。
HDDは専用オプションとして販売されてますが、当然それを無視して秋葉原でIBMの5GByteHDDを購入し接続しました。はっきり言って差すだけなので簡単です。
無視したらメーカ保証がなくなるだろう?と思いますが、HDDを接続してサーバ代わりに使用すること自体が保証外なので、眼中無しです。っていうか、こういう使い方しないとOpenBlockSの真価が発揮できないしね。
ちなみに容量的にはコンパクトフラッシュで十分なんですが、実は*あること*をしたいがために大容量にしています。何をしたいかはまた後ほど書くとして、、、。
HDDを増設時はかなり注意が必要です。触ると壊れそうな個所がかなりあるので、カスタマエンジニア(パソコンの修理屋)を経験した私でもちょっと怖かったくらいです。

OpenBlockSSの可能性

OpenBlockSの後継機として、OpenBlockSSが2001年11月に発表されました。
※残念ながらデルタはOpenBlockSSを持っていません。発売前に今のサーバを作ってしまったもので、、、。
OpenBlockSSの大きなポイントはCPUのパワーアップ(50MHz→200MHz)と、メモリの増強(32MB→64MB)です。どのくらいのパフォーマンスが出るかの情報はまだ入手していませんが、非常に期待できるでしょう。

コラム

このコンテンツはOpenBlockSの構築記録ですが、ここにはそれと間接的に関係してきそうなネタを書きたいと思います。

OpenBlockSリンク集

はっきり言って、どこかの個人サイトを参考にしないと厳しい。というか、同じことを考える人は多いので、参考にさせていただいております。

セキュリティ1(バージョンの隠蔽)

デルタはブラックハットでもクラッカーでもないですが、一応セキュリティのお仕事をしているので、セキュリティ対策としてやっといたほうがいいなぁというのを記述しています。
バージョンの隠蔽というのは、所謂どういうサーバかよくわからない状態にすることにより、不正侵入される可能性を低くするという対策です。
バージョン情報はイロイロなところで出てきます。telnetのプロンプトの前や、Webサーバのエラーメッセージ/ヘッダー情報、SMTPに接続したときや、「HELP」コマンドを入力したときです。
バージョン情報の隠し方は特に書きませんが、ソースコードが読めるならチャレンジしてみましょう。
※それにしても、OpenBlockSはコンパイルに時間がかかるので、いざ直そうと思っても気力が出ない(^^;;

Linuxコマンド集

まぁ、メモってことで。
http://linux.nikkeibp.co.jp/command/

viのコマンド

Linuxには必ずといってもいいほど「vi」というテキストエディタが入っています(というかソレしか使い方知りません)。以下に簡単な使い方を記します。

  • 起動
    vi ファイル名
  • 挿入モード(viはいきなり文字を書くことができません)。また、以下のコマンド群は挿入モード中は使えません。
  • ロールアップ
    f
  • ロールダウン
    b
  • 一文字削除
    x
  • 行削除
    dd
  • 終了
    q(編集後の強制終了はq!)
  • 書き込み
    w
  • 検索
    「/」の後に検索文字列。正規表現が使えるようで、*とか?とか/とか.とか\とかいう文字の取り扱いには注意。

telnet

通常使用しているパソコンはWindows2000なので、Linuxへtelnetでログオンできる環境が必要になります。ちなみにWindows2000のtelnetは文字コードの認識がまともにできないヘタレなので使わない。
私が使用しているのはTera Term(http://hp.vector.co.jp/authors/VA002416/)です。まぁ、非常に有名であるのと、後でインストールするSSH(同サイトのリンクにある「TTSSH」というもの)のクライアントにもなれるところがすばらしいからである。

その他参考になるサイト

・TCP/IP入門
http://www.net-newbie.com/tcpip/
ものすごくわかりやすいです。じっくり読むと2,3日はイケるかも。
・Sendmailのテスト
http://www.kuis.kyoto-u.ac.jp/imel/tebiki/rvsettei/settei/node121.html
カンタンなテスト方法が書いてあります。本が無い人向け。
・sendmailとsendmail.cfのインストール
http://qubeley.ipc.kobe-u.ac.jp/Computers/SPAM/Mail/index.html
始め、Sendmail本をどこに置いたかわからなかったので、ココを読んで入れました。

デルタがOpenBlockSで何をしたいのか

結論を言ってしまえば、「UNIXとネットワークの勉強をしたい」が50%、「Linuxサーバでいろいろ遊びたい」が50%です。
UNIXという名前は昔から知っていたのですが、UNIXの考え方〜マルチユーザ、マルチタスクとか、C言語との関連性や、オープンソースという考え方〜を知ったのは専門学校のときです(大卒ではありません^^;;)。当時はまだ「32bitCPUの80386SX」を搭載した「PC-9801シリーズ」が主流で、OSは「MS-DOS3〜5くらい」が使われてました。私自身は「TurboC(ボーランド社)」を使ってCの勉強をしていたころです。
UNIX自体はまだパソコンではそんなに使われてなかった(と思う)時代でしたが、「将来UNIXの勉強をしたいな」とひそかに考えていました。
時間は流れて、UNIXやLinuxのことを知るにつれて、コンピュータやOS、ネットワーク等などの学習にはUNIXを知るとそれだけでもかなりの勉強になると思い、またLinux自体、リーナスさんが学生時代に作ったものであるということを知り、まぁ勉強の題材にはベストであると考えました。どちらにしろ、WindowsとかUNIXとかのブームもありますが、少なくとも基盤となる技術を知っておけば、一生ものだなと考えています。とりあえず「勉強としての50%」はこんなかんぢ。
「遊びの50%」はイロイロあるんですけど、その中のひとつとしてはまず、クラッカーが仕掛けた攻撃をどのようにして検知できるのかなというところ。他にも遊びネタはいろいろあるのですが、まぁうまく言ったらココに書こうと思います。

Windowsの罠

別にWindowsが悪いわけではないのですが、WindowsとLinuxを併用しているとイロイロと問題が起きます。大体はファイル転送の問題ですが、、、。

  • テキストファイルをバイナリで転送してしまう。
    普通はそんなに問題ではないですが、Perlスクリプトとかは動かなくなるときがあります。
  • パーミッションの設定
    転送したらちゃんと設定してあげましょう。
  • 改行コードの問題。
    Windowsの一般的な改行コードは「CR+LF」でLinuxは「LF」です。そのまま送って「vi」とかで開くと行末に「^M」とかいう文字が発生してゲンナリします。
    この辺の変換をやってくれるテキストエディタもありますので活用しましょう。

メモ

メモです。気にしないでください。
http://www.go.dlr.de/linux/src/
ZDnet Tips for Linux
http://www.zdnet.co.jp/help/tips/linux/

基礎構築

まずはHDDから起動してネットワークにつながる環境を構築しなければなりません。ここでは(ほとんど他のサイトの丸写しですが)その記録を残しています。

HDDの初期化

とりあえず、デフォルトの状態で、Telnetでログオンできる状態にしました。当然、HDDは接続済みですが、インストールする前に、HDDを初期化しなければなりません。
1、fdisk /dev/hda
ここではHDDのパーテイション管理ができます。メニューは「mENTER」で出るんで、さくさく切ります。swapは32MByteでいいらしいので、そのまま設定。quote(HDDの容量管理ソフト)とかでも遊びたいので、いくつかのパーテイションに分けてます。

/dev/hda1...プライマリ 1024Mbyte
/dev/hda2...swap 32MByte
/dev/hda3...プライマリ 1024Mbyte
/dev/hda4...プライマリ 残り全部

ちなみにfdiskの主なコマンドは以下のとおり。

  • m
    メニュー表示
  • n
    パーテイション作成。だいたい開始セクタはENTERのみ(デフォルト)で、終了セクタは「+1024M」みたいに容量で入力できます。
  • p
    作成したパーテイションの状況を表示。
  • t
    フォーマットタイプの設定。デフォルトはLinuxの標準なので通常は変更無し。swapだけ「Linux Swap」を選ばなければならない。
  • w
    書き込み終了
  • q
    書き込まずに終了

最後に「w」で書き込まないと機能は有効になりません。
パーテイションを切り終わったら、おのおののパーテイションを初期化します。通常の領域は、「mke2fs /dev/hda1」とかでOKですが、swapだけ「mkswap /dev/hda2」とコマンドが変わります。

hddイメージを登録

まず、hddイメージを入手します。入手場所は以下。
http://openlab.plathome.co.jp/OpenBlockS/hdroot_dl0.html
hddイメージというよりか、必要最低限のコマンド等は入ってます。入れれば動くって感じ。
「es1h_plat_1.03h_0905-2.tgz.Build」というファイルを使いますが、かなりでかいので、HDDに直接ftpでぶち込まなければなりません。やり方は以下をそのまま打ち込めばOK。

まずはHDDをマウント

  1. mount /ext1(/ext1は事前に用意されてる)
  2. cd /ext1(ここがHDDのルート)
    次にftp経由でファイルをゲット。
  3. ftp ftpサーバのIP
  4. ftpサーバへログオン
  5. get es1h_plat_1.03h_0905-2.tgz.Build
  6. bye
  7. 展開。
    tar zxvf es1h_plat_1.03h_0905-2.tgz.Build(かならずHDDのルートから展開しなければならないらしい)
    しばらく待てば完了します。あとは「halt」か「shutdown -h now」でシャットダウン。ディップスイッチをいじってHDD起動モードに切り替えればOKです。あ、このまま起動するとネットワークの設定が、初期値なのでシャットダウン前に変更したほうがいいかもしれません(viが使えないので、設定ファイルを「ftpでput」→「設定変更」→「ftpでget」しなければなりません)。

設定方法は次ってことで、、、
ちなみに、ftpサーバが無い場合(っていうか、始めはLANのftpサーバにしかつながらなかったし、、、)はftpサーバツールが使えます。私はこれ↓を使って、一時的にFTPサーバを作りました。結構楽ちんです。
http://www.vector.co.jp/soft/win95/net/se083171.html
あと、足りないパッケージ等は以下のサイトから入手できる。
http://openlab.plathome.co.jp/OpenBlockS/packages.html

基本的なネットワーク設定

とりあえず、telnetが繋がるような状況に持ってこないと困るので設定します。うちの環境では、OpenBlockSに固定IPを割り振りました。DHCPで割り振られるなら設定が違うので注意。

  • /etc/inetd.conf
    以下の2行だけ有効にし、それ以外をコメントアウト(行頭に#を付加)しました。
    ftp stream tcp …
    telnet stream tcp …
  • /etc/hosts
    「192.168.253.254」の部分を新しいIPアドレスに変更。
  • /etc/hosts.allow
    「ALL : ALL」の1行を追加。
  • /etc/sysconfig/network
    GATEWAYだけを、ゲートウエイのIPに変更(DHCP環境で、他にwindowsマシンがあるなら、DOSプロンプトで「ipcpnfig /all」でわかります)
    あと、GATEWAYDEVが外部接続されているポートに設定されていないと外部からの接続ができなくなります(かなりハマりました)。
  • /etc/sysconfig/network-script/ifcfg-etc0
    「192.168.253.254」の部分を新しいIPアドレスに変更。「NETWORK」と「BROADCAST」も変更。
    ちなみに
    IPADDR=192.168.0.10
    なら
    NETWORK=192.168.0.0
    BROADCAST=192.168.0.255
    って感じ。
  • /etc/resolv.conf
    「nameserver (ネームサーバのIP)」を設定。ネームサーバのIPも例の「ipconfig /all」をすると出てくる「DNS Servers」の値です。そのはず、、、イヤ違うかも、、、無くても動きます(爆。
    これでtelnetくらいなら動くハズです。

SSH(SecureShell)

Telnetでのログオン時の環境設定が気に入らないとか、FTPサーバ立てないととかイロイロ考えてましたが、最終的にはそういう管理系の通信は暗号化したかったので、ばっさり省略してSSHを入れることにしました。
SSHとは何か?というと、「セキュアシェル」という名前のとおりで、telnetやftpでログインする際に、パスワードを盗まれるときがあるので、それらを暗号化しようというもの。これがあれば、とりあえずtelnetとftpができて暗号化されるので安心なのである。
暗号化の仕組みはというと公開鍵方式を利用してるのだが、これがなかなかわかりづらい。
簡単に言うと、あるデータを「公開鍵」で暗号化し、「秘密鍵」で暗号化を解除するというもので、「公開鍵」で暗号化したものは、「秘密鍵」が無いと暗号化した人手さえ暗号化を解除することができない。「秘密鍵」は「データの受取人」しか持ってないので、一度暗号化したが最後、「データの受取人」しかそのデータが見れなくなるので、安全な通信が可能となる。
当然ながら、「秘密鍵」が「データの受取人」以外に流出するとこの手法は無意味になるので「秘密鍵」の管理が重要になる。「公開鍵」は一般公開されるものなので、データの送り手はそれを使っていくらでもデータを送ることができるのである。

SSHのインストール

始めはソースからのインストールをしようとしたが、よくわからないのでとりあえずrpmでインストールする。
インストールするrpmの順番は以下のとおり。

ldconfig-1.9.5-15obs.ppc.rpm
openssh-2.9p1-1obs.ppc.rpm
openssh-server-2.9p1-1obs.ppc.rpm
openssl-0.9.6a-1obs.ppc.rpm

ldconfigは入ってないとopensslを入れる段階でエラーになるんで。このまま起動するとイロイロエラーが出るので以下の操作をする。
あと、/dev/urandomとlibcrypto.so.0.9.6のパスがおかしいらしいので(この辺はよくわからんがML見たら書いてあった)直す。

# ln -s /usr/lib/libcrypto.so.0.9.6 /lib
# ls -l /dev/urandom
-rw-r--r-- 1 root root 0 Feb 2 1999 /dev/urandom
# rm /dev/urandom
# mknod /dev/urandom c 1 9
# ls -l /dev/urandom
crw-r--r-- 1 root root 1, 9 Dec 15 03:01 /dev/urandom

こんな感じ。

キーの生成と接続

細かいことは調べてないのでやり方だけ。
まずはとりあえず以下のように打ち込む。

/etc/rc.d/init.d/sshd start

これでキーが生成される。
次に自分の秘密鍵と公開鍵の生成。そしてフォルダへのコピー。この作業はroot権限でなくても大丈夫なので、suは解除しておいたほうがいいかもしれない。

$ ssh-keygen -f keyfile
$ mkdir ~user1/.ssh
$ cat keyfile.pub >> authorized_keys

後はアクセス権の設定

$ chmod 700 .ssh
$ chmod 600 .ssh/*

あとは/usr/sbin/sshdで起動するが、起動スクリプトに書き込んで自動起動するようにする必要がある。
/etc/rc.d/rc.sysinitに以下のように書き込む。(initdの起動の後くらい)

if  -f /usr/sbin/sshd ; then
echo "starting sshd..."
/usr/sbin/sshd
fi

あとはinetdの起動に関するスクリプト文をコメントアウトすればいいのだが、一度sshで接続できるのが確認できた後のほうがいいかも。
サーバへの接続はWindowsの場合、Tera Term+TTSSHを使うといい。SSHに接続して「Use RSA key to log in」を選び、先ほど作成した「keyfile」を指定する(事前にサーバから取り出してないとダメだけど)。
ログオンメッセージが気に入らなければ、/etc/motdを編集すればOK。

GCCによるコンパイル環境を整える

gccは入ってるんだけど、ちょっとした規模のアプリはまともにコンパイルできない。特にapacheとかを入れる時に「./configure」とか入れても、「trが無い」とか「cmpが無い」とか言われる。
「tr」に関しては「textutils」入れればOKらしく、また「cmp」に関しては「diffutils」が必要になるらしい。とにかく入れまくる。ただし、これら2つの「utils」は「/sbin/install-infoが無い」といわれる。install-infoに関しては「info-3.12h-2obs.ppc.rpm」を入れるとできる。

Apacheのインストール

Apacheのインストール〜って言っても、ApacheはすでにOBSに入ってます。ただし、バージョンが古いです。せっかくなので最新バージョンを入れよう!っていうか、そもそもrpmでのインストールよりもソースからのインストールのほうが(多少大変だが)メリットが多い。
一応、前もってgccによるコンパイルがちゃんとできる環境にしていなければならない。
まずは、最新版のApacheを入手する。最新版はhttp://www.apache.org/で入手することができる。ファイル名は「apache_1.3.xx.tar.gz」という感じ。コンパイル手順は以下のようになる。

$ ./configure --prefix=/usr/local/apache_1.3
$ make
$ su
# make install

–prefixはインストール先の指定。コンパイルまでは原則としてユーザ権限。インストールだけroot権限で行うのが基本。
ちなみにコンパイル時間は非常に長いので、覚悟して置いてください:)

Apacheの設定

このままだと自動起動しないので、「/etc/rc.d/rc.sysinit」の「httpd」の記述を「/usr/local/apache_1.3/bin/httpd」って感じに書き換える。設定ファイルは「/usr/local/apache_1.3/conf/httpd.conf」にあるのでそれを書き換える。重要なポイントは大体以下のとおり(すでに設定されている個所もある)。

ServerRoot "/usr/local/apache_1.3"
Port 80

↑最近のApacheは8080になってる。

ServerAdmin (管理者のメールアドレス)
ServerName ドメイン名

↑設定しないと「http://hoge.com」のように後ろにスラッシュを付けてないとアクセスできないなどの問題が出る。

DocumentRoot "/home/webmaster/public_html"

↑「webmaster」ユーザのWebディレクトリをトップページにしたい場合。

<Directory />
  Options FollowSymLinks
  AllowOverride None
</Directory>

↑全ディレクトリの設定。
※OptionsにCGIを使いたいとか、SSIを使いたいとかを設定する。指定できるのは「All(何でも許可)」「Include(SSI使用許可)」「Indexes(ファイル一覧表示許可)」「FollowSymLinks(シンボリックリンクの許可)」「ExecCGI(CGI実行許可)」です。
例)CGI、SSI、シンボリックリンクの許可

Options ExecCGI Includes FollowSymLinks

※AllowOverrideはユーザディレクトリに「.htaccess」を置いてアクセス制限をすることを許可するかどうかという設定(詳細は略)。

<IfModule mod_userdir.c>
UserDir public_html
</IfModule>

↑ユーザディレクトリの指定

<IfModule mod_dir.c>
DirectoryIndex index.html
</IfModule>

↑ファイル名が指定されない場合にどのファイルが参照されるかの指定。

AddHandler cgi-script .cgi

↑CGIの拡張子指定

AddType text/html .html
AddHandler server-parsed .html

↑SSIの拡張子指定(デフォルトは.shtmlになっているが、.htmlと共存したい場合は上記の設定になる)

Apacheの備忘録

CGIの挙動にかなり悩んだ。まぁやり方はイロイロあるだろうけど、調べたところまでのメモ。
基本的にはperlのopen(DB,xxx)関連。

  • CGIで作成したファイルはプログラムの中でchmodしてやらないと後で何もできなくなる。
  • 別ディレクトリにファイルを作る場合はそのディレクトリに実行権限がないとダメ。

nmapの導入

nmapってな〜に?って方も多いかも知れませんが、いわゆるポートスキャナです。ポートスキャナとはポートスキャンをするものですが、たとえばhttpサービスは80番、telnetは23番と定められているTCPポートをスキャンしていって、どんなサービスが動いているのを調べるものです。実行結果は以下のような感じになります。

root@deltasv /# nmap localhost
Starting nmap V. 2.54BETA26 ( www.insecure.org/nmap/ )
Interesting ports on localhost (127.0.0.1):
(The 1544 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
80/tcp open http
Nmap run completed -- 1 IP address (1 host up) scanned in 6 seconds

まぁ、クラッカーとかいう方々がよく使われるモノなんですが、ネットワーク管理にも使えるので、入れておくと何かと便利です。たとえば、apacheを入れたのにWebページが見れないって時に、これを使うと、簡単なミスの場合は、

8080/tcp open http

ってなったり、また企業内とかでFirewallが設定されている場合は、

80/tcp fillterd http

なんて出たりもします。
psコマンドで調べるのもいいですが、こういうのもあわせて使うと非常に問題解決が早くなります。
ちなみに他人のホストにかけると管理者から怒られるのでやめましょう。

nmapのインストール

nmapは「http://www.insecure.org/nmap/」で手に入ります。Windows版もありますが、いまいち使い方がよくわからないので使ってません。また、GUIフロントエンドもありますが、CUIで十分なので使ってません。
今回は「nmap-2.54BETA26.tgz」を入手しました。これをftpで転送し、いつものコマンドで導入します。

$ ./configure
$ make
$ su
# make install

makeの時にnmapFEが云々というエラーが出るかもしれませんがこれはGUIフロントエンドの話です。無視しておいてもCUIで使用する分には問題ありません。もしかしたらパスが通ってないかもしれないので(本体は/usr/local/bin/nmapにあります)、私はシンボリックリンクを作成しました。

# cd /usr/sbin
# ln -s /usr/local/bin/nmap ./

あとは「nmap localhost」と打ち込めば結果が表示されます。

nmapの応用

nmapはいろいろな使い方ができます。以下はその一例。
・OSの推測

# nmap -O hostname

・ステルススキャン

# nmap -sS hostname

普通はログに残りません。
・UDPスキャン

# nmap -sU hostname -p 130-140

結果表示が遅いのでポートスキャンの範囲を指定しています。135とか137,138あたりが開いていれば大体Windowsです。
こんなコマンド何に使うのか?といわれてもソレは内緒♪

Sendmailの導入

Sendmailのインストールの仕方は本とかが無いので一番よくわからないのですが、とりあえずソースコードを入手し、構築してみました。http://www.sendmail.org/から最新のソースを入手し、展開。以下のコマンドでインストールしました。

$ sh Build
$ make
$ su
# make install

とりあえずできたらしい。ちなみにこの間30分ほどかかりました(汗

CFの導入

sendmailの設定ファイルはまさに宇宙語なので直接編集する気がしない。その為、CFツールを使用する。
以下のURLから最新版とパッチを入手。
ftp://ftp.kobe-u.ac.jp/pub/Net/net/mail/CF/
次にパッチ当てとコンパイル。

$ tar zxvf CF-3.7Wpl2.tar.gz
$ cd CF-3.7Wpl2/Master
$ patch < ../../CF-3.7Wpl2-smtpcheck.patch1

ぬぁっ。patchが無い。OBSのパッケージサイトを見たらあったので、ここで導入、、、。

$ patch < ../../CF-3.7Wpl2-smtpcheck.patch1
$ patch < ../../CF-3.7Wpl2-smtpcheck.patch2
$ cd ..

どこからsuすればいいのかわからないのでとりあえずこの辺でsu。

$ su
# make cleantools
# make tools

どうやら、「インストール」という概念は無いらしい。というか、上記の内容を実行した場所がインストール場所らしい。

SPAMテスト

SPAMとはまぁSPAMメールの略ですけど、つまり第三者があるメールサーバを使って他の第三者にメールを送るという行為です。そのメールサーバはいい迷惑なだけですので、そういう行為はさせない設定をしましょう。とりあえず、ここではその設定がちゃんとされているか、チェックの仕方だけを解説します。
ちなみに文中に「telnet IP 25」とありますけど、これはTCP25番に接続して、直接SMTPサービスとお話する為の方法です。IPは当然ながらSMTPサーバのIPです。※使ってるコマンドはtelnetですけど、telnetサービス(TCP23番)とはぜんぜん関係ありません。
接続に成功すると、「220 云々」と出ます。この「220」のように頭が「2」で始まるサーバ応答は「処理の成功」を意味します。「550」のように「2」以外は何かしらのエラーです。SMTPはコマンドを打つたびに成否応答を返します。
接続を解除するときは「QUIT」です。

テスト1、他ドメインからの接続

SMTPサーバとは違うドメインから「telnet IP 25」で接続してみる。「違うドメインのユーザがSMTPサーバを使用しない」という運用形態ならば最強の対策でしょう。

テスト2、第三者中継テスト。

これはどこのドメインで接続してもいいです。以下のコマンド打ちます。
※間違えて入力した場合、BackSpaceがうまく処理されないときがあるので、その場合は再入力すればOKです。

$ telnet IP 25
$ HELO ugege(←ugegeの部分は何でもいいです)
$ MAIL FROM:<hogehoge@otherdomain.com&lg
$ RCPT TO:<hogehoge2@otherdomain2.com&lg

「MAIL FROM」と「RCPT TO」には自分のドメイン以外のメールアドレスを指定しましょう。実際に存在するアドレスだとなおよいです。ちなみにここまでの処理ならメールは送信されません。
「RCPT TO」が入力し終えたところまでの間に、処理の失敗(頭が「2」以外の応答)があれば合格です。

テスト3、ドメインを偽装した中継テスト

内容は「テスト2」と同じですが、SMTPサーバへの接続は別のドメインからのほうが効果的です。ただし、「MAIL FROM」のメールアドレスを「自分のドメイン名が含まれた存在しないユーザのメールアドレス」にします。
UserUnknownとかいうメッセージ(または他のエラー)が発生すれば合格です。
SPAMerは送信元のアドレスを好きなように設定できるので、当然ながらこれに成功しないとぜんぜんダメです。

テスト4、ユーザを偽った中継テスト

このテストは別のドメインからじゃないとあまり意味がありませんが、非常に有効的なテストです。通常のテストツールではテストできない(テストしようが無い)方法ですからね。
テストの仕方は「テスト2」「テスト3」と同じです。ただし、「MAIL FROM」には「実際に存在するユーザ」を指定します。
エラーになれば合格です。しかし、これは運用上必要になる場合がありますが、実際にこの手法を使ったSPAMメールが存在するのも事実です。一応、解決策として「POP before SMTP(POPでの認証を成功した後の数分間だけ、SMTPを許す機能)」があるそうです(設定したことはありません^^;;)。

syslogdの導入

やっぱり、Linuxで公開サーバを立てるからにはログを取りまくるべ〜ということで、syslogdを探しに行く、、、syslogdってどこにあるの?誰が作ったの?、、、そんな状態のまま悶々と探しているうちに、どうも「sysklogd」という名前が正しいらしいことに気が付く。カーネルロガーもいっしょなのかと自分に根拠の無い納得をさせた上体で探す。
そんなときに見つけたサイトがココ→http://homepage1.nifty.com/yohta/diary/2000/12/20/
「ゼロからLinuxを作ろう!」、、おぉ〜。これこそ求めていたサイト。lessのソースもあるじゃん。ま、気を取り直してsysklogdをget。

sysklogdのインストール

いつもどおりの、、、と思ったら./configureが無い。とりあえず「INSTALL」を読んでみると、英語はよくわからんのだが、Makefileをカスタマイズしてコンパイルしてくれというようなことが書いてあるらしい。よくわからないので

$ make
$ su
$ make install

とやってみる。「/usr/bin/install」が無いと言われるので、調べてみると「/bin/install」にあることがわかった。Makefileを修正して、再度「make install」を試みてみると美しく成功した。syslogdとklogdが/usr/sbinに導入された。
はてさて、これをどうやって動かすのであろうか、、、?

iplogの導入

iplogはパケット監視ツールのようなもので、IDS(侵入検知システム)のように複雑な攻撃パターンを認識できるわけではありませんが、ポートスキャンやフラグメントされた通信を監視するのに向いてるそうです(受け売り)。
とにかく、おかしな通信パケットを見つけるのにベストらしいので、導入してみることにしました。

iplogのインストール

iplogを入れるにはパケットをキャプチャするためのlibpcapが必要です。で、libpcapを入れるにはflexが必要です。flexを入れるにはyacc?が必要です、、、、。
いいかげんムカついてきたので、OBSのパッケージからyaccと検索したら、byaccというものがあったので、よくわからないけどインストール(短気)。
flexはftpサイト「ftp://ftp.gnu.org/non-gnu/flex/」に落ちていたので、そのソースを拾ってきてインストール(往年の./configure、make、su、make installってかんじ)。ちなみにいまさらlibpcapの./configureオプションに–without-flexなんてオプションを発見したのは内緒(TT。
次にlibpcap。こいつも、./configure、make、su、make installでOK、、、。と、思いきや、iplogの./configureでエラーになりました。どうやらlibpcap系のファイルが/usr/localに入ったのがダメだったらしい。とりあえず、libpcapのMakefileを見たところ、はじめのほうに「prefix=/usr/local」という記述を発見。これを「prefix=/usr」にしたらうまくいった。もっとスマートな方法があるかもしれないけど、結果オーライということで(いいのか?w)。
さて、やっとiplogのコンパイル。./configure、make、su、make installの順でイキます。

cronの導入

linuxに入っているcronってvixie-cronっていうやつなのね、、、。これを知るのにえらい時間がかかりました。
んで、vixie-cronのソースを探しに行ったのですが、どうもよくわかりませんでした。vixieのサイト(多分間違いない)は見つけたのですが、肝心のソースがダウンロードできませんでした。
とりあえず、今回はバイナリからの導入で行きます。
ちなみに、事前にchkconfigというツールを入れておかないと、バイナリでの導入でエラーが出ます。

cronのインストール

今回はバイナリなので、特にインストール方法は書きません。cronを入れた後は設定ファイルを記述しなければなりません。
記述内容は下のほうに入れてあります。crontabの記述のポイントは「#run-parts」以下です。

42 4 1 * * root run-parts /etc/cron.d/cron.monthly

↑たとえばこの場合、「42 4 1 * *」が「分 時 日 月 曜日」を示しています。で、「*」は任意なので、この場合「毎月、1日4時42分」にスケジューリングしていることになります。ずいぶん中途半端な時間だなぁとお思いかもしれませんが、やはり「サーバ一番空いている時間」「他のスケジュールとぶつからない時間」を選ぶべきでしょう。ひとつのスケジュールの処理に時間がかかる場合は、その処理が終わる時間を予測すべきです。特に月が変わった瞬間は月変更、日変更、時間変更の処理が行われることを考えなければなりません。
あとは肝心のcrontab本体ですが、情報を調べると2つの方法があるのに気が付きます。「/etc/crontab」を編集する方法と「crontab -e」コマンドで編集する方法です。試したところこの2つの設定は連携してません。
イロイロ実験してみましたが、設定は「crontab -e」の処理が行われます。しかし、「/etc/crontab」が無いと動きません。これも悩んだ挙句、一度「crontab -u root /etc/crontab」を実行した後に、「crontab -e」をすると「/etc/crontab」が編集対象になるらしいというのがわかりました。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.d/cron.hourly
02 4 * * * root run-parts /etc/cron.d/cron.daily
22 4 * * 0 root run-parts /etc/cron.d/cron.weekly
42 4 1 * * root run-parts /etc/cron.d/cron.monthly

NTPの導入

ログを確認してて、外部からのアタックがあったときに、時間を確認したら「1980/05/03」とか、えらい過去からアタックを受けないように、サーバ内部の時計は常に正しく稼動しないと運用に支障をきたします。
そんな時刻を自動的に合わせるものがNTP(Network Time Protcol)です。今回はxntpというツールを導入します。

NTPのインストール

xntpはftp://ftp.udel.edu/pub/ntp/ntp3/でダウンロードできます。ntp4というのもあるんですが、私はntp3しかわからないので、とりあえずコレを選びました。
ダウンロードしたら、いつもの「./condifure」「make」「su」「make install」で導入完了です。
これが終わったら、以下のコマンドで時間を調整します。
#/usr/local/bin/ntpdate (タイムサーバ)
当然、元となるタイムサーバが無いと時計を合わせられません。さてどうするかというところですが、「http://www.eecis.udel.edu/~mills/」にアクセスすると「Public NTP 云々 Time Servers」というのがあるので、それを使います。Serversなのでサーバ群がずらずらと出てきますが、まぁ海外のを使って言葉が通じないと困るのでページ内検索で「Japan」を探して、ソレを使わさせていただきました。
ちゃんと動作するか、「date」コマンドで時計をづら下後に実行すると動きがよくわかります。
動作が確認されたら、とりあえず毎日実行されるようにcronでスケジューリングしましょう。スケジューリングするときは「ntpdate -s 云々」のように「-s」オプションをつけるとsyslogに記録されるので、動作状況を確認することができます。

logrotateの構築

サーバを立てる以上、ログをとってそれを管理しなければなりませんが、どんどん蓄積されているログを放置しておくと無意味にディスク容量を圧迫してしまいます。
そこでlogrotateを使い、ログを分割、また古いものは破棄という処理をします。
logrotateは以下のアドレスから入手できます。
ftp://ftp.redhat.com/pub/redhat/linux/code/logrotate/

logrotateの構築

logrotateは「./configure」無いみたいなので、そのまま「make」「su」「make install」でやったところOKみたいです。
次に設定ですが、まずは「/etc/logrotate.conf」です。もしかしたら無いかも知れないので、その場合はソースファイルを展開したディレクトリの「examples」あたりから拾ってきてもいいですし、自前で作ってもいいです。内容は以下のような感じ。
weekly
# 毎週実行
rotate 4
# 4回まわしたら古いものから消す
errors root
# エラーはrootへメールする
create
# 新しいログファイルを作る
include /etc/logrotate.d
# ↑このディレクトリにある設定もすべて実行。
これで、完了です。「log」というログファイルなら「log.1」「log.2」…と回転されていき、「log.5」になると消えます。また、createを指定してるので、回転したときに0バイトのログファイルが作成されます。
次に、どのファイルを回転させるかの設定。「logrotate.conf」に直接書いてもいいですが、今回は分けます。「logrotate.conf」に「include /etc/logrotate.d」と書いてあるので、次のデータはそこに書きます。
参考例としてapacheのログ。

/var/log/httpd/access_log {
postrotate
/etc/rc.d/init.d/httpd restart
endscript
}

こんな感じに書くと「/var/log/httpd/access_log」を回転することができます。また、回転時にデーモンがログを見失うことがあるのでデーモンを再起動してます。
同じくerror_logやmessages等も回転させましょう。

自動起動の設定

結構はまりましたが、

/usr/sbin/logrotate /etc/logrotate.conf

とすると回転できるはずなんですが、できませんでした。どうも初回は

/usr/sbin/logrotate -f /etc/logrotate.conf

で強制的に回転させないとダメみたいです。
これができたら

#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf

のようなシェルスクリプトを「cron.weekly」あたりに入れておけば毎週回転されます。

デーモン起動ルーチンの整理

ここでシステムの構築を一時休み、ぐちゃぐちゃになってるサーバ内の整理を始めました。
まずは/etc/rc.d/init.d/httpdとかを実行するとエラーが出る問題を解決し、デーモンの起動と終了のロジックをきれいにしたいところから始めます。

pidof

まず、「pidofが無い」というエラーを何とかしたい。確かにpidofは無い。んで、pidofをいろいろ探したのだが無い。とりあえず、情報収集をいた結果、sysvinitに付属のkillall5のシンボリックリンクらしいというところまでわかったので、ftp://sunsite.unc.edu/pub/Linux/system/daemons/init/からsysvinitを入手した。
こいつを展開すると展開先のフォルダに「src」というフォルダができ、shutdownとかinitとかありがたいファイルがいっぱいある。「pidof->../sbin/killall5」なんてファイルもあるので、ここでpidof=killall5なんだ〜と確信する。とりあえず、目的のkillall5.cのみをコンパイル。
gcc killall5.c -o killall5
ちなみにkillall5はもともと「/sbin/killall5」に入っている。しかしなぜか動かなかったので、今回新しく作ったkillall5を上書きし、pidofにシンボリックリンク。
最後に試しに「/etc/rc.d/init.d/httpd status」なんて入力してちゃんと動いていることを確認。
これで今日は眠れる(^^

Run Level管理

通常のディストリビューションは、RunLevelが設定されていて、その値に応じてテキストコンソールになったり、Xが起動したりします。
この動きは、システムで一番初めに起動される「init(PIDが常に1)」が「/etc/inittab」を読み込み、デフォルトのRunLevel(initdefault)を読み込み、その値に応じて、処理が行われます。「/etc/inittab」は
識別子:ランレベル:処理方法:実行するプログラム
という書式になっています。始めはRunLevelにかかわらず、sysinitの行が処理されます。OpenBlockSでは
si::sysinit:/etc/rc.d/rc.sysinit
と定義されてるので、「/etc/rc.d/rc.sysinit」スクリプトを処理します。
ちなみに今まではこのスクリプトにhttpdの起動とか全部書いてました。なぜかというと、「/etc/rc.d/init.d/httpd start」とかがうまく動かなかったからです。これにはいくつか原因がありました。前にも書いたとおり、pidを調べるコマンドである「pidof」が無かったのもあるのですが、どうも「/etc/rc.d/init.d/functions」がおかしかったみたいです。これにはデーモンの起動や終了の処理のサブルーチンが記述されています。
とりあえず、近場にあるTurboLinuxも同じ仕組みだったので、そこから奪ってきました。
あとは、一通りのデーモン起動終了スクリプトの確認と必要に応じて修正を行いました。
また、通常のディストリビューションは「/etc/inittab」に特定のRunLevelの場合に行う処理として
l3:3:wait:/etc/rc.d/rc 3
と書いてあります。この場合はたとえば、RunLevelが3の場合に、「/etc/rc.d/rc」というスクリプトを起動しているのですが、このスクリプトに対する引数(プログラムに渡すオプションスイッチ)に「3」を指定してます。
「/etc/rc.d/rc」は与えられた引数に応じて、それらに対応したディレクトリ無いのファイルをすべて実行します。たとえばRunLevelが「3」の場合は「/etc/rc.d/rc3.d」ディレクトリ内をすべて実行するわけです。ただし、ヤミクモに実行するわけではなく、ファイル名が「S30httpd」のように、ファイル名の先頭が「S」のものだけを実行します。さらに「S」の後に続く数字の順番に起動します。たとえば「S10syslogd」があった場合は「S30httpd」よりも先に「S10syslogd」が処理されます。
「/etc/rc.d/rc3.d」内にあるファイルはすべて「/etc/rc.d/init.d」へのSymlinkなので、どのRunLevelでもデーモンの実行は同じスクリプトが使われます。
、、、と、まぁこういう風に実行されるように、環境を整備しました。そうそう。OpenBlockSは「/etc/rc.d/rc」も上記のような動きをするように作られていませんでしたので、これもTurboLinuxからもらってきました(一応、前のrcの残しておいたほうが無難そうなので、名前をrcxに変えてます)。
rcxとfunctionsは以下に置いてあります。
http://delta-jp.homeip.net/pub/functions
http://delta-jp.homeip.net/pub/rcx

snortの導入

サーバはコンピュータウイルスやクラッカーによく狙われているという話がありますが、実際に私自身そういう話にかかわる仕事をしており、その被害をよく見ています。まぁ、そんなことはどうでもいいとして、Linuxをクラッカーから守る方法はイロイロあります。基本的な考え方はいろいろあるのですが、大雑把に分類すると「攻撃、侵入されない対策」「攻撃、侵入の傾向を調べる記録」、「侵入されてもデータへアクセスできないようにする対策」「データの変更を検知するための対策」「データを復旧するための対策」、というところです。
今回の「snort」は「攻撃、侵入の傾向を調べる記録」の部分にあたります。syslogやiplogのようなログとは一味違います。一般的にはNIDS(ネットワーク型侵入検知システム)と言われ、流れてくる通信データをすべて監視して、ある特定のパターンを見つけると、不正な通信と判断して記録するものです。「ある特定のパターン」というのはウイルスワクチンと同じような「辞書」です。
snortはLinux同様、世界各国の開発者から協力を得て作られているNIDSで、市販のIDSを作っている技術者や国内のプログラマも協力しています。
また、ディスカッションも盛んで、侵入パターンの「辞書」もそういうところから作られているので、更新も早いです。
今回はsnort1.8というバージョンを使っています。

snortのインストール

snortを入れるには、libpcapが必要です。これは「iplog」のところに書いてあるので、そこを読んで入れてください。
snort自身はhttp://www.snort.org/から入手できます。入手後はいつもどおり、展開した後に「./configure」「make」「su」「make install」でOKです。
次に、snortの辞書を入れます。辞書もhttp://www.snort.org/から入手できます。辞書も適当な場所へ展開し、「snort.conf」を編集します。
snort.confは4ステップに分かれています。
1つ目はネットワークの設定。

var HOME_NET xxx.xxx.xxx.xxx/24

ここでは監視するネットワークの範囲を指定します。当然ながら自分自身のみを監視することもでき、その場合は自分のIPアドレスを設定し、後ろに「/32」とつける場合です。他にも

var SMTP $HOME_NET

と、ありますが「$HOME_NET」はHOME_NETの値と同じことを示すので、特に理由が無ければそのままでOSです。
次にプリプロセッサの設定です。プリプロセッサは通常の「辞書」では対応できない攻撃パターンを処理するプログラムです。基本的にはコメント行として認識されてしまう「#」をはずせば設定され、たとえばフラグメント化されたパケットを処理する場合は、

preprocessor defrag

でOKです。
URLに文字コードを使って行われる攻撃を検知するには以下の行が必要になります。

preprocessor http_decode: 80 8080

ポートスキャンの検知は以下の行なんですが、基本的にiplogの方がポートスキャンの検知に優れてると言われてますので、これはコメントアウトしてます。まぁ、あっても悪くないですけどね。

# preprocessor portscan: $HOME_NET 4 3 portscan.log

3つ目はログの出力先ですが、これは特に変更しなくてもログディレクトリにalertというファイルが記録されます。大規模なシステムの場合はデータベースとかを使ったほうがいいのかもしれませんが、あえて使うなら以下のsyslogに記録するオプションくらいでしょうか。

output alert_syslog: LOG_AUTH LOG_ALERT

最後は検知のための「辞書」であるルールセットの指定です。ルールファイルは通常別ファイルになっているので、includeでファイル名を指定しています。ディレクトリ名を変えたりとか、新しいルールを追加するときにいじりましょう。
後はsnortの起動です。ログディレクトリを「/var/log/snort」などにし、デーモンモードで起動するときは以下のような感じになります。

/usr/local/bin/snort -Dd -c snort.conf -l /var/log/snort

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>