NetBSD / PC-98 Information
for 9821 note user




Page 5: Don't talk to Stranger



■セキュリティの強化 ◆1.4.3のセキュリティ現状
◆securelevelの設定
◆securelevelの戻し方
◆不要な外部アクセスを防ぐ
◆nmapでスキャンテスト
◆opensshのインストール
◆opensslパッケージ
◆ssh鍵作成と設定(3.4以降)
◆inetd.confへの設定追加

【参考文献】
(1) FreeBSD セキュリティ HOW-TO (Googleキャッシュ)
(2) BSDでセキュアサーバーを作ろう, アスキー(ムック)
(3) UNIXしま専科--openssl・opensshインストール


◆1.4.3のセキュリティ現状 >_<;

多少ともNetBSDをお使いの方はご存知でしょうが....

NetBSDの本家開発では 1.4.xのサポートは(事実上)終了してるようです。

コンパイル済みpackageの配布ディレクトリも "unsupported" 下に移動してます。
>_<;

ftp.jp.netbsd.org/pub/NetBSD/packages/unsupported/

実用上の問題としては、bindのセキュリティホールが未対応だったり、
IPSec、SSHへの標準対応も未対応(1.5以上で標準対応)になっているなど、
NetBSD 1.4.3をサーバーとして外部公開するのは ちょっと厳しい状況に
なっています。

もちろん、フィルタ機能のついている市販のルーターの後ろに置いたり、
公開したい(例えばhttpd)サービス以外をきちんと止めるなどすれば むやみに恐れることはありません。


ま、NetBSD/PC-98に関しては 1.4.3a以外の選択肢は存在しないので、(私は)今後も
このversionを使い続けていくことになるのですが、
やはり、できるだけセキュアな環境を維持する努力はしておきたいです。




◆securelevelの設定

カーネルの再構築を行ったり、ある程度UNIXの雑誌(のセキュリティ特集とか)を
読んだことがある人ならば、カーネルのセキュリティレベルという言葉は
聞いたことがあると思います。

ただ、これは私個人のばあいですが、市販の雑誌の特集が ほとんどLinuxの記事であることや、
カーネルのsecurelevel設定の違いは 一般(ユーザーとしての)利用にあまり影響が無いことから、
ちゃんと考えたことはありませんでした(汗)。

参考文献(1),(2) を読んで、ようやく具体的な意味を理解しました。


NetBSD/PC-98 1.4.3aの場合、デフォルトのセキュリティレベルは -1 なので、
要は カーネルセキュリティが無い状態になっています。

# sysctl kern.securelevel で現在のセキュリティレベルを見ることが出来ます。

サーバーを外部公開するのであれば、/etc, /bin, /sbin の中の重要なファイルに対する
ファイルフラグ変更とあわせて、ちゃんとsecurelevel設定を変更しておくことが重要ですね。

# chflags schg /bin/* (例えば こんな感じで 保護したいファイルを設定)
# chflags schg /bin
# chflags schg /sbin/*
# chflags schg /sbin
# chflags schg /usr/bin/netstat
# ・・・・・・
# sysctl -w kern.securelevel=1
#


ちなみに、一度 セキュリティレベルを1以上に変更すると、ファイルフラグの設定によっては
たとえrootであっても セキュリティレベルを戻せないケースも起こりえます。
(シングルユーザーモードで再起動しないといけません)

securelevel を変更するのは、ほかの設定が一通り終わった後に 最後に実行するのが良いでしょう。
( シングルモードで起動した際に 作業が楽なように、rc.confのバックアップを残しておくと便利です )




◆securelevelの戻し方(備忘録)

上で述べたように、rc.conf を schg に設定して securelevelを1以上にすると、
これを元に戻すのは それなりに手間がかかります。
(まあ、簡単に変更できるのではセキュリティとして意味が無いのですが)

んで、設定を元に戻す手順を残しておかないと忘れてしまいそうなので、
備忘録として シングルモードでの操作例を記載しておきます。


(1) まずは、再起動して シングルモードで起動。

NetBSD起動時に スペースキーを押し、-sオプションでboot実行。
> boot -s

(2) fsckを実行し、 / (ルート)と /usr のマウント( chflagコマンドが /usr/binにあるので /usr が必要 )

# fsck
・・・・・・( fsckの結果が表示される )

# mount /
# mount /usr
# /usr/bin/chflags noschg /etc/rc.conf ( rc.conf の schg フラグをはずす場合)

(3) あとは もう一度再起動して rc.conf を編集するか、違う設定のrc.confのバックアップが とってあればそれをリネームする。



◆不要な外部アクセスを防ぐ

不要なポートをふさぐ、というネットワークセキュリティの基本は、すでにWindowsでも
おなじみの事と思います。

具体的な設定手順は ほかのサイト・文献にたくさんの事例が紹介されていますので
そちらを見てもらったほうが早いとして、UNIX特有のポートとしては syslog などが
以外に見落としがちなポートなのではないでしょうか。


NetBSD/PC-98 1.4.3(に限らないですが)のデフォルトでは、外部からの syslog メッセージを
全て受け入れてしまうので、logger コマンドでログファイルに落書きされる可能性があります。

余談ですが、NetBSD 1.4.3 の logger にはメッセージの送り先に他のPCを指定するオプションは無いようですね...
他のPCからのメッセージは受け入れますが自分は送れないです(汗)。

ネットワーク経由で他デバイスからsyslogメッセージを受け取る必要が無いならば、
syslogの起動オプションに -s をつけて 外部UDPソケットを開かないようにします。

# syslogd -s ( syslogd を手動起動する場合 )

あるいは、syslogdを自動起動している場合なら、/etc/rc.conf でオプションを指定します。

