Apache2.4に設定しておきたい設定項目


はじめに

個人的によく設定する項目をまとめました。
Apache/2.4.38をソースインストールした状態での設定値を確認しています。
そのため、デフォルト値などyumでのインストールした環境と違うところがあるかも。

基本設定

インストールしたらとりあえず確認/変更しておきたい設定項目。

Listen

Apacheのリッスンポートを指定する。
デフォルトの80番と443番をリッスンさせておく。Firewallやiptables側でも空けておくのを忘れないように。

httpd.conf
Listen 80
Listen 443

ServerAdmin

連絡先用メールアドレスの設定。
エラーページを表示する際に、問い合わせ先となるメールアドレスを設定する。
大体、いつも設定しないのでコメントアウト。デフォルトは有効になっていたはず。

httpd.conf
#ServerAdmin [email protected]

ServerName

サーバ自身のホスト名(ドメイン名)を指定する。
デフォルトはコメントアウトだけど、設定していないと構文チェックで警告を出してくる。
検証環境など、とりあえずの設定でいい場合はローカルホストをそのまま設定する。

httpd.conf
#ServerName www.example.com:80
ServerName localhost

DocumentRoot

ルートディレクトリを指定する。
Webコンテンツを置く場所。特に理由がなければデフォルトのままで設定する。

httpd.conf
DocumentRoot "/var/www/htdocs"

Log

ログの確認は検証でも運用でもとても大事なので、最低でもログの格納先は確認しておく。

Errorlog

エラーログの格納先をわかりやすいように「/var/log」配下に変更する。

httpd.conf
#ErrorLog "logs/error_log"
ErrorLog "/var/log/httpd/error_log"

AccessLog

ログフォーマットの変更と格納先変更する。
※log_config_moduleのロードが必要。

httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#CustomLog "logs/access_log" common
CustomLog "/var/log/httpd/access_log" combined

combinedのログフォーマット

接続元ホスト名 クライアントの識別子 認証ユーザ名 時刻 リクエスト内容 レスポンスステータスコード レスポンスのバイト数 ユーザエージェント

DirectoryIndex

ディレクトリにファイル指定無しのアクセスがあった場合に、どのファイルを表示するかを設定する。
デフォルトはindex.htmlのみ。PHPなどを使用する場合はindex.phpも指定する。
※「dir_module」のロードが必要。

httpd.conf
   #DirectoryIndex index.html
   DirectoryIndex index.php index.html

mime

html形式のファイル内でPHPの実行を有効にする場合は設定する。
※mime_moduleのロードが必要。

httpd.conf
AddType application/x-httpd-php .php

詳細設定

外部公開を前提としたり、セキュリティ面などを考慮して設定しておきたい項目。

Directory

指定したディレクトリ配下に対してアクセス制限などを個別に細かく設定できる。
Document Rootを変更した場合は、そのDocument Rootに対するDirectory設定を忘れないように。

httpd.conf
<Directory "/var/www/htdocs">

</Directory

Options

ディレクトリに対してのオプションを設定する。

Indexs

セキュリティ面を考慮して、ディレクトリリスティングを無効化する。
無効化するにはOptionsからIndexsを削除する。

ディレクトリリスティング

ブラウザからサーバに対してディレクトリをURLで指定すると、ファイルの一覧を表示する機能。
Webコンテンツとして使っていないファイルなどもすべて表示したり、他の階層への移動してもできてしまうので意図的に使用する必要がないなら無効化しておく。
※CentOSやミドルウェアパッケージの古いバージョンをダウンロードするときに行くページはディレクトリリスティングが有効されているはず。

FollowSymLinks

シンボリックリンク先をApacheが見れるように設定する。

httpd.conf
<Directory "/var/www/htdocs">
    #Options Indexes 
    Options FollowSymLinks
</Directory

Optionsを何も指定しない場合

httpd.conf
<Directory "/var/www/htdocs">
    #Options Indexes 
    Options None
</Directory

バージョン非表示

Apacheのバージョンが見えてしまうのは、望ましくないため非表示に設定する。

  • レスポンスヘッダーのバージョンを非表示にする
httpd.conf
ServerTokens ProductOnly
  • エラーページのフッターにバージョンを非表示にする
httpd.conf
ServerSignature Off

AllowOverride

.htaccessに対する制御を設定する。
基本的には.htaccesは使わずApacheの設定ファイルで済ませてしまいたいが、WordPressなどCMSを入れたりする場合は.htaccessを有効にしないとリダイレクト等がうまく動かないなどがあったかも。

httpd.conf
<Directory "/var/www/htdocs">
    AllowOverride None
</Directory

CGI

セキュリティを考慮して、CGIを実行しない場合は許可しないようにする。

httpd.conf
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

#<Directory ""/var/www/cgi-bin"">
#    AllowOverride None
#    Options None
#    Require all granted
#</Directory>

Traceメソッド無効

クロスサイトトレーシングなどの脆弱性に繋がる可能性があるので無効化する。

httpd.conf
TraceEnable Off

header

ヘッダー周りの設定項目。
受け売りな部分もあって、あまり理解しきれていない。

httpd.conf
# 使用可能なリクエストヘッダを設定する。
Header set Access-Control-Allow-Headers "Content-Type"  

# アクセスを許可するOriginのURL。*で指定なし
Header set Access-Control-Allow-Origin "*"  

# キャッシュを残さないようにするため。
Header append Pragma no-cache

# リクエスト、レスポンスを一切保存しないため。
Header append Cache-Control no-store

# オリジンサーバの確認無しにキャッシュを利用させないため。
Header append Cache-Control no-cache    

# リクエストごとに毎回完全なレスポンスを利用するため。
Header append Cache-Control must-revalidate

# XSSフィルターを有効化し、XSS検出時にページのレンダリングを停止させるため。
Header always set X-XSS-Protection "1; mode=block"

# XSS対策のため、常にレスポンスヘッダからContentTypeを優先して指示する。
Header always set X-Content-Type-Options nosniff

# クリックジャッキング対策ためのフレーム内でのページ表示表示を一切許可しない。
Header append X-FRAME-OPTIONS "DENY"

# 大量のアクセスが来た際に、サーバ負荷をあげないため。
ListenBacklog 511   

# PHPに関するHTTP_PROXYの脆弱性について対策するため。
RequestHeader unset Proxy   

おまけ

ソースインストールしたときの情報。

Configure オプション

./configure \
--prefix=/etc/httpd \
--exec-prefix=/usr \
--bindir=/usr/bin \
--datadir=/var/www \
--includedir=/usr/include/httpd \
--libdir=/usr/lib64 \
--libexecdir=/usr/lib64/httpd/modules \
--mandir=/usr/share/man \
--sbindir=/usr/sbin \
--sysconfdir=/etc/httpd/conf \
--with-apr=/opt/apr/apr-1.6.5 \
--with-apr-util=/opt/apr-util/apr-util-1.6.1 \
--with-mpm=worker \
--enable-mods-shared=most \
--enable-so \
--enable-ssl \
--enable-http2 \
--enable-rewrite \

起動スクリプト

/etc/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/sbin/apachectl start
ExecReload=/usr/sbin/apachectl graceful
ExecStop=/usr/sbin/apachectl stop

[Install]
WantedBy=multi-user.target