広く利用されている人気のあるWebサーバーの1つであるApacheウェブサーバーは、ファイルやウェブサイトをホストするために使用されています。インストールも簡単で、ホスティングニーズに合わせて設定することができます。ただし、デフォルトの設定はサイトの必要な保護を提供するには安全ではありません。
このガイドでは、Apacheサーバーのセキュリティを強化するために実装できるいくつかのハードニングのヒントとトリックを紹介します。
1. ApacheバージョンとOS情報の非表示方法
デフォルトでは、Apacheウェブサーバーはウェブサイトの誤ったURLをブラウズした場合にそのバージョンを表示します。以下は、サイトでページが見つからないことを示すエラーページの例です。最後の行にはApacheバージョン、ホストOS、IPアドレス、およびリッスンポートが表示されます。

Webサーバーの情報を表示することは、ハッカーにとって好都合な贈り物になりえるため、決して良いアイデアではありません。セキュリティのレイヤーを追加し、ハッカーにとって難しくするには、Webサーバーの情報を非表示にすることをお勧めします。
これを行うには、DebianベースのディストリビューションでデフォルトのApache設定ファイルを開きます。
$ sudo vim /etc/apache2/apache2.conf
RHELベースのシステム、例えばRHEL、Fedora、CentOS、Rocky、およびAlmaLinux。
$ sudo vim /etc/httpd/conf/httpd.conf
次の行をファイルの末尾に追加してください。
ServerTokens Prod ServerSignature Off
変更を保存し、Apacheウェブサーバーを再起動してください。
$ sudo systemctl restart apache2 [On Debian, Ubuntu and Mint] $ sudo systemctl restart httpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
今度はサイトを再読み込みすると、ウェブサーバーの情報が表示されなくなります。

2. Apacheでディレクトリリストを無効にする
デフォルトでは、Apacheはディレクトリリスティングを許可し、訪問者はDocument Rootディレクトリにあるファイルやディレクトリを見ることができます。
これを示すために、testというディレクトリを作成します。
$ sudo mkdir -p /var/www/html/test
次に、ディレクトリに移動していくつかのファイルを作成します。
$ cd /var/www/html/test $ sudo touch app.py main.py
これで、URL http://localhost/test
にアクセスすると、ディレクトリリスティングが表示されます。

ディレクトリリスティングを無効にするには、Apacheのメイン設定ファイルに移動し、「Directory」属性を検索します。「Options」パラメータを'-Indexes'
に設定します。
<Directory /opt/apache/htdocs> Options -Indexes </Directory>
Apacheを再読み込みすると、今度はURLを訪問したときにディレクトリが表示されなくなります。

3. 定期的にApacheを更新
常にすべてのアプリケーションを最新の状態に保つことをお勧めします。最新のアプリケーションには、古いソフトウェアバージョンに存在する潜在的な脆弱性に対処するバグ修正とセキュリティパッチが含まれています。
そのため、定期的にアプリケーションを最新バージョンにアップグレードすることをお勧めします。
$ sudo apt update && sudo apt upgrade [On Debian, Ubuntu and Mint] $ sudo dnf upgrade [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]

