我已通过 SimpleSAML 为我的 SSO / SAML 配置设置了一个子域。作为管理员,我(或任何其他人)真正需要访问的所有文件都在https://sso.domain.com/www/文件夹,这就是我在 vhost 配置文件中设置限制的原因sso.domain.com.conf
。问题是这似乎不起作用,子域的根目录仍然对所有人开放。
<VirtualHost *:80>
ServerName sso.domain.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/sso
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/html/sso/config
Alias /simplesaml /var/www/html/sso/www
<Directory /var/www/html/sso/www>
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =sso.domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
如何配置上述 conf 文件以仅允许公众访问 /www/ 子文件夹而不是子域的根目录?
答案1
不要用作/var/www/html/sso
你的 DocumentRoot首先。Apache 不应该为该位置提供服务一点儿也不。是的,它包含 PHP 文件,但是这些文件将通过 PHP 的 require() 加载,而不涉及 Apache。
(它还包含您的 IdP 私钥,因此将所有这些放在公共访问区域,然后尝试再次限制该访问会导致致命错误。)
因此,应该将 DocumentRoot 指向一个只包含 index.html 的不相关目录(例如 /var/www/misc),或者将其直接指向 /var/www/html/sso/www 子目录(不再需要别名)。
我个人甚至会移动整个 SimpleSAMLphp 安装在......之外/var/www,这样它就不会受到发行版默认<Directory /var/www>
配置的影响,从而降低通过另一个 VirtualHost 意外暴露这些文件的风险。例如,我可能会将其放在 /srv 或 /usr/lib 中:
<VirtualHost *:80>
ServerName sso.example.com
# No need for 'DocumentRoot' or 'Alias' in a redirect-only vhost
RewriteEngine on
RewriteRule ^/\.well-known/acme-challenge/ - [L]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=permanent,L,NE]
</VirtualHost>
<VirtualHost *:443>
ServerName sso.example.com
(...log settings, SSL settings, PHP-FPM settings...)
DocumentRoot /var/www/html
Alias /simplesaml /srv/simplesamlphp/www
<Directory /srv/simplesamlphp/www>
Require all granted
</Directory>
</VirtualHost>