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

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

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

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

```apache:httpd.conf
Listen 80
Listen 443
```

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

```apache:httpd.conf
#ServerAdmin you@example.com
```

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

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

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

```apache:httpd.conf
DocumentRoot "/var/www/htdocs"
```

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

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

```apache:httpd.conf
#ErrorLog "logs/error_log"
ErrorLog "/var/log/httpd/error_log"
```

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

```apache: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」のロードが必要。

```apache:httpd.conf
   #DirectoryIndex index.html
   DirectoryIndex index.php index.html
```

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

```apache:httpd.conf
AddType application/x-httpd-php .php
```

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

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

```apache:httpd.conf
<Directory "/var/www/htdocs">

</Directory
```

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

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

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

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

```apache:httpd.conf
<Directory "/var/www/htdocs">
    #Options Indexes 
    Options FollowSymLinks
</Directory
```
#### Optionsを何も指定しない場合

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

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

- レスポンスヘッダーのバージョンを非表示にする

```apache:httpd.conf
ServerTokens ProductOnly
```

- エラーページのフッターにバージョンを非表示にする

```apache:httpd.conf
ServerSignature Off
```

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

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

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

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

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

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

```apache:httpd.conf
TraceEnable Off
```

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

```apache: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 \
```

## 起動スクリプト
```bin:/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
```