ASP で書き込み可能なフォルダを用意する
SERVER
ASP からファイルの書き込みを可能にするには…
通常、IIS は匿名アカウント ( IUSR_XXXXX ) 権限で Web サイトの情報を取り扱います。
これは IIS の Web サイトを設定する際に 「ディレクトリセキュリティ」 タブの 「匿名アクセス」 の設定で、匿名アカウントとして指定されたアカウントが使用されるようになっています。
ですので普通に公開する場合は、このアカウントが読み取り可能なフォルダを Web サイトとして公開すれば問題なく動作します。標準搭載されている FrontPage Server Extensions も、権限を自動調整する際には、この匿名アカウントを読み取り可能として設定してくれるようです。
読み込みだけならば、もともと匿名アカウントでアクセスされるものは基本的に誰が見ても良いものでしょうからこれで問題は少ないのでしょうけど…。細かいところまで考えると、ASP スクリプトには時にパスワードを記載する可能性がありますから、一概にそれで良いとも言えないのですけど。
ともあれ ASP 内のスクリプトからデータファイルへ書き込みを行いたいような場合には、ファイルに書き込み権限を与えなくてはならないので、なおさら少し安全性を考慮できたら良いなと思って、自分なりにいろいろと考えてみました。
とりあえず、匿名アカウントに対して書き込み権限を与えたディレクトリを用意した場合を考えてみます。
そのサーバにサイトが 1 件しかない場合や、複数あってもそれらのサイトを全てひとりで開発している場合にはあまり問題はないでしょう。けれど複数の人が作成するような場合には、全てのサイトが同じ匿名アカウントで起動していると、同一サーバ内の他のサイトからも書き込みができてしまうために面倒なことも起こるかもしれません。
それに、サイト全体から書き込みが行えるようにするよりは、書き込み可能な環境を局所的に抑えた方が、そうしないよりは安全性が増すはずです。
あともうひとつ、FrontPage Server Extensions を使っている場合、FrontPage Server Extensions のチェックみたいなことをすると、匿名アカウントに割り当てられている権限が読み取り専用になってしまう感じがあるみたいです。
そうなると当然のように書き込み時にエラーとなってしまうので、ちょっとした都合で上手く書き込みが出来なくなるということも意外と良くある気がしますので、匿名アカウントに対して書き込み権限を与える場合は、Web フォルダなどのような FrontPage Server Extensions の管理下になってしまうフォルダへは、設定しない方が安心そうです。
なお、Windows 認証 (NTLM 認証) を行ってサイトにアクセスした場合には、そのアカウントにて文書が参照されることになりますので、そういうアクセス制限が可能な場合には、それを用いてしまうと簡単です。書き込みしたいフォルダへ、想定しているアカウントに対する書き込み権限を与えるだけで、特に IIS の匿名アカウントをいじることなく目的を達成することが出来ます。
あと、関係ないのですけど、IIS の方で指定できる 「書き込み」 のチェックは、そのフォルダを WevDAV という機能で書き込むことが出来るかどうかを指定するもののようです。今回で言う、ASP からの書き込みが出来るかどうかとは別物ですので気をつけましょう。
書き込み権限設定の案
あくまでも自分の直感なので賢い方法ではないかもしれませんけど、自分なりにこう設定するのが良いのではないかなって思うところをお話ししてみようと思います。
IIS には "仮想ディレクトリ" というものが設定できます。
それを利用するとサイトに設定されているフォルダとはまた別のフォルダに保存されているデータを公開することが出来るようになるのですけど、それと同時に、その仮想フォルダ内のファイルへアクセスする際の匿名権限を調整することが可能です。
これを利用して、ファイルの読み書きを行いたいフォルダは仮想フォルダとして設定して、その匿名アカウントとして、IIS 標準の匿名アカウントではない別のアカウントを指定してあげれば、少なくとも書き込みが不要なサイトとは区別ができます。
書き込み処理を仮想ディレクトリ内に限定するため、書き込みを行いたいファイルがここに保存されるのは当然のことですけど、同時に書き込み処理を行う ASP ファイルもここへ配置する必要は出てきます。でもそれは、書き込みに関する安全性の配慮を小さな範囲で抑えることにも繋がりますので、こちらの方が頭でも把握しておきやすいのではないかと思います。
なお、ここの外に置いた ASP ファイルは標準の匿名アカウントで実行されるため、このフォルダ内へは書き込むことはできなくなります。また、このフォルダ外からでもフォルダ内の情報を読み取りたい場合には、標準の匿名アカウントでも読み込み可能なように調整しておく必要があります。
また、IIS にて仮想フォルダの匿名権限を調整してはいるのですけど、なぜか、FrontPage Server Extensions のチェック処理を行っても、新たに設定した匿名アカウントに関するアクセス制限は、自動調整はされないようでした。しかも逆に、標準の匿名アカウントに対する読み取り権限は設定されてしまうような感じがしました…。
ですので、不要に自動調整されてしまう心配性も、確かなことは判りませんけど、たぶんないのではないかと思います。
書き込み可能フォルダを登録する
実際に、自分なりの方法で書き込み可能フォルダを登録してみることにします。
まず 「コンピュータの管理」 を開いて、書き込みに使用する匿名アクセス用のアカウントを登録します。
これは便宜上、ローカルシステムに登録してしまうのが良さそうです。そうすることでパスワードをわざわざ覚えておかなくても、匿名アカウントの設定の際に 「IIS によるパスワードの管理を許可する」 にチェックを入れるだけで、そのアカウントを匿名アカウントとして利用することが可能となります。
つづいて、仮想ディレクトリに使用するフォルダを用意します。
これは基本的に、サイトに設定されているフォルダの外側に配置します。そして、先ほど作成した書き込みに使用する匿名アクセスアカウントが書き込めるように、そのフォルダへ書き込み権限を設定します。
また、その仮想ディレクトリのプロパティを参照して、「ディレクトリセキュリティ」 タブの 「匿名アクセスおよび認証コントロール」 の項にて、書き込みに使用する匿名アカウントを指定します。ローカルアカウントを指定した場合には、「IIS によるパスワードの管理を許可する」 にチェックを入れることでパスワードの入力を省略できます。
あとは必要に応じて FrontPage Server Extensions を設定すれば、設定は完了です。
注意事項としては、ファイルの書き込みを行う ASP スクリプトもこのフォルダ内に配置しなくてはならないこと、くらいでしょうか。標準の匿名アカウントに対して読み取り権限さえ与えておけば、書き込んだファイルを読み取ることはできますから、おそらくは問題ないでしょう。
場合によっては、さらに書き込み用フォルダとスクリプト用フォルダとで分けることも出来ると思います。スクリプト用フォルダには書き込みを禁止して、書き込み用フォルダではスクリプトの実行を禁止するようにすれば、より安全になるかとは思います。