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.