Apacheによるリバースプロキシいろいろ

## 自宅でホストするサーバ群がいろいろあるため外部からのアクセスをリバースプロキシで捌くための設定
　宗教上の理由で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>
```