Apache динамический белый список IP для определенных каталогов и файлов - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь динамически внести IP-адреса в белый список, чтобы предоставить доступ к определенному каталогу.PHP-скрипт будет постоянно модифицировать файл whitelist.txt для добавления / удаления записей.

Я знаю, как правильно справиться с этим с помощью RewriteMap, но я не уверен, как это настроить.

Например, я хочу, чтобы пользователи обычно заходили на мой сайт, когда они посещают пример.com, однако я хочу запретить доступ ВСЕМ пользователям, посещающим что-либо в пути / каталоге блока "http://example.com/block", КРОМЕ этих IP-адресов в whitelist.txt, кроме того, эти IP-адреса в whitelist.txt будут иметь доступ только копределенная папка и файл внутри директории "block", запрос, например:

http://example.com/block/123/123.txt

Я попробовал код ниже (это грубый набросок, он полностью выключен и неправильнЯ уверен, но просто чтобы понять):

RewriteEngine on

RewriteCond %{THE_REQUEST} ^\/block+\ ##apply rules only for /block directory

RewriteMap ipmap txt://var/whitelist.txt

RewriteCond ${ipmap:%{REMOTE_ADDR}} ^\/([0-9]*).txt$ $1 [NC] ##check whitelist for matching IP AND specific dir and file

RewriteRule .* - [F,L]

Конечно, это не работает. Когда я посещаю example.com, мой сайт переходит в бесконечный цикл перенаправления.

Белый списокФайл .txt будет выглядеть следующим образом:

170.172.100.162 123
152.109.211.250 43
62.55.254.83 2345
227.202.162.48 32
203.52.248.55 533

Таким образом, IP-адрес 170.172.100.162 будет иметь доступ к http://www.example.com/block/123/123.txt

IP-адрес 152.109.211.250 будет иметь доступ к http://www.example.com/block/43/43.txt

... и так далее.

1 Ответ

0 голосов
/ 09 декабря 2018

Я немного поэкспериментировал, исходя из ваших правил, и получил следующее:

RewriteEngine On

RewriteCond %{THE_REQUEST} \/block\/? 
# apply rules only for /block directory

RewriteMap ipmap txt:/var/whitelist.txt

RewriteCond ${ipmap:%{REMOTE_ADDR}} ^$ [NC]
RewriteRule .* /block [R=403,L]
# redirect to /block with 403 when IP address not in the whitelist 

RewriteCond %{REQUEST_URI} /+[^\.]+$ [NC]
# stops when the request finds a dot '.', assuming a file
RewriteCond ${ipmap:%{REMOTE_ADDR}} ^\d+$ [NC]
# does the redirect only when the IP is in the whitelist
RewriteRule .* /block/${ipmap:%{REMOTE_ADDR}}/${ipmap:%{REMOTE_ADDR}}.txt [R=permanent,L] 
# will redirect everything from /block to /block/x/x.txt -> x = numeric value corresponding to the request IP from the whitelist.txt file

При тестировании это работало так:

  • доступ http://example.com -> без перенаправления, попадание на страницу индекса
  • доступ http://example.com/block -> перенаправление на http://example.com/block/123/123.txt и отображение содержимого текстового файла
  • доступ http://example.com/block с другого устройства в сети -> перенаправлен на соответствующую запись из файла белого списка

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ :

  • , когда IP не найден в whitelist.txt, тогда выполняется перенаправление на / блок с кодом 403

РЕДАКТИРОВАТЬ 2 :

На данный момент любой пользователь с IP из файла whitelist.txt может получить доступ к каталогу других пользователей.Я пытался найти условие для этого, но ничего не нашел.Итак, на данный момент я могу думать о .htaccess файлах на уровне каталогов, например:

deny from all
allow from 1.2.3.4
#1.2.3.4 is arbitrary
...