4. ApacheでHTTPS暗号化を使用する
デフォルトでは、ApacheはHTTPプロトコルを使用します。これは盗聴の危険性が高く、セキュリティに脆弱なプロトコルです。サイトのセキュリティを向上させるために、さらにGoogleのSEOランキングを向上させるために、SSL証明書を使用してサイトを暗号化することを検討してください。
これにより、デフォルトのHTTPプロトコルがHTTPSに切り替わり、サーバー間で送受信される通信を傍受して解読するのがより難しくなります。
LinuxでLet’s Encrypt SSLを使用してApache Webサーバーをセキュリティ証明書で保護する方法を確認してください。
- RHELでLet’s Encrypt SSL証明書を使用してApacheをセキュリティ化する方法
- UbuntuとDebianで無料のLet’s Encrypt SSL証明書を使用してApacheをセキュリティ化する方法
5. ApacheのHTTP Strict Transport Security(HSTS)を有効にする
ウェブサイトをTLS/SSL証明書で暗号化するだけでなく、HSTSウェブセキュリティメカニズムをHTTPSの上に実装することを検討してください。
HTTP Strict Transport Security(HSTS)は、ウェブサイトを中間者攻撃やクッキーの乗っ取りから保護するポリシーメカニズムです。これは、攻撃者がHTTPSプロトコルを安全ではないHTTPプロトコルにダウングレードするときに起こります。
HSTSは、ウェブサーバーがウェブブラウザーがHTTPSを介してのみそれと対話し、決してHTTPプロトコルを介してではないと厳密に宣言できるようにします。
HSTSを有効にするには、ウェブサイトがHTTPSで実行され、有効なTLS/SSL証明書を持っていることを確認してください。
次に、Apacheのヘッダーモジュールを有効にします:
$ sudo a2enmod headers
次に、変更を適用するためにApacheをリロードしてください。
$ sudo systemctl restart apache2
次に、ドメインの仮想ホスト構成ファイルにアクセスしてください。
$ sudo vim /etc/apache2/sites-available/mydomain.conf
次に、<VirtualHost *:443>
ブロック内にこの行を追加します:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
これは次のように見えます。
<VirtualHost *:443> # ..... # .... Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost>
max-ageパラメーターは、ウェブブラウザーに対して、次の1年間(31536000 = 1年)だけHTTPSを使用してサイトにアクセスするよう指示します。
最後に、Apacheを再起動してHSTSポリシーを有効にします。
$ sudo systemctl restart apache2
6. ApacheでHTTP/2を有効にする
2015年に、HTTP/2がリリースされました。これは、HTTP/1.1の作成者が予見していなかった複数の問題に対処する新しいHTTPプロトコルのバージョンです。
HTTP/1.1はまだ広く使用されていますが、ブラウザからの複数のリクエストを処理するために複数のTCP接続を使用することに関連するパフォーマンスの問題があり、これによりクライアント側で高いリソースオーバーヘッドが発生し、ネットワークのパフォーマンスが低下します。
アプリケーションが複雑さと機能性を増すにつれて、HTTP/2はHTTP/1.1の欠点を解決するために作成されました。これには、長いHTTPヘッダー、遅いウェブページの読み込み速度、および一般的なパフォーマンスの低下が含まれます。
HTTP/2は前任者よりも保護とプライバシーが向上しています。同様に重要なのは、データの複数のストリームを使用したパフォーマンスの向上です。HTTP/2では、単一のTCP接続により、複数のデータストリームを送信しても効果的な帯域幅の利用が保証されます。
ApacheウェブサーバーでHTTP/2を有効にする方法をチェックしてください:
7. Apacheで機密ディレクトリへのアクセスを制限する
取るべきもう1つのセキュリティ対策は、ユーザーデータ、ログ、および設定ファイルなどの機密情報が含まれている可能性のあるディレクトリへのアクセスを制限することです。
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html # Other virtual host settings <Directory /var/www/html/sensitive_directory> Require all denied </Directory> </VirtualHost>
上記の構成では、Require all denied
が/sensitive_directory内のファイルへのアクセスを試みるすべてのユーザーのアクセスを拒否します。
変更を保存してファイルを終了します。その後、変更が有効になるようにApacheを再起動します。
8. ApacheでServerSignatureディレクティブを無効にする
Apacheの設定ファイル内のServerSignatureディレクティブは、サーバが生成したドキュメントにサーバの設定に関する情報(バージョンや実行されているOSなど)を付加します。このような重要な情報を悪意のある行為者に公開することは、攻撃の可能性を大幅に高めます。
このような情報の露出を防ぐために、Apacheの設定ファイルでこのディレクティブを無効にする必要があります。
ServerSignature Off
変更を保存し、変更が有効になるように再びApacheを再起動してください。
$ sudo systemctl restart apache2
9. ‘ServerTokens’ディレクティブを’prod’に設定する
‘ServerTokens‘ディレクティブは、Apacheのバージョン(メジャーやマイナーバージョン)、OS、実行中のウェブサーバの種類など、サーバが送信する情報を制御します。
公開したくない情報は、ウェブサーバがApacheであることだけです。それ以外の情報はサーバを攻撃の可能性にさらすだけです。そのため、Apacheの設定ファイルで’ServerTokens‘ディレクティブを’prod‘に設定することが推奨されます。
ServerTokens Off
変更を保存し、Apacheを再起動することを忘れないでください。
10. Fail2banでApacheをセキュアにする
Fail2banは、Linuxシステムを外部の脅威から保護するオープンソースのイントルーダー防止アプリケーションです。DoS攻撃やブルートフォース攻撃などを防ぐために、悪質なアクティビティを模倣するパターンに一致するホストをブロックすることで機能します。
Fail2banは、常にApacheログを監視し、失敗したログイン試行を一時的に禁止して攻撃者のIPアドレスをブロックすることで、DoS攻撃からApacheを保護するように設定できます。
Fail2banをLinuxにインストールする方法を以下から確認してください:
11. 不要なモジュールを無効にする
Apacheモジュールは、単純にウェブサーバーの機能を拡張するためにロードされるプログラムです。モジュールによって拡張される機能には、基本認証、コンテンツキャッシング、暗号化、セキュリティなどがあります。
現在使用されていないすべてのモジュールを無効にして、攻撃の被害を最小限に抑えるために推奨されています。
有効になっているすべてのモジュールを表示するには、次のコマンドを実行します。
$ apache2ctl -M

