Назад | Перейти на главную страницу

Apache LimitExcept GET на IP-адрес, но запрещает все методы для других IP-адресов

У меня проблемы с получением 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-адреса в отдельном файле в качестве более масштабируемого решения.