自宅でホストするサーバ群がいろいろあるため外部からのアクセスをリバースプロキシで捌くための設定
宗教上の理由でnginxを使わないためApacheで設定を行います。
Zabbix 7
<VirtualHost *:80>
ServerAdmin <サーバ管理者のメールアドレス>
ServerName <アクセスしてほしいURL>
DocumentRoot <ダミーでよいが実在するディレクトリ>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://<アクセスしてほしいURL>/$1 [L,R=301]
</VirtualHost>
<VirtualHost *:443>
ServerAdmin <サーバ管理者のメールアドレス>
ServerName <アクセスしてほしいURL>
DocumentRoot <ダミーでよいが実在するディレクトリ>
SSLEngine on
SSLCertificateFile <TLSルート証明書>
SSLCertificateKeyFile <TLSサーバ証明書>
Protocols h2 http/1.1
SetOutputFilter BROTLI_COMPRESS
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli
BrotliCompressionQuality 5
BrotliCompressionWindow 18
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"
SSLHonorCipherOrder off
SSLSessionTickets off
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "/var/log/httpd/<アクセスしてほしいURL>_httpd-access.log" combined
</IfModule>
TransferLog "/var/log/httpd/<アクセスしてほしいURL>_httpd-transfer.log"
ErrorLog "/var/log/httpd/<アクセスしてほしいURL>_httpd-error.log"
ProxyPass /.well-known/ !
ProxyPass / http://<オリジンサーバアドレス>/zabbix/
ProxyPassReverse / http://<オリジンサーバアドレス>/zabbix/
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
ProxyPassReverseCookiePath /zabbix / # ここを誤るとログインできなくなる(Zabbix 7)
# HTTP Strict Transport Security (HSTS)
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
# セキュリティヘッダー強化
Header always set Content-Security-Policy "default-src 'self' wss:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self';"
Header always set X-Frame-Options "SAMEORIGIN"
# Set-Cookie のセキュリティ強化
Header always edit Set-Cookie ^(.*)$ "$1; Secure; HttpOnly; SameSite=Lax"
# HTTPメソッドの制限(GET, POST, HEAD のみ許可)
<Location />
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
</Location>
# ファイルETagを無効化(情報漏洩防止)
FileETag None
</VirtualHost>
CloudFlare経由のWordpress
インターネット → CloudFlare → リバースプロキシ → オリジンサーバ となるので設定が結構ややこしい
CloudFlareからのアクセスに制限したいが、時々403を出すので設定はまだ途上。
<VirtualHost *:80>
ServerAdmin <サーバ管理者のメールアドレス>
ServerName <アクセスしてほしいURL>
DocumentRoot <ダミーでよいが実在するディレクトリ>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://<アクセスしてほしいURL>/$1 [L,R=301]
</VirtualHost>
<VirtualHost *:443>
ServerAdmin <サーバ管理者のメールアドレス>
ServerName <アクセスしてほしいURL>
DocumentRoot <ダミーでよいが実在するディレクトリ>
LogLevel debug
SSLEngine on
Protocols h2 http/1.1
SSLCertificateFile /usr/local/etc/apache24/Includes/CF-TLS/<アクセスしてほしいURL>.pem
SSLCertificateKeyFile /usr/local/etc/apache24/Includes/CF-TLS/private.pem
ProxyPreserveHost On
ProxyPass / http://<オリジンサーバアドレス>/
ProxyPassReverse / http://<オリジンサーバアドレス>/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Host "<アクセスしてほしいURL>"
RequestHeader set X-Forwarded-For "%{CF-Connecting-IP}s"
<Directory />
Require all denied
</Directory>
<Location />
Require ip 173.245.48.0/20
Require ip 103.21.244.0/22
Require ip 103.22.200.0/22
Require ip 103.31.4.0/22
Require ip 141.101.64.0/18
Require ip 108.162.192.0/18
Require ip 190.93.240.0/20
Require ip 188.114.96.0/20
Require ip 197.234.240.0/22
Require ip 198.41.128.0/17
Require ip 162.158.0.0/15
Require ip 104.16.0.0/13
Require ip 104.24.0.0/14
Require ip 172.64.0.0/13
Require ip 131.0.72.0/22
Require ip 2400:cb00::/32
Require ip 2606:4700::/32
Require ip 2803:f800::/32
Require ip 2405:b500::/32
Require ip 2405:8100::/32
Require ip 2a06:98c0::/29
Require ip 2c0f:f248::/32
</Location>
RewriteEngine On
RewriteCond %{HTTP:CF-Connecting-IP} ^$
RewriteRule ^ - [F,L]
# セキュリティヘッダーの追加
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "no-referrer-when-downgrade"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), interest-cohort=()"
Header always set Content-Security-Policy "default-src 'self'; frame-ancestors 'none'; base-uri 'self';"
# ログフォーマット変更
LogFormat "%{CF-Connecting-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" cloudflare
CustomLog "/var/log/httpd/<アクセスしてほしいURL>_httpd-access.log" cloudflare
ErrorLog "/var/log/httpd/<アクセスしてほしいURL>_httpd-error.log"
</VirtualHost>