Windows 秘話: ありふれた風景の中に隠れているもの

Windows エクスプローラーで、ユーザーがアクセスすべきでないファイルが表示されないようにするには、どうすればよいでしょうか。このコラムで紹介するヒントを実行すると、ユーザーに非表示のファイルが表示されないようにすることができます。

Raymond Chen

エクスプローラーで、ファイル システム ディレクトリのコンテンツを表示するように指定すると、ディレクトリのコンテンツは、ファイル システムの指示どおりに表示されます。ファイル システムに隠しファイルやフォルダーが含まれている場合、エクスプローラーは既定で、その項目を表示しないようにします。

エクスプローラーで表示されないようにする項目は、コントロール パネルの [フォルダー オプション] の一覧で構成できます。非表示になっている項目や、"保護されたオペレーティング システム ファイル" (社内では、まるでシャツに大きく H とプリントされているかのように "スーパー隠しファイル"と呼ばれています) を表示するように選択することもできます。ただし、エクスプローラーには、ユーザーがアクセスできない項目を非表示にする設定は用意されていません。

エクスプローラーでは、複雑な処理をファイル システムに任せています。ディレクトリにアクセスできないサブフォルダーが含まれていても、ファイル システムの列挙関数には関係ありません。そのサブフォルダーのディレクトリのコンテンツを要求すると、そのコンテンツすべてを取得します。

コマンド プロンプトを使用して、dir コマンドを実行すると、この処理を確認できます。このコマンドを実行すると、要求したすべてのコンテンツにアクセスできるかどうかにかかわらず、ディレクトリのコンテンツが表示されます。ファイル システムの列挙関数にとって重要なのは、FILE_LIST_DIRECTORY アクセス許可 ("フォルダーの内容の一覧表示のアクセス許可" という UI があります) だけです。ディレクトリのコンテンツを一覧表示するアクセス許可が与えられている場合、ユーザーは、ディレクトリのコンテンツを表示できます。

アクセス制御

エクスプローラーには、ユーザーがアクセスできない項目をフィルター処理するオプションが用意されていない理由を説明しましょう。一例を挙げると、このようなオプションを利用すると、ディレクトリのコンテンツを列挙する速度が低下するためです。エクスプローラーは、FindNextFile 関数から返されるすべての項目に対して、セキュリティ チェックを実行し、ユーザーにアクセス許可が与えられているかどうかを確認する必要が生じます。つまり、リモート コンピューターのファイルを列挙している場合 (これは一般的なシナリオです)、項目ごとに、1 回 (場合によっては 2 回) のネットワーク ラウンドトリップが発生することになります。

1,000 個のファイルが格納されたディレクトリのコンテンツを列挙するのに、従来の方法であれば 12 回のネットワーク要求が必要でしたが、アクセス許可を確認すると 1,012 回のネットワーク要求が行われることになります。地球の反対側にあるネットワーク サーバーに対して ping を実行するのに 500 ミリ秒かかる場合、従来の方法でディレクトリのコンテンツを一覧表示するのに 6 秒かかっていたとしたら、同じ処理に 3 分以上かかることになります。

もう 1 つ重要な問題があります。それは、ユーザーのアクセス許可を確認するために、各ファイルにアクセスすると、高い確率でアクセスが失敗することです。こうなると、セキュリティ ログに多数の監査エントリが記録されることになります。このような監査エントリは、セキュリティ ログに記録された監査エントリを検証している企業にとって、悩みの種になります (また、この機能を必要としているユーザーは、たいていセキュリティ ログ調査します)。

監査エントリは多くのノイズを生成するので、社内で発生している重要なセキュリティ脅威を特定するのが難しくなります。この機能を有効にすると、すべてのユーザーは、脆弱なアクセス制御リストを含むファイルを検出するために、システムのすべてのファイルを入念にテストしているハッカーのように見えることになります。

早い段階で Windows XP スタイルのログオンをドメインに導入した企業の IT 管理者は同じような問題に直面しました。Windows XP では、パスワードが空の場合、ユーザーは自動的にログオンできました。この操作を実現するために、Windows では、空のパスワードを使用して、ユーザーがログオンできるかどうかを試行していました。失敗した場合は、パスワードを入力することを求めるメッセージが表示されました。

このアルゴリズムにより、セキュリティ ログに、"無効なパスワード" によるログオンがあったことが記録されました。この処理が IT 管理者の関心を集めているのは、本当にシステムに侵入しようとしている処理を検出するのが難しくなるだけでなく、何度もログオンに失敗すると、ユーザーがアカウントから知らないうちにロック アウトされる可能性が高くなるからです。

ユーザーがエクスプローラー チームに、この機能を追加するように要求したところ、エクスプローラー チームのメンバーは以上の問題についてすべて説明しました。また、メンバーは、「もう少し具体的な質問をする必要がある」という解決策についても言及しました。エクスプローラーでフィルター処理を行うように要求するのではなく、ファイル システムでフィルター処理を行う必要があります。

アクセス許可がないユーザーに対して項目を非表示にする従来の解決策は、ユーザーがアクセス許可を与えられていないフォルダーのサブディレクトリに、そのような項目を格納するという方法です。Windows Server 2003 SP 1 には、アクセス ベースの列挙 (多くの場合、縮めて ABE と呼ばれます) という機能が導入されました。アクセス ベースの列挙を使用して共有を構成すると、サーバーでは、ユーザーがアクセスできないファイルとディレクトリをフィルター処理します。

この機能をファイル システム リダイレクターに実装すると、この設定は共有にのみ適用されます。ローカル パスを使用したアクセスは、引き続き以前と同じように動作します。サーバーに要求する処理が多くなるので、ディレクトリのコンテンツを列挙する速度はわずかに低下します。各項目は、クライアントに返す前に確認する必要があります。詳細については、アクセス ベースの列挙に関するホワイト ペーパー (英語) を参照してください。

Raymond Chen

Raymond Chen は自分の Web サイト「The Old New Thing」および同じタイトルの書籍 (Addison-Wesley、2007 年) で、Windows の歴史、Win32 プログラミング、そしてル・シャトリエの原理について触れています。

関連コンテンツ