* 業務でpukiwikiを使うときの設定メモ [#l243f9fe]

- ページ: [[BugTrack2]]
- 投稿者: [[pai]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: その他
- 投稿日: 2007-09-07 (金) 19:57:31
- バージョン: 

** メッセージ [#h085c114]
会社でpukiwikiを使う場合に、注意する点をまとめてみました。[[BugTrack2]]にふさわしくなければ対応をお願いします。
--------
#contents

** 概要 [#u80ff553]

会社でクローズドなwikiを使用する場合、アクセス数は多くないかわりに、安全性が重要になります。以下のような項目を設定することで、安全性を高めることがでます。

*** インターネット上で利用する場合 [#p9cc7642]

会社の公開サーバ上で、関係者専用のwikiを動かすことを想定しています。おすすめの設定は以下の通りです。

- 重要: [[HTTPサーバでのアクセス制御>./#x11971d0]] 信頼できるIPアドレスのみ、アクセスを許可します。それができない場合は、パスワードを利用します。
- 重要: [[HTTPサーバでのログ>./#l59ba467]] 問題が発生したときの解析用に、ログを取ります。
- 重要: [[バックアップ機能>./#gb8189d3]] すべての変更が残るようにします。
- 重要: [[タイムスタンプ変更の強制>./#w9f3c58f]] 変更が明示されるようにします。
- 重要: [[Referer>./#v9b8de19]] 外部のサイトにページ名などが渡らないようにします。
- 重要: [[暗号化>./#aa1b0e15]] パケットを盗み見られないように暗号化した方がよいでしょう。
- 重要: [[システムのバックアップ>./#kcf21e5b]] 重要度に応じてバックアップポリシーを決めてください。
- [[HTTPサーバでのユーザー>./#dcc63fb4]] 社外に公開されるサーバは、管理者しかログインできないことが多いと思うので、その場合はファイルのアクセス権は重視しなくてもよいでしょう。
- [[その他>./#u07548d8]] 使わない機能は切っておきます。

アクセス制御についてですが、TCPはUDPとは異なり、パケットが往復できないと通信が開始できません。このため、インターネットのようにIPアドレスがきちんと管理されているネットワークであれば、不正なソースIPによる偽装攻撃をしようとしても攻撃者にパケットが返らず通信が開始できないので、アドレスの偽装は非常に困難と考えられます(UDPは単方向なので、たとえばDNSサーバへの攻撃にIPを偽装したパケットが利用されることがあります)。したがって、信頼できるIPアドレスからのアクセスのみ許可することは、攻撃防止に有効と考えられます。

> ただし暗号化されていないと、パケットを盗み見られる危険があります。

一方、IPアドレスによる制限ができない場合は、仮にパスワードが破られた場合に、世界中からのアクセスを許すことになります。細かいアクセス制限をかけていない限り、誰か一人の不注意で全体が危険にさらされることになりますので、(wikiに限ったことではありませんが)重要度の高いデータを扱う場合にはそれなりの対策を取る必要がでてきます。

*** イントラネット上で利用する場合 [#u382ff9c]

会社の社内LAN上で、wikiのサーバを動かすことを想定しています。おすすめの設定は以下の通りです。

- 重要: [[HTTPサーバでのログ>./#l59ba467]] 問題が発生したときの解析用に、ログを取ります。
- 重要: [[バックアップ機能>./#gb8189d3]] すべての変更が残るようにします。
- 重要: [[タイムスタンプ変更の強制>./#w9f3c58f]] 変更が明示されるようにします。
- 重要: [[Referer>./#v9b8de19]] 外部のサイトにページ名などが渡らないようにします。
- 重要: [[システムのバックアップ>./#kcf21e5b]] 重要度に応じてバックアップポリシーを決めてください。
- [[HTTPサーバでのアクセス制御>./#x11971d0]] 関係者しかアクセスできない環境であれば、アクセス制御はしなくても構わないでしょう。
- [[HTTPサーバでのユーザー>./#dcc63fb4]] サーバに多数の人がログインできる場合は、ユーザーをわけることを検討してください。
- [[暗号化>./#aa1b0e15]] パスワードなどを入れないのであれば、なくても構わないでしょう。
- [[その他>./#u07548d8]] 使わない機能は切っておきます。

イントラネット(社内LAN)では、マネジメントスイッチなどを利用していない限り、IPアドレスの偽装が可能なケースが多いと思います(管理外のPCをネットワークにつないで利用できる環境であれば、IPアドレスは信頼できないと考えたほうが安全です)。しかしアクセスできる人は全員信頼できると考えてよい場合は、特に対策が不要な場合も多いと思います。

** HTTPサーバでのアクセス制御 [#x11971d0]

アクセス元を特定のアドレスに制限したり、basic認証でパスワードを要求したりするのは、セキュリティ上有効です。特にIPアドレスによるフィルタリングは偽装が困難なので、いくつかある関連会社のゲートウェイのアドレスからのみアクセスできるようにするような対策は有効でしょう。

> basic認証ではパスワードがそのまま流れますので、SSLを併用して暗号化するのが望ましいでしょう。

設定方法ですが、サーチエンジンで「.htaccess」を検索すると、多数のサイトが見つかります。ここではapacheのドキュメントを紹介するにとどめます。

- http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order
- http://httpd.apache.org/docs/2.2/howto/auth.html

また、PCを会社でセットアップして配布しているような場合には、クライアント証明書をあらかじめPCにインストールしておき認証に使う方法も有効です(証明書を他のPCにコピーされないように保護しておく必要があります)。クライアント証明書は、SSL通信のときにサーバがクライアントに要求するもので、あらかじめサーバに登録しておいた証明書を持っていないクライアントは、通信をおこなうことができません。

** HTTPサーバでのログ [#l59ba467]

pukiwikiの履歴(バックアップ機能)にあるタイムスタンプとHTTPサーバのアクセスログを照合することで、ある更新がどのIPアドレスからおこなわれたかを調べることができます。basic認証を使用している場合、認証に使用されたユーザー名も知ることができます。ログのタイプをcombinedにするとよいと思います。

また、webalizerなどでログを解析すると、活発さや異常をグラフィカルに見ることができます。

なお設定によっては、SSL通信のログは別のファイルに出力されますので、注意してください。

** HTTPサーバでのユーザー [#dcc63fb4]

pukiwikiはPHPスクリプトであり、一般的にはapacheなどHTTPサーバの権限でファイルの読み書きをおこないます。しかし複数の人でHTTPサーバを共用している場合、関係ない人でもPHPスクリプトを書けばwikiのファイルにアクセスできてしまいます(これはサーバ上のファイルのアクセス権の問題であり、前述のパスワード認証とは別の問題です)。

これを避けるには、以下のような方法を組み合わせるのが有効です(HTTPサーバがapacheの場合)。&br;要点は、wikiのファイルにアクセスするためのユーザーを作り、apacheからCGIを起動するときにそのユーザーの権限で実行するというものです。これにより、wiki用のユーザー以外からのアクセスを禁止することができ、他のスクリプトからのファイルアクセスもできなくなります。この仕組みはsuexecと呼ばれています。
//残念ながら筆者の手元ではまだうまくいっていませんので、もっとよい方法をご存知の方がいれば更新をお願いします。

- pukiwikiをアクセスするためのユーザー(実行ユーザー)を作る(ここではwikidとする)
- 実行ユーザーのホームディレクトリ(public_htmlなど)にpukiwikiを置く
-- データファイルは実行ユーザーのみが読み書き可能とする
-- PHPファイルはインストールしたユーザーが書き込み可能、実行ユーザーは読み込みのみ可能とする
- index.phpをCGIとして実行するように設定する(以下の節を参照)
//-- index.phpの先頭に、以下の行を追加する(phpのパスに変更すること)
// #! /usr/bin/php
//-- index.phpを、実行ユーザーが実行可能とする
//-- .htaccessなどを利用して、.phpをCGIとして実行するように設定する
- apacheのsuexec機構を有効にする(パッケージからインストールしている場合、すでに有効になっていることがあります)
//- apacheの設定で、wikiへのパス名が実行ユーザーのホームディレクトリのpukiwikiに置換されるようにする
- ~wikid/public_html/cgi-bin/php-cgi を用意しておく(ownerを実行ユーザーにする)。

これで、 http://somedomain.com/~wikid/pukiwiki/index.php でwikiにアクセスできるようになります。

- php.iniのdoc_root等は設定しないこと。
- OptionsでExecCGIが指定できるようにAllowOverrideを設定しておくこと。

なお、apacheからPHPをCGIで起動した場合は、モジュールで起動した場合とは異なり、PHP内部でのBASIC認証がおこなえません(PHP_AUTH_USERなどが渡りません)。apacheでのBASIC認証は可能です。参照: http://www.php.net/manual/ja/features.http-auth.php

*** httpd.conf [#d249505b]

 <Directory "/home/*/public_html/*/cgi-bin">
     AllowOverride None
     Order allow,deny
     Allow from all
     Options ExecCGI
     SetHandler cgi-script
 </Directory>

*** .htaccess [#f4f0cab7]

 Options +ExecCGI
 RemoveType .php
 Addhandler php-cgi .php
 Action php-cgi /~wikid/public_html/cgi-bin/php-cgi

** バックアップ機能 [#gb8189d3]

すべての変更履歴を残したい場合は、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

** タイムスタンプ変更の強制 [#w9f3c58f]

更新が明示されるようにするには「タイムスタンプを更新しない」オプションを無効化する必要があります。

 /////////////////////////////////////////////////
 // Allow to use 'Do not change timestamp' checkbox
 // (0:Disable, 1:For everyone,  2:Only for the administrator)
 $notimeupdate = 1;
↓
 $notimeupdate = 0;

** Referer [#v9b8de19]

外部リンクをクリックしたときにRefererが流出しないようにするには、以下を参照してください。

- [[BugTrack2/247]]

** 暗号化 [#aa1b0e15]

SSLを強制したい場合は、pukiwiki.ini.phpの先頭(<?phpの次の行)に以下を追加してください。URLは適宜変更してください(未テストです)。

 if (SERVER_PORT != 443) {header("Location: https://nohost.nodomain/wiki/");die();}

SERVER_PORTは、init.phpで定数化されています。

** システムのバックアップ [#kcf21e5b]

wikiのベースディレクトリ全体を圧縮してCD-Rなどに焼いてしまうのが簡単だと思います。wiki/以下だけだと、履歴や添付ファイルなどが残りません。

サーバ設定などがwiki上に書いてある場合は、サーバ障害時に見れなくならないよう、wgetなどでHTML版を作り、一緒にCD-Rなどに焼いておくとよいと思います。

- http://blog.crm.co.jp/2006/08/wiki.html Wikiのバックアップ

** その他 [#u07548d8]

使わない機能があれば切っておきます。

 /////////////////////////////////////////////////
 // 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]]の修正を元に戻しておきます。

** コメント [#c128bdd8]
- 叩き台ですので、どんどん書き加えてください。 -- [[pai]] &new{2007-09-07 (金) 20:35:37};
- いま見付けたのですが「ちょっと便利に」の方が適切だったかも知れません -- [[pai]] &new{2007-09-08 (土) 15:24:49};
- readme やヘルプをよりよくするため、という意図だと思うので(個人的には)かまわないと思います。&br;類似品として負荷対策ネタは[[BugTrack/763]]にまとめがありますけど、この手の((セキュリティや安全対策のネタ))まとめページってもうありましたっけ? --  &new{2007-09-08 (土) 16:39:43};
- suexec関係を更新しました。 -- [[pai]] &new{2007-10-12 (金) 20:04:33};
- わかりにくい表現を修正して、インターネットとイントラネットにわけたクイックリファレンスを追記しました。自ページ内のアンカーへのリンクは[ [エイリアス>#アンカー名]]ではできないようです。 -- [[pai]] &new{2007-10-28 (日) 23:57:42};
-- %%そのかわり、%% 相対表記で自ページを指せば飛べます。&br;例えば、&#91;&#91;タイムスタンプ変更の強制>./#w9f3c58f&#93;&#93; とこのページに書けば、このページの[[タイムスタンプ変更の強制>./#w9f3c58f]]に飛べます。&br;絶対表記だと長くなるページにはこちらの方がいいかと。 --  &new{2007-10-29 (月) 00:35:57};
-- ありがとうございます。[[PukiWiki/1.4/添付文書/FormattingRules#u1026558]]によると、「カレントページのアンカーへリンクを貼る場合はページ名を省略することができます」とあったので、省略できるものと考えていました。 -- [[pai]] &new{2007-10-29 (月) 23:37:08};
-- [[test>#w9f3c58f]] ←「タイムスタンプ変更の強制」へ飛べます。 --  &new{2007-10-30 (火) 00:10:45};
-- もしかしたら、プレビュー表示だとリンク先に飛べないので、勘違いしたのかも知れません。あとで確認します。お騒がせしました。 -- [[pai]] &new{2007-10-31 (水) 22:35:14};
- キャッシュの無効化に関する記述を追加しました。 -- [[pai]] &new{2009-02-25 (水) 17:21:58};

#comment

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.045 sec.

OSDN