CGIプログラムのセキュリティを上げる方法について紹介します。プログラムを使い続ける場合、すべて対応しておくことをおすすめします。
パスワードは 1234
や test
のように単純なものは絶対に避けてください。ある程度長く複雑な英数字の混在をお勧めします。
また、パスワードは定期的に変更されることをお勧めします。
CGIファイルの名前を変更することで、ロボットによる不正投稿を防いだり、ファイル名を省略してCGIにアクセスしたりする事ができます。CGIファイルの名前は、FTPソフトで名前を変更するだけでは正しく機能しません。設定ファイルも編集する必要があります。
CGIファイル名の設定は lib/webliberty/App/Init.pm
の「初期設定」の部分にあります。Web Diary Pro の場合、
script_file => './diary.cgi',
tb_file => './diary-tb.cgi',
paint_file => './diary-paint.cgi',
という項目が並んでいる箇所がありますが、これらがCGIファイル名の設定です。例えば
script_file => './diary.cgi',
この設定項目を
script_file => './index.cgi',
このように変更すると、CGIファイルの名前が diary.cgi
から index.cgi
に変わります。設定変更後、FTPソフトで各ファイル名も変更してください。
各ログファイル名の設定は init.cgi
の「システムの設定」の部分にあります。Web Diary の場合、
#日記帳プログラム
$init->{script_file} = './diary.cgi';
という項目がありますが、これらがCGIファイル名の設定です。例えば
$init->{script_file} = './diary.cgi';
この設定項目を
$init->{script_file} = './index.cgi';
このように変更すると、CGIファイルの名前が diary.cgi
から index.cgi
に変わります。設定変更後、FTPソフトで各ファイル名も変更してください。
ログファイル名やディレクトリ名を変更することで、ファイルに直接アクセスされることを防ぐ方法です。
各ログファイル名の設定は lib/webliberty/App/Init.pm
の「初期設定」の部分にあります。Web Diary Pro の場合、
#ログファイル
data_dir => './data/',
data_config => './data/init.cgi',
data_user => './data/user.log',
という項目が並んでいる箇所がありますが、これらがログファイル名などの設定です。例えば
data_field => './data/field.log',
この設定項目を
data_field => './data/diary_field.dat',
このように変更すると、分類情報が保存されるファイルの名前が field.log
から diary_field.dat
に変わります。同じ要領で、ディレクトリ名も変更することができます。(初期状態では、データファイルはすべて data
ディレクトリに保存されます。)
設定を変更してからセットアップするとそのファイル名でデータファイルが作成されますが、セットアップ後に変更した場合、FTPソフトで各ファイル名も変更してください。
なお、./data/user.log
には暗号化された管理者パスワードが保存されていますので、ファイル名の変更を強くお勧めします。
各ログファイル名の設定は init.cgi
の「システムの設定」の部分にあります。Web Diary の場合、
#ログファイル
$init->{log_file} = './diary.log';
#アップロードファイル保存ディレクトリ
$init->{upfile_dir} = './upfile/';
#過去ログ保存ディレクトリ
$init->{past_dir} = './past/';
#過去ログの拡張子
$init->{past_ext} = 'log';
という項目が並んでいる箇所がありますが、これらがログファイル名などの設定です。例えば
$init->{log_file} = './diary.log';
この設定項目を
$init->{log_file} = './article.dat';
このように変更すると、記事が保存されるファイルの名前が diary.log
から article.dat
に変わります。同じ要領で、アップロードファイル保存ディレクトリ名なども変更することができます。
設定を変更した場合、FTPソフトで各ファイル名も変更してください。
各配布プログラムには lib
フォルダ内に拡張子が .pm
のファイルがありますが、これらは各プログラムで共通して利用しているモジュールです。また、Professional 版では共通モジュール以外も lib
フォルダ内に格納しています。
ほとんどのサーバーでは、これらのモジュールに直接アクセスすると内容を読むことができます。ですがプログラム内部の情報を知られる事は好ましくないため、モジュールへの直接アクセスを禁止しておくとより安全です。
直接アクセスを禁止する方法はいくつかありますが、パーミッションを変更する事で容易に対処する事ができます。これらはCGIプログラムから読み込むことができれば大丈夫なファイルなので、パーミッションを 600
に設定しておくとOKです。
プログラムを設置したフォルダもしくはその上位フォルダに .htaccess
ファイルを作成し、以下の記述を行っておくと有効です。拡張子が log
のファイルに不正アクセスさせないように設定できます。
<Files ~ "\.log$">
deny from all
</Files>
時々 .htaccess
ファイルの使用が許可されていないサーバがありますが、その場合この方法は利用できません。
suEXECとは、CGIプログラムを所有者の権限で起動し、ファイルの読み書きなどをその所有者の権限で行う仕組みのことです。本来CGIプログラムは nobody 権限で実行されるのですが、それに比べてセキュリティが高くなります。
suEXECがあると具体的に何が変わるかというと、パーミッションの値を低く設定することができます。
例えば、ログファイルのパーミッションは通常 606
に設定します。これにより、「所有者」と「その他」に対して書き込み権限が与えられます。ですが「その他」にはブラウザからのアクセスも含まれるため、ログファイルのURLに直接アクセスされるとファイルがダウンロードされてしまいます。
ですがsuEXECなら所有者の権限で動作するため、「その他」に対して権限を与えなくても動作するようになります。具体的には、600
というパーミッションでログファイルを扱うことができます。
suEXECに対応していない場合と対応している場合の、パーミッションの設定方法は以下のようになります。
ファイルの種類 | suEXEC非対応 | suEXEC対応 |
---|---|---|
CGIプログラム | 705(または755) | 700(または701) |
ログファイル | 606(または666) | 600 |
ライブラリ・モジュール | 604(または644) | 600 |
ファイル作成用ディレクトリ | 707(または777) | 700(または701) |
以下で、suEXECに対応させる具体的な手順を紹介します。なお、利用してるサーバーがsuEXECに対応しているかどうかは、サーバーのサポートページなどを調べてください。
各CGIファイルを設置する前に、lib/webliberty/App/Init.pm
の「初期設定」にある
suexec_mode => 0,
この部分を以下のように設定します。
suexec_mode => 1,
この状態でセットアップを行うと、suEXECに適したパーミッション設定を自動的に行います。すでにセットアップしている場合、上の設定を行ったうえで、FTPソフトから各ファイルのパーミッションを変更してください。
また、diary.cgi
など、セットアップ前にFTPソフトでパーミッション設定を行うファイルは、手動でsuEXEC用のパーミッションに設定しておいてください。
なお、./data/user.log
には暗号化された管理者パスワードが保存されていますので、パーミッションの変更(600
に設定)を強くお勧めします。
普通にプログラムを設定&設置した後、パーミッションの設定をsuEXEC用に行ってください。
例えば、diary.cgi
は 705
ではなく 700
に設定するなどします。
掲示板で投稿者名を記憶したり、管理者ページへのログイン状態を保持するため、Cookieを使用しているプログラムがあります。これらでCookie情報を扱う際、暗号化して扱うことができます。これにより、万一XSSなどでCookie情報を盗まれても、パスワードやユーザー情報が直ちに知られることは無くなります。
(ただし、この作業で安全性が絶対になるわけではありません。必要な作業が終わればすぐに管理者ページからログアウトし、管理者パスワードも定期的に変更するのが理想的です。)
暗号化には、トリプルDESと呼ばれるアルゴリズムを使用します。これは鍵となる文字列を元に情報を暗号化し、同一の鍵が無ければ復元できなくする、可逆式の秘密鍵型暗号方式です。
鍵となる文字列はどこかで入力を求めたりするものでは無いので、覚えやすい文字列にする必要はありません。また、この文字列は一旦設定したら、変更しないことをお勧めします。(変更前に扱ったCookieは読み出せなくなります。ですが、本体の動作に問題はありません。)
以下で、Cookie情報を暗号化する具体的な手順を紹介します。なお、この暗号化はサーバーによっては正しく実行できないことがあるようです。「この機能を使用したら、管理ページにログインできなくなった」という場合、この機能はOFFにしておいてください。
lib/webliberty/App/Init.pm
の「初期設定」にある
des_key => '',
この部分に、半角24文字までの任意の文字列を指定します。具体的には、以下のように設定します。
des_key => 'KA9QFeZ6EzQDpZYYM3lcR8MX',
設定しておくと、この文字列を鍵としてCookie情報を暗号化して扱います。
また、lib/webliberty/App/Init.pm
のパーミッションは 600
など、ブラウザから直接アクセスできない値に設定しておきます。
init.cgi
の「Cookieの設定」にある
#トリプルDES暗号キー
$init->{des_key} = '';
この部分に、半角24文字までの任意の文字列を指定します。具体的には、以下のように設定します。
#トリプルDES暗号キー
$init->{des_key} = 'KA9QFeZ6EzQDpZYYM3lcR8MX';
設定しておくと、この文字列を鍵としてCookie情報を暗号化して扱います。
また、Cookieを使用しないプログラムには、上の設定項目はありません。