Во-первых, моя структура. Запуск Ubuntu 16.04.3 с Apache 2.4, у меня есть сайт в / mnt / WWW, но я никогда не обслуживаю оттуда страницы, за исключением формы входа. Все перенаправляется на www. если не другой поддомен, а затем перенаправлен с http на https. У меня также есть форма аутентификации, запущенная из каталога / mnt / WWW. Это позволяет мне иметь одну форму php, которая обслуживает аутентификацию mod_auth_form для любого URL-адреса, пути или обратного прокси.
Я потратил более 12 часов на то, чтобы все это работало до этого момента, и многое узнал обо всем этом, но я застрял на одном последнем моменте. Но перед этим здесь некоторая информация о моей существующей (и работающей) настройке.
Структура каталогов сервера.
Мой текущий файл виртуальных хостов:
# Default
ServerName example.com
DocumentRoot /mnt/WWW
ServerAdmin support@example.com
RemoteIPHeader X-Forwarded-For
Alias "/login.php" "/mnt/WWW/login.php"
Alias "/logo.png" "/mnt/WWW/logo.png"
<Directory />
# Allow access to excluded directories
SetEnvIf Request_URI "login.php" allow
SetEnvIf Request_URI "logo.png" allow
Order allow,deny
Allow from env=allow
Satisfy any
Require valid-user
</Directory>
<Location />
AuthFormProvider file
AuthType form
AuthName "Reserved Area"
Session On
SessionCookieName session path=/
SessionCryptoPassphrase secret
SessionMaxAge 300
require valid-user
# This is the login page
ErrorDocument 401 /login.php
# This is the file containing users login data
AuthUserFile /mnt/WWW/.htpasswd
</Location>
# Default HTTP
<VirtualHost *:80>
DocumentRoot "/mnt/WWW"
ServerName example.com
<Directory />
Require valid-user
</Directory>
# Force SSL
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}:443$1 [R,L]
# Force WWW Subdomain
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[0-9a-zA-Z-]+\.[a-zA-Z]{2,}$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}:443$1 [R=301,L]
</VirtualHost>
# Default HTTPS
<VirtualHost *:443>
DocumentRoot "/mnt/WWW"
ServerName example.com
<Directory />
Require valid-user
</Directory>
# Force WWW Subdomain
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[0-9a-zA-Z-]+\.[a-zA-Z]{2,}$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}:443$1 [R=301,L]
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
</VirtualHost>
# Default WWW
<VirtualHost *:443>
DocumentRoot "/mnt/WWW/www.example.com"
ServerName www.example.com
<Directory />
Require valid-user
</Directory>
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
</VirtualHost>
#Reverse Proxies
<VirtualHost *:443>
# NAS
DocumentRoot /mnt/WWW
ServerName nas.example.com
ServerAlias nas.example.com
<Directory /mnt/WWW/>
Require valid-user
</Directory>
ProxyPass /logo.png !
ProxyPass /login.php !
ProxyPass / http://10.0.28.1:5000/
ProxyPassReverse / http://10.0.28.1:5000/
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
</VirtualHost>
Теперь, как вы можете видеть, у меня есть файлы login.php и logo.png для формы. Я планирую преобразовать это в форму для LDAP, и у меня нет проблем с этим, и я также планирую изменить его стиль. Это означает, что у меня будет больше файлов для включения в конфигурацию для входа в систему.
Говоря это, я хочу переместить файлы входа в папку / mnt / WWW / authentication. Я надеялся, что вместо того, чтобы создавать правила и т. Д. Для 2+ отдельных файлов, я мог бы просто установить их в сам каталог. Все, например, псевдоним, настройка noauth и т. Д.
Но я не могу заставить все это работать. Любая помощь будет оценена по достоинству.
PS: Я новичок во всем этом, и если кто-то видит какие-либо потенциальные проблемы с безопасностью, сообщите об этом.
ОБНОВЛЕНИЕ: я переработал конфигурацию, работая на каждом этапе и убедившись, что я использовал полные пути и т. Д. У меня пока все работает, а именно:
Вот обновление моей конфигурации.
<VirtualHost *:80>
# Redirect anything on port 80 to port 443
#ServerName example.com
ServerAdmin support@example.com
DocumentRoot /mnt/WWW
# Force SSL
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}:443$1 [R,L]
# Error Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAdmin support@example.com
DocumentRoot /mnt/WWW
# Force WWW Subdomain
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[0-9a-zA-Z-]+\.[a-zA-Z]{2,}$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}:443$1 [R=301,L]
# SSL Certificates
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
# Error Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
ServerAdmin support@example.com
DocumentRoot /mnt/WWW/www.example.com
<Directory /mnt/WWW/www.example.com>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
<Directory /mnt/WWW/phpmyadmin>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
# Map PHPMyAdmin to another folder
Alias "/phpmyadmin" "/mnt/WWW/phpmyadmin"
# WEBMIN
ProxyPass "/webmin" "http://localhost:10000/"
ProxyPassReverse "/webmin" "http://localhost:10000/"
# SSL Certificates
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
# Error Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# Reverse Proxies
<VirtualHost *:443>
# NAS
ServerName nas.example.com
ServerAdmin support@example.com
DocumentRoot /mnt/WWW
# NAS 2
ProxyPass "/nas2" "http://10.0.28.3:5000/"
ProxyPassReverse "/nas2" "http://10.0.28.3:5000/"
# NAS 1
ProxyPass "/nas1" "http://10.0.28.2:5000/"
ProxyPassReverse "/nas1" "http://10.0.28.2:5000/"
# NAS CLUSTER
ProxyPass / http://10.0.28.1:5000/
ProxyPassReverse / http://10.0.28.1:5000/
# SSL Certificates
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
# Error Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Теперь я пытаюсь использовать подпапку из корня документа для хранения всех файлов, необходимых для аутентификации. На этом этапе это просто форма, изображение, файл css и .htaccess с учетными данными. Чуть позже это изменится на форму, которая будет проверяться на сервере LDAP вместо .htaccess.
Моя цель - заблокировать ВСЕ доступ к серверу, проверить локальный сайт, phpmyadmin или обратный прокси, поэтому я получаю authform (в /mnt/WWW/example.login/) перед тем, как получить доступ к тому, что было запрошено.
У меня это уже работало раньше, поэтому я считаю, что моя проблема как-то связана с порядком или структурой кода, но до сих пор, что бы я ни пытался, я получаю внутреннюю ошибку сервера.
Я изменил окончательный виртуальный хост www.example.com на следующий:
<VirtualHost *:443>
ServerName www.example.com
ServerAdmin support@example.com
DocumentRoot /mnt/WWW/www.example.com
<Directory /mnt/WWW/www.example.com>
Options Indexes FollowSymLinks
AllowOverride all
Require valid-user
</Directory>
<Location /mnt/WWW>
AuthFormProvider file
AuthType form
AuthName "Reserved Area"
Session On
SessionCookieName session path=/;domain=.example.com;httponly;secure
SessionCryptoPassphrase secret
SessionMaxAge 300
require valid-user
ErrorDocument 401 /example.login/index.php
AuthUserFile /mnt/WWW/example.login/.htpasswd
</Location>
<Directory /mnt/WWW/phpmyadmin>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
# Map PHPMyAdmin to another folder
Alias "/phpmyadmin" "/mnt/WWW/phpmyadmin"
# WEBMIN
ProxyPass "/webmin" "http://localhost:10000/"
ProxyPassReverse "/webmin" "http://localhost:10000/"
# SSL Certificates
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
# Error Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Что это я делаю не так. Заказ или я что-то пропустил? Я занимаюсь этим часами и сводит меня с ума. Мне просто нужны свежие (и опытные) люди по этому поводу. Спасибо.
Кстати, для ясности, все пути и домены верны, так как у меня они IRL. Я только изменил используемое реальное доменное имя на example.com и т. Д., Чтобы скрыть настоящее.
Еще одно обновление:
Я где-то читал (не могу найти снова), что могу использовать материал Auth в теге каталога вместо местоположения. Я читал, что это безопаснее. Не уверен, правда это или нет, но я получил конфигурацию, которая вроде как работает:
<VirtualHost *:443>
ServerName www.example.com
ServerAdmin support@example.com
DocumentRoot /mnt/WWW/www.example.com
# Map PHPMyAdmin to another folder
Alias "/example.login" "/mnt/WWW/example.login"
<Directory "/mnt/WWW/example.login">
Order allow,deny
Allow from all
Satisfy any
</Directory>
# Map PHPMyAdmin to another folder
Alias "/phpmyadmin" "/mnt/WWW/phpmyadmin"
<Directory /mnt/WWW/phpmyadmin>
Order allow,deny
Allow from all
Satisfy any
</Directory>
<Directory /mnt/WWW/www.example.com>
Options Indexes FollowSymLinks
AllowOverride all
Require valid-user
AuthFormProvider file
AuthType form
AuthName "Reserved Area"
Session On
SessionCookieName session path=/;domain=.example.com;httponly;secure
SessionCryptoPassphrase secret
SessionMaxAge 300
Require valid-user
ErrorDocument 401 /example.login/index.php
AuthUserFile /mnt/WWW/example.login/.htpasswd
</Directory>
# WEBMIN
ProxyPass "/webmin" "http://localhost:10000/"
ProxyPassReverse "/webmin" "http://localhost:10000/"
# SSL Certificates
SSLEngine on
SSLCertificateFile /root/ssl/example.com.crt
SSLCertificateKeyFile /root/ssl/private.key
SSLCACertificateFile /root/ssl/intermediateCA.crt
# Error Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Теперь эта конфигурация дает мне частичную форму, и я могу войти в систему и получить главный корень сайта www.example.com. phpmyadmin не защищен, и example.login также не защищен. Я планирую защитить phpmyadmin и другие позже, просто выполняя по одному шагу за раз.
Когда я говорю «частично», я имею в виду, что форма отображается, но на странице есть изображение, которое не отображается. Я думаю, что это проблема безопасности, поскольку страница обычно показывает, когда в конфигурации нет аутентификации.
Итак, моя проблема сейчас заключается в следующем: как я могу использовать папку example.login и ВСЕ файлы в ней, минуя аутентификацию, и нет лучшего способа вставить код аутентификации, чтобы применить ко всему и контролировать то, что заблокировано с помощью Требовать валид-пользователя?