ここでは、Webサーバでapacheを使用している方向けに、現役SEが必ず設定しているセキュリティ対策含めた王道のコンフィグの設定方法を紹介します。どのような設定をしたらよいかわからない方もとりあえず同じ設定をすることで、安全なWebサーバを構築することが可能です。
まず何をすれば良いか?web用アカウントの作成
apacheのデフォルトのホームディレクトリは、/var/www/html になります。こちらにホームページのコンテンツをアップするとなると、一般ユーザの権限ではアップできず、apacheユーザまたはrootユーザにてアップする必要があります。
これはセキュリティ的にあまり良くなく、私は一般ユーザのホームディレクトリをデフォルトとします。この点のデメリットとしましては、selinuxのデフォルトのルールから外れてしまいますので、設定しなおす必要が出てきます。selinuxを無効にされている方は特に問題はございません。
またFTP(S)は使用せず、基本的にはscp(TCP 22番ポート)を使用します。不要なサービスは起動しない事はセキュアなサーバを構築する基本です。
以下のコマンドを実行します。
ユーザの追加とパスワードの設定
# useradd webadmin
# passwd webadmin
ユーザのホームディレクトリのパーミッション変更
# chmod 701 /home/webadmin
作成したユーザにスイッチ
# su - webadmin
コンテンツを公開するディレクトリを作成し、index.htmlを作成
$ mkdir public_html
$ chmod 755 public_html/
$ vi public_html/index.html
基本的なhttpd.confの設定内容(セキュリティ対策含む)
apacheのインストールは、以下のコマンドで実施します。httpsはもはや必須ですので、mod_sslも併せてインストールします。
# dnf install httpd mod_ssl
先に結論から、/etc/httpd/conf/httpd.confの設定は、以下をファイルの最後に追記します。
<VirtualHost *:80>
ServerName www.hogehoge.jp
ServerAlias hogehoge.jp
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.hogehoge.jp$1 [R=301,L]
</VirtualHost>
### 以下セキュリティ設定 ###
# バージョン情報の隠蔽
ServerTokens ProductOnly
ServerSignature off
Header unset "X-Powered-By"
# httpoxy 対策
RequestHeader unset Proxy
# クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN
# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
# DoS 攻撃対策
LimitRequestBody 10485760
# slowloris 対策
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
# XST対策
TraceEnable off
まず前半部分ですが、私の場合、基本的にはhttp(TCP 80番ポート)でアクセスがあった場合は、自身のサーバのhttps(TCP 443番ポート)へ転送するように設定しています。これは常時SSL化ともいわれているものです。今後httpでのアクセスは推奨されないものとなる可能性が大きいので、httpsでアクセスするように設定しておきます。
なお、サーバにてFirewalldが有効になっている場合は、ポート80や443を開放する必要があります。Firewalldについての詳しい設定は、こちらを参照ください。
次に後半部分ですが、セキュリティ設定になるのですが、わかる方もよくわからない方も、とりあえずこれだけはやっとけ、という設定になるので、特に気にせず設定しておきましょう。
暗号化通信を使用したhttpsの設定内容
次に、実質メインで使用するhttpsの設定を行います。ファイルは、/etc/httpd/conf.d/ssl.confを編集します。(ここではSSLサーバ証明書の設定部分は割愛しています)
具体的には、以下の内容に編集します。ここでは、デフォルトのバーチャルドメインの設定の中に追記し、あえてバーチャルドメインは追加していません。またここで先ほど作成したユーザのホームディレクトリをドキュメントルートに指定しています。
ServerName www.hogehoge.jp:443
DocumentRoot /home/webadmin/public_html
<Directory "/home/webadmin/public_html">
AllowOverride All
Require all granted
Options FollowSymLinks
</Directory>
Directoryタブにて指定されている各パラメータの意味は、
AllowOverride All | .htaccess で設定可能なものは全て有効 |
Require all granted | すべてのアクセスを許可 |
Options FollowSymLinks | シンボリックリンクを有効にする。シンボリックリンクが無効になっていると Rewrite が動かない。 |
となります。このあたりは、ご利用になる環境や機能に合わせて適時変更ください。私は.htaccessでちょっとした制御をすることが多いので、上記のような設定にしています。
ーーー(2024/2/28 修正)ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上記オプションで「Options +FollowSymLinks」と「Options FollowSymLinks」では動きが異なる事に気が付きました。具体的には、 + まはた – を使わないで機能を有効した場合、設定前にどのような機能が有効にになっていたかに関わらず新しく設定した機能だけが有効となります。
今回問題と感じたのは、Indexesです。こちらはファイル一覧の表示を行うオプションですが、セキュリティの観点からこの機能は無効にしていたつもりですが、「Options +FollowSymLinks」としていたので、userdir.confのIndexesを引き継いで、有効になっておりました。(
「Options +FollowSymLinks -Indexes」とするか「Options FollowSymLinks」とする必要がありました。設定後は動作確認も必要なことを改めて感じました。
ーーー(2024/2/28 修正ここまで)ーーーーーーーーーーーーーーーーーーーーーーーーー
最後に、その他のコンフィグの設定として、デフォルトのコンテンツが表示されないよう、以下の対処をしておきます。(コンフィグファイルの無効化)
# cd /etc/httpd/conf.d/
# mv welcome.conf welcome.conf.org
# mv autoindex.conf autoindex.conf.org
# mv userdir.conf userdir.conf.org
パッチ適用後にリネーム(削除)したコンフィグファイルが自動生成される
前項の通り、デフォルトで存在するコンフィグファイルをリネーム(削除)する方法で、対処している場合も多いかと思いますが、apacheのパッチ適用後にこれらリネームしたファイルが復活していることが確認されました。
せっかくセキュリティ対策を実施していても、パッチが適用されると元に戻るのは良くありません。この対処方法としては、ファイルをリネーム(削除)せず、ファイルの中身を書き換えるようにしましょう。
具体的にはファイルの中身をすべてコメント化、あるいはすべて削除してコメント行を1つ追加するなどです。ファイルサイズが0バイトだと、また自動で作成される可能性があるので要注意です。(0バイトの場合の動作は未確認)
攻撃の有無や設定に問題がないかの確認方法(ログを見る)
設定が終了したら、サービスを再起動して、設定内容を反映させます。
# systemctl restart httpd
その後、ログファイルの中身を確認して、エラーが出ていないかを確認します。(/var/log/httpd/配下にあります)外部から攻撃を受けたり、設定が誤っていると、ログに出力されます。初めて見た場合やたまにしかログを確認しないのでは、気が付かない場合が多いです。定期的にログをみて、どういった内容のものが出力されているかを認識しましょう。正常な状態を知ることで初めて不審なログに気が付くことができるようになります。
また、ログがローテートされていることも確認します。ローテートされていなければ、/etc/logrotate.d/httpd などのファイルを参照して、適切にログがローテートされるように設定しましょう。これを忘れるとサーバのディスク圧迫につながりますので必須です。
脆弱性の発表などで設定を定期的に見直すことの必要性
最後に、webの世界は日々変化しています。今回設定した内容が、現在は良くても、来年には良くない設定になっていることもゼロではありません。とくに脆弱性が出た際には、修正パッチが提供される場合もありますが、設定を修正することで対処する場合もあります。定期的に問題がないか確認するようにしましょう。私も直すべき点が見つかったら、上記の記載内容を修正するようにします。
Webサーバと一緒に設定することが多いデータベースサーバ(mariadb、phpmyadmin)の設定方法については、こちらにまとめていますので、ご参考になれば幸いです。
今回はここまでです。最後までお読みいただきありがとうございました。