会社でpukiwikiを使う場合に、注意する点をまとめてみました。BugTrack2にふさわしくなければ対応をお願いします。
会社でクローズドなwikiを使用する場合、アクセス数は多くないかわりに、安全性が重要になります。以下のような項目を設定することで、安全性を高めることがでます。
会社の公開サーバ上で、関係者専用のwikiを動かすことを想定しています。おすすめの設定は以下の通りです。
アクセス制御についてですが、TCPはUDPとは異なり、パケットが往復できないと通信が開始できません。このため、インターネットのようにIPアドレスがきちんと管理されているネットワークであれば、不正なソースIPによる偽装攻撃をしようとしても攻撃者にパケットが返らず通信が開始できないので、アドレスの偽装は非常に困難と考えられます(UDPは単方向なので、たとえばDNSサーバへの攻撃にIPを偽装したパケットが利用されることがあります)。したがって、信頼できるIPアドレスからのアクセスのみ許可することは、攻撃防止に有効と考えられます。
ただし暗号化されていないと、パケットを盗み見られる危険があります。
一方、IPアドレスによる制限ができない場合は、仮にパスワードが破られた場合に、世界中からのアクセスを許すことになります。細かいアクセス制限をかけていない限り、誰か一人の不注意で全体が危険にさらされることになりますので、(wikiに限ったことではありませんが)重要度の高いデータを扱う場合にはそれなりの対策を取る必要がでてきます。
会社の社内LAN上で、wikiのサーバを動かすことを想定しています。おすすめの設定は以下の通りです。
イントラネット(社内LAN)では、マネジメントスイッチなどを利用していない限り、IPアドレスの偽装が可能なケースが多いと思います(管理外のPCをネットワークにつないで利用できる環境であれば、IPアドレスは信頼できないと考えたほうが安全です)。しかしアクセスできる人は全員信頼できると考えてよい場合は、特に対策が不要な場合も多いと思います。
アクセス元を特定のアドレスに制限したり、basic認証でパスワードを要求したりするのは、セキュリティ上有効です。特にIPアドレスによるフィルタリングは偽装が困難なので、いくつかある関連会社のゲートウェイのアドレスからのみアクセスできるようにするような対策は有効でしょう。
basic認証ではパスワードがそのまま流れますので、SSLを併用して暗号化するのが望ましいでしょう。
設定方法ですが、サーチエンジンで「.htaccess」を検索すると、多数のサイトが見つかります。ここではapacheのドキュメントを紹介するにとどめます。
また、PCを会社でセットアップして配布しているような場合には、クライアント証明書をあらかじめPCにインストールしておき認証に使う方法も有効です(証明書を他のPCにコピーされないように保護しておく必要があります)。クライアント証明書は、SSL通信のときにサーバがクライアントに要求するもので、あらかじめサーバに登録しておいた証明書を持っていないクライアントは、通信をおこなうことができません。
pukiwikiの履歴(バックアップ機能)にあるタイムスタンプとHTTPサーバのアクセスログを照合することで、ある更新がどのIPアドレスからおこなわれたかを調べることができます。basic認証を使用している場合、認証に使用されたユーザー名も知ることができます。ログのタイプをcombinedにするとよいと思います。
また、webalizerなどでログを解析すると、活発さや異常をグラフィカルに見ることができます。
なお設定によっては、SSL通信のログは別のファイルに出力されますので、注意してください。
pukiwikiはPHPスクリプトであり、一般的にはapacheなどHTTPサーバの権限でファイルの読み書きをおこないます。しかし複数の人でHTTPサーバを共用している場合、関係ない人でもPHPスクリプトを書けばwikiのファイルにアクセスできてしまいます(これはサーバ上のファイルのアクセス権の問題であり、前述のパスワード認証とは別の問題です)。
これを避けるには、以下のような方法を組み合わせるのが有効です(HTTPサーバがapacheの場合)。
要点は、wikiのファイルにアクセスするためのユーザーを作り、apacheからCGIを起動するときにそのユーザーの権限で実行するというものです。これにより、wiki用のユーザー以外からのアクセスを禁止することができ、他のスクリプトからのファイルアクセスもできなくなります。この仕組みはsuexecと呼ばれています。
これで、 http://somedomain.com/~wikid/pukiwiki/index.php でwikiにアクセスできるようになります。
なお、apacheからPHPをCGIで起動した場合は、モジュールで起動した場合とは異なり、PHP内部でのBASIC認証がおこなえません(PHP_AUTH_USERなどが渡りません)。apacheでのBASIC認証は可能です。参照: http://www.php.net/manual/ja/features.http-auth.php
<Directory "/home/*/public_html/*/cgi-bin"> AllowOverride None Order allow,deny Allow from all Options ExecCGI SetHandler cgi-script </Directory>
Options +ExecCGI RemoveType .php Addhandler php-cgi .php Action php-cgi /~wikid/public_html/cgi-bin/php-cgi
すべての変更履歴を残したい場合は、pukiwiki.ini.phpの設定を変更する必要があります。
///////////////////////////////////////////////// // Backup related settings // Enable backup $do_backup = 1; // When a page had been removed, remove its backup too? $del_backup = 0; // Bacukp interval and generation $cycle = 3; // Wait N hours between backup (0 = no wait) $maxage = 120; // Stock latest N backups
↓
$cycle = 0; // Wait N hours between backup (0 = no wait) $maxage = 300; // Stock latest N backups
更新が明示されるようにするには「タイムスタンプを更新しない」オプションを無効化する必要があります。
///////////////////////////////////////////////// // Allow to use 'Do not change timestamp' checkbox // (0:Disable, 1:For everyone, 2:Only for the administrator) $notimeupdate = 1;
↓
$notimeupdate = 0;
外部リンクをクリックしたときにRefererが流出しないようにするには、以下を参照してください。
SSLを強制したい場合は、pukiwiki.ini.phpの先頭(<?phpの次の行)に以下を追加してください。URLは適宜変更してください(未テストです)。
if (SERVER_PORT != 443) { header("Location: https://nohost.nodomain/wiki/"); die(); }
SERVER_PORTは、init.phpで定数化されています。
wikiのベースディレクトリ全体を圧縮してCD-Rなどに焼いてしまうのが簡単だと思います。wiki/以下だけだと、履歴や添付ファイルなどが残りません。
サーバ設定などがwiki上に書いてある場合は、サーバ障害時に見れなくならないよう、wgetなどでHTML版を作り、一緒にCD-Rなどに焼いておくとよいと思います。
使わない機能があれば切っておきます。
///////////////////////////////////////////////// // Enable Freeze / Unfreeze feature $function_freeze = 1;
↓
$function_freeze = 0;
// PKWK_SAFE_MODE - Prohibits some unsafe(but compatible) functions if (! defined('PKWK_SAFE_MODE')) define('PKWK_SAFE_MODE', 0);
↓
define('PKWK_SAFE_MODE', 1);
キャッシュ制御により、「戻る」でフォームが失われるのを避けたい場合は、BugTrack/413の修正を元に戻しておきます。