1.パーミッションの基本
掲示板を設置するサーバーの大半はUnixで、Unixには全てのfileおよびdirectoryにパーミッションがあります。
当然掲示板の各ファイルにも適切なパーミッションを設定する必用があります。パーミッションの基本は
ファイルの場合
r(4)...読み出しできる
w(2)...書き換えできる
x(1)...実行できるディレクトリの場合
r(4)...ディレクトリ内のファイルを一覧できる(ls)
w(2)...ディレクトリ情報の書き換えができる(内部でのファイルやディレクトリの新規作成、消去)
x(1)...ディレクトリ内のファイルにアクセスできる
また、ファイルから見た利用者はそのファイルの所有者、そのファイルの所有者と同じグループのユーザー、
その他、の3つに分けられます。それぞれに数値を設定するので
所有者 グループ その他 rwx --- rx 4+2+1 0+0+0 4+1 (=705)
記号だとrwx---rx、8進の数値で705のように表記します。正確にはこれだけではないですがここでは割愛します。
2.一般的な掲示板でのパーミッション
さて、一般的な掲示板の例でパーミッションを考えてみましょう。以下のような構成の掲示板があったとします。
[cgi-bin] |--bbs.cgi (掲示板本体) |--bbs.dat (掲示板のデータ記録ファイル) |--jcode.pl(掲示板に読み込んで使う日本語コード変換ライブラリ) | |--[log] (掲示板CGIが自動作成する過去ログファイルを置くディレクトリ)
多くのサーバでは外部からブラウザでアクセスした場合のCGIの実行者は「その他」 になります。
つまり「その他」に対するパーミッションを中心に考えればよい事になります。グループに対しては
全て0でいいし所有者(あなた)に対しては最大の権限を設定していいわけです。
以下が標準的なパーミッションの設定例です。
[cgi-bin] (701) |--bbs.cgi (705) |--bbs.dat (606) |--jcode.pl(604) | |--[log] (707)
3.さまざまな利用者に対するセキュリティ
3−1.外部(WEB)からの利用者に対するセキュリティ
cgi-binが701だとdirectoryの一覧はできませんが個別のfileにはfile nameが判ればアクセスできます。
外部からbbs.datを直接読まれないためには類推されないfile nameに変えるというのが一般的ですが、拡張
子を.cgiか.plにするという方法もあります。サーバの設定でCGIとして認識される拡張子のfileは外部から中味
を見る事はできないので、bbs.datをdata.cgi等にリネームしておくのです。
ちなみにjcode.plのように本体に読み込んで使うfileには実行権限は不要です。よく解説ページで705とかある
のは単独で実行するものかインクルードして使うものか区別できないPerl初心者の設定ミスを無くす配慮だ
と思われます。
3−2.内部からの利用者(?)に対するセキュリティ
PerlにはUnixのシェルコマンドを実行できる関数があります。lsやらcatやら出来るわけですが、パーミッションが
許せばそれは基本的に同一サーバ内のどこに対しても実行できます。つまりCGIを経由すれば他人があなたの
アカウントの606のfileを上書きしたり707のdirectoryにfileをアップロードしたりも出来るわけです。
これに対してはそういうパーミッションのfileやdirectoryを作らない、という以外に対処のしようがありません。
特に何でもできる707のdirectoryは本来作るべきではありません。
例えば過去logfileなどでCGIが自動生成するfileの名前があらかじめ判っている場合は
|--[log] (705) | |--199901.html (606) |--199902.html (606)
のようにあらかじめ書き込み可能なパーミッションのfileを用意しておくことで707のdirectoryを作らないで済みます。
これらのことに留意してパーミッションを設定すると以下のようになります。
[cgi-bin] (701) |--bbs.cgi (705) |--data.cgi (bbs.datをリネーム、606) |--jcode.pl(604) | |--[log] (705) | |--199901.html (606) |--199902.html (606)
ただしこのように注意を払っても「その他」の権限でCGIが動くサーバでは記録ファイルを606にしなければならず、
そこがセキュリティホールになっています。基本的にこういったサーバでは内部からの攻撃は防げないということ
を知っておいて下さい。
4.所有者権限でCGIが動かせるサーバ
virtualavenueやhypermartのように所有者権限でCGIが動かせるサーバの場合は今まで書いてきたセキュリティ上の
問題も解決できます。具体的には以下のようなパーミッション設定が可能です。
[cgi-bin] (701) |--bbs.cgi (700) |--bbs.dat (600) |--jcode.pl(600) | |--[log] (700、外部に公開する場合は701 or 705)
この設定なら外部からも同一サーバ内の他ユーザーからもdatやcgiの中味を隠すことができて安全です。
ただしそういった所でもサーバ側の設定ミスでユーザーの登録情報を記録したfile等にCGI経由でアクセスできる
場合があるので気を付けて。そんなサーバを見つけたらとりあえずlogを保存した後、設定が直るまで寝かせて
様子見をするのがいいですね。らちがあかないようなら管理者にメールで設定ミスを教えてあげましょう。
5.最後に
パーミッションの基本は前述のとおりですが、サーバによっては固有の設定をしている場合もあるのでFAQページ
には必ず目を通すようにしましょう。(たとえば705ではなく755にしないとCGIが動かないサーバもあります)
パーミッションはできる限り低くして運用するのが基本ですので、はじめてのサーバではenvcheckのような簡単な
テストCGIで755→705→700と順にテストしてみるのがいいですね。