Back

♪ パーミッションと掲示板のセキュリティ





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と順にテストしてみるのがいいですね。




この文章のリンク、転載は自由に行って下さい。    1999/09/19  真辺慎 (shin)
                                 2000/07/24  篠崎 愛 (CORRECTOR AI)