03-03 Apache2.4ソース版の設定

前回はソースコードからコンパイルしたApache2.4をsystemdを使って起動させました。

多くの受講生がこの時点で1000を超えるコマンドをタイプしています。

この講座で紹介したコマンドは20から30くらいでしょうか?

それほど多くはありませんが、皆さんが真剣に受講しているのかが伺えますね!

ログインしてコマンドを打ったり、ファイルを編集したり、コンパイルしたり、2週間前まではこんなことできるなんて想像していましたか?

もう立派なエンジニアですよ。自信を持ってくださいね!

今回は、Apacheのセキュリティ対策と先を見据えたプロ仕様に仕立てていきます。

動画講座 Apache2.4ソース版の設定

Apacheの実行ユーザーの考え方

ps aux | grep httpd

Apacheのプロセスを確認するとdaemonというUserで動いていることが分かります。

root      2652  0.0  0.7 104036  3592 ?        Ss   17:08   0:00 /usr/local/apache/bin/httpd -DFOREGROUND
daemon    2653  0.0  0.4 392948  2412 ?        Sl   17:08   0:00 /usr/local/apache/bin/httpd -DFOREGROUND
daemon    2654  0.0  0.4 392948  2412 ?        Sl   17:08   0:00 /usr/local/apache/bin/httpd -DFOREGROUND
daemon    2655  0.0  0.5 458484  2912 ?        Sl   17:08   0:00 /usr/local/apache/bin/httpd -DFOREGROUND

Apacheのパッケージ版は「apache」というUserで動いていたのを覚えていますか?

ApacheをapacheというUserで動かすことに普通は何の疑問も持たないと思うのですが、WebサーバーはApacheだけではなくnginxなどもあります。

何が言いたいのかというと例えばこの記事、文字はDBに保存され、画像ファイルはアップロードされサーバー内に保存されます。

Webサーバー経由でアップロードされた画像はWebサーバーのUser権限

もしWebサーバーをApacheからnginxに載せ替えたら...

Apacheはapache、nginxはnginxで動かしていると書き込み権限の問題が生じます。

ApacheをapacheというUserで動かすという決まりはないので、無くすことのできる問題はサーバー構築時に潰しておきましょう!

具体的には、www-dataというアカウントを追加します。

Webサーバー専用グループの追加

まずはGID(グループID)を使用されていない49にして、www-dataグループを追加。

sudo groupadd -g 49 www-data

Webサーバー専用アカウントの追加

次にuseraddコマンドでwww-dataアカウントを追加。

sudo useradd -u 49 -g 49 -d /var/www www-data -s /sbin/nologin

結果、このようなメッセージが表示されます。

useradd: 警告: ホームディレクトリが既に存在します。
skel ディレクトリからのコピーは行いません。

ホームディレクトリ(/var/www)が既に存在します。というのはApacheパッケージ版をインストールした時に作られたものです。

またapacheというアカウントも/etc/passwdに残ったままになっています。

追加アカウントの確認

www-dataはシェルに/sbin/nologinを指定しました。

ログインできるシェルではないので、www-dataのパスワードは設定をする必要はありません。

www-dataが追加されたことを確認します。

id www-data

以下のように表示されるはずです。

uid=49(www-data) gid=49(www-data) groups=49(www-data)

httpd.confの編集

それではApacheの設定ファイルが格納されているディレクトにcdしてhttpd.confを編集していきます。

cd /etc/httpd/conf

今回も管理者権限の作業が続くので、sudo suしましょう。

sudo -s

まずは現在のhttpd.confをcpコマンドでバックアップします。

cp -p httpd.conf httpd.conf.YYYYMMDD

YYYYMMDDには西暦を含めた月日、2019年10月3日なら20191003と入力すればいいでしょう。

同じ日に複数のバックアップを取るなら、20191003-01などとして識別します。

vi httpd.conf

ServerRoot

ServerRootは、/usr/local/apache であることを確認します。

MPM(マルチプロセッシングモジュール)

Apache2.4からはeventがデフォルトになっています。

ただし、この講座ではApacheの伝統的な方式、preforkを使います。

httpd.confのmpm_event_moduleをコメントアウトして、mpm_prefork_moduleの行を有効にします。

#LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

preforkはクライアントからリクエストが来ると自分自身をコピーして子プロセスを起動します。

リクエスト後にforkすると待ち時間が発生するので、予めいくつかの子プロセスをforkしておいて待ち時間を無くす方式、これをpreforkと言います。

socache_shmcb_module

SSLのセッションキャッシュを使うために、socache_shmcb_moduleを有効にします。

#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

