null

Организация разграничения доступа к веб-ресурсам на базе Squid

 Возникла как-то у одного моего коллеги-программиста задача административного характера - разграничить доступ пользователям локальной сети к известному веб-ресурсу, используя простейшую авторизацию и без реализации сложных механизмов, например защиты от спуфинга.
Решение коллегой найдено не было и он обратился за помощью ко мне. Постараюсь вкратце описать, как мной было предложено решить данную задачу.
Для начала, поднимем squid. Установку этого прокси-сервера я описывать не буду, приведу лишь мой конфигурационный файл.

acl all src all
http_access allow all
http_port 3128 transparent
access_log /var/log/squid/access.log squid
debug_options ALL,1 33,2
coredump_dir /var/spool/squid
redirect_program /etc/squid/redirector.sh

Далее, настроим прозрачное перенаправление клиентов локальной сети (172.16.0.0/16), запрашивающих порт 80 на любом хосте на наш сервер (172.16.0.1, порт 3128). Также тут приведено правило для организации механизма NAT - чтобы обеспечить доступ пользователей локальной сети во внешнюю.

iptables -A PREROUTING -t nat -j DNAT -s 172.16.0.0/16 -p tcp --dport 80 --to-destination 172.16.0.1:3128
iptables -A POSTROUTING -t nat -j SNAT --to-source 192.168.0.1

Следует отметить, что на GNU/Linux необходимо также включить форвардинг пакетов:

sysctl net.ipv4.ip_forward=1
Далее приведён текст программы-редиректора, которую использует squid для определения доступа к ресурсам.
Наибольший интерес представляют вот эти две строки:
# echo "$src" >> "$DB"
echo "http://192.168.0.1/xxx.php?${url##*\?}"
Первую можно раскомментировать, чтобы обеспечить пользователю доступ после единичного показа нашей странички, вторая позволяет указать адрес показываемой страницы. Следует отметить, что в данном примере в качестве целевой страницы указана страница xxx.php, код которой можно найти сразу после текста программы. Эта страница осуществляет проверку переменных user и password, и перенаправляет клиента на запрашиваемый ресурс.
Также интерес в коде программы представляет строка "*vk.com*)", которая выбирает ресурсы, доступ к которым ограничивается. В данном примере ограничим доступ к vk.com:
#!/bin/sh
# Made by: KorG

DB="/tmp/squid.db"
chmod a+w "$DB"

while read url src ident method line
do
   [ xGET = "x$method" ] || continue
   case $url in
      *vk.com*)
            if fgrep -q "${src%%/*}" "$DB"
            then
               break
            fi
            # Add information about client
            # echo "$src" >> "$DB"
            # Redirect to login page
            echo "http://192.168.0.1/xxx.php?${url##*\?}"
            continue
         ;;
   esac
   
   # Allow another URLs
   echo "$line"
done

Код страницы xxx.php:

<html>
<?php
if (!empty($_GET['user']) && !empty($_GET['password'])) {
   file_put_contents("/tmp/squid.db", $_SERVER['REMOTE_ADDR'] . "\n", FILE_APPEND);
   echo '<head><script type="text/javascript">
      var url = window.location.toString();
      url = url.substring(0, url.lastIndexOf("?"));
      window.location.reload(url);
      </script></head>';
} else {
   /* Render page */
   echo '<body>
      <form action="">
      <input type="text" name="user" />
      <input type="text" name="password" />
      <input type="submit" />
      </body>';
}
?>
</html>
Таким образом, пользователи, запрашивая различные сайты, будут автоматически перенаправляться на наш прокси. В свою очередь, прокси-сервер отправляет запрос на проверку в программу-редиректор, которая определяет доступность запрашиваемого ресурса. Если ресурс доступен для пользователя - разрешает прокси-серверу обмениватся с этим ресурсом. В противном случае, прозрачно перенаправляет пользователя на нашу страницу.
Приведённый текст программы-редиректора широко масштабируем и позволяет исключить процесс авторизации из задачи, оставив лишь разовое посещение пользователем страницы. Это может широко использоваться администраторами сети для разового показа корпоративной информации при доступе к некоторым ресурсам.
korg

 

Коротко о себе

Работаю в компании Tune-IT, администрирую инфраструктуру компании и вычислительную сеть кафедры Вычислительной ТехникиСПбНИУ ИТМО.

Интересы: администрирование UNIX и UNIX-like систем и активного сетевого оборудования, написание shell- и perl-скриптов, изучение технологий глобальных сетей.
Люблю собирать GNU/Linux и FreeBSD, использовать тайлинговые оконные менеджеры и писать системный софт.

Ничего не найдено. n is 0