11-4. fwtk とワンタイム・パスワ−ド '96
(1) fwtk の概要と portscan
* フリ−ソフトの fwtk と製品版の Gauntlet
イ−サネットの口が2つある Apollo のマシンにインスト−ルして試してみた。 fwtk は
BSD ベ−スで書かれていて、コンパイルは幾つかのワ−ニングは出たものの、数分であっ
さり終わってしまった。ファイアウォ−ルのソフトなんていうのは、どんなにすごいプロ
グラムかとテストするのも怖いような感じがしていたのだが。このソフト、イ−サネット
の口が2つのゲ−トウェイとしてのホストに必ずしも載せる必要はない。 fwtk は Proxy
サ−バの性質として、イ−サネットのポ−トが1個のホストでも問題なく機能する。ただ
しこの場合は、経路制御に注意する必要がある。 fwtk の製品版の TIS Gauntlet 3.0 だ
と下記のような二段構えの telnet でなく、透過的にできる。何か fwtk も Gauntlet も
基本部分は、ほとんど同じみたいである。 Gauntlet だと設定がWWWブラウザでできる
のがミソぐらいなものか。
> telnet firewall
Connet 192.9.200.1 << ファイアウォ−ルのホストに接続する。
tn-gw > c 外部ホスト << もう一度専用 telnet をかける。
login:
* fwtk の認証
パスワ−ドによる認証には、プレ−ンテキスト、bellcore's S/Key、Security Dynamics'
SecurID、Digital Pathways SNK、Enigma Logics' Silver Card の方法から選ぶことがで
きる。デフォルトはプレ−ンテキストで、通常のロッグインと変わりない。 bellcore 社
の S/Key のみフリ−ソフトである。名称は fwtk のソ−スから抜粋した。 他の認証方法
を使うには再コンパイルが必要だが、コマンドとしては authsrv だけ使えれば、 どの方
法にも対応できる。パスワ−ドの登録作業は、 fwtk を入れたホストで行なうことが望ま
しい。注意点は他のホストから fwtk のホストにロッグインを許さないことである。管理
者のみ内部のホストからロッグインできるようにすることはあるかも知れないが。
authsrv 認証サ−バはゲ−トウェイで稼働した方が安全性が高い。
authsrv の使用は、ゲ−トウェイだけでできる。
authmgr は authsrv を他のホストから使用するためのコマンドである。
authdump と authload は別に使う必要はない。
* ソフトの入手
以下の所から fwtk.tar.Z とドキュメントの fwtk-doc-only.tar.Z をとってくる。 この
時のバ−ジョンは v1.3、展開したファイルの README の日付けは October 20,1993 だっ
た。小生がダウンロ−ドしたのは96年だった。それからしばらくして、 fwtk は商用利
用禁止になり、ダウンロ−ドも自由にできなくなった。iij のサイトにはもうソフトはな
いし、TIS のサイトはアクセスできなくなっている。97年終わり頃の雑誌の記事によれ
ば、TIS のWWWサイトにアクセスして、ダウンロ−ドのパスを教えてもらい、12時間
以内にダウンロ−ドするとか書いてあった。`02/06追記。この後の話しで、インタ−ネッ
ト接続口で使うのはライセンス違反、内部での部門ファイアウォ−ルとして使う場合なら
OKということになった。
ftp://ftp.iij.ad.jp/pub/security/tis/toolkit/
ftp://ftp.tis.com/pub/firewalls/toolkit/ << 日本のTISではない。
$ ld /usr/local/source/fwtk
README auth/ ftp-gw/ smap/ config/ tn-gw/
LICENSE auth.h http-gw/ smapd/ lib/ doc/
Makefile rlogin-gw/ netacl/ plug-gw/ x-gw tools/
Makefile.config CHANGES DISCLAIMER firewall.h
./doc
admin_guide.ps manpages.ps presentation.ps user_guide.ps
overview.ps sample-report.txt man/ <-- マニュアルが入っている
( README より抜粋 )
Makefile - toplevel Makefile
README - this file
auth - authentication server and libraries (optional)
config - sample configuration/permissions tables
doc - documentation
firewall.h - compile-time configuration
ftp-gw - sources for FTP proxy server
http-gw - http/gopher proxy
lib - sources for library routines
netacl - sources for TCP/IP access control "wrapper"
plug-gw - sources for plug-board proxy server
rlogin-gw - sources for rlogin proxy server
smap - sources for sendmail wrapper client
smapd - sources for sendmail wrapper daemon
tn-gw - sources for TELNET proxy server
tools - miscellaneous/unsupported tools
x-gw - X11 proxy
./tools/admin
netscan - a tool to ping hosts on a network
portscan - a tool to ping service ports on a host << どのポ−トが生きてい
flog - follow log, tail -f /usr/adm/syslog るかリストするだけ。
reporting - fwtk のログからサマリ−を作成する。
./tools/server
ftpd - a version of ftpd that uses the auth server
login-sh - a login shell wrapper that uses the auth server
syslog - a version of the 4.3bsd syslog that uses regexps
* コンパイル
とりあえずコマンドなどは /usr/local/source/fwtk/bin に作成して、テストするときに、
/usr/local/etc にコピ−して使うことにする。 マニュアルをインスト−ルせず、見るに
は $ /usr/bin/nrof -man plug-gw.8 このようにする。
Makefile.config
---------------------------------------------------
|CC= cc
|CP= cp
|COPT= -g
|MAKE= make
|RANLIB= ranlib # touch
|DEST=/usr/local/source/fwtk/bin # /usr/local/etc
|AUXLIB= -lresolv # -lsocket
|DBMLIB= # -lndbm
|
|LDFL= -g # -Bstatic or 空
|FWTKSRCDIR=/usr/local/source/fwtk
Makefile
-----------------------------------------------------------------
|include Makefile.config
|LIB= lib auth
|DIRS= smap smapd netacl plug-gw ftp-gw tn-gw rlogin-gw http-gw
| | ↑
この下 make, clean, install がある。 使わないのは消せばいい。
* portscan を試してみる '99/05 追記
$ /usr/ucb/netstat -a << -an とすると番号で、例えば *.x11 が *.6000 と出る。
Active connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp 0 0 node_abcd.2420 indy1.telnet ESTABLISHED
tcp 0 0 *.x11 *.* LISTEN
tcp 0 0 *.time *.* LISTEN
tcp 0 0 *.daytime *.* LISTEN
tcp 0 0 *.exec *.* LISTEN
tcp 0 0 *.shell *.* LISTEN
tcp 0 0 *.login *.* LISTEN
tcp 0 0 *.telnet *.* LISTEN
tcp 0 0 *.sunrpc *.* LISTEN
udp 0 0 *.time *.*
udp 0 0 *.sunrpc *.*
udp 0 0 *.1024 *.*
/etc/inetd.conf
-----------------------------------------------------
|telnet stream tcp nowait root /etc/telnetd telnetd
|login stream tcp nowait root /etc/rlogind rlogind
|shell stream tcp nowait root /etc/rshd rshd
|exec stream tcp nowait root /etc/rexecd rexecd
|daytime stream tcp nowait root internal
|time stream tcp nowait root internal
|time dgram udp wait root internal
上記のような環境で、自分自身のホストをポ−ト・スキャンしてみた。ホストはおなじみ
Apollo コンピュ−タである。使い方は簡単。 portscan プログラムは TCP パケットだけ
を対象にする。-l は開始ポ−ト番号、-h は終わりのポ−ト番号で、その範囲を1個ずつ
なめていき、サ−ビスをしているか調べてる。 -v は調べたいホスト名かIPアドレスを
指定する。自分自身のホストなら localhost でもよい。portscan は fwtk をインスト−
ルしたディレクトリ tools/admin に入り、make をかければ即できる。
$ portscan -l 1 -h 6000 -v node_abcd << root でなくても実行できた。
node_abcd: trying stream ports between 1 and 6000
.............
daytime
........
telnet
..............
time
............................
sunrpc << Sun RPC の pormap デ−モン。
..................................
exec
.
login
.
shell << ここまではパッパとでる。次の x11 は 6000 番なので時間がかかる。
...........................................
x11 << xapollo。これは inetd 経由でなく直接稼働している。
この Apollo コンピュ−タでは inetd, portmap, xapollo が稼働している。それに INDY
に telnet をかけているので、これらが $ pst コマンド(UNIXなら ps)で出てくる。
inetd を止めると inetd.conf にある telnet, login, shell, exec, daytime, time が、
$ netstat -a で出なくなる。portmap を止めると sunrpc が出なくなる。inetdを止めて
も INDY への telnet は $ netstat -a で表示されるが、 portscan では出て来ないこと
に注意したい。
[ ポ−ト・スキャンを tcpdump で見る ]
$ portscan -l 19 -h 22 -v 192.9.10.1 ---------- ---------
192.9.10.1: trying stream ports between 19 and 22 | Apollo | | INDY |
. ---------- ---------
chargen | .2 | .1
.. -----*--------------*------
ftp << ftp-data 20/tcp は出てこない。 192.9.10.0
. INDY 側 netstat -a でも出てこない。
以下の tcpdump は Apollo から INDY に telnet して、root ユ−ザで INDY 側で実行し
ている。-n でIPアドレスにポ−ト番号で表示するように指示している。src は Apollo
からのパケットだけを見るようにしている。残りは telnet アクセスを表示しないように
している。tcpdump の他、Solaris 2.x なら snoop が同様使える。
% tcpdump -n src 192.9.10.2 and not tcp port telnet
tcpdump: listening on ec0
.. 192.9.10.2.4160 > 192.9.10.1.19: S 929056267:929056267(0) win 9116
.. 192.9.10.2.4160 > 192.9.10.1.19: . ack 1629376001 win 9116
.. 192.9.10.2.4160 > 192.9.10.1.19: F 0:0(0) ack 1495 win 7622
.. 192.9.10.2.4160 > 192.9.10.1.19: R 929056269:929056269(0) win 7622
.. 192.9.10.2.4160 > 192.9.10.1.19: R 929056269:929056269(0) win 61060
.. 192.9.10.2.4160 > 192.9.10.1.19: R 929056269:929056269(0) win 61060
.. 192.9.10.2.4161 > 192.9.10.1.20: S 929056332:929056332(0) win 9116
.. 192.9.10.2.4162 > 192.9.10.1.21: S 929056397:929056397(0) win 9116
.. 192.9.10.2.4162 > 192.9.10.1.21: . ack 1629504001 win 9116
.. 192.9.10.2.4162 > 192.9.10.1.21: F 0:0(0) ack 31 win 9086
.. 192.9.10.2.4162 > 192.9.10.1.21: R 929056399:929056399(0) win 9086
.. 192.9.10.2.4162 > 192.9.10.1.21: R 929056399:929056399(0) win 61060
.. 192.9.10.2.4163 > 192.9.10.1.22: S 929056462:929056462(0) win 9116
↑
16:25:17.708133 というように時刻である。スペ−スの都合省略。
(2) fwtk 組込み telnet のテスト
* telnet でのテスト
hostG はIPパケットの転送を禁止するとして、 hostA から hostB に telnet だけでき
るようにする。hostB からは hostG へも hostA にもアクセスできないようにする。設定
は、/etc/inetd.conf と /usr/local/etc/netperm-table ファイルを少しいじるだけであ
る。netperm-table ファイルは変更すると、直ちに有効になる。注意点としては fwtk コ
マンドを /usr/local/etc に入れておくことである。 さて、先ず telnet と telnetd の
有りかを調べておく。Apollo では $ /usr/ucb/which telnet でみると /usr/ucb/telnet
になっている。同様に /etc/telnetd になっている。

Fig. b41
hostG /etc/inetd.conf
--------------------------------------------------------------
|#telnet stream tcp nowait root /etc/telnetd telnetd
|telnet stream tcp nowait root /usr/local/etc/netacl telnetd <--- 注目
hostG /usr/local/etc/netperm-table
--------------------------------------------------------------------
| |
|# どのホストからここにアクセスを許すのか。
|netacl-telnetd: permit-hosts 127.0.0.1 -exec /etc/telnetd
|netacl-telnetd: permit-hosts 192.9.200.1 -exec /etc/telnetd
|netacl-telnetd: permit-hosts 192.9.200.2 -exec /usr/local/etc/tn-gw
|
|# アクセスを許したホストで、アクセス時にパスワ−ドを要求するか。
|tn-gw: permit-hosts 192.9.200.2 -passok -xok << 要求しない場合。
$ /bin/ps -ax
1082 ? S 0:00 /etc/inetd << inetd デ−モンを初期化する。
$ /bin/kill -HUP 1082
[ hostA から hostB へアクセスする ]
hostA % telnet hostG
Trying 192.9.200.1...
Connected to hostG.
hostG telnet proxy (Version V1.3) ready:
tn-gw-> c hostB
Trying 192.9.202.1 port 23...
IRIX System V.4 (hostB) << ロッグイン・セッションになって接続する
|
[ hostB から hostA にアクセスする ]
hostB % telnet hostG
Trying 192.9.200.1...
Connected to hostG. << hostG にもアクセスできない。これでOK。
Connection closed by foreign host.
* 設定の意味
・netacl-telnetd: permit-hosts 127.0.0.1 -exec /etc/telnetd
> 自分のホストで telnet localhost をやった場合は、通常の telnetd を実行するこ
とを意味する。tn-gw: の設定はここでは関係ない。
・netacl-telnetd: permit-hosts 192.9.200.2 -exec /usr/local/etc/tn-gw
tn-gw: permit-hosts 192.9.200.2 -passok -xok
> fwtk の入ったホスト hostG へ Proxy 接続できるホストは 192.9.200.2 である。
-exec ../n-gw が Proxy 接続を意味する。その下の tn-gw: permit-hosts .. は、
192.9.200.2 がアクセスしてきた場合にパスワ−ドを要求するかどうかの指定になる。
・netacl-telnetd: permit-hosts 127.0.0.1 192.9.200.* ..
tn-gw: permit-hosts * -auth
> IPアドレスの指定にワイルドカ−ドが使えるよん。並べてもいいよん。
* plug-gw 汎用プロキシ−サ−バの特徴 `24/03
昔自分で書いたことだが、正しいかどうか分からなくなった、一応参考まで。plug-gw で
は2つのホスト間で telnet する固定トンネルは設定できない。固定トンネルはクライア
ント側のポ−ト番号が一意に決まるプロトコルである必要がある。よく NetNews の NNTP
に使う話がある。電子メ−ルの SMTP も適用できない。本「ファイアウォ−ル」に載って
いたAT&T作成の Relay プログラムと同じことが出来ないか考えてみたのだ。 確か動
作の確認もしたような気がするのだが。「UNIX MAGAZINE」'99/07, P.46〜53, "汎用 TCP
プロキシ−" の記事を参照されたい。「UNIX MAGAZINE」'99/05, P.58 にはファイアウォ
−ル越しに POP を中継する設定も載っていた。
/usr/local/etc/netperm-table これはできない
---------------------------------------------------------------------------
|plug-gw: port telnet 192.9.200.1 -plug-to telnet 192.9.202.1 -port telnet
(3) fwtk のパスワ−ド設定
* authsrv の使用
上記で 192.9.200.2 ホストから hostG の fwtk Proxy Server へのアクセスには、 パス
ワ−ドを要求するようにしてみる。平文によるパスワ−ドで、ロッグインのアカウントは
katou でパスワ−ドは 333 とする。
/usr/local/etc/netperm-table
--------------------------------------------------------------------
|netacl-telnetd: permit-hosts 127.0.0.1 -exec /etc/telnetd
|netacl-telnetd: permit-hosts 192.9.200.1 -exec /etc/telnetd
|netacl-telnetd: permit-hosts 192.9.200.2 -exec /usr/local/etc/tn-gw
|
|#tn-gw: permit-hosts 192.9.200.2 -passok -xok
|tn-gw: permit-hosts 192.9.200.2 -auth -xok << パスワ−ドを要求する。
| | xok はあってもなくてもよい。
|# Example auth server and client rules
|# ------------------------------------
|authsrv: hosts 127.0.0.1 << authsrv コマンドを使えるのは hostG だけ。
|authsrv: database /usr/local/etc/fw-authdb
|authsrv: badsleep 1200
|authsrv: nobogus true
|# clients using the auth server
|*: authserver 127.0.0.1 7778 << 7777 は使っているのがあった。
/etc/services
-------------------------------
|authsrv 7778/tcp # fwtk use << 7777 は使っているのがあったので変更した。
/etc/inetd.conf 追加する
--------------------------------------------------------------
|authsrv stream tcp nowait root /usr/local/etc/authsrv authsrv
以上の編集をやって /etc/inetd デ−モンを再起動すると /usr/local/etc に fw-authdb
ファイルなどができる。後は authsrv コマンドでアカウントを登録すれば、 パスワ−ド
が効くようになる。ちなみに netperm-table の authsrv の部分をコメントを外さずにお
くと $ authsrv コマンドを入れると "Cannot open database" と出て終わってしまう。
$ wd /usr/local/etc;ld
authdump authload authmgr authsrv << 関係するコマンド。
fw-authdb fw-authdb.dir fw-authdb.pag << できたパスワ−ド・ファイル。
* アカウントの登録
$ wd /usr/local/etc
$ authsrv
authsrv# adduser katou 'katou ikken' << ユ−ザに katou を登録する。
ok - user added initially disabled
authsrv# disp katou
Report for user katou (katou ikken)
Authentication protocol: password
Flags: DISABLED
authsrv# password << パスワ−ドを 333 とする。
Usage: password [username] passwordtext
authsrv# password katou 333
Password for katou changed.
authsrv# list << status が n だとアカウントは使えない。
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
katou katou ikken n passw never
authsrv# enable katou << アカウント katou を使えるようにする。
enabled
authsrv# list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
katou katou ikken y passw never
↑
authsrv# quit n から y に変わっている。
hostA % telnet hostG
Trying 192.9.200.1...
Connected to hostG.
hostG telnet proxy (Version V1.3) ready:
Username: katou << ユ−ザ名の入力。katou しか登録していない。
Password: ### << 平文によるパスワ−ド入力。
Login Accepted
tn-gw-> c hostB
Trying 192.9.202.1 port 23...
IRIX System V.4 (hostB)
login: katou
hostB %
* コマンド
$ authdump
user=katou << 登録したユ−ザ分だけ、だ−と表示してくれる。
longname=katou ikken 特に使う必要なし。
group=
pass=pa1Ot5/6bGFtM << katou のパスワ−ド 333
flags=1 パスワ−ドを登録してないと pass=* とでる。
bad_count=0
proto=p
last=0 << last=0 はアクセスがまだ一度も無いことを示す。アクセス
があると最後の日付けが last=837750663 などと出る。
$ authsrv
authsrv# disp katou << ここで help を入れると使えるコマンドがリストされる。
Report for user katou (katou ikken)
Last authenticated: Fri Jul 19 13:31:03 1996
Authentication protocol: password
Flags:none
authsrv# list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
katou katou ikken y passw Fri Jul 19 13:31:03 1996
authsrv# del katou << 登録を消去する場合。
deleted
authsrv# list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
(4) fwtk 電子メ−ルへの対応
* fwtk の smap & smapd 制御
--------------------------------------------------------------------------------
fwtk の smap、smapd の働きは、ファイアウォ−ルの中でも最も複雑といってよい。いろ
いろ雑誌にも smap を使うと書いてあるが、実際どうやって設定するかは見たことがない。
--------------------------------------------------------------------------------
hostG をメ−ルゲ−トウェイ兼メ−ルサ−バとする基本的な構成例で仕組みを見てみよう。
hostG のメ−ルサ−バに、内外の sendmail デ−モンからアクセスがくる。それを inetd
制御下にある SMTP クライアントの smap が受ける。 smap はメ−ルを受けてある適当な
ディレクトリに落とす。それを smapd デ−モンが一定時間毎、 通常は1分毎にファイル
をチェックする。smapd の中では sendmail デ−モンが起動され、メ−ルキュ−にファイ
ルをキュ−の形で落とす。そして同時にメ−ルの配送を実施する。もし配送が失敗すれば
キュ−に溜まったままになる。それを cron 運転で sendmail を時々稼働させ、キュ−を
チェックし、メ−ルを配送する。
何でこんな処理をわざわざするのか。 sendmail はセキュリティ泣かせで有名なソフトと
して通っている。即ち外部からのメ−ルを sendmail で直接受けようとするから危険なの
である。そこでメ−ルサ−バは先ず、メ−ルを受けるだけにしましょう。これが smap で
ある。受ける際に適当なユ−ザ設定ディレクトリに落とす。 このディレクトリには smap
から chroot をかけて、よそのディレクトリに行けないようにしてしまう。 それに smap
自体メ−ルを受けるだけだから root 権限で実行せずに、 uucp などあまり権限のないユ
−ザIDで稼働させておけばよい。さらにプログラミングをやるつもりなら、smapd.c は
500行ぐらいのソ−スだから、これをいじれば変なメ−ルを排除するとかできるわけだ。
一応下記の構成は smap の働きがわかるようにと、メ−ルサ−バをファイアウォ−ルのホ
ストにおいた。これはあまりおすすめではない。メ−ルサ−バは内部ネットのホストに置
くか、バリアネットに置いた方がよい。バリアネットにおく例は幾つかのファイアウォ−
ルの本に出ている。どうも安全面でも管理面でも、その方がいいような気がする。しかし
この場合、hostA でメ−ルゲ−トウェイ、hostB でメ−ルサ−バとなる。hostA,B 間のメ
−ルの受け渡しが必要になる。sendmail をリレ−として設定するか、 relay プログラム
を使うかしなければならない。だいぶ設定がややこしい。この方が問題になったりして。
内外からのメ−ル inetd 制御 デ−モン cron 運転
sendmail -------> smap smapd sendmail -q ----> 失敗分の再配送
| / | /
| / sendmail /
↓/ ↓ /
ユ−ザ設定 Mail queue
ディレクトリ /usr/spool/mqueue ---------> 配送完了
:どこかのホストからの sendmail
WWW DNS :
hostA □ MX hostG □ Router
| |
----------*------------------- バリアネット INDY の場合
| ↓
↑------- メ−ルサ−バ inetd /usr/etc/smap
×|hostG| deaemon /usr/etc/smapd
↓------- cron /usr/lib/sendmail -b
|
----------*-------------------- 内部ネット
|
hostB □ sendmail
* hostG の設定
INDY で fwtk でなく市販品の "Gauntlet 3.0 for IRIX" を使ってみた。WWWブラウザ
で設定するようになっているが、それは使わずに手作業で設定してみた。ブラウザでやろ
うとすると最初からうまくいかなかった。設定の際の予備知識なども挙げておく。
・Gauntlet の一連のコマンドは /usr/etc/ にある。
・netperm-table ファイルは /usr/gauntlet/config/ にあること。
・電子メ−ルのキュ−・ディレクトリは /usr/spool/mqueue/ である。
/etc/inetd.conf
--------------------------------------------------------------
|smtp stream tcp nowait root /usr/etc/smap smap
/usr/gauntlet/config/netperm-table
--------------------------------------------------------------
|# email wrapper control
|smap, smapd: userid 3 << uucp uid。root でなければ結構。
|smap, smapd: directory /usr/spool/smap << これは作ること。オ−ナは uucp。
|smapd: executable /usr/etc/smapd
|smap: timeout 3600
|
|#smapd: baddir /usr/spool/smap << コメントでよし。
|#smapd: sendmail /usr/lib/sendmail << smapd 内部で定義された sendmail
|#smap: maxrecip 4000 と違うのを使う場合。
|#smap: maxbytes 1048576
% ps -e | grep smapd << 本格運用の時はちゃんと rc2.d で起動しておくこと。
1863 ? 0:00 smapd
/usr/spool/cron/crontab << いわば残務整理に使う。
--------------------------------------------------------------
|0,15,30,45 * * * * /usr/lib/sendmail -q > /dev/null 2>&1
% ps -e | grep cron << cron もちゃんと設定しておくこと。
320 ? 0:01 cron
% netstat -a << smap の確認。
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp 0 0 *.smtp *.* LISTEN
% cat /etc/passwd
uucp:*:3:5:UUCP Owner:/usr/lib/uucp:/bin/csh << uucp ユ−ザの確認。
* 等価テスト
ユ−ザ katou jiro
------- -------
|hostB| |hostA| メ−ルサ−バ
Apollo ------- INDY -------
| |
---------------------------------------------- nix.co.jp
sendmail inetd による smap
sendmail.cf クライアント sendmail.cf サ−バ
$ /usr/ucb/mail -v jiro@nix.co.jp
Subject: hello
katou kun desuyo << メ−ルサ−バの hostA の smap と接続する。
.
EOT
jiro@nix.co.jp... Connecting to hostA.nix.co.jp (tcp)...
220 hostA SMTP/smap Ready.
>>> HELO hostB.nix.co.jp
250 (hostB.nix.co.jp) pleased to meet you.
>>> MAIL From:
250 ... Sender Ok
>>> RCPT To:
250 OK
>>> DATA
354 Enter mail, end with "." on a line by itself
>>> .
250 Mail accepted
>>> QUIT
221 Closing connection
jiro@nix.co.jp... Sent
% cd /usr/spool/smap;ls << hostB からのメ−ルを hostA の smap が受けて、
sma001857 ファイルに落としたところ。
sma001857
-----------------------------------------------------------
|FROM
|RCPT
|BODY
|Received: from hostB(192.9.200.2) by hostA via smap (g3.0.1)
| id sma001857; Tue, 3 Dec 96 15:21:57 +0900
|Received: by hostB.nix.co.jp (5.65c/nix.1.0)
| id AA01642; Tue, 3 Dec 1996 15:05:52 +0900
|Date: Tue, 3 Dec 1996 15:05:52 +0900
|From: katou@nix.co.jp
|Message-Id: <199612030605.AA01642@hostB.nix.co.jp>
|To: jiro@nix.co.jp
|Subject: hello
|
|katou kun desuyo
% smapd をここで起動する << smapd を起動すると、 上の sma001857 は消えて、
メ−ルキュ−に入る。すぐに sendmail が smapd
% cd /usr/spool/mqueue;ls の中で起動され、メ−ルは配送される。配送に失
dfPAA01865 qfPAA01865 敗するとキュ−にそのまま残る。
dfPAA01865 キュ−に残った状態を確かめるには、他のホスト
---------------- のユ−ザにメ−ルを送る。 一応 sendmail.cf や
|katou kun desuyo named も設定し、そのホストで sendmail デ−モ
ンだけ止めれば、配送できないのでキュ−に残る。
% /usr/lib/sendmail -q << キュ−に残っているメ−ルを吐き出す。
(5) ワンタイム・パスワ−ドを試す
* fwtk による例
文字通り一回限り、毎回違うパスワ−ドである。外部からファイアウォ−ル内部のホスト
にアクセスする場合に有効である。ワンタイム・パスワ−ドを使うようにするには、専用
のソフトで初期化をする必要がある。初期化をするには、ユ−ザ名、パスワ−ド、シ−ケ
ンス番号、シ−ド(種)の4つのパラメ−タを与える。シ−ケンス番号は、パスワ−ドが
何回使えるか示す数である。ロッグインしてパスワ−ド入力するたびに、最初のシ−ケン
ス番号の数から1ずつ減っていく。0になったら使えなくなってしまうので、再度パスワ
−ドの初期化をすることになる。fwtk では authsrv コマンドがパスワ−ドの設定プログ
ラム、ワンタイム・パスワ−ドを計算するのは別なソフトで donkey というのがある。
次の例は hostG に fwtk を入れて、hostA から telnet しているところである。 通常の
telnet では login、Password を入力するが、ワンタイム・パスワ−ドの場合はユ−ザ名
を入れると、チャレンジ・コ−ド( 663 no21201 )を返してくる。 このコ−ドをもとに自
ホストでワンタイム・パスワ−ドを計算する。そしてこのパスワ−ドをレスポンス・コ−
ドとして入力すると、めでたしロッグイン完了である。ここらあたりのやり取りでもって、
このパスワ−ド管理を Challenge & Response 方式と呼んでいる。チャレンジ・コ−ドの
663 はシ−ケンス番号であり、初期化の際は 664 だった。663 はつまり2回目のロッグ
インになる。no21201 はシ−ド(種)と呼ばれて固定である。
telnet
パスワ−ドを初期化しておく <--------- ユ−ザ名 katou を送る
katou
authsrv# pass katou 333 <--------- % donkey 663 no21201
ID katou s/key is 664 no21201 Enter passphrase : 333
663 no21201 JIBE KNOB MILT BUN DRAB COG
---------->
664:シ−ケンス番号 S/Key 組込
no21201:シ−ド(種) ------------ JIBE .. ----------
| hostG | <---------- | |
| | | hostA |
|fwtk Proxy| ログインOK | |
------------ ----------> ----------
| |
-------------------------------------------------
このテストを行なうためには、 S/Key のサ−バ側ソフトである logdaemon が必要である。
logdaemon にはパスワ−ドを計算するクライアント側のソフトも入っている。 donkey は
クライアント側だけのソフトである。下記のところにちょうど2つ揃ってあった。
ftp://ftp.nic.ad.jp/src/donkey-0.3.tar md4,md5 サポ−ト
ftp://ftp.nic.ad.jp/src/logdaemon-4.9.tar md4 のみサポ−ト
参考文献は「UNIX MAGAZINE」しかない。 何やらいろいろ訳の分からんことが一杯書いて
ある。ワンタイム・パスワ−ドの数学的な意味など知る必要はない。S/Key は実績があり
安全であること。OTP( One Time Password ) は S/Key の今後の呼び方であること。 md4
とか md5 というのは、パスワ−ド生成の暗号化の度合で md5 の方が強力であること。こ
れだけ知っておけば十分である。「UNIX MAGAZINE」'95/03, P.114〜 "転ばぬ先のセキュ
リティ S/KEY"、'96/02, P.68〜 "転ばぬ先のセキュリティ OTP"。
* ワンタイム・パスワ−ドの運用
[ パスワ−ドの初期化 ]
ワンタイム・パスワ−ド初期化の際のパスワ−ドは、管理者が勝手に決めてしまっていい
のでないか。一般の人はそれ程セキュリティ意識が高いとは言えない。誕生日や免許証番
号の一部を使う可能性は高い。管理者が相手の誕生日などまで聞いて、パスワ−ドをチェ
ックするわけにはいかない。手間もその度かかってしまう。ワンタイム・パスワ−ドとい
えども、本当に隠されるのはパスフレ−ズと呼ばれるパスワ−ドだけである。シ−ケンス
番号やシ−ドはプレ−ン・テキストで流れる。よって簡単なパスワ−ドで初期化してしま
ったら、見破られる可能性は大きい。もしそんなことで侵入されてしまったとしても、容
易なパスワ−ドをつけた人を責めることはできない。あくまでも管理者の責任でしかない。
[ 危険な設定 ]
telnet にワンタイム・パスワ−ドを適用することを検討してみる。あるホストに telnet
を掛けると、相手ホストでは telnetd デ−モンから、ロッグインのための /bin/loginが
起動される。この login はただのロッグイン手続きではなく、 ワンタイム・パスワ−ド
対応になっている必要がある。/bin/login は Sun や Apollo などの場合で、 INDY では
/usr/bin/login である。つまりこの login プログラムをワンタイム・パスワ−ド用と置
き換えなければならない。これはテストするのも恐ろしい。login をへたに換えたらその
計算機に二度とロッグインできなくなってしまう。絶対やめた方がいい。そうしないため
にもワンタイム・パスワ−ドは、fwtk や tcp_wrapper 等の制御下に組み込むべきである。
* ワンタイム・パスワ−ドの実装
[ fwtk に S/Key を組み込む ]
$ wd /usr/local/source/logdaemon-4.9;ld
Makefile README ftpd/ keysu/ lib/ login/
rexecd/ rlogind/ rshd/ skey/ skeysh/ telnetd/
fwtk は認証機能を使う場合、 デフォルトでプレ−ンテキストのただのパスワ−ド入力を
するようになっている。これをソ−スプログラムの auth.h で bellcore's S/Key を使う
ように修正する。そしてコンパイルし直すのだが、 ここで S/Key のライブラリが必要に
なる。S/Key のソ−スである logdaemon をとってきて、libskey.aを作成しておく。fwtk
はここでは Apollo コンピュ−タに設けるので、libskey.a も Apollo でコンパイルして
作成する。$ /bin/make sunos4 とやって、ともかく BSD 系を指示すると途中エラ−で止
まるが libskey.a はできる。テストはこれで問題ない。logdaemon のコンパイルは INDY
でもやってみたが、難なく終わった。
[ fwtk の auth.h の修正とコンパイル ]
/usr/local/source/fwtk/source/auth.h
----------------------------------------------------------------
|#define AUTHPROTO_PASSWORD /* builtin plaintext passwords */
|/* #define AUTHPROTO_SKEY bellcore's S/Key */
|/* #define AUTHPROTO_SECURID Security Dynamics' SecurID */
↓ 変更する
/usr/local/source/fwtk/source/auth.h
----------------------------------------------------------------
|/*#define AUTHPROTO_PASSWORD builtin plaintext passwords */
|#define AUTHPROTO_SKEY /* bellcore's S/Key */
/usr/local/source/fwtk/source/auth/Makefile
----------------------------------------------
|#SKEYDIR=../../skey
|SKEYDIR= /usr/local/source/logdaemon-4.9/skey << libskey.a 必要。
|SKEYINC= -I$(SKEYDIR)
|SKEYLIB= $(SKEYDIR)/libskey.a
$ wd /usr/local/source/fwtk/source ※インスト−ルし直したら、authsrv だけがフ
$ /bin/make ァイル・サイズが変わっていた。authsrv を
$ /bin/make install /usr/local/etc にコピ−して入れ替える。
[ ワンタイム・パスワ−ドの初期化 ]
注意点として /etc/inetd デ−モンは、再起動して認証デ−タベ−スを初期化した方がい
い。inetd を再起動しないとエラ−がでる。 もしこれでもダメなら /usr/local/etc/ に
ある認証デ−タベ−スのファイル fw-authdb, fw-authdb.dir, fw-authdb.pag を消去し
て、再度 inetd を起動してみる。初期化は S/Key の keyinitコマンドは使えない。fwtk
の authsrv に組み込まれている。ユ−ザ名とパスワ−ドを入れると、 シ−ケンス番号と
シ−ド(種)は authsrv が決める。
$ authsrv
authsrv# passwd katou 333
Bad authentication protocol for user - abort
$ wd /usr/local/etc
$ authsrv
authsrv# add katou 'katou ikken' << root で作業すること。
ok - user added initially disabled
authsrv# list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
katou katou ikken n unkno never
authsrv# proto katou skey << skey を使う。
changed
authsrv# list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
katou katou ikken n Skey never
authsrv# pass katou 333
ID katou s/key is 664 no21201 << 出たぞ。これがチャレンジ・コ−ドだ。
authsrv# enable katou << パスワ−ドを有効にする。
enabled
authsrv# list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
katou katou ikken y Skey never
[ いよいよトライ ]
hostA % cd /usr/local/source/logdaemon-4.9/skey
hostA % key 663 no21201
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: << パスワ−ド 333 をいれる
JIBE KNOB MILT BUN DRAB COG << これがワンタイム・パスワ−ドだ
hostA % telnet hostG
hostG telnet proxy (Version V1.3) ready:
Username: katou
Skey Challenge: s/key 663 no21201 << ただ Return キ−を押してみた。ダメ。
Permission Denied.
Username: katou ↓ここから後ろ入力する。小文字でもよい。
Skey Challenge: s/key 663 no21201JIBE KNOB MILT BUN DRAB COG
Login Accepted << ロッグインに成功した。
tn-gw-> c localhost
[ ワンタイム・パスワ−ドの計算 ]
donkey は S/Key の key と同じく、ワンタイム・パスワ−ドを計算することができる。
デフォルトは md4 で計算するが、md5 でも計算できる。key の方は今のところ md4 で
の計算だけである。以下全て katou でロッグインした状態での出力である。donkey の
コンパイルは IRIX 5.3 でやってみたところ何の問題もなかった。各自やられたい。
% donkey 663 no21201 << デフォルトでは md4 で計算する。
Enter passphrase :
JIBE KNOB MILT BUN DRAB COG
% donkey -f md5 663 no21201 << md5 で出してみた。上記とは異なっている。
Enter passphrase :
OUST WAIT WOK SAID COCO GRID
% donkey -n 5 663 no21201 << 663 番から5個ワンタイム・パスワ−ドを表示
Enter passphrase : した。プリントしておけば、計算機に donkey
659: NAT THEM BEET JOB DEAL HOYT など計算プログラムが無くても構わない。
660: MIKE FOUR AIDE CHAR HUM GLOM
661: TAKE FUME JOG BASH TIC AREA
662: ALP MALE BURY JACK EMMA ARE
663: JIBE KNOB MILT BUN DRAB COG
% key -n 3 663 no21201 << S/Key でも同じ結果が得られる。
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
661: TAKE FUME JOG BASH TIC AREA
662: ALP MALE BURY JACK EMMA ARE
663: JIBE KNOB MILT BUN DRAB COG
% donkey -i << S/Key のための初期化用の書式を出力する。
Enter login name [default katou]:
Enter sequence 1 to 999 [default 99]: 663
Enter new seed [default ic99863]: no21201
Enter passphrase :
Enter passphrase :
katou 0663 no21201 a174faee04a76616 Jul 22,1996 10:44:37
JIBE KNOB MILT BUN DRAB COG
-----------------------------------------------------------------------------------
[付録]
% donkey
usage: donkey [-n num] [-f func] sequence seed
donkey -i
[ donkey のコンパイル ]
% tar -xvf donkey-0.3.tar << INDY IRIX 5.3 でコンパイルしてみた。なんの問
% ls -F 題も無く数十秒で終わった。
setup /obj /src 00changes 00install 00readme
% ./setup
Set up obj/IRIX.5.3 ...
Done
To make donkey for IRIX.5.3, type:
cd obj/IRIX.5.3 << この順番で実行していけばよい。
./configure
make
% cd obj/IRIX.5.3
% ./configure
% make
% make install
cp donkey /usr/local/bin << /usr/local/bin/ に donkey がコピ−される。
ln -s donkey /usr/local/bin/key
authsrv# help << これでだいたい使い方は分かる。
Command List:
(Commands may be invoked with unique leading abbreviation)
authorize username [comment]
authenticate username
response
quit
exit
display username
adduser username [fullname]
deluser username
enable username [onetime]
disable username
password [username] passwordtext
passwd [username] passwordtext
proto username protoname
group username groupname
rename username newname [fullname]
wiz username
unwiz username
superwiz username
operation group/user username command dest [tokens]
list [group]
ls [group]
?
help