ext_filter_module

リクエストをレスポンスする際、ボディをクライアントに送る前に外部プログラムで処理することのできるモジュールです。

#LoadModule ext_filter_module modules/mod_ext_filter.so

このモジュールは少し特殊な使い方になるので、有効にしなくても大丈夫です。

deflate_module

コンテンツを圧縮することで転送量を抑えることができるのでレスポンスを高速化することができます。

#LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule ext_filter_module modules/mod_ext_filter.so

別途、設定が必要です。

expires_module

expires_moduleを有効にして設定を行うと、設定したファイルの種類、期間をクライアントのブラウザにキャッシュしてもらうことができます。

そのためにコンテンツを高速に表示できるようになります。

#LoadModule expires_module modules/mod_expires.so
LoadModule expires_module modules/mod_expires.so

別途、設定が必要です。

ssl_module

Apacheを暗号化通信対応させるために必要となるのがssl_module。

最近は常時SSL化をして通信の内容を暗号化することがスタンダードになってきているので有効にします。

#LoadModule ssl_module modules/mod_ssl.so
LoadModule ssl_module modules/mod_ssl.so

cgi_module

PerlなどのようなCGI(Common Gateway Interface)スクリプトを動作させるときに必要。

#LoadModule cgi_module modules/mod_cgi.so
LoadModule cgi_module modules/mod_cgi.so

rewrite_module

rewrite_moduleを有効にしていればURLを書き換えることのできます。

#LoadModule rewrite_module modules/mod_rewrite.so
LoadModule rewrite_module modules/mod_rewrite.so

別の講座で取りあげますが、例えばブラウザから、

https://www.superusers.jp/  にリクエストがあったとき、
https://www.superusers.jp/  にリダイレクトさせたい。

という場合は、rewrite_moduleを有効にしたうえで以下のように記述すれば、ページが暗号化通信されるhttpsにリダイレクトされます。

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

Server-pool

httpd-mpm.confという設定ファイルをIncludeします。

#Include /etc/httpd/conf/extra/httpd-mpm.conf
Include /etc/httpd/conf/extra/httpd-mpm.conf

httpd-mpm.confの設定については、後ほど説明します。

httpd.confの修正箇所

以下、httpd.confの修正サンプルです。

  • - 修正前
  • + 修正後
--- httpd.conf.20191004	2019-10-03 09:47:44.195599358 +0900
+++ httpd.conf	2019-10-07 14:40:13.135068827 +0900
@@ -63,8 +63,8 @@ Listen 80
 # Example:
 # LoadModule foo_module modules/mod_foo.so
 #
-LoadModule mpm_event_module modules/mod_mpm_event.so
-#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
+#LoadModule mpm_event_module modules/mod_mpm_event.so
+LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
 #LoadModule mpm_worker_module modules/mod_mpm_worker.so
 LoadModule authn_file_module modules/mod_authn_file.so
 #LoadModule authn_dbm_module modules/mod_authn_dbm.so
@@ -88,7 +88,7 @@ LoadModule auth_basic_module modules/mod
 #LoadModule cache_module modules/mod_cache.so
 #LoadModule cache_disk_module modules/mod_cache_disk.so
 #LoadModule cache_socache_module modules/mod_cache_socache.so
-#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
+LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
 #LoadModule socache_dbm_module modules/mod_socache_dbm.so
 #LoadModule socache_memcache_module modules/mod_socache_memcache.so
 #LoadModule socache_redis_module modules/mod_socache_redis.so
@@ -109,7 +109,7 @@ LoadModule filter_module modules/mod_fil
 #LoadModule substitute_module modules/mod_substitute.so
 #LoadModule sed_module modules/mod_sed.so
 #LoadModule charset_lite_module modules/mod_charset_lite.so
-#LoadModule deflate_module modules/mod_deflate.so
+LoadModule deflate_module modules/mod_deflate.so
 LoadModule mime_module modules/mod_mime.so
 LoadModule log_config_module modules/mod_log_config.so
 #LoadModule log_debug_module modules/mod_log_debug.so
@@ -117,7 +117,7 @@ LoadModule log_config_module modules/mod
 #LoadModule logio_module modules/mod_logio.so
 LoadModule env_module modules/mod_env.so
 #LoadModule mime_magic_module modules/mod_mime_magic.so
-#LoadModule expires_module modules/mod_expires.so
+LoadModule expires_module modules/mod_expires.so
 LoadModule headers_module modules/mod_headers.so
 #LoadModule usertrack_module modules/mod_usertrack.so
 #LoadModule unique_id_module modules/mod_unique_id.so
