前回はソースコードからコンパイルした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のバーチャルホストの設定をしていきます。
コメント