プログラミング・テクニック C シェルが用いるハッシュ よいハッシュ関数 C シェルでもハッシュを用いています。 C シェルのサ ハッシュ関数はキーの値をある範囲内の値にマップす プコマンドに hashstat 、 rehash 、 unhash などがありま るものです。しかし、この変換の仕方にもよいものと悪い すが、これらのコマンドの意味を考えると、 C シェルで ものがあります。前節の、 N と M の両方に同じ値を指定 のハッシュの使用力 1 去はおおむね予想がっくでしよう。 C した場合などは悪いハッシュ関数の例です。 シェルでは、コマンド名をキーにしてハッシュを利用して よいハッシュ関数とは、おおむね次のようなものです。 います。 計算カ吶単である。 ちょっと変わっているのは、キーに対応して当求するレ ・各入力に対して出力が通隻に分散する。 コードです。通常は、キーに対応するレコードとしてその キーを含むひとかたまりの情報を登録しますが、 C シェル 言 1 算カ吶単であるという牛は、ハッシュ関数の使用目 の場合はすこし違い、何も登録せすにビットを定するだ 的によります。今回は、探索を高速化するためにハッシュ けです。 C シェルの利用ガ去では、キーが存するかどう 関数を用いようとしているのですから、そのハッシュ関数 かだけが重要なので、存する場合にはピットを設定し、 の計算が大変でのかかるものだったら意味がありませ 存在しない場合にはピットをクリアしています。こうした ん。しかし、別の目的でハッシュ関数を使っており、速 指定が可能になるように、ちょっとした工夫も凝らされて 度がそれはど間題にならないのであれはこの持生は必頭で います。キーのなかに調べたい情報を組み込んでしまって はありません。 いるのです。 一方、各入力に対して出力が適度に分散することは重要 C シェルカしい情報は、あるコマンド名か指定され です。これは、さまざまな入力が与えられたときに、あた たときに、そのコマンドカ躾際にはどのようなパス名とな かも乱数で得られているかのようにすべてのハッシュ値 っているかです。また、パスの検索は PATH 変数にオ絲タ カ寸匀等に得られるはどよいのです。キーの値は異なるにも されているディレクトリに対してのみおこなわれます。 C かかわらす、ハッシュ関数を適用した結果か 1 司じ値となっ シェルて採用しているガ去は、キーとしてコマンド名を用 てしまうことがあります。これをハッシュの衝突と呼びま いるのはもちろんですが、そのコマンド名が PATH 変数 すが、ハッシュを使う以 - E は避けられない問題です。ただ の i 番目のディレクトリに存在するかどうかをヾるため し、ハッシュの出力範囲の 1 割程度しか使用していない に、コマンド名と i という整数の両方からハッシュ値を計 のに衝突か頻発するようであれば、それは悪いハッシュ関 算して、その結果をピットとして表現します。つまり、 i 数だといえるでしよう。もちろん、衝突は避けられません 番目のディレクトリにコマンド名のファイルか有して実 が、適度に出力を分散させることができれば衝突の頻度は 行可能な場合には、対応するハッシュのピットか設定され それはど高くなりません。 ます。 ハッシュを効率よく運用していくには、すべて刎直を均 このハッシュのセットアップをおこなうのが exec. c の 等に使えることか布要になるため、自分でハッシュ関数を なかにある dohash 関数です。この関数は PATH 変数を 作成したときなどは、テストデータを与・えて出力の分散の 変更した場合に呼び出されます。また、 rehash サプコマ 具合を石忍しておくとよいでしよう。 ンドでも呼び出されます。そのため、引数は不要であるに ンシュ関数に対する入力値、つまりキーの値に何か もかかわらす v と t という 2 つの引数を旦言しています。 特別な性質があるのなら、それを利用してハッシュ関数 これらは、 C シェルのサプコマンドを実現する関数すべて を考えるとよい場合もあります。たとえば値の範囲が 0 に共通の引数であるため、コンパイラに警告を出されない ~ 10 000 だとしても、そのなかで使われているのが 0 ~ ようにここでも旦言しています。 1 , 000 と 9 , 000 以降だけなら、この特生を考慮に入れて ハッシュ関数を作ることができます。 void 101 UNIX MAGAZIN E 1998.5
ォー します。ポート番号を省略したときは、 telnet のポートで ある 23 番ポート , 材妾続します。 connect の代わりに c と書くこともできます。 ア の password コマンドを実行すると、最初にユーザー認証 がおこなわれます。そして、ユーザー認証に成功した場合 にのみ、新しいパスワードが入力できます。 パスワードを変更する例を示します。 telnet コマンド : 書 : 式 : telnet ん os 佖 me ゆ 0 ] connect コマンドと同しです。 telnet の代わりに t と 書くこともできます。 ope Ⅱコマンド : 書ツに : open hostname [ 〃 0 ] connect コマンドと同じです。 open の代わりに o と 書くこともできます。 x - gw コマンド : 書 : 式 : x-gw [ ん os ame : 市夘ⅵ . sct ℃ e れ nun 訪 e 司 ] ん os ame に、ディスプレイ番号 0 が市夘に、スク 引数を省略した場合は、 tn-gw への接続元の言 t 算機が については、次回以降に説明します。 けです。 X プロトコルのプロキシー・サーバーの使用ガ去 -xok オプションで許可されたホストから接続した場合だ このコマンドか夫行できるのは、 tn-gw のルールにおいて る、 X プロトコルのプロキシー・サーバーを起動します。 指定されたホストの指定されたディスプレイへ接続す 書式 : password password コマンド help の代わりに h や ? と書くこともできます。 を表示します。 tn-gw のコマンドモードで実行できるコマンドの一 書式 : help help コマンド x ー gw の代わりに x と書くこともできます。 リーン番号 0 が . screennumber に成疋されます。 UNIX MAGAZINE 1998.5 password の代わりに p と書くこともできます。 ( 認証システムの使用ガ去については災可に説明します ) 。 オプションで許可されたホストから接続した場合だけです ドかま行できるのは、 tn-gw のルールにおいて一 passok ューザー認証のパスワードを変更します。このコマン tn-gw—> p Changing passwords ←コマンド実行 アカウント名を入力 Enter Username : rascal ←ー 01d Password: # # # # # # # # # # ←現在のノヾスワードを入力 New Password: # # # # # # # # # # ←新しいノヾスワードを入力 ←もう 1 回 Repeat New Password : # # # # # # # # # # Password for rascal changed. tn¯gw— > timeout コマンド 書式 : timeout seconds tn-gw フロキシー・サーバーは、一定時以上バケット を中継しない状態 ( アイドル状態 ) か読くと、自重加勺にそ の接続を切断します。このコマンドは、接続を切断するま での秒数を指定します ( デフォルトでは 7 , 200 秒です ) 。 timeout の代わりに ti と書くこともできます。 quit コマンド 書式 : quit tn-gw プロキシー・サーバーの利用を終了します。 quit の代わりに q または exit 、 e と書くこともでき ます。 tn-gw に指定できるパラメータ属匪の一覧を表 3 に示し ます。各パラメータ属の未と、オプションについて説 明します。 permit-hosts tn-gw へ窈妾続を許可する計算機を指定します。 引数には、ホスト名や IP アドレスを記主します。その 文字列の一部にワイルドカードを使用し、計算機の集合を 指定することもできます。 permit-hosts で明示的に許可されていない言 - 算機は、 すべて、、拒否 " として扱われます。 ・ -auth オフション tn-gw ー、、の接剞にユーサー認証を要求します。 - バラメータ属性 51
プログラミング・テクニック リスト 3 パスかかドットて始まっている場合 ~ 里 if ()v [ 0 ] [ 0 ] 0 Ⅱ eq(pv[0] , STRdot)) / * don't make . /xxx * / texec(*av, (v) ; る部分も多いので、関連する部分だけを取り出して紹介し ます。 まず、ハッシュか有効になっているかどうかを調べま す。有効になっている場合は、ハッシュのキーのうち、コ マンド名の部分をさきに言 t. 算して hashval に入れておき ます。 i は PATH 変数の何番目の要素かを示し、 hits は ハッシュがヒットした回数を数えるもので、最初にインク リメントしておきます。この変数は、ハッシュがどの程度 有効に用いられたかを示す hashstat サプコマンドカリ用 します。 if (havhash) hashval i = 0 ; hits 十十 ; hashname (*av) ; 本体は、パスのそれぞれの要素に関する do ループに なっています。最初の条件は、 ・コマンド名がスラッシュで始まっていない ・パス名はスラッシュて始まっている ・ハッシュか有効になっている UNIX MAGAZINE 1998.5 の実行を試みます。 にコマンド名をつなげたものをファイル名としてコマンド それ以外の場合には、現在注目しているパスの値の後ろ す ( リスト 3 ) 。 場合です。この場合にはそのままコマンドの実行を試みま 次のテストはパスが空だったりドットて始まっている goto cont ; if ( !bit(xhash, hashvall)) hashvall = hash(hashval , i) ; ' / ' & & havhash) { if ( ! slash & & pv [ 0 ] [ 0 ] do { て do ループの最後の部分に飛びます。 こには実行できるファイルはないので、 goto 文を実行し 値に対応する xhash のビットか設定されていなけれはこ 刎直とを組み合わせてハッシュ値を得ます。このハッシュ 名に関するハッシュ値と、パス可番目の要素かを示す i 索します。このとき、あらかしめ引算しておいたコマンド という 3 つです。これらカヾ岡たされた場合にハッシュを検 else { dp = Strsp1(*pv, sav) ; Vdp = dp ; texec(dp, (v) ; Vdp = 0 ; xfree( (ptr-t) (p) ; が、次の PATH 変数の値をチェックすればよいだけなの コマンドが実行できないことて衝突カ起きたと分かります ハッシュ関数には衝突がっきものです。 C シェルでは、 衝突の解決 あるのです。こオ功ゞハッシュの衝突です。 そちらのために xh h のピットか轂定されている場合も ているキーとは別の値カ祠しハッシュ値にマップされて、 点です。これはハッシュの宿命です。チェックしようとし もかかわらす、コマンドを実行できないこともあるという ッシュ値に対応する xh h のピットカ疋されていた ) に こて主意してはしいのは、ハッシュがヒットした ( ハ に戻して、実行できなかったことを示します。 には、最初にインクリメントしておいた hits の値をもと 使ってもコマンドを実行できなかった場合です。この場合 この do ループを抜けるのは、 PATH 変数のどの値を hits— } while (*pv) ; pv 十十 ; C ont : 次の要素にするとともに i の値を変更しています。 最後は do ループの次の要素を指すための処理で、 pv を msses 十十 ; ておきます。 結果を与・えたことを示す misses 変数をインクリメントし た場合にはここに到達します。そこで、ハッシュかった したファイルが存しないなど、なんらかのエラーカ吽し ため本来は戻ってくるはすはないのですが、実行しようと 合です。 texec は内部で exec システムコールを実行する この後ろまて到達するのは、 texec の実行か失敗した場 103
デフォルトは 7 200 秒ですが、このパラメータ属性で 値を変更することかできます。単位は秒です。 prompt denydest-msg ォルトは、 tn-gw-> " です。 コマンドモードのプロンプト文字列を設定します。デフ このパラメータ属性を省略したときは、次のようなメッ msg 、 denial-msg 、 help-msg についても同オ兼です ) 。 ァイル名を記述する必要があります ( これは、 welcome- chroot(2) した環竟からアクセスできるディレクトリとフ 引数に言当するディレクトリ・パスに注意してください。 パラメータ属生 directory を同時に指定した場合は、 示されます。 ータ属匪で指定したファイルの内容がユーサーの端末に表 はかの言算機への接続が、、拒否 " されたとき、このパラメ 則述の -dest オプションにより、コマンドモードから 、 Melcome—msg NOt permitted tO connect tO ん OS れ 07 れ e tn—gw—> connect ん OSt れ佖 7 れ e セージか表示されます。 hostname telnet proxy (Version V2.0 ) ready : セージか表示されます。 このパラメータ属性を省略したときは、次のようなメッ ます。 性て指定したファイルの内容がユーザーの端末に表小され ューサーが tn-gw に接続したとき、このパラメータ属 denial-msg 54 tO use the telnet proxy hostname ( または IPaddT 、 ess) is not authorized セージか表示されます。 このパラメータ属匪を省略したときは、次のようなメッ ます。 性で指定したファイルの内容がユーサーの端末に表示され tn-gw への接続か拒否されたとき、このパラメータ属 help-msg コマンドモードで help コマンドを実行したとき、この パラメータ属性て指定したファイルの内容がユーザーの端 末に表示されます。 このパラメータ属性を省略したときは、プログラム内部 に埋め込まれているヘルプメッセージが表示されます。 環竟に合わせたヘルプメッセージを表小する場合などに 使います。ヘルプメッセージを表示したくないときは、中 身か空のファイルを用意し、そのファイル名を引数で指定 tn—gw [ —daemon [ 、 vice ] ] tn-gw コマンドの書式を次に示します。 - コマンドの書式 接続できません。 このパラメータ属性を省略したときは、 ます。 認証サーバーカ力いている計算機とポート番号を指定し authserver します。 認証サー / ヾーに して FWTK のユーザー認証システムについて説明する 次回は、バージョン 2.1 の紹介と、インストールイ業、そ 先日、 FWTK バージョン 2.1 がリリースされました。 今月の竹喋はここまでです。 ☆ が自重加勺に補われます。 引数 service を省略すると、 telnet のポートである 23 述します。 値、あるいは /etc/services で定義されている文字列を記 プロセスとして重川乍します。 service には、ポート番号の 引数 service て指定されたポートを受け付けるデーモン・ -daemon オプションを指定して起動すると、 tn-gw は 予定です。 UNIX MAGAZINE 1998.5 ( しらさき・ひろお )
UN Ⅸへの招待 と定義すれは、 UNIX コマンドの date か夫行されます。 date のような引数のないコマンドではなく、ファイル名 を引数にとるものであれは、その部分を、 と書いておくこともできます。ここで、れは何番目の引数 かを表します ( ただし、ファイル以タ P ) 引数は指定できま ・アイコンにほかのアイコンをドロップした。 簡単な例ですが、 date cat $ 1 せん ) 。たとえば、 私は、を実行するために次のように設定しまし であれば、 2 つのファイルの差分を見ることができます。 diff $ 1 $ 2 であれば、最初のファイル引数が cat て表示されますし、 ようにして、 jlatex $ 1 どこで指定するのでしようか ? わけですが、実行されるコマンドへの引数はいったいどの して、それに定義されているアプリケーションを実行する ところで、アクション・アイコンは、ダブルクリック・ 172 diff $ 1 $ 2 それでは、 ルの内容が表示されます。 ドロップされたファイル名が $ 1 の部分でイ吏われてファイ ン・アイコン上にドロッフするとアクションか実行さ と定義されている場合、ファイルのアイコンをアクショ cat $ 1 ンのドロッフ。です。たとえば、 1 つは、アクション・アイコンへのファイル・アイコ などの場合はどうでしようか。 2 つのファイルを同時に ドロップすることはできません ( 1 回のドロップでアプ リケーションか起動されるので、 2 つを連続してドロッ プすることもできません ) 。このように、複数のファイル 引数が必要な場合は、実行時にその入力を促すダイアロ グ・ポックスを用意しなければなりません。そのための 準備についてはもうすこしあとでとりあげることにして、 アクション作成のウインドウの残りの部分について説明 しておきましよう。 、アクション・アイコンのヘルプ・テキスト " では、アイ テムヘルプ 3 に表示する内容を入力します。たとえば、 このアクション・アイコンでは、ドロップされたファイルが latex コマンドで整形されます。 などと書きます。ここに入力した内容は、ヘルプウイン ドウではその横幅に応じて自動的に改行されます。ただ こで改行したい " と明示したい場合は、その部分 し、 に、、 \ n " を入れておきます。 、、ウインドウタイプ " は、デフォルトでは、、グラフィカル (X ウインドウ ) " になっています。 X ウインドウ・シス テムに対応しているアプリケーション ( アプリケーション が独自のウインドウを開く ) はそのままにしておきます。 さきほど例に挙げた cat や d 沮などの UNIX コマンドの 場合は、右側のボタンをクリックすると表示されるポップ アップ・メニューから、、、端末 ( 自重加勺に閉しる ) " 、ある いは、端末 ( 自分で閉じる ) " のいずれかを選びます。 の 2 つの違いは、アプリケーションの終了とともに端末 工ミュレータが自重加勺に終了するか、あるいはユーサーが 指定して終了させるか、という点だけです。以 E の 3 つ のほかに、アプリケーションからの出力結果がない、、出 力なし " もあります。 前述した、 diff $ 1 $ 2 のように、アクション・アイコンをダブルクリックして 実行するときに引数の入力が必要な場合は、ユーサーに対 するプロンプトを決めておきます。アクション作成のウィ 3 ポインタカワクション・アイコン上にある状態で FI キーを押すか、ア イコンをマウスポタン 3 でクリックしたときのメニューから、ヘルプ " を退尺して得られるヘルプ 1 帯にてす。 UNIX MAGAZINE 1998.5
ワークステーションのおと たしかに、一イ殳にはマスタードライプと C ドライプ、ド 70 2 ほかの方法は ? xcopy32. exe か実行されるようてす。 だし、 Windows 95 がに動力している状態で xcopy. exe を利用すると、 者は DOS の 8 十 3 のファイル名しか扱えないという点にあります。た 違いは、前者が 32bit 版で長いファイル名に対応しているのに対し、後 2 xcopy32. exe とよく似たコマンドに xcopy ・ exe があります。両者の 4. MS-DOS プロンプトを開く。 含めてかならすすべて消しておきます。 コピー先のドライプにあるファイルは、隠しファイルも いようにするためです。同しような事故を防ぐために、 ピーするときに、システムファイルの上書きに失敗しな する、、 / s " オプションは付けません。これは、あとでコ ファイルシステムを作成するとき、システムをコピー 双疋、ファイルシステムの作成をする。 3. 必に応じて、コピー先のドライプのパーティションの ら Windows 95 を起重丿ける。 2. コピー元のドライプをマスタードライプとして、 る。 1. コピー先のドライプをスレーブドライプとして接続す に入っています ) 。そして、次のようにします。 です ( 通常、 MS-DOS プロンプトでのコマンド検索パス コマンドは *windows*command*xcopy32. exe 近まて私はできるとは知りませんでした。 できます。「当り前やんけ」と言われそうですが、つい最 Windows 95 に標準で備わっているコマンドでもコピー と思っている人も多いのではないでしようか。しつは、 に、なんや面倒くさいなあ」 「 UNIX やったら dd とか dump/restore でできんの はかかりません。しかし、 ツールを使えばコピーにはそれほどの手間 このように のです。 ればいいといえばそれまでですが、紛らわしいのは困りも 合、スレーブドライプが C ドライプになります。注意す スレーブドライプから起動できるものもあります。この場 ライプ 1 は同じです。しかし、マサーポードによっては 5. C ドライプ、 D ドライプともカレント・ディレクトリ をルート ( ¥ ) にする。 6. カレントドライプを C とし、次のコマンドを実行する。 C:*>xcopy32 C:* D:* /E /C /Q /H /R /K ここで指定しているコマンドスイッチの意味は次のとお りです。 /E : 空のディレクトリも含めて、すべてのサプディレクト リをコピーする。 /c : 工ラーが発生してもコピーを続ける (C ドライプにあ る Windows 95 のスワップファイル Wⅲ386. swp は コピーできないので、かならす工ラーが発生します。 のエラーで停止するのを防ぐために指定します ) /Q : コピー中にコピーしているファイルの名前を表小しな い ( 大量のファイルがあるので、いちいち表示されると 煩わしく感します。表示しないはうが、コピーできな かったファイルを石忍しやすいという利点もあります ) /H : 隠しファイルとシステムファイルもコピーする ( いろ いろな隠しファイルがあるので、これもコピーします ) /R : 書込み禁止ファイルも上書きする ( コピー先のディス クにファイルか残っていても、確実にファイルをコピー できるようにするためです ) /K : 属性をコピーする ( そのままコピーすると、書込み禁 止のファイルか書込み可能になってしまうので、これを 避けるためです ) こオ・けごけでは、スワップファイルの Wⅲ386. swp はコ ピーされないので、 xcopy32. exe を実行したあと、適当 な大きさのファイルを win386. swp という名前で D ドラ イプに作ります ( 内容はなんでもかまいません ) 。そして、 このディスクを PC に取り付けて起動し、ホスト名とユー サー名を設定すればおしまいです。 DriveCopy の場合とくらべて、 fdisk と format のた めの時間がかかるので、 xcopy32 方式では IGB のディ スクで 1 日判り半くらい必要です。 ノート PC のディスク交換 xcopy32. exe とちょっとした道具 ( 、怪しいツール " と呼ぶ人もいます ) を使えば、ノート PC のディスクを UNIX MAGAZINE 1998.5
図 1 tn-gw の乍 tn- クライアント ロ ねえねえ 起動 許可 ? 拒否 ? なんや ? コマンド モード サーバー tn-gw は、ネットワークから接続要求を受け取ると、ま す netperm-table ファイルを読み込みます。そして、そ の設定内容に従ってアクセスの司否を判断し、その判断の 結果をログに言求します。 アクセスを許可した場合は、 tn-gw はプロンプト (tn-gw->) を表示してコマンドモードに移行します。 方、アクセスを拒否した場合は、そのコネクションを切断 して処理を終了します。 ューザーがコマンドモードで connect コマンドを実 行すると ( コマンドモードで入力できるコマンドについて は、あとで説明します ) 、 tn-gw はその引数に指定された 計算機 ( 通常は Telnet サーバー ) への接続を試みます。 コネクションの石立に成功すると、 tn-gw は 2 つの TCP コネクションを張っている状態になります。 1 つはユー サーか起動したクライアント側、もう 1 つは新たに接続し たサーバー側です。その後、 tn-gw はコネクションが切 断される ( ューザーがログアウトする ) まで、クライアン ト側のコネクションから受信するバケットをサーバー側の コネクションに転送し、同様にサーバー側のコネクション から受信したバケットをクライアント側のコネクションに 転送し続けます。まさしく、、、筒抜け " 状態です。 tn-gw か起動してから終了するまでに、表 1 の情報が あ 0 の Te et サーバーに つないでえな できたで 接続したいんやけど ええで Telnet 通信の中継 ばいばい ばいばい さいなら さいなら 42 syslog に言当求されます。 表 1 tn-gw が syslog に出力するログ 接続元 IP アドレス ( つねに表示される ) 接続元ホスト名 IP アドレスから逆引きできない場合は unknown と表示さ れる。 ・ユーザーカ甘旨定した接続先ホスト名 入力した文字列がそのまま表示される ( タイプミスも言求さ れる ) 。 接続先 IP アドレス 接続先ホスト名から得られた IP アドレスか表示される。 動かしてみよう 接続ⅢⅡ単位は秒 ) なわない場合は、 unauth と表示される ) 。 FWTK 上のユーサー名か表示される ( ューサー認証をおこ ・ユーザー名 中継しなかった場合は、 0 " か表示される。 接続元 , 、紳継したバイト数 ( ⅲ ) 中継しなかった場合は、 0 " カ俵示される。 接続先 , 、、中継したバイト数 (out) # tn—gw に対するルール —exec /usr/local/etc/tn—gw netacl—telnetd: permit—hosts 192.168.255. * # Ⅱ etacl に対するルール しています。以 - ド ) table ファイルを作成します ( 誌面の都合上、で折り返 そして、次の 2 つのルールを言己した新しい netperm- # rm —f /etc/inetd. conf # rm —f /usr/local/etc/netperm—table 2 つのファイルカ戯っている場合はいったん削除します。 まず、前回イ乍成した netperm-table と inetd. conf の gw を動かしてみましよう。 説明を読んでいるだけでは退屈かもしれないので、 tn- tn—gw : permit—hosts 192.168.255. * 次に、 /etc/inetd. conf ファイルの telnet に関する工 ントリを以下のように変更します。 nowait telnet stream tcp /usr/local/etc/netacl telnetd root ファイルの修正カ絲冬ったら、ⅲ etd プロセスに HUP シ グナルを送り、 inetd に変更を応央させます。 UNIX MAGAZINE 1998.5
表 3 tn-gw のパラメータ属性 denydest-msg file authserver host 0 prompt rom timeout seconds directory 市几 ct0 xforwarder 7 ・四 ram userid userid groupid gro 社か d deny—ho s t s hostname deny—ho s t s lPaddress help-msg file denial-msg file welcome—msg file permit—hosts ん OS れ佖 me permit—hosts lPaddT ・ ess パラメータ属性 オプション —auth -passok —extnd —xok —startx —do-x —remhost hostname —de s t 〃 0 、れ 説明 IPaddress からの接続を許可 hostname からの接続を許可 ューザー認証を要求 パスワードの変更を許可 拡漲認証樹冓を利用 x-gw の利用を許可 接に x-gw を自重丿起動 -startx と同し かならす hostname に接続 接続先を制限 /P靃心・ ess からの接続を拒否 hostname からの接続を拒否 プログラムをグループ ID gro 叩記の権限で実行 プログラムをユーサー ID userid の権限で実行 X プロトコルのプロキシー・サーバーのプログラム・ファイル名を 日ノ丘 ディレクトリ市 ct 。に chroot(2) 接続切断までのアイドル日判りを設定 コマンドモードのプロンプト文字列を設定 認証サ→ヾーへのアクセス先を指定 help コマンドを実行したときに表示するメッセージ・ファイル tn ー gw への接続を拒否したときに表示するメッセージ・ファイル tl ト gw ' 材妾続したときに表小するメッセージ・ファイル ァイノレ コマンドモードからの接続を拒否するときに表小するメッセージ・フ tn-gw がユーサーからアクセスされたとき、アクセス 元が permit-hosts の引数に指定された計算機である 場合、そのユーサーに対してアカウント名とパスワード の入力を要求します。 -auth オプションを省略すると、ユーザー認証はおこ なわれません。 ・ -passok オプション tr ト gw へ接続したユーザーに対して、パスワード変更 を許可します。 ューザーによるパスワードの変更を許可する場合、 permit-hosts ルールに -passok オプションを当し ます。このとき、 permit-hosts の引数て指定された計 算機からアクセスしたユーザーに対してのみ、コマンド モード上でのパスワード変更を許可します。 -passok オプションを省略すると、ユーサーによるパ スワードの変更はできません。 ・—extnd オフ。ション 拡張認証オ胼冓を利用します ( この機溝については次回に 52 説明します ) 。 ・—xok オフション tn-gw ー材妾続したユーザーに対して、 X のプロキシー サーバー (x-gw) の起動を許可します。 ューザーに x-gw の起動を許可する場合、 permit- hosts ルールにこのオフションを記述します。この とき、コマンドモード上で x ー gw を起動できるのは、 permit-hosts の引数て指定された計算機からアクセス したユーザーだけです。 -xok オプションを指定する場 合は、パラメータ属性 xforwarder も設定する必要が あります。 -xok と xforwarder のどちらか一方でも指定されて いないと、 x-gw の起動は許可されません。 ・—startx オフション tn-gw ' 材妾続したユーサーに対して、 X のプロキシー バー (x-gw) を自勺に起動します。 ューザーが permit-hosts の引数て指定された計算機 から tn-gw にアクセスしたとき、自重加勺に X のプロキ UNIX MAGAZINE 1998.5
表 2 Telnet の許可 イ立許可 or キ語 1 2 3 許可 拒否 fs. doubutsu. co ・ JP ・ co も指定で . doubutsu ・ CO ・ JP ユーサー あり なし 挙することかできます。また、否定の未で ! きます。 複数のホスト名や複数の一 dest オプションを列挙した 場合には、した順番に詔面されます。 たとえば、前回紹介した表 2 を寒見するルールは次のよ うに言当します。 tn¯gw: permit¯hosts * . raccoon. doubutsu. CO ・ jp tn¯gw: permit—hosts fs . doubutsu. CO ・」 p —dest * . raccoon. doubutsu ・ CO ・」 p —auth 次のルールは、複数の -dest オプションを使用してい ます。このルールでは、どのような接続か許可さどの ような接続カ甘巨否されるかを考えてみましよう。 tn¯gw: permit—hosts * . raccoon. doubutsu. CO. 」 p -dest king. 1i0Ⅱ . raccoon. doubutsu ・ co ・ JP —dest ! * .1ion. raccoon. doubutsu. CO . JP —dest * . doubutsu ・ co ・」 p 「接続元を制限する」の項て紹介したルーノレの逆のパター ンです なお、 -dest オプションを列挙せすに、次のように記 述することもできます。 tn¯gw: permit¯hosts * . raccoon. doubutsu. CO ・」 p —dest { king ・ 1土0n. raccoon. doubutsu. CO ・ JP !* .1i0Ⅱ . raccoon. doubutsu. co. JP = 〉 * . doubutsu. co ・ jp } X プロトコルの中継 X プロトコルの中継を許可した場合の設定方法について 説明します。 今回は X プロトコルの中継を許可した場合に、 tn-gw 側で必要な設定について説明します (X プロトコルのプ ロキシー・サーバーについての詳細は稿を改めて説明し ます ) 。 特定のホストから tn-gw ' 材妾続するユーサーに対して X プロトコルの中継を許可する場合は、 X のプロキシー サ→ヾーの起動去の違いによって、 2 通りの設定ガ去が あります。 50 ます、ユーサーか明カ勺に X のプロキシー・サー UNIX MAGAZINE 1998.5 /etc/services に登録されたサービス名または数字で言己 アドレスで記述します。には、接続するポートを hostname には、接続する計算機をホスト名または IP 指定された計算機窈旨定されたポート , 材妾続します。 : 書工に : connect ん 0 れ ame ゆ 0 ] connect コマンド を、 tn-gw プロキシーのコマンドモードと呼びます。 tn-gw に接続して、 t Ⅱーー > " が表示されている状態 - プロキシー・コマンドの説明 これで設定完了です。 tn-gw: xforwarder /usr/local/etc/x-gw table に追加します。 最後に、どちらの場合でも次のルールを netperm- tn-gw: permit-hosts hostname —do—x [ 0 0 れ tn-gw: permit-hosts ん os 佖 me —startx [ 0 0 司 -do-x オプションは同じ未てす ) 。 指定するところがポイントです (-startx オプションと に -startx オプション、あるいは一 d 。ー x オプションを ラメータ属性を netperm-table に記述します。叩。れ な設定をおこなうときは、次の書式の permit-hosts パ X のプロキシー・サーバーを起動する去です。このよう 次は、ユーザーが tn-gw に接続するときに、自重加勺に tn-gw: permit-hosts hostname -xok [ 02 0 司 叩。れに -xok オプションを指定するところがポイント hosts パラメータ属性を netperm-table に記述します。 ります。このように設定するときは、次の書式の permit- コマンドモード上で x - gw コマンドを実行する必要があ ・サーバーを利用したいユーザーは、そのつど tn-gw の を起重丿ける場合の設定ガ去です。このとき、 X のプロキシ
4. 明示されていない言 t 算機は、、拒否 " として扱われる。 最初に、 TeInet に関するセキュリティ・プランか実現で きるように、 permit-hosts の引数と deny-hosts の引数、 そしてそれらをする順番を決定します。たとえば、ま すアクセスを許可する計算機の集合を決め、 permit-host でその言算機の集合をワイルドカードなどを用いて言己し ます。もし、そのなかに伊物粕勺に拒否したい言算機があれ ( ま、 permit-host の則の行に deny-host のノレーノレを言当 します。さらに例外があれば、その前の行に ・という ように言当すればよいでしよう。 permit-hosts と deny-hosts の引数と記述の順番を 決めたら、 netperm-table にルールを日己していきます。 このとき、プログラムの識別名には netacl-telnetd を指定します。そして、 permit-hosts のルールにはオ 算機 king は好きだから許可しよう」 ライオン部は食べられそうだから拒否しよう。ただし、計 「本に会社どう」えんの全部の言 t 算機を許可する。でも、 たとえば、 hosts には、、 -exec bye" を追加してください。 フション—exec /usr/local/etc/tn-gw を、 deny- UNIX MAGAZINE 1998.5 そのホストから接続するユーサーに対して認証を要求する 特定のホストから tn-gw への接続を許可し、さらに、 を要求する tn-gw 場合の設定方法を説明します。 することもできます。ここでは、ユーサー認証を要求する したユーザーに対してユーザー認証を要求するように設定 そこで、図 3 のように、コマンドモードに入る前に接続 カ状態です。これはおおいに問題です。 telnet て鮟続できてしまうので、はっきりいってスカス ただし、このままでは外部のユーザーが内部の計算機に net で接続するときは、これでとくに問題はありません。 ファイアウォール内部のユーサーが外部の言 t. 算機に tel- に接続しました。 アクセスした直後にコマンドモードに入り、外部の言 t 算機 図 2 の例では、ファイアウォール・ホストに telnet で tn-gw のユーザー認証 します。 というルールを実現したい場合は、リスト 2 のように言己主 ファイアウォールの作り方・・・ 6 ように設定する場合は、次の書式の permit-hosts パラ メータ属性を netperm-table に言己主します。叩 0 れに -auth オプションを指定するところがポイントです。 tn-gw: permit-hosts hostname —auth [ 0 0 司 さらに、次のルールも netperm-table に記述しま す。このルールの hostname と〃 0 には、認証サー (authsrv) を運用する計算機とポート番号を指定します。 tn-gw: authserver hostname 20 ローカルホストへの telnet 図 2 では、 pepper にログインする例を示しました。そ れでは、自分自身 (localhost) にログインしたい場合はど うするのでしようか。とりあえす、 connect コマンドの 引数に localhost を指定してみます。 % telnet 192.168.255.1 tn—gw—> connect localhost Trying 127.0.0.1 port 23. Connected to localhost . tn¯gw¯ > やっても結果は同しで、 tn-gw のコマンドモード のプロンプトが延々と表示されます。 なぜでしようか。この不可解な ( ? ) 重川乍について順を 追って調べてみましよう。 ます、実験用言算機からファイアウォール・ホストへ telnet でアクセスしました。このとき、ファイアウォー ル・ホスト上では次の順番でプログラムか起動さ各プ ログラムは以下のように重川乍します。 1. ファイアウォール・ホスト上の netacl が、 netperm- table の telnetd に関するルールを調面する。 2. netacl が tn-gw を実行 (exec) する。 3. tn-gw は netperm-table の tn-gw に関するルールを tn¯gw¯> あれ ? コマンドモードのプロンプトが表示されてしま いました。もう 1 回やってみましよう。 tn—gw¯> connect localhost Trying 127.0.0.1 port 23. Connected to localhost . 面する。 47