Apache httpd: Як я можу заборонити від усіх, дозволити від підмережі, але заборонити від IP у цій підмережі?


26

Я працюю CentOS 5.5 з запасом Apache httpd-2.2.3.

Увімкнено mod_status у статусі Location / server-status. Я хотів би дозволити доступ до цього одного місця таким чином:

  1. Заперечувати від усіх
  2. Дозволити з підмережі 192.168.16.0/24
  3. Заборонити від IP 192.168.16.100, що знаходиться в межах підмережі 192.168.16.0/24.

1 і 2 прості. Однак, оскільки я "Дозволити з 192.168.16.0/24", чи можна заборонити з 192.168.16.100?

Я спробував додати заяву заперечення для 192.168.16.100, але це не працює. Ось відповідна конфігурація:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Або:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Однак це не перешкоджає доступу до цієї конкретної сторінки, як показано в журналах доступу:

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

Відповідно до посібника для mod_authz_host :

Дозволити заборонити

По-перше, оцінюються всі директиви Allow; принаймні один повинен відповідати, або запит буде відхилено. Далі оцінюються всі директиви заперечення. Якщо якісь збіги, запит буде відхилено

IP-адреса відповідає директиві заборонити, тому чи не слід відхиляти запит?

Відповідно до таблиці на сторінці mod_authz_host, ця IP-адреса повинна "відповідати як дозволити, так і заборонити", і, таким чином, має застосовуватися правило "Кінцевий контроль відповідності: Відхилено".

    Матч Дозволити, Заборонити результат Заборонити, Дозволити результат
    Матч Дозволити лише Запит дозволений Запит дозволений
    Лише відмовити у відповіді Запит відхилений. Запит відхилений
    Не збігається За замовчуванням з другою директивою: Заборонено за замовчуванням на другу директиву: Дозволено
    Збігайте обидва елементи контролю дозволу та заборони фінального матчу: відмовлено у контролі фінального матчу: дозволено

Заборонити від усіх 192.168.16.100 - Оскільки ви тут використовуєте "всі", я очікую, що всі запити будуть відхилені з будь-якої IP-адреси. Подумайте, що тут відбувається щось інше.
micah

@Michah: Я теж займаюся Allow from 192.168.16.0/24. Як я розумію документацію, будь-які IP-адреси запитувача в мережі 192.168.16.0/24 будуть відповідати цій заяві Дозволити, запит дозволений.
Стефан Ласевський

Дотримуючись документації, вставленої вище. "По-перше, усі директиви Allow оцінюються; принаймні одна повинна відповідати, або запит відхилено" ==> Це має відповідати вашому "Дозволити з 192.168.16.0/24", але друга частина "Далі, усі директиви заборонити: Якщо будь-які збіги, запит буде відхилено "З" Заборонити від усіх ", чи не кожен запит збігатиметься з цією другою частиною і тому буде відмовлено?
micah

Ви дійсно повинні врахувати, чи хочете ви заборонити цій IP-адресі повний доступ до вашої системи або лише з httpd. Якщо перші продовжуватимуть свій підхід до використання директив apache. Якщо останнє, це слід зробити в брандмауері.
Ендрю Кейс

Спасибі ACase. Я хочу лише заборонити доступ з 192.168.16.100 до цієї конкретної сторінки. Я хочу, щоб 192.168.16.100 мав доступ до всіх інших сторінок цього веб-сервера.
Стефан Ласєвський

Відповіді:


35

Я не проходив тестування, але, думаю, ви майже там.

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from allне потрібна. Насправді це викрутить, тому що все буде відповідати all, і таким чином заперечується (і я думаю, що Apache намагається бути розумним і робити щось дурне). Я завжди знаходив в Apache Order, Allowі Denyдирективи заплутаним, тому завжди візуалізувати речі в таблиці (взято з Документів ):

Матч | Дозволити, заперечити результат | Заперечити, Дозволити результат
-------------------------------------------------- -----
Дозволити лише | Дозволено | Дозволено
Заперечувати лише | Заперечується | Заперечували
Не відповідає | За замовчуванням: Відхилено | За замовчуванням: Дозволено
Зіставити обидва | Фінальний матч: Відмовлено | Фінальний матч: Дозволено

З наведеними вище параметрами:

  • Запити від 192.168.16.100 отримують "Матч обох" і, таким чином, відмовляються.
  • Запити від 192.168.16.12 отримують "Дозволити лише" і таким чином дозволені.
  • Запити від 123.123.123.123 отримують "Не збігається", і таким чином відмовляються.

1

Я б, мабуть, дивився також на додавання для цього правил IPTables, щоб заперечувати єдиний хост на порту 80, відмовляти від усіх та дозволяти підмережі.

У вас не повинно виникнути проблем із налаштуванням правила заборонити з певної адреси після дозволу підмережі. Просто зробіть це в тому порядку.


Я оновив свою відповідь. Я включив правило "Заборонити від 192.168.16.100", але доступ дозволений з 192.168.16.100
Стефан Ласєвський

Я хочу дозволити доступ до всіх інших місць цього хоста. Однак я хочу заборонити конкретні місця. IPTables мені тут не допомагають.
Стефан Ласєвський

IPTables спеціально не відмовлятиме від виїзного трафіку, якщо ви цього не скажете. Однак ви можете заборонити вхідний трафік зі світу та конкретну адресу, але всі вони дозволяють підмережу.
Майк

Я думаю, ти неправильно розумієш моє прохання. Я хочу застосувати цей контроль доступу лише до / status-server, а не до всього хоста. Наскільки мені відомо, IPtables не може це зробити легко.
Стефан Ласєвський

-4

Чи можете ви використовувати php? Якщо так, додайте заяву php для виходу / переадресації для цієї конкретної IP-адреси

Приклад:

$ deny = масив ("111.111.111", "222.222.222", "333.333.333");

if (in_array ($ _SERVER ['REMOTE_ADDR'], $ заперечення))

{header ("розташування: http://www.google.com/ ");

Вхід();

Довідка: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/


2
Це повинно бути на кожній сторінці, розміщеній веб-сервером. Це рішення недоцільно, і не там, де ви хочете відфільтрувати доступ до веб-сервера.
Ендрю Кейс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.