Web Liberty

セキュリティの向上について

CGIプログラムのセキュリティを上げる方法について紹介します。プログラムを使い続ける場合、すべて対応しておくことをおすすめします。

パスワードを長く複雑なものに変更する

パスワードは 1234test のように単純なものは絶対に避けてください。ある程度長く複雑な英数字の混在をお勧めします。

また、パスワードは定期的に変更されることをお勧めします。

CGIファイルの名前変更方法

CGIファイルの名前を変更することで、ロボットによる不正投稿を防いだり、ファイル名を省略してCGIにアクセスしたりする事ができます。CGIファイルの名前は、FTPソフトで名前を変更するだけでは正しく機能しません。設定ファイルも編集する必要があります。

Professional版の場合

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ソフトで各ファイル名も変更してください。

Professional版以外の場合

各ログファイル名の設定は 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ソフトで各ファイル名も変更してください。

ログファイルの名前変更方法

ログファイル名やディレクトリ名を変更することで、ファイルに直接アクセスされることを防ぐ方法です。

Professional版の場合

各ログファイル名の設定は 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 には暗号化された管理者パスワードが保存されていますので、ファイル名の変更を強くお勧めします。

Professional版以外の場合

各ログファイル名の設定は 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への対応

suEXECとは

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に対応しているかどうかは、サーバーのサポートページなどを調べてください。

Professional版の場合

各CGIファイルを設置する前に、lib/webliberty/App/Init.pm の「初期設定」にある

suexec_mode => 0,

この部分を以下のように設定します。

suexec_mode => 1,

この状態でセットアップを行うと、suEXECに適したパーミッション設定を自動的に行います。すでにセットアップしている場合、上の設定を行ったうえで、FTPソフトから各ファイルのパーミッションを変更してください。

また、diary.cgi など、セットアップ前にFTPソフトでパーミッション設定を行うファイルは、手動でsuEXEC用のパーミッションに設定しておいてください。

なお、./data/user.log には暗号化された管理者パスワードが保存されていますので、パーミッションの変更(600 に設定)を強くお勧めします。

Professional版以外の場合

普通にプログラムを設定&設置した後、パーミッションの設定をsuEXEC用に行ってください。

例えば、diary.cgi705 ではなく 700 に設定するなどします。

掲示板で投稿者名を記憶したり、管理者ページへのログイン状態を保持するため、Cookieを使用しているプログラムがあります。これらでCookie情報を扱う際、暗号化して扱うことができます。これにより、万一XSSなどでCookie情報を盗まれても、パスワードやユーザー情報が直ちに知られることは無くなります。
(ただし、この作業で安全性が絶対になるわけではありません。必要な作業が終わればすぐに管理者ページからログアウトし、管理者パスワードも定期的に変更するのが理想的です。)

暗号化には、トリプルDESと呼ばれるアルゴリズムを使用します。これは鍵となる文字列を元に情報を暗号化し、同一の鍵が無ければ復元できなくする、可逆式の秘密鍵型暗号方式です。

鍵となる文字列はどこかで入力を求めたりするものでは無いので、覚えやすい文字列にする必要はありません。また、この文字列は一旦設定したら、変更しないことをお勧めします。(変更前に扱ったCookieは読み出せなくなります。ですが、本体の動作に問題はありません。)

以下で、Cookie情報を暗号化する具体的な手順を紹介します。なお、この暗号化はサーバーによっては正しく実行できないことがあるようです。「この機能を使用したら、管理ページにログインできなくなった」という場合、この機能はOFFにしておいてください。

Professional版の場合

lib/webliberty/App/Init.pm の「初期設定」にある

des_key => '',

この部分に、半角24文字までの任意の文字列を指定します。具体的には、以下のように設定します。

des_key => 'KA9QFeZ6EzQDpZYYM3lcR8MX',

設定しておくと、この文字列を鍵としてCookie情報を暗号化して扱います。

また、lib/webliberty/App/Init.pm のパーミッションは 600 など、ブラウザから直接アクセスできない値に設定しておきます。

Professional版以外の場合

init.cgi の「Cookieの設定」にある

#トリプルDES暗号キー
$init->{des_key} = '';

この部分に、半角24文字までの任意の文字列を指定します。具体的には、以下のように設定します。

#トリプルDES暗号キー
$init->{des_key} = 'KA9QFeZ6EzQDpZYYM3lcR8MX';

設定しておくと、この文字列を鍵としてCookie情報を暗号化して扱います。

また、Cookieを使用しないプログラムには、上の設定項目はありません。