У меня проблемы с получением Order
директива прямо в конфигурации vhost в Apache.
У меня есть IP-адреса, которым я хочу полностью запретить доступ ко всему виртуальному хосту. Ранее они были отмечены как вредоносные.
Я также хочу отклонить все запросы, кроме GET и HEAD, со всех IP-адресов, кроме нашего внутреннего диапазона IP.
У меня проблемы с первым Directory
директиву и выясняя, как лучше всего организовать ее с помощью Order
директива.
Это то, что у меня есть до сих пор, и, похоже, это не работает, поэтому я хотел бы получить несколько советов о том, как лучше всего заказать этот блок ...
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.test.com
ServerAlias test.com
DocumentRoot /var/www/html/www.test.com
<Directory /var/www/html/www.test.com>
Options +FollowSymLinks
Order Deny,Allow
# Deny suspect IPs previously flagged
Deny from 111.111.111.111
Deny from 222.222.222.222
Deny from 333.333.333.333
# But only internal IPs can POST
<LimitExcept GET HEAD>
Deny from all
Allow from 10.10.0.0/22
</LimitExcept>
Allow from all
</Directory>
# CLI directory not web accessible
<Directory /var/www/html/www.test.com/cli>
Order Deny,Allow
Deny from all
</Directory>
# Restrict access to admin internal IPs only
<Directory /var/www/html/www.test.com/admin>
Order Deny,Allow
Deny from all
Allow from 10.10.0.0/22
</Directory>
</VirtualHost>
Моя голова так забита этим сейчас, что я не могу это ясно видеть. Кто-нибудь знает, как это сделать?
Могу ли я использовать несколько Directory
директивы для того же каталога?
Итак, я отделяю отказ от вредоносных IP-адресов от запрета всех запросов, кроме GET и HEAD?
Когда вы используете Order Deny,Allow
в Allow from all
отменит любые Deny from ...
.
Поведение по умолчанию с Order Deny,Allow
в случае отсутствия совпадения - «разрешить». Будет ли работать ближе к ожидаемому, если вы удалитеAllow from all
"?
Каждый <Directory>
также наследует предка (т.е. более короткий путь) <Directory>
настройки, поэтому <LimitExcept>
относится к другому <Directory>
разделы тоже. Вы не можете просто отменить это, добавив
<Limit GET HEAD>
Allow from all
</Limit>
тем, потому что это отменит вашу блокировку плохих IP-адресов и там. (Я не знаю, нужно ли вам отменить это на своем веб-сайте.)
Важные вещи, которые следует помнить о Order / Allow / Deny:
Allow
и Deny
оба проверяются на соответствиеAllow
или Deny
) и значение по умолчанию зависит от Order
.Иметь дубликат - не лучшая идея <Directory ...>
блоки, но если вы это сделаете, они будут обработаны в том порядке, в котором они указаны в config.
См. Полную логику в документации Apache: http://httpd.apache.org/docs/2.2/sections.html
Поскольку ваши требования не совсем соответствуют простой логике разрешения / запрета, вам следует рассмотреть возможность использования одного или обоих:
SetEnvIf
и Allow from env=...
Deny from env=...
mod_rewrite
Вот один из способов сделать это:
RewriteEngine on
RewriteCond %{REMOTE_ADDR} 1.1.1.1 [OR]
RewriteCond %{REMOTE_ADDR} 2.2.2.2 [OR]
RewriteCond %{REMOTE_ADDR} 3.3.3.3
RewriteRule . - [F]
Поместите это в свой <Virtualhost>
снаружи и </Directory>
контейнеры. Если список IP-адресов большой или непостоянный, вы также можете использовать RewriteMap
и вариант вышеупомянутого, чтобы хранить IP-адреса в отдельном файле в качестве более масштабируемого решения.