рубрики

Автоматизация выгрузки реестра запрещённых сайтов и настройка mikrotik

Стоит задача по выгрузки реестра запрещенных сайтов и блокирование доступа к ним пользователей. Реестр запрещенных сайтов можно получить на сайте роскомнадзора по ссылке http://vigruzki.rkn.gov.ru/tooperators_form/, выгрузка должна производится не реже 2-х раз в сутки. Делать это вручную не совсем хочется, поэтому я решил этот процесс автоматизировать. В интернете много статей по автоматизации выгрузки, но вот как полностью автоматизировать процесс от выгрузки и до насройки оборудования мне не попадалось.

Весь процесс разбит на несколько этапов

  1. Создание файл запрос и подпись файла запроса с помощью открепленной электронной подписи
  2. Отправка подписанного файла на сайт http://vigruzki.rkn.gov.ru  и получение реестра запрещенных сайтов
  3. Извлечение доменных имен из реестра
  4. Настройка маршрутизаторов.

Вся система по получению реестра и настройки маршрутизаторов будет находится на сервере с установленной системой 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

 и перезапускаем крон

/etc/init.d/crond restart
Рубрика: Mikrotik | Теги: реестр запрещенных сайтов автоматизация, mikrotik, python
Система Orphus
-->