@@ -142,7 +142,7 @@ LoadModule version_module modules/mod_ve
 #LoadModule session_dbd_module modules/mod_session_dbd.so
 #LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
 #LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
-#LoadModule ssl_module modules/mod_ssl.so
+LoadModule ssl_module modules/mod_ssl.so
 #LoadModule dialup_module modules/mod_dialup.so
 #LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
 #LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
@@ -161,7 +161,7 @@ LoadModule autoindex_module modules/mod_
 	#LoadModule cgid_module modules/mod_cgid.so
 </IfModule>
 <IfModule mpm_prefork_module>
-	#LoadModule cgi_module modules/mod_cgi.so
+	LoadModule cgi_module modules/mod_cgi.so
 </IfModule>
 #LoadModule dav_fs_module modules/mod_dav_fs.so
 #LoadModule dav_lock_module modules/mod_dav_lock.so
@@ -172,7 +172,7 @@ LoadModule dir_module modules/mod_dir.so
 #LoadModule speling_module modules/mod_speling.so
 #LoadModule userdir_module modules/mod_userdir.so
 LoadModule alias_module modules/mod_alias.so
-#LoadModule rewrite_module modules/mod_rewrite.so
+LoadModule rewrite_module modules/mod_rewrite.so
 LoadModule systemd_module     modules/mod_systemd.so
 
 <IfModule unixd_module>
@@ -184,8 +184,8 @@ LoadModule systemd_module     modules/mo
 # It is usually good practice to create a dedicated user and group for
 # running httpd, as with most system services.
 #
-User daemon
-Group daemon
+User www-data
+Group www-data
 
 </IfModule>
 
@@ -206,7 +206,7 @@ Group daemon
 # e-mailed.  This address appears on some server-generated pages, such
 # as error documents.  e.g. admin@your-domain.com
 #
-ServerAdmin you@example.com
+ServerAdmin webmaster@superusers.jp
 
 #
 # ServerName gives the name and port that the server uses to identify itself.
@@ -239,8 +239,8 @@ ServerName su-camp.superusers.jp:80
 # documents. By default, all requests are taken from this directory, but
 # symbolic links and aliases may be used to point to other locations.
 #
-DocumentRoot "/usr/local/apache/htdocs"
-<Directory "/usr/local/apache/htdocs">
+DocumentRoot "/var/www/html"
+<Directory "/var/www/html">
     #
     # Possible values for the Options directive are "None", "All",
     # or any combination of:
@@ -253,7 +253,7 @@ DocumentRoot "/usr/local/apache/htdocs"
     # http://httpd.apache.org/docs/2.4/mod/core.html#options
     # for more information.
     #
-    Options Indexes FollowSymLinks
+    Options FollowSymLinks
 
     #
     # AllowOverride controls what directives may be placed in .htaccess files.
@@ -291,7 +291,7 @@ DocumentRoot "/usr/local/apache/htdocs"
 # logged here.  If you *do* define an error logfile for a <VirtualHost>
 # container, that host's errors will be logged there and not here.
 #
-ErrorLog "logs/error_log"
+ErrorLog "/var/log/httpd/error.log"
 
 #
 # LogLevel: Control the number of messages logged to the error_log.
@@ -320,13 +320,13 @@ LogLevel warn
     # define per-<VirtualHost> access logfiles, transactions will be
     # logged therein and *not* in this file.
     #
-    CustomLog "logs/access_log" common
+    #CustomLog "logs/access_log" common
 
     #
     # If you prefer a logfile with access, agent, and referer information
     # (Combined Logfile Format) you can use the following directive.
     #
-    #CustomLog "logs/access_log" combined
+    CustomLog "/var/log/httpd/access.log" combined
 </IfModule>
 
 <IfModule alias_module>
@@ -356,7 +356,7 @@ LogLevel warn
     # client.  The same rules about trailing "/" apply to ScriptAlias
     # directives as to Alias.
     #
-    ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
+    #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
 
 </IfModule>
 
@@ -372,7 +372,7 @@ LogLevel warn
 # "/usr/local/apache/cgi-bin" should be changed to whatever your ScriptAliased
 # CGI directory exists, if you have that configured.
 #
-<Directory "/usr/local/apache/cgi-bin">
+<Directory "/var/www/cgi-bin">
     AllowOverride None
     Options None
     Require all granted
@@ -420,7 +420,7 @@ LogLevel warn
     # To use CGI scripts outside of ScriptAliased directories:
     # (You will also need to add "ExecCGI" to the "Options" directive.)
     #
-    #AddHandler cgi-script .cgi
+    AddHandler cgi-script .cgi
 
     # For type maps (negotiated resources):
     #AddHandler type-map var
