私のメモです。参考になればいいですが、間違っていたらごめんなさい。
--------------------------------------------------------Thanks to Hyper-Estraier
サーバを立ててそろそろ2年になるが、設定を終えてからは停電後の復旧やセキュリティアップデートくらいしか メンテナンスをしてこなかった気がする。今回、検索機能を付けようと思い立ったので、それを機会に ファイルのパーミッション、httpd.confなどの設定を見直すことにした。
woodyでウェブサーバでは、ディレクトリを311、ファイルを440にしていた。 しかし、管理者やユーザは自分しかいないからグループに許可を与える必要はない。 そのため、ディレクトリは100、ファイルは400で十分である。そこで、次のコマンドで変更した。 但し、以下で”ユーザ”とはapacheを実行しているwww-dataユーザのことである。
|
|
|
上は、findの typeオプションにファイル(f)やディレクトリ(d)を指定し、 パイプを使ってxargs に渡すことでchmodを実行している。xargsは、引数に渡されたコマンド(ex. chmod)に対し、パイプで渡された文字を ”引数のコマンド パイプで渡された文列字"(ex. chmod パイプで渡された文字列)というコマンドを生成&実行する便利な コマンドである。
僕のウェブページでは、Perlスクリプトでカウンターを作っている。 Perlスクリプトは実行だけ、カウンタ保持用データファイルは書き込みだけしか行わないが、 共に読み取り属性を付けないとファイルをオープンできない。そのため、Perlスクリプトファイル、 データファイルにはそれぞれ実行、書き込みの他に読み取り属性も付加した。
これまでファイルのアクセス制御を.htaccessファイルで行っていたが、.htaccessファイルを使った アクセス制御は apacheのパフォーマンスを低下させる ようだ。そこで、.htaccessで行っていたアクセス制御をhttpd.confに書き換えることにした。
ユーザ認証に関しては、.htaccessファイルの記述がhttpd.confファイルの記述とほぼ等しい。
その違いは、httpd.confでは<Directory>と</Directory>ディレクティブ(指令)で
.htaccessの記述を括るところである。
一方、ファイルのアクセス制御は、FilesやFilesMatchディレクティブを用いる。
但し、ファイル名や拡張子の指定は、<Files>の<>内で行い、ディレクティブ間には
制御順序などを記述する。
例えば、plスクリプトファイル(*.pl)やデータファイル(*.dat)をhttpでアクセス
できないようにするには次のように記述する。
<FilesMatch "\.(pl|dat)$">
Order allow,deny
Deny from all
</FilesMatch>
正規表現でのピリオドは”何か1文字”を指すワイルドカードになるため、拡張子の区切り文字としての ピリオドの前にはエスケープシークケンス\を記述する。また()内で文字を|で区切ることにより ”又は”の意味を持つ。その際、()を使った後には$を記述するらしい (理由を探しましたが見つからない。無くてもちゃんと機能するようですが・・・)。
上の記述ではワイルドカード*が記述されてないが、””内の文字の前後に自動的に適用される。 そのため、例えばtest.datとtest.dataというファイルがあると、共に*.dat*にマッチするのでtest.dataまで アクセス拒否されるので注意を要する。
<FilesMatch>〜</FilesMatch>ディレクティブ間に記述されたOrderは許可(allow)と拒否(deny)の 順序を示す。上の設定では、先にallowが評価され、allow fromでの限定が無いため全てを許可するが、 次に評価されるdenyでは全てを拒絶しているので、結果として全てのアクセスが拒否される。 ここに特定のIPアドレス(例えば192.168.0.など)を記述することで、細かい制御が可能である。
上と同じ設定を<Files>〜</Files>ディレクティブでも行うことが可能である。 その違いは、FilesMatchディレクティブは、正規表現で記述するのに対し、 Filesディレクティブで正義表現を使用する際はそれを記す記号が必要があることだけである。 具体的には次のように記述する。
<Files ~ "\.(pl|dat)$">
Order allow,deny
Deny from all
</Files>
~が正規表現の使用を表す文字である。これが無いと、構文エラーとなって <Files>〜</Files>ディレクティブは無視されてしまう。また、ウェブを 検索すると、"^\.(pl|dat)$"と記述しているのを見かけるが、 ^を入れるのは間違いのようである(^を入れると設定が有効にならない。 構文エラーとみなされているようだ)。
Filesディレクティブ、FilesMatchディレクティブとも、Directoryディレクティブの中に入れて 使うことも可能である。Directoryディレクティブで適用するディレクトリを限定すれば、 そのディレクトリ以下にだけファイルのアクセス制限を設けることができる。 例えば、/var/www/html/friendにユーザ認証を掛け、そのディレクトリにある Perlスクリプトファイル(count.pl)を隠したい場合は下のようになる。
<Directory /var/www/html/friend>
AuthUserFile /etc/apache/.htpasswd
AuthName "My Friend Room"
AuthType Basic
require valid-user
order deny,allow
deny from all
allow from .bbtec.net
<FilesMatch "\.pl">
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
検索機能はCGIで行うため、Hyper-Estraierを設定するだけでなく、httpd.confでCGIを 使えるようにしなくてはならない。 そこで、まずhttpd.confを編集する。とは言え、普通は以下の行が コメントアウトされているので、#を外すだけで済む。
|
|
|
次にHyper-Estraierをインストールして設定する。 その方法はHyper-Estraierの イントロダクションのページに記述されたやり方そのものである。 僕の環境では、Hyper-Estraierの他に、 QDBm、 Zlibも 必要であった。以下、それらのtarballをダウンロードした後の手順を示す。
|
|
|
以上でインストールは終了である。もしHyper-Estraierをアンインストールしたいならば、 tarballを展開したディレクトリでmake uninstallを行えば良い。
次にコンフィグファイルを編集し、検索用インデックスを作成する。 コンフィグファイル(estseek.conf)をエディタで開き、次の箇所を修正する。
|
|
|
上の編集を終えたら、好みでテンプレート(estseek.tmpl)やトップページ(estseek.top)も編集する。 もちろん、estseek.confでtmplfileとtopファイルに自前のものを用いても良い。 編集が終えたら、estseek.cgiのパーミッションを100に、テンプレートなどは400に変更し、 ユーザ、グループをwww-dataに変更する。
|
|
最後に、検索用インデックスを下のコマンドで作成する。 その際、estseek.confのindexnameに指定したディレクトリに検索用インデックスを作成しなくてはならない。
|
|
|
面倒なことに、estcmdには指定したディレクトリ以下を除外するオプションが無い(ファイル単位ならばある)。 そのため、例えば/var/www/html/friendがユーザ認証を要するページの場合は、後から逐一friend配下のファイルを 除外することになってしまう。 これが面倒なので、僕はシェルスクリプトにインデックスに加えるディレクトリだけを指定して estcmdコマンドを羅列して対処している。はやくディレクトリを指定して除外できるオプションが付かないものか・・・。
トップページのHTMLファイルに以下の行を追加することで検索機能が使えるようになる。 これは、estseek.tmplに記述されてる検索文字列入力部を抜き取りって修正を加えたもので、 太字部を自分の環境に合わせたものである。 (サイズも適宜変更したが、これを直さなくても検索可能なので説明は割愛)
|
|
この記述で重要なのは、3行目のhidden属性のinputである。トップページの文字コードを前述のvalueで 指定することによって、estseek.cgiに引数として渡される。この行が無いと、estseek.cgiに渡される 文字はUTF-8とみなされ、トップページをUTF-8以外で記述している場合は文字化けして検索できない。 3行目の1文を入れておくことで、送られる文字列にenc=Shift_JISも送られ、 Shift_JISで書かれたトップページからも正しく検索できるようになる。