特定のモジュールが有効かどうかを確認するには、たとえば、rewriteモジュールを実行します。
$ apache2ctl -M | grep rewrite

モジュールを無効にするには、次のコマンドを実行します。
$ sudo a2dismod rewrite

12. mod_securityおよびmod_evasiveモジュールを使用してApacheをセキュリティ化する
mod_securityおよびmod_evasiveモジュールを有効にすると、Apacheをブルートフォース攻撃やDDoS攻撃から保護できます。
- mod_securityモジュールは、Webアプリケーションファイアウォール(WAF)のように機能し、あなたのサイトへの疑わしい不要なトラフィックをブロックします。
- mod_evasiveモジュールは、サーバーをブルートフォース攻撃やサービス拒否(DoS)攻撃から保護します。
mod_securityとmod_evasiveを使用してApacheを保護する方法モジュールを保護する方法について詳しく読んでください。
13. Apacheで不要なサービスを制限する
Apacheをさらに安全にするために、現在必要ない場合はシンボリックリンクやCGI実行などの特定のサービスを無効にすることを検討してください。デフォルトでは、Apacheはシンボリックリンクに従いますが、この機能をオフにすることができます。また、-Includes
機能とCGIも一括でオフにすることができます。
これを行うには、‘Directory’セクションで‘Options’ディレクティブに'-ExecCGI -FollowSymLinks -Includes'
行を追加します。
<Directory /your/website/directory> Options -ExecCGI -FollowSymLinks -Includes </Directory>
これはディレクトリレベルでも実現できます。たとえば、ここでは“/var/www/html/mydomain1”ディレクトリに対してIncludesとCgiファイルの実行をオフにしています。
<Directory "/var/www/html/mydomain1"> Options -Includes -ExecCGI </Directory>
変更を保存してApacheを再起動します。
14. Apacheでファイルのアップロードサイズを制限する
Webサーバーをさらに保護する方法の1つとして、クライアントからWebサーバーに送信されるHTTPリクエストボディの合計サイズを制限することがあります。サーバー、ディレクトリごと、ファイルごと、または場所ごとに設定できます。
たとえば、特定のディレクトリ(例:var/www/domain.com/wp-uploads)へのファイルアップロードを許可し、アップロードされるファイルのサイズを4M = 4194304バイトに制限したい場合、次のディレクティブをApacheの設定ファイルまたは.htaccessファイルに追加します。
<Directory "/var/www/domain.com/wp-uploads"> LimitRequestBody 4194304 </Directory>
変更を保存してApacheを再起動してください。
サーバー、ディレクトリ、ファイル、またはロケーションごとに設定できます。このディレクティブは、時にはDoS(Denial-of-Service)攻撃の形で現れる異常なクライアントリクエストの挙動を防ぎます。
15. Apacheでのログの有効化
ログは、クライアントリクエストに関するすべての詳細や、ウェブサーバーのパフォーマンスに関するその他の情報を提供します。これは、何か問題が発生した場合に有用な情報を提供します。特に、Apacheログを有効にすると、仮想ホストファイルで何か問題が発生した場合に問題を特定できます。
ログを有効にするには、2つの主要なログディレクティブを提供するmod_log_configモジュールを含める必要があります。
- ErrorLog – エラーログファイルのパスを指定します。
- CustomLog – ログファイルを作成し、フォーマットします。
これらの属性を仮想ホストファイルの仮想ホストセクションで使用して、ログの有効化を行うことができます。
<VirtualHost 172.16.25.125:443> ServerName example.com DocumentRoot /var/www/html/example/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Debianシステムの{APACHE_LOG_DIR}
ディレクティブは、/var/log/apache2パスとして定義されています。
16. Apacheを別のユーザーとグループとして実行する
Apacheを別のユーザーとグループとして実行することは一般的なセキュリティ慣行です。これにより、ウェブサーバープロセスを他のシステムプロセスから分離し、ウェブサーバーが侵害された場合の潜在的な被害を最小限に抑えることができます。
まず、Apache用に新しいユーザーとグループを作成する必要があります。
$ sudo groupadd apachegroup $ sudo useradd -g apachegroup apacheuser
次に、Apacheの設定ファイルを編集して、新しいユーザーとグループを指定する必要があります。
User apacheuser Group apachegroup
Apacheが実行されるユーザーとグループを変更するので、Webディレクトリとファイルの所有権を更新して、Apacheがそれらを引き続き読み取れるようにする必要があるかもしれません。
$ sudo chown -R apacheuser:apachegroup /var/www/html
これらの変更を行った後は、Apacheを再起動して適用してください:
$ sudo systemctl restart httpd # For RHEL/CentOS $ sudo systemctl restart apache2 # For Debian/Ubuntu
17. DDOS攻撃と強化の保護
まあ、ウェブサイトを完全にDDoS攻撃から保護することはできません。しかし、これらのガイドラインに従うことで、緩和し管理するのに役立ちます。
- TimeOut – このディレクティブは、サーバーが特定のイベントが完了するのを待機する時間を指定します。デフォルト値は300秒です。DDoS攻撃の影響を受けやすいサイトでは、この値を低く保つことが勧められます。ただし、適切な設定は、ウェブサイトが受信するリクエストの性質に大きく依存します。注意:低いタイムアウトは、一部のCGIスクリプトで問題を引き起こす可能性があります。
- MaxClients – このディレクティブは、同時に処理できる接続数の制限を設定します。この制限を超える新しい接続はキューに入れられます。これは、PreforkとWorker MPMsの両方で利用可能です。デフォルト値は256です。
- KeepAliveTimeout – このディレクティブは、サーバーが接続を閉じる前に次のリクエストを待機する時間を指定します。デフォルト値は5秒です。
- LimitRequestFields – このディレクティブは、クライアントが受け入れるHTTPリクエストヘッダーフィールドの数に制限を設定します。デフォルト値は100です。DDoS攻撃がHTTPリクエストヘッダーの数が過剰であるために発生している場合は、この値を減らすことをお勧めします。
- LimitRequestFieldSize – このディレクティブは、HTTPリクエストヘッダーのサイズ制限を設定します。
18. 定期的な脆弱性スキャンを実行
ウェブサーバーを保護する別の方法は、定期的な脆弱性スキャンテストを実施することです。これにより、ハッカーが機密ファイルにアクセスしたり、マルウェアを注入したりする可能性のあるセキュリティ上の弱点を特定できます。
脆弱性スキャンツールは、安全でない設定を指摘し、コンプライアンスの監査を支援するのにも役立ちます。人気のある脆弱性スキャンツールには、Acutenix、Nessus、Nexpose、Sucuriなどがあります。
結論
これらは、ウェブサーバーに追加の保護層を提供し、侵入を防ぐために実装できるいくつかのApacheの強化のヒントです。