@@ -480,7 +480,7 @@ LogLevel warn
 # necessary.
 
 # Server-pool management (MPM specific)
-#Include /etc/httpd/conf/extra/httpd-mpm.conf
+Include /etc/httpd/conf/extra/httpd-mpm.conf
 
 # Multi-language error messages
 #Include /etc/httpd/conf/extra/httpd-multilang-errordoc.conf

ApacheのプロセスIDに関する設定

まずは/etc/httpd/conf/extraにcdします。

cd /etc/httpd/conf/extra

今回ソースコードからインストールしたApacheのプロセスIDは、

/usr/local/apache/logs/httpd.pid

に置かれる設定になっています。

LinuxはプロセスIDなどシステムが起動した後の情報を/var/runに格納するという慣習があります。

ApacheのプロセスIDも/var/runの下に指定するためにhttpd-mpm.confを修正します。

httpd-mpm.confの修正

httpd-mpm.conf のバックアップをとります。

cp -p httpd-mpm.conf httpd-mpm.conf.yyyymmdd

コピーした後、httpd-mpm.confに記されているPidFileのパスを修正します。

vi httpd-mpm.conf

Apache2.4系では、12行目前後にPidFileの記述があるので、以下のように修正。

PidFile "logs/httpd.pid"
PidFile "/var/run/httpd.pid"

Apacheのセキュリティ

Apacheのセキュリティに関する設定をします。

設定を入れるファイルはhttpd-default.confなので、バックアップをとってから修正をします。

vi httpd-default.conf

以下の内容をコピーしてhttpd-default.confに追記してください。

# TRACE requests
TraceEnable off

# X-Frame-Options Setting
Header append X-Frame-Options "DENY"

# X-XSS measures
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff

#  HTTPoxy Vulnerability
RequestHeader unset Proxy

# Hide PHP version
Header unset "X-Powered-By"

TRACEメソッドの無効化

TraceEnable off

Apacheは「HTTP TRACEメソッド」という機能がデフォルトで有効になっています。

XSS(クロスサイトスクリプティング)の脆弱性があった場合、Cross-Site Tracing(XST)という攻撃リスクが高まるので「TraceEnable off」を設定。

クロスサイト、クリックジャッキング対策

Header append X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff

Webページのリンクやボタンなどの要素を偽装してクリックを誘い、利用者の意図しない動作をさせようとするクリックジャック攻撃に対する設定。

Proxyヘッダーの無効化

RequestHeader unset Proxy

リクエストに含まれるProxyヘッダーを無効にすることで、リクエスト内の環境変数が悪意ある内容に書き換えられないようにするための設定。

バージョンを非表示

Header unset "X-Powered-By"

Apacheでレスポンスヘッダから"X-Powered-By"を消すための設定。

Apacheの再起動

全ての設定が完了したら、Syntaxチェックを行って問題がなければApacheを再起動しましょう。

service httpd restart

再起動後は、必ずApacheが起動しているかpsコマンドでプロセスを確認します。

Webページの表示とアクセスログを確認

動画の19分26秒から説明しているように、

ブラウザでページの表示確認やApacheのログが意図したファイルに書き込まれているか必ずチェックするようにしてください。

tail -f /var/log/httpd/access.log

Apacheのログローテーション

ここで忘れてはならないのが、ログローテーションの設定です。

ログのローテーションが行われないと、一つのファイル(access.log)にずっとログが蓄積されていきます。

肥大化したログは開くことさえできなくなりますので、Apacheに限らずログローテートされるべきものは設定が入っているか必ず確認しましょう。

/etc/logrotate.d/httpdの設置

vi /etc/logrotate.d/httpd

以下の内容をコピーしてhttpdに貼り付けて保存。

/var/log/httpd/*.log
/var/log/httpd/*/*log
{
	weekly
	missingok
	rotate 52
	compress
	delaycompress
	notifempty
	create 640 root adm
	sharedscripts
	postrotate
		/bin/kill -HUP `/bin/cat /var/run/httpd.pid` 2> /dev/null
	endscript
}

次の講座では、Apacheのバーチャルホストの設定をしていきます。

関連記事

コメント

この記事へのコメントはありません。

おすすめ記事

  1. 【多段SSH】公開鍵認証で中継サーバー経由のログインが簡単!

  2. インターネットに繋いだサーバーで最初にやらなければならない設定

  3. Swapアウトしているプロセスを特定する方法

  4. Linuxを極めるならコマンドよりも〇〇が先だ!!

  5. お名前ドットコムのDNS設定方法