Стоит задача по выгрузки реестра запрещенных сайтов и блокирование доступа к ним пользователей. Реестр запрещенных сайтов можно получить на сайте роскомнадзора по ссылке http://vigruzki.rkn.gov.ru/tooperators_form/, выгрузка должна производится не реже 2-х раз в сутки. Делать это вручную не совсем хочется, поэтому я решил этот процесс автоматизировать. В интернете много статей по автоматизации выгрузки, но вот как полностью автоматизировать процесс от выгрузки и до настройки оборудования мне не попадалось.
Cистема по получению реестра и настройки маршрутизаторов будет находится на сервере с установленной системой Centos 6.4
Весь процесс разбит на несколько этапов
Создание файл запрос и подпись файла запроса с помощью открепленной электронной подписи
1. Для начала вам нужна квалифицированная электронная подпись. Получить эту подпись можно в любом аккредитованном удостоверяющем центре, список можно скачать по ссылке http://minsvyaz.ru/common/upload/Perechen_akkreditovannih_UZ.xls. Выбираем ближайший, звоните туда, объясняете что вам нужна электронная подпись для zapret-info.gov.ru, и вам объясняют дальнейшие шаги. Собираете кучу бумаг, заполняете анкеты, оплачиваете, после чего получаете сертификат, при необходимости еще и покупаете e-Token.
2.Когда e-Token с сертификатом у вас уже на руках. вам нужен будет компьютер с установленным Windows и программой КриптоПро. Необходимо средствами КриптоПро скопировать ключевой контейнер в реестр с возможность экспорта. Затем с помощью утилиты P12FromGostCSP.zip выгружаем сертификат в формате PCKS#12
3.Подключаемся к нашему серверу с CentOS, и создаем в корне каталог gost-ssl.
Устанавливаем openssl:
wget http://zhutov.ru/static/files/mikrotik/openssl-1.0.1c.tar.gz tar xzf openssl-1.0.1с.tar.gz cd openssl-1.0.1с ./config shared zlib enable-rfc3779 --prefix=/gost-ssl make depend make make test make install
Если в процессе установки появится ошибка:
gcc: команда не найдена или zlib.h: Нет такого файла или каталога
То устанавливаем пакеты gcc и zlib-devel :
yum install gcc zlib-devel -y
Правим конфиг /gost-ssl/ssl/openssl.cnf
В самом верху, первой строкой пишем:
openssl_conf = openssl_def
Далее добавляем в конец:
[openssl_def] engines = engine_section [engine_section] gost = gost_section [gost_section] default_algorithms = ALL engine_id = gost dynamic_path = /gost-ssl/lib/engines/libgost.so CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
Далее проверяем работоспособность и наличие GOST (полный путь до openssl обязателен)
/gost-ssl/bin/openssl ciphers | tr ":" "\n" | grep GOST
Если вывод пуст, значит что то не так. Должны появится строчки типа:
GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89
Создаем каталог:
mkdir /gost-ssl/ssl/rzs
И кидаем туда файл p12.pfx полученный в пункте 2.
Проверяем, что у нас нормальный (содержит сертификат и закрытый ключ) PKCS#12 командой:
/gost-ssl/bin/openssl pkcs12 -in p12.pfx -nodes
конвертируем полученный на Windows PKCS#12 в PEM:
/gost-ssl/bin/openssl pkcs12 -in p12.pfx -out provider.pem -nodes -clcerts
создаем XML файл запроса, согласно памятке оператора http://zapret-info.gov.ru/docs/description_for_operators_2012-11-09v1.4.pdf и конфертируем его при помощи icov в СP1251:
/usr/bin/iconv -f UTF8 -t WINDOWS-1251 request.xml -o request.xml
подписываем xml файл нашим сертификатом:
/gost-ssl/bin/openssl smime -sign -in request.xml -out request.bin -signer provider.pem -outform DER
скидываем в Windows и проверяем валидность на http://www.gosuslugi.ru/pgu/eds/ если все впоряде, то идем дальше.
Для автоматизации получения файла запроса, создаем скрипт на python под названием request.py
Со следующим кодом:
# -*- coding: windows-1251 -*- from datetime import datetime from dateutil.tz import tzlocal from lxml import etree from lxml.builder import E f=open('/gost-ssl/ssl/rzs/req.xml', 'w') request_xml = E.request( E.requestTime(datetime.now(tzlocal()).isoformat()), E.operatorName(u'ООО Рога и копыта'), E.inn('1234567890'), E.ogrn('1234567890'), E.email('123"123.ru'), ) request_str = etree.tostring(request_xml, xml_declaration=True, encoding='windows-1251').replace("'", '"') print request_str f.write(request_str)
Естественно Название компании, ИНН, ОГРН и e-mail указываем свои.
Отправка подписанного файла на сайт http://vigruzki.rkn.gov.ru и получение реестра запрещенных сайтов
В интернете были найдены два скрипта на pyton для автоматической выгрузки реестра, скачиваете их и кладете в тот же каталог /gost-ssl/ssl/rzs/
cd /gost-ssl/ssl/rzs/ wget http://zhutov.ru/static/files/mikrotik/zapret_checker.py http://zhutov.ru/static/files/mikrotik/zapretinfo.py
Устанавливаем suds
yum install python-suds -y
Проверяем работу выгрузки:
/gost-ssl/bin/openssl smime -sign -in req.xml -out req.xml.sign -binary -signer provider.pem -outform PEM python request.py python zapretinfo.py
Через 1-3 минуты каталоге /gost-ssl/ssl/rzs/ должен появится файл реестра запрещенных имен dump.xml
Извлечение доменных имен из реестра
Для извлечения из реестра доменные имена, создаем в каталоге /gost-ssl/ssl/rzs/ скрипт extract.py
from xml.dom.minidom import * import os os.remove('domains.txt') f=open('domains.txt', 'a') xml = parse('dump.xml') domains = xml.getElementsByTagName('domain') for domain in domains: f.write('%s\n' % domain.childNodes[0].nodeValue)
ВНИМАНИЕ!!! перед первым запуском скрипта extract.py создайте пустой файл domains.txt
touch domains.txt
Настройка маршрутизаторов
При попытке получить доступ к запрещенному сайту, пользователь должен будет попасть на страницу с сообщением о запрещенном ресурсе, например как тут . Для этого в сети должен быть настроен http сервер, с html страницей на которой сообщается о запрещенном ресурсе.
На маршрутизаторах должно быть включен перехват dns запросов «Allow Remote Requests»
ip dns edit allow-remote-requests
Исправляем на yes и сохраняем. Так же в качестве ДНС сервера у пользователей должен быть прописан ip адрес микротика.
Для автоматической настройки маршрутизаторов используется скрипт mikrotik_configure.py
# -*- coding: utf-8 -*- import paramiko from datetime import datetime import time #Логин и пароль для доступа на маршрутизаторы user='admin' secret='password' port='22' #Список ip адресов маршрутизаторов ip_list=['1.1.1.1', '2.2.2.2', '3.3.3.3'] f=open('domains.txt') string=f.readlines() def m_add_host(host,user,secret,port,string): client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: #Подключаемся к маршрутизатору client.connect(hostname=host, username=user, password=secret, port=port) time.sleep(3) #Очищаем старую dns таблицу stdin, stdout, stderr = client.exec_command('ip dns static remove [find address=10.10.10.10]') time.sleep(5) for name in string: stdin, stdout, stderr = client.exec_command('ip dns static add name=%s address=10.10.10.10' % name.replace('\n','')) client.close() except: print 'Error' for ip in ip_list: m_add_host(ip,user,secret,port,string)
10.10.10.10- ip адрес нашего http сервера.
Теперь собираем все вместе в один скрипт который будет запускать выгрузку реестра и настраивать маршрутизаторы. Для этого создаем файл start_rzs.sh
#!/bin/bash cd /gost-ssl/ssl/rzs/ python request.py /gost-ssl/bin/openssl smime -sign -in req.xml -out req.xml.sign -binary -signer provider.pem -outform PEM python zapret_checker.py wait python extract.py python mikrotik_configure.py
И помещаем его в cron который будет его запускать, несколько раз в сутки, допустим каждые 10 часов, для этого в /var/spool/cron/root добавляем строку
00 */10 * * * /gost-ssl/ssl/rzs/start_rzs.sh
Обучающий курс по настройке MikroTik
Нужно разобраться с MikroTik, но не определились с чего начать? В курсе «Настройка оборудования MikroTik» все по порядку. Подойдет и для начала работы с этим оборудованием, и для того, чтобы систематизировать знания. Это видеокурс из 162 уроков и 45 лабораторных работ, построен на официальной программе MTCNA. Проходить можно, когда удобно и пересматривать по необходимости – материалы курса выдаются бессрочно. Также есть 30 дней на личные консультации с автором. На пробу выдают 25 уроков бесплатно, заказать их можно на странице курса.