XREAで使う.htaccessを作る

XREAのFreeプランでサーバを借りた後行うべき.htaccess設定について考えた。

利用開始直後のディレクトリ構成

Webサーバで公開されるDocumentRootである${HOME}/public_html以下について。
デフォルトではアクセスログがanalogとして有効になっているので下記の通りのはず。

./public_html/.fast-cgi-bin/php.cgi
                            php.fcgi
                            php.ini
                            php4.cgi
                            php5.cgi
                            php5.fcgi
                            php5.ini
                            ...
                            php72.cgi
                            php72.fcgi
                            php72.ini
              index.html
              log/.htaccess
                  .htpasswd
                  analog.1.html
                  ...
                  analog.5.html
                  analog.html
                  images/analog.gif
                         analog.png
                         ...
              ${アカウントID}.shop/
./log/YYYY-MM-DD.log
      ${アカウントID}.${XREAサーバ番号}.xrea.com.log

DocuemntRoot(./public_html)には主には4つ。また.htaccessはない。

  1. .fast-cgi-binフォルダとその配下のPHP CGI用実行ファイル+設定ファイル
  2. Webページアクセスログ関連ファイル一式
  3. 公開ドキュメントindex.html
  4. サイト設定で指定した、デフォルト以外のDocumentRoot

このうち4つ目の「デフォルト以外のDocumentRoot」(${アカウントID}.shop/)については今回は設定しない想定なのでFTPクライアントで接続しrmdirし削除しておく。

また、DocumentRoot/logはanalogやAWStats用、~/logは生ログ用なので、無効化していれば生成されない。
管理コンソールのサイト設定にある「アクセスログ解析 analog」より解析ログを保存しないに、生ログを保存するに変更する。
また、必要に応じてすでに生成済みのログ(DocumentRoot/log/*.html)をFTPクライアントで接続し削除しておく。

.htaccessの設定を考える前に、.htaccessの設定ルール

Apacheの.htaccess設定ルールのおさらい。

アクセス制限方法(Directory/Location)

ApacheであるURLに対するアクセス制限をかける方法には大きく分けて2つ、ファイルシステム(Direcotry/Files)でやる方法とURL(Location)で書ける方法がある。
そしてまた、それらを正規表現を使わず指定する方法と正規表現を用いて指定する方法がある。
Apacheにはこれらの評価順序や適用範囲が定められている。
https://httpd.apache.org/docs/2.4/ja/sections.html

上記に警告されているように、使い分けは以下のように行う。

  • ファイルシステム上のオブジェクトに対するアクセスを制限したい場合:DirectoryやFilesを使う
    • 他のVirtualHostやAliasで設定されている場合には迂回されてしまう可能性あり
    • 大小小文字を区別しないファイルシステム上でサーブされていたら回避される(Apacheの設定ファイル上は大小区別する)
    • ただし、シンボリックリンクは回避できないので別途Optionsでシンボリックリンクの振る舞いを決めること
  • ファイルシステムに依存しないもの(Apacheのモジュール呼び出しなど)はLocationを使う
  • これら制限のマージの順番は以下の順番で行われる
    1. Directory(正規表現なし)と.htaccessを同時に
    2. DirectoryMacthとDirectory(正規表現あり)を同時に
    3. FilesとFilesMatchを同時に
    4. LocationとLocationMatchを同時に

なので、基本的にDirectoryでやりつつ、個別にはFilesで対応する。
Locationを使うのはApacheのモジュールを呼び出すときのみ使う。
複数一括で指定する場合のみ正規表現とし、特に重要な(優先して適用されるべき)制限については個別にファイルパスを正規表現なしで指定する。

.htaccess内で記載できる設定について

基本的な設定方針は上記の通りだが、でも.htaccessで利用できるディレクティブには制限がある。
具体的にはリファレンスページにあるコンテキスト欄に.htaccessと書いていないものは利用できない。
https://httpd.apache.org/docs/2.4/ja/mod/core.html

そのためDirectory(DirectoryMatch)やLocationはできず今回は改めて以下の方針で設定を行うことになる。

  1. .ht(access|passwd|digest)のアクセス制御をDocumentRootの.htaccessで行う。
  2. Filesでアクセス制限をするが、これは配下のディレクトリ含めて有効になってしまうので、制限したい最小限のディレクトリの.htaccessで設定する。

.ht(access|passwd|digest)のアクセス制御

たぶんこんな感じ。

<Files ~ "^\.ht(access|passwd|digest)$">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

.fast-cgi-binフォルダ以下

このフォルダの中には3つの種類のファイルがある。

  • php*.cgi CGI版PHPで指定する実行ファイル
    #!/bin/sh
    exec /usr/local/bin/php
    
  • php*.fcgi FastCGI版PHPで指定する実行ファイル
    #!/bin/bash
    PHPRC="php.ini"
    PHP_FCGI_CHILDREN=1
    PHP_FCGI_MAX_REQUESTS=10000
    export PHPRC
    export PHP_FCGI_CHILDREN
    export PHP_FCGI_MAX_REQUESTS
    exec /usr/local/bin/php
    
  • php*.ini PHP設定ファイル
    cgi.force_redirect = 0;
    date.timezone = Asia/Tokyo
    ...
    

これらのファイルには直接リクエストすることはないので、アクセス禁止をしておく。

# 理想、でも実際には不可
#<Directory /virtual/${アカウントID}/public_html/.fast-cgi-bin>
#    Order allow,deny
#    Deny from all
#    AllowOverride None
#</Directory>

# 実際にはこちらの内容で行う
<Files ~ "^php[0-9]*\.(f?cgi|ini)$">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

Webアクセスログファイル一式

analogやAWStatsは今は使わない想定だが、XREAレンタルサーバの機能としてこれらを操作する/される可能性があるので、ディレクトリ等は残して閲覧制限しておく。

/public_html/log/.htaccess
                 .htdigest
                 images/*.png
                        *.gif

認証を設け管理者しか閲覧できなくする。
また、デフォルトではBasic認証だが、Digest認証に切り替える。

<Files ~ "^.+$">
    AuthType Digest
    AuthName "analog for ${アカウントID}.${XREAサーバ番号}.xrea.com"
    AuthUserFile "/virtual/${アカウントID}/public_html/log/.htdigest"
    AuthGroupFile "/dev/null"
    Require valid-user
    Order allow,deny
    Deny from all
</Files>

Digest認証用のパスワードファイル(.htdigest)はLinuxで以下のコマンドで生成する。

# 適宜修正
_passwordFile="./htdigest"
_realm="analog for ${アカウントID}.${XREAサーバ番号}.xrea.com"
_user="siteadmin"

# 生成
htdigest "${_passwordFile}" "${_realm}" "${_user}"

上記で生成した.htaccessおよび.htdigestをpublic_html/log/にFTPクライアントを使ってアップロードする。

以上。

補足:HTTPメソッドを制限しておく

上記でファイルへのアクセスを制限したが、ついでにHTTPメソッドを制限しておく。
CGIの作り方にもよるが、でも基本的にGETとPOSTしか使わないので/public_html/.htaccessにLimitExceptをつけておく。
全文はこちら:

<Files ~ "^\.ht(access|passwd|digest)$">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

<LimitExcept GET POST>
    Order allow,deny
    Deny from all
    Satisfy all
</LimitExcept>

これで許可されていないメソッドを実施すると、サーバからHTTP 405が返されるようになる。

[user@localhost ~]$ telnet ${アカウントID}.${XREAサーバ番号}.xrea.com 80
Trying xx.yy.zz.ww...
Connected to ${アカウントID}.${XREAサーバ番号}.xrea.com.
Escape character is '^]'.
PUT /index.html HTTP/1.1
Host: ${アカウントID}.${XREAサーバ番号}.xrea.com

HTTP/1.1 405 Method Not Allowed
Date: Wed, 10 Oct 2018 08:43:23 GMT
Server: Apache
Allow: GET,POST,OPTIONS,HEAD,TRACE
Content-Length: 231
Content-Type: text/html; charset=iso-8859-1

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です