yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> NFS サーバにも、一般ユーザがログイン可能という前提です。敷居
> をあげることは、意味はあります。敷居が低いと、一般ユーザが悪
> の道に道に走ってしまうけれど、敷居が高ければ走らないというこ
> とはあります。

「NFSサーバに一般ユーザをログインさせない」方が手っ取り早いと思います
が,まあ,そういう前提で話をしましょう.

皆がログインできるNFSサーバで,(例えば)ポート番号2049のnfsdが
portmapperに登録された後,nfsdが死んでしまうと,一般ユーザが2049ポート
をbindする偽のNFSサーバを立ち上げて,クライアントからの要求を受けとる
ことが出来る,と.

(問題はどうやって本物のnfsdを殺すか,かな…
詳しい人に聞いたところ,「別のポートをnfsdをportmapperに登録し直す」こ
とはスーパーユーザでないとできないそうです.)

> mountd がしていることは、アクセス・ポイントのファイル・ハン
> ドル(オブジェクト識別子)を返すだけです。NFSサーバのポート番
> 号は、返していません。NFS サーバのポート番号と mountd は、関
> 係ありません。

なるほど.mountdだけ乗っ取っても意味はないんですね.(両方乗っ取らない
といけないのかな.)

> RPC のプログラミングのテクニックですが、portmapper を通らな
> いでポート番号を指定することはできます。具体的には、サーバ側
> では、bind したソケットを svcudp_create() に渡します。クライ
> アント側では、clntudp_create() で、第1引数にサーバのIPア
> ドレスとポート番号を保存した struct sockaddr_in を渡します。
> 
> サーバ側で NFS サーバのポート番号を portmapper に登録しなく
> ても、片っ端から試していけばいいので、安全性はそんなには上が
> らないのでしょうね。

いや,そうではなくて,
「portmapperから返されたポートが特権ポートかどうかチェックする」ように
NFSクライアントを改造するよりは,
「portmapperに聞かずに,あらかじめ決めておいた特権ポートに直接つなぎに
いく」ようにNFSクライアントにオプションを与えるほうが簡単だろうと思っ
たのです.

Linuxの(あてにならない)マニュアルでは,port=nマウントオプションでこの
指定ができるとあります.デフォルトでは「portmapperに尋ね,登録されてい
なければ2049を使う」そうです.(Vine 2.6CR, RedHat 7.2) 

SunのNFSクライアントにも同様のマウントオプションがあります.

元の質問者の方もSunのサーバ側の「オプション」をお尋ねでしたし,プログ
ラムの改造までは考えてらっしゃらないんじゃないかと.

> はい。ファイルが存在しない時に、これはどうも NFS サーバが乗っ
> 取られているらしいとにらんで、追跡調査する能力があれば、気が
> 付きます。自分でファイルを消したと思って、もう一度最初から設
> 定し直して、電子メールを読みに行くようだと気が付かないでしょう。

このいたずらがすぐにバレないようにするのはなかなか難しいですね.
「目的のファイルが書かれるまでじっと本物のふりをする」とかできれば良い
ですけど,「本物のふり」が全然できないから.

                                前田敦司