たぶん難しくないApache2・初期設定編その1~お触りはダメよ!~ [Linux(Apache)]
httpd.confの設定に入る前に、最初に大切な用語の意味を整理しておく。
「サーバルート」(ServerRoot)とは、Apacheが使用するさまざまなファイルが保存されているディレクトリツリーの「てっぺん」を意味する。httpd.confの中等で、相対パスで記述することがあるが、その時はこの「サーバルート」を基点にしてのパス指定になっていることに注意すべし。
たとえば、先の『最小のhttpd.conf』の中にあった、「PidFile run/httpd.pid」という記述。これはサーバルートと組み合わせることで、実際には /etc/httpd/run/httpd.pid というフルパス名になるのである。
「ドキュメントルート」(DocumentRoot)とは、実際に外部に公開するhtmlファイルとか画像ファイルとかのドキュメントデータを保存しているディレクトリの「てっぺん」を意味する。
たとえば、ドキュメントルートが /var/www/html に指定されているとして、 http://server/index.html というファイルをアクセスしてきた場合、実際に提供されるファイルは原則的に /var/www/html/index.html ということになるし、 http://server/directoryA/page.html だったとしたら、実際に提供されるファイルは原則的に /var/www/html/directoryA/page.html ということになる。
ちなみに、いちいち「原則的に」と強調しているのは、この原則論はあとから曲げることができるからであ~る。
「ディレクティブ」という言葉が出てくることとなる。これは、それぞれの「設定項目(設定名)」のことを言っていると思ってもらってよいと思う。(厳密には違う…といわれるのだけども)たとえば、サーバルートを指定する部分は「ServerRootディレクティブ」というし、Apacheが接続を待ち受けるポート番号を指定する部分は「Listenディレクティブ」ということとなる。
ざっくりと用語の説明をしたところで、いよいよhttpd.confの内容に入る。
設定項目として記述したい内容としては、
防御のための指定
便利に使うための指定
その他の指定
と、おおざっぱに3種類に分かれると思う。
まずは、「防御のための指定」を先の『最小のhttpd.conf』に書き足していこうと思う。
『Webサーバを公開する』といっても、そこには当然見せてもよいファイルと見せたくないファイルとが存在する。Webコンテンツデータは前者だろうし、サーバの設定ファイルなどは後者だろう。あるいは、特定の人には見せてもよいが、その他の人には見せたくないファイルもあるだろう。関係者・関係部門だけがアクセスできるWebコンテンツとか。そういった、アクセスの許可・不許可の設定が特に重要になるのだが、そんなのはお構いなしに、とにかく見せたくないファイル(ディレクトリ)について、一様に防御してしまう設定をまずは導入しようと思う。
①まず、サーバ全体を一旦「とにかく全部アクセス禁止!」にしてしまう。
ドキュメントルートの中に公開したいWebコンテンツデータを保存するのだが、裏を返せばドキュメントルートの”外”は公開したくないということになろうか。そのため、
全体を不許可
↓
でもドキュメントルートの下だけは許可
という形でガードすることとなる。
『全体』を不許可 ということだが、ドキュメントルート(ここでは/var/www/html)は許可ということなので、『全体』とはサーバのファイルシステムの「てっぺん」を指定する。つまり…
「/」
これが『全体』を意味することになる。ルートディレクトリに対する指定を記述するディレクティブは、「<Directory>」ディレクティブを用いる。これは「</Directory>」とセットで用い、この2つのディレクティブで囲まれた範囲内が、その指定されたディレクトリと、サブディレクトリに対して影響を及ぼすこととなる。
<Directory (指定したいディレクトリ)>
「指定したいディレクトリ」に及ぼしたい設定内容
:
:
</Directory>
こんな具合。
で、今回活躍する、「アクセス許可」「アクセス不許可」を指定するディレクティブは
Allow from
Deny from
前者が「許可」。後者が「不許可」を指定する。
fromに続けて単独のIPアドレス、IPアドレスの範囲、単独のドメイン名、ドメイン名の一部などを記述します。
また、IPアドレスなどの代わりに「All」を記述すると、「全部」を指定したこととなります。つまり、「Allow from All」ならば「どこからのアクセスもすべて許可」だし、「Deny from All」なら「どこからのアクセスすべて不許可」ということに。
ルートディレクトリに対するアクセス制御は「全部不許可」なので、
<Directory />
Deny from All
</Directory>
という記述をすればよいことがわかると思う。なお、同一のディレクトリに対してDenyとAllowと両方を組み合わせてアクセス制御をする場合には、「Order」ディレクティブの指定が重要になってくるが、どちらか片方しか記述しないのであれば、とりあえずOrderディレクティブについては意識しなくてもさしたる問題になることはないはず。
気になるようなら、
<Directory />
Order Allow,Deny
Deny from All
</Directory>
とでもしておけばよいだろう。
②続いて、ドキュメントルート配下を「アクセス許可」にする。
ルートディレクトリからアクセス禁止にしたままでは、ドキュメントルートまでアクセス禁止の状態になってしまいWebサーバとして用を成さないので、ドキュメントルートの下はアクセスを明示的に許可しなければならなくなる。
ドキュメントルート、すなわち /var/www/html の下にあるファイル、サブディレクトリは許可ということなので、
<Directory /var/www/html>
Allow from All
</Directory>
という記述を行う。
で、問題になるのはコレを記述する位置。くれぐれも、「<Directory />」ディレクティブの中に入れ子にしてしまわないように!ドキュメントルートに対するアクセス許可は、ルートディレクトリに対するアクセス不許可の指定の外側に記述する。つまりこんな感じ。
<Directory />
Order Allow,Deny
Deny from All
</Directory>
<Directory /var/www/html>
Allow from All
</Directory>
これで、ルートディレクトリ配下は全部アクセス禁止だが、ドキュメントルートだけは許可という状態にできる。
さて。これでドキュメントルートの中にある公開したいファイルだけをアクセス許可にする設定ができた…と思いたいところだが、残念なことにまだリスクが残っている。
今はまだ使わないし意識していないが、「.htaccess」というファイルの存在がある。このファイルは、本来httpd.confの中で指定すべき設定項目を、ディレクトリ単位で設定を外出し出来るもので、多くの場合はアクセス認証の設定とか、CGIの動作とか、部分的にアクセス制御を変更したりするために用いられる。
ドキュメントルートの中で動作の細かな変更を行うので、普通はドキュメントルートの中に置かれるのであるが、一般的には公開したくないファイルなのである。
ドキュメントルートは公開する → でも、.htaccessは公開したくない
難儀な存在である…。
そこで、今度はファイル単位のアクセス制御を行う必要が生じる。(さっきはディレクトリ単位であった)用いるディレクティブは「<Files>」である。ちなみにこれも「</Files>」とペアで用いる。
.htaccessをアクセス禁止にする場合は
<Files .htaccess>
Order Allow,Deny
Deny from All
</Files>
と、なるのであるが、一般的によく用いられる指定方法としては
<Files ~ "\.ht">
Order Allow,Deny
Deny from All
</Files>
という方式。正規表現を用いて、「.htナントカ」というファイルはアクセス禁止よ! という指定にしている。(これは後で登場する、Basic認証のパスワードを記述したファイルもまとめてアクセス禁止にしたい場合などを想定しているのだと思う)
ちなみに、このFilesディレクティブも、Directoryディレクティブと同様に入れ子にせず、並べて記述するように。
そんな訳で、今回とりあえずhttpd.confに追加したい指定はざっと以下のとおりとなる。
<Directory />
Order Allow,Deny
Deny from All
</Directory>
<Directory /var/www/html>
Allow from All
</Directory>
<Files ~ "\.ht">
Order Allow,Deny
Deny from All
</Files>
まずは全体的にアクセス禁止!!
↓
でもドキュメントルートの下はアクセス許可
↓
ただし「.htナントカ」はどこにあってもアクセス禁止!!
という指定が行われることが理解できるだろうか。
さっそくこの記述を、前回紹介した『最小のhttpd.conf』に追記してみよう。
ちなみに、httpd.confを記述したら書式などをチェックする方法があるので、忘れずに使うようにしたい。方法は、「apachectl -t」だ。記述ミスなどがあればだいたいはこれで事前にチェックできる。(文法的なチェックしかしてないようなので、すべてのミスがコレでチェックできるわけではない)
と、エラーになった。「Order」ディレクティブを処理できるモジュールが足りないと言っている。
実は、今回追加した、Allow、Deny、Orderディレクティブを正しく処理させるためには、Apacheの基本機能(coreモジュール)だけでなく、ソレ用のモジュールを別途読み込むように仕向ける必要があるのであった。
登場するのは「mod_authz_host」というモジュール。
Apacheは数多くの機能を持っているのだが、それは「モジュール」という形で提供されている。不要な機能を「全部入り」という形で実現しようとするとメモリを馬鹿食いするなど、弊害も大きいので、本当に基本的な機能だけをApache本体(httpd本体)に組み込み、その他の機能の大半はモジュールで提供している。
今回のアクセス制御の機能も、「その他の機能」としてモジュールで提供されているのであった。
というわけで、httpd.confに、「mod_authz_hostを読み込みなさい」という指定も必要になるのであった…
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_default_module modules/mod_authz_default.so
具体的には、この2行。実は、最初の1行だけでもよかったりするのだが、後々2行目が絡んできたりするので、今はこの2行を書き加えておくことをオススメする。
これを書き加えたら、再度apachectl -tを実行してみよう。
Apacheを起動するところまでやっている。
これでドキュメントルートにあるコンテンツデータを安全に公開できる状態になっている。
お好みに応じてファイルを置くとかしてアクセスして試してみて欲しい。
次のアーティクルでは、現状、微妙に不便なところを直す設定を入れてみることにする。
「サーバルート」(ServerRoot)とは、Apacheが使用するさまざまなファイルが保存されているディレクトリツリーの「てっぺん」を意味する。httpd.confの中等で、相対パスで記述することがあるが、その時はこの「サーバルート」を基点にしてのパス指定になっていることに注意すべし。
たとえば、先の『最小のhttpd.conf』の中にあった、「PidFile run/httpd.pid」という記述。これはサーバルートと組み合わせることで、実際には /etc/httpd/run/httpd.pid というフルパス名になるのである。
「ドキュメントルート」(DocumentRoot)とは、実際に外部に公開するhtmlファイルとか画像ファイルとかのドキュメントデータを保存しているディレクトリの「てっぺん」を意味する。
たとえば、ドキュメントルートが /var/www/html に指定されているとして、 http://server/index.html というファイルをアクセスしてきた場合、実際に提供されるファイルは原則的に /var/www/html/index.html ということになるし、 http://server/directoryA/page.html だったとしたら、実際に提供されるファイルは原則的に /var/www/html/directoryA/page.html ということになる。
ちなみに、いちいち「原則的に」と強調しているのは、この原則論はあとから曲げることができるからであ~る。
「ディレクティブ」という言葉が出てくることとなる。これは、それぞれの「設定項目(設定名)」のことを言っていると思ってもらってよいと思う。(厳密には違う…といわれるのだけども)たとえば、サーバルートを指定する部分は「ServerRootディレクティブ」というし、Apacheが接続を待ち受けるポート番号を指定する部分は「Listenディレクティブ」ということとなる。
ざっくりと用語の説明をしたところで、いよいよhttpd.confの内容に入る。
設定項目として記述したい内容としては、
防御のための指定
便利に使うための指定
その他の指定
と、おおざっぱに3種類に分かれると思う。
まずは、「防御のための指定」を先の『最小のhttpd.conf』に書き足していこうと思う。
『Webサーバを公開する』といっても、そこには当然見せてもよいファイルと見せたくないファイルとが存在する。Webコンテンツデータは前者だろうし、サーバの設定ファイルなどは後者だろう。あるいは、特定の人には見せてもよいが、その他の人には見せたくないファイルもあるだろう。関係者・関係部門だけがアクセスできるWebコンテンツとか。そういった、アクセスの許可・不許可の設定が特に重要になるのだが、そんなのはお構いなしに、とにかく見せたくないファイル(ディレクトリ)について、一様に防御してしまう設定をまずは導入しようと思う。
①まず、サーバ全体を一旦「とにかく全部アクセス禁止!」にしてしまう。
ドキュメントルートの中に公開したいWebコンテンツデータを保存するのだが、裏を返せばドキュメントルートの”外”は公開したくないということになろうか。そのため、
全体を不許可
↓
でもドキュメントルートの下だけは許可
という形でガードすることとなる。
『全体』を不許可 ということだが、ドキュメントルート(ここでは/var/www/html)は許可ということなので、『全体』とはサーバのファイルシステムの「てっぺん」を指定する。つまり…
「/」
これが『全体』を意味することになる。ルートディレクトリに対する指定を記述するディレクティブは、「<Directory>」ディレクティブを用いる。これは「</Directory>」とセットで用い、この2つのディレクティブで囲まれた範囲内が、その指定されたディレクトリと、サブディレクトリに対して影響を及ぼすこととなる。
<Directory (指定したいディレクトリ)>
「指定したいディレクトリ」に及ぼしたい設定内容
:
:
</Directory>
こんな具合。
で、今回活躍する、「アクセス許可」「アクセス不許可」を指定するディレクティブは
Allow from
Deny from
前者が「許可」。後者が「不許可」を指定する。
fromに続けて単独のIPアドレス、IPアドレスの範囲、単独のドメイン名、ドメイン名の一部などを記述します。
また、IPアドレスなどの代わりに「All」を記述すると、「全部」を指定したこととなります。つまり、「Allow from All」ならば「どこからのアクセスもすべて許可」だし、「Deny from All」なら「どこからのアクセスすべて不許可」ということに。
ルートディレクトリに対するアクセス制御は「全部不許可」なので、
<Directory />
Deny from All
</Directory>
という記述をすればよいことがわかると思う。なお、同一のディレクトリに対してDenyとAllowと両方を組み合わせてアクセス制御をする場合には、「Order」ディレクティブの指定が重要になってくるが、どちらか片方しか記述しないのであれば、とりあえずOrderディレクティブについては意識しなくてもさしたる問題になることはないはず。
気になるようなら、
<Directory />
Order Allow,Deny
Deny from All
</Directory>
とでもしておけばよいだろう。
②続いて、ドキュメントルート配下を「アクセス許可」にする。
ルートディレクトリからアクセス禁止にしたままでは、ドキュメントルートまでアクセス禁止の状態になってしまいWebサーバとして用を成さないので、ドキュメントルートの下はアクセスを明示的に許可しなければならなくなる。
ドキュメントルート、すなわち /var/www/html の下にあるファイル、サブディレクトリは許可ということなので、
<Directory /var/www/html>
Allow from All
</Directory>
という記述を行う。
で、問題になるのはコレを記述する位置。くれぐれも、「<Directory />」ディレクティブの中に入れ子にしてしまわないように!ドキュメントルートに対するアクセス許可は、ルートディレクトリに対するアクセス不許可の指定の外側に記述する。つまりこんな感じ。
<Directory />
Order Allow,Deny
Deny from All
</Directory>
<Directory /var/www/html>
Allow from All
</Directory>
これで、ルートディレクトリ配下は全部アクセス禁止だが、ドキュメントルートだけは許可という状態にできる。
さて。これでドキュメントルートの中にある公開したいファイルだけをアクセス許可にする設定ができた…と思いたいところだが、残念なことにまだリスクが残っている。
今はまだ使わないし意識していないが、「.htaccess」というファイルの存在がある。このファイルは、本来httpd.confの中で指定すべき設定項目を、ディレクトリ単位で設定を外出し出来るもので、多くの場合はアクセス認証の設定とか、CGIの動作とか、部分的にアクセス制御を変更したりするために用いられる。
ドキュメントルートの中で動作の細かな変更を行うので、普通はドキュメントルートの中に置かれるのであるが、一般的には公開したくないファイルなのである。
ドキュメントルートは公開する → でも、.htaccessは公開したくない
難儀な存在である…。
そこで、今度はファイル単位のアクセス制御を行う必要が生じる。(さっきはディレクトリ単位であった)用いるディレクティブは「<Files>」である。ちなみにこれも「</Files>」とペアで用いる。
.htaccessをアクセス禁止にする場合は
<Files .htaccess>
Order Allow,Deny
Deny from All
</Files>
と、なるのであるが、一般的によく用いられる指定方法としては
<Files ~ "\.ht">
Order Allow,Deny
Deny from All
</Files>
という方式。正規表現を用いて、「.htナントカ」というファイルはアクセス禁止よ! という指定にしている。(これは後で登場する、Basic認証のパスワードを記述したファイルもまとめてアクセス禁止にしたい場合などを想定しているのだと思う)
ちなみに、このFilesディレクティブも、Directoryディレクティブと同様に入れ子にせず、並べて記述するように。
そんな訳で、今回とりあえずhttpd.confに追加したい指定はざっと以下のとおりとなる。
<Directory />
Order Allow,Deny
Deny from All
</Directory>
<Directory /var/www/html>
Allow from All
</Directory>
<Files ~ "\.ht">
Order Allow,Deny
Deny from All
</Files>
まずは全体的にアクセス禁止!!
↓
でもドキュメントルートの下はアクセス許可
↓
ただし「.htナントカ」はどこにあってもアクセス禁止!!
という指定が行われることが理解できるだろうか。
さっそくこの記述を、前回紹介した『最小のhttpd.conf』に追記してみよう。
[root@kagami conf]# cat httpd.conf ServerRoot "/etc/httpd" PidFile run/httpd.pid Listen 80 User apache Group apache ServerName kagami.hiiragi.com:80 DocumentRoot "/var/www/html" <Directory /> Order Allow,Deny Deny from All </Directory> <Directory /var/www/html> Allow from All </Directory> <Files ~ "\.ht"> Order Allow,Deny Deny from All </Files>
ちなみに、httpd.confを記述したら書式などをチェックする方法があるので、忘れずに使うようにしたい。方法は、「apachectl -t」だ。記述ミスなどがあればだいたいはこれで事前にチェックできる。(文法的なチェックしかしてないようなので、すべてのミスがコレでチェックできるわけではない)
[root@kagami conf]# apachectl -t Syntax error on line 11 of /etc/httpd/conf/httpd.conf: Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration
と、エラーになった。「Order」ディレクティブを処理できるモジュールが足りないと言っている。
実は、今回追加した、Allow、Deny、Orderディレクティブを正しく処理させるためには、Apacheの基本機能(coreモジュール)だけでなく、ソレ用のモジュールを別途読み込むように仕向ける必要があるのであった。
登場するのは「mod_authz_host」というモジュール。
Apacheは数多くの機能を持っているのだが、それは「モジュール」という形で提供されている。不要な機能を「全部入り」という形で実現しようとするとメモリを馬鹿食いするなど、弊害も大きいので、本当に基本的な機能だけをApache本体(httpd本体)に組み込み、その他の機能の大半はモジュールで提供している。
今回のアクセス制御の機能も、「その他の機能」としてモジュールで提供されているのであった。
というわけで、httpd.confに、「mod_authz_hostを読み込みなさい」という指定も必要になるのであった…
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_default_module modules/mod_authz_default.so
具体的には、この2行。実は、最初の1行だけでもよかったりするのだが、後々2行目が絡んできたりするので、今はこの2行を書き加えておくことをオススメする。
これを書き加えたら、再度apachectl -tを実行してみよう。
[root@kagami conf]# apachectl -t Syntax OK [root@kagami conf]# service httpd start httpd を起動中: [ OK ] [root@kagami conf]# ps -ef | fgrep httpd root 1804 1 0 18:29 ? 00:00:00 /usr/sbin/httpd apache 1805 1804 0 18:29 ? 00:00:00 /usr/sbin/httpd apache 1806 1804 0 18:29 ? 00:00:00 /usr/sbin/httpd apache 1807 1804 0 18:29 ? 00:00:00 /usr/sbin/httpd apache 1808 1804 0 18:29 ? 00:00:00 /usr/sbin/httpd apache 1809 1804 0 18:29 ? 00:00:00 /usr/sbin/httpd root 1812 1377 0 18:29 pts/0 00:00:00 fgrep httpd
Apacheを起動するところまでやっている。
これでドキュメントルートにあるコンテンツデータを安全に公開できる状態になっている。
お好みに応じてファイルを置くとかしてアクセスして試してみて欲しい。
次のアーティクルでは、現状、微妙に不便なところを直す設定を入れてみることにする。
2009-11-20 15:44
nice!(0)
コメント(0)
トラックバック(0)
コメント 0