syslogd_flags="-s"

より新しいバージョンのsyslogでは、受け取りを許可するIPアドレスをオプション指定できるらしいです。



◆nmapでスキャンテスト

自分のマシンが外部のクラッカーに狙われた場合、どんな情報が "見える" のか、を
調べるためのツールとしては、nmap がお勧めです。

nmapの配布場所としては、下記が有名(?)みたいです。

www.insecure.org

ちなみに、Windows版 1.3.0をインストール後にバージョン情報で表示される本家(?)のURLは、現在は なくなっているようです。


私は Windows版をダウンロードして、NetBSDのマシンへポートスキャンをかけてみました。
全てのテストを試すとなると、結構時間がかかりますね。

一通りのテストを実施して、自分が意図していないポートが開いていれば、
調査・対応が必要です。 また、OSのバージョン等がどこまで見えるのかも
気をつけたほうが良いかもしれません。



◆opensshのインストール

ネットワーク上の通信のセキュリティといえば、やはり通信の暗号化が基本です。

まあ 最近は、よほどセキュリティポリシーの低いLANでない限り 他人のPCのパケットを
キャプチャできるような環境は存在しませんが、それでも 外部からのログインは
telnet ではなく ssh を使用するべきでしょう。


余談ですが...
昔、それこそ'95年ころのネットワークは 非常にのんきなものでしたね〜。

H大学のネットワークも全学でひとつのセグメントになっており、同じ学部の
誰とも知らない人のPCから、フリーソフトをコピーしてきて遊んだり出来ましたから(汗)

在学中は、パケットキャプチャなどしたことはありませんでしたが、
当時はスイッチハブが高価でめったに見かけなかったから、かなり広範囲のパケットが覗けたんじゃないかと(^ ^;


フリーで使えるSSHといえば、openssh がスタンダードです。
openssh は日本語のドキュメントが非常に充実しているので大変助かります。

( postgresなんかも充実してますよね〜。 ボランティアの方々、陰ながら感謝しています!)

www.openssh.org(日本語サイト)

公式ページからリンクされているマニュアルを読めば、インストールは簡単にできるでしょう。




◆opensslパッケージ

opensshを利用するためには、あらかじめ opensslをインストールしておく必要があります。

一般には、セキュリティホールへの対応という意味から 最新のソースをコンパイルして
インストールするのが基本でしょう。
しかしopensslのパッケージは頻繁に更新されているので、リアルタイムでセキュリティ勧告を
追っかけているような人でなければ パッケージを使っても一緒かなと思ったのです...が、

このあたりからダウンロードしてみますた

上記のリンクから取得できるopenssl-0.9.6g.tgzは、どうやら1.4.3aで使えないようです
(確信はもてませんが、1.5以降?)
CA作成とかを実行すると binary not executable とか表示されます。>_<;




◆ssh鍵作成と設定(3.4以降)

openssh のインストールは特に問題ないと思いますが、意外な落とし穴なのが
sshd.conf の設定と、ssh鍵の作成手順です。
(通信の暗号化さえ出来ればいい、という場合は ssh鍵の作成は不要ですが)

と言っても、設定が複雑で難しいという話ではありません。

実は つい最近(2002年夏ころ?) の仕様変更のため、ちょっと古い書籍などを参考にして
その通り設定しようとすると、エラーが出てうまく動かないようになっているのです。

ver 3.4〜3.5の設定方法については、参考文献(3)に挙げたサイトが有用でしょう。

UNIXしま専科--openssl・opensshインストール


昔の起動手順でエラーとなる原因は、特権分離(privilege separation)に関するもので、
もし privsep を有効にするのであれば あらかじめそのためのユーザー sshd を
作成しておかなければなりません。

逆に privsep が不要であれば、sshd_config ファイルを編集して

UsePrivilegeSeparation no

というオプションを設定する必要があります。


もうひとつ、昔の手順と違っている部分は、ssh-keygen コマンド実行時に、
オプションとして鍵のタイプの指定が必須になっていることです。

昔は ssh-keygen とだけ打てばよかったのですが、今は必ず -t オプションをつけなければなりません。

> ssh-keygen -t rsa1 ( rsa1の鍵を作成する場合 )


余談ですが...
公開暗号鍵の原理については PC雑誌でも時々紹介されていますが、
たいていの場合、「相手の公開鍵で暗号化し秘密鍵で復号化してもらう云々」
という手順だけが紹介されている場合が多いですよね...
実際には、公開鍵でどうやって復元可能かつ不可逆な暗号化ができるのか
(公開鍵と暗号文を入手しても解読できないのはなぜか)がむしろ重要だと
思うんですけど、一般のPC雑誌では そういう事は書いてないですね?_?

このあたりの数学的説明をしてくれているサイトのリンクがこちらです。
伊藤さんという方の個人ページ



◆inetd.confの設定

私の利用環境の場合、sshdを常駐させる必要は特に無いので、
リソースの有効利用のためにも inetd で sshdを開始させることにします。

まず、あらかじめ /etc/services にsshが登録されていることを確認し、
inetd.confに sshdの設定を追加します。

# vi etc/inetd.conf

(以下の行を追加)
ssh stream tcp wait root /usr/local/sbin/sshd sshd

ポイントとしては、nowait ではなく wait を指定する事でしょうか。
なお、本当は最後の所にちゃんと引数を書いて、sshd -f /usr/local/etc/sshd_config
とするべきなのでしょうが...デフォルトに任せても、特に問題は無いようです。



情報をお持ちでしたらぜひ lazylico(あっとマーク)msb.biglobe.ne.jp まで!
m(_ _)m