Giter Site home page Giter Site logo

prototype-x / blacklist-rkn-tool Goto Github PK

View Code? Open in Web Editor NEW
36.0 8.0 11.0 199 KB

Python3 скрипт для работы с реестром запрещенных сайтов http://vigruzki.rkn.gov.ru/

License: GNU General Public License v3.0

Python 100.00%
roskomnadzor blacklist zapret rkn vigruzki

blacklist-rkn-tool's Introduction

blacklist-rkn-tool

Code Health

Python3 скрипт bl-rkn.py для работы с реестром запрещенных сайтов http://vigruzki.rkn.gov.ru/

Сделано на базе проектов:

Возможности:

  • Получение дампа реестра
  • Хранение файлов дампа реестра
  • Сохранение дампа реестра в БД SQLite/PostgreSQL
  • Уведомление по email о изменениях в реестре, статистика (--stat)
  • Уведомление по email об обновлении: веб сервиса, формата выгрузки, памятки оператору
  • Генерация и подпись запроса с Rutoken
  • Хранение истории идентификаторов запросов
  • Поддержка формата файла выгрузки версии 2.2
  • Перекодировка доменов и url в кириллице
  • Фильтрация ip: 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 0.0.0.0/0, 0.0.0.0
  • Хранение нескольких версий реестра (--rollback)
  • Вывод изменений в реестре (--diff)
  • DNS резолвинг доменов из реестра в ipv4 и ipv6 адреса
  • Вывод списка актуальных ip, url, domain и истории запросов

Требования:

Python версии 3.4.0 и выше

Установленные пакеты: peewee, lxml, suds-jurko, psycopg2, dnspython

Установка:

  1. unzip blacklist-rkn-tool.zip -d /opt

  2. chmod a+x /opt/blacklist-rkn-tool/bl-rkn.py

  3. Установите пакеты:

     pip3 install peewee lxml suds-jurko dnspython
    

    Для работы достаточно установить один Database Adapter, для типа БД который будет использоваться (SQLite установлен по умолчанию):

     apt install libpq-dev
     pip3 install psycopg2   #для PostgreSQL
    

    Установить все пакеты:

     pip3 install -r requirements.txt
    
  4. Запустите скрипт, затем отредактируйте bl-rkn.cfg

  5. Настройте запуск по cron

    19 */3 * * *  root  /usr/bin/python3 /opt/blacklist-rkn-tool/bl-rkn.py --dump   
    #права root нужны для подписи запроса с использованием rutoken
    
  6. Для отправки писем:

    sudo apt-get install postfix

Запуск:

python3 bl-rkn.py

После первого запуска скрипта будет создан файл конфигурации bl-rkn.cfg.

Ключи:

--url показать список URL
--ip показать список ip
--domain показать список доменов
--history показать список запросов на получение дампа
--help, -h краткая справка
--bt атрибут реестра blockType [default, ip, domain, domain-mask]  
--dump получить последний дамп
--rollback 0 - последняя версия дампа, 1 - предпоследняя и т.д.
--diff 0 - изменения дампа относительно предыдущей версии дампа
--stat 0 - статистика по последней версии дампа
--resolve - принудительно запускает DNS резолвинг последней версии дампа
--version, -v версия скрипта

Файл конфигурации:

bl-rkn.cfg

[DataBase]
Type = 0 # 0 - SQLite, 1 - PostgreSQL
Name = blacklist # имя БД, для SQLite имя файла, без расширения
Host = localhost
Port = 5432
User = user
Password = password

[Log]
LogCount = 7 #количество файлов для ротации логов
LogRotate = midnight # время ротации s - секунды, h - часы, d - дни
LogInterval = 1 # если LogRotate = h, LogInterval = 2, тогда ротация лога будет каждые 2 часа
LogPathFName = /opt/bl-rkn/bl-rkn.log # имя и путь log файла

[Notify]
Notify = 0 # не отправлять письмо при изменении в реестре
Auth = 0 # не использовать авторизацию на почтовом сервере
Server = mail.domain.ru # адрес почтового сервера
Port = 25 # порт почтового сервера
StartTLS = 0 # шифрование
Login = [email protected] # логин для почтового сервера
Password = 159753 # пароль для почтового сервера
Subject = vigruzki.rkn.gov.ru ver. 2.2 update # тема письма
From = [email protected] # адрес отправителя
To = [email protected] # адрес получателя

[Request]
GenerateRequest = 0 # 1 - генерировать запрос .xml и .xml.p7s автоматически нужен usb ключ Rutoken
OperatorName = ООО "Телеком" # параметры необходимые для создания файла запроса актуально,
inn = 1234567890             # если GenerateRequest = 1
ogrn = 1234567890123         #
email = [email protected]      #
XMLPathFName = /opt/bl-rkn/request.xml # путь и имя файла запроса
P7SPathFName = /opt/bl-rkn/request.xml.p7s # путь и имя файла подписи
PEMPathFName = /opt/bl-rkn/cert.pem # сертификат подписи, актуально если GenerateRequest = 1
ID = 12345006000000007089123456789001 # id ключа в rutoken, актуально если GenerateRequest = 1

[History]
HistoryCount = 3000 # количество хранимых id запросов
DiffCount = 3 # количество версий реестра хранимых в БД, минимальное значение 1 

[Dump]
lastDumpDateUrgently = 1 # проверять новый дамп по параметру lastDumpDateUrgently
lastDumpDate = 1 # проверять новый дамп по параметру lastDumpDate (обновляется один раз в час)
DumpFileSave = 1 # сохранять дампы
DumpPath = # если не указано тогда сохранять дампы в директории скрипта/dumps/
GetResultMaxCount = 3 # количество попыток получения дампа

[Resolver]
Resolver = 1 # вкл. резолвинг доменов
IPv6 = 0 
DNS = 8.8.4.4 77.88.8.1

[OpenSSL]
Path =

Использование:

Получение полного списка для блокировки по url:

  1. Список url подлежащих блокировке

     bl-rkn.py --url
    
  2. Список доменов, где блокировка должна осуществлятся только по имени домена т.е. blockType = domain

     bl-rkn.py --domain --bt domain
    
  3. Список доменов, где блокировка должна осуществлятся только по маске домена т.е. blockType = domain-mask

     bl-rkn.py --domain --bt domain-mask
    
  4. Список ip, где блокировка должна осуществлятся только по ip адресам т.е. blockType = ip

     bl-rkn.py --ip --bt ip
    

Примеры использования аргументов коммандной строки --diff x, --rollback x, --stat x:

Количество версий реестра задается в конфигурации опцией DiffCount.

Когда аргумент --rollback не указан, что эквивалентно --rollback 0 и соответствует самой последней версии реестра.

Аргумент --diff 0 показывает разницу между поледней и предпоследней версией реестра, что позволяет сделать однократную полную выгрузку IP/URL/Domain в систему фильтрации трафика, а в дальнейшем выгружать только изменения в реестре, что позволяет экономить ресурсы и ускоряет обновление данных в системе фильтрации.
Разница отображается с помощью символов '+' и '-' перед IP/URL/Domain.

Пример однократной полной выгрузки IP/URL/Domain в систему фильтрации трафика и накат изменений в реестре:

У нас хранится три версии реестра т.е. DiffCount = 3

bl-rkn.py --rollback 2 --ip #вывод ip самой старой версии реестра [0, 1, 2]
bl-rkn.py --diff 1 --ip #изменения в предпоследней версии реестра
bl-rkn.py --diff 0 --ip #изменения последней версии реестра

В дальнейшем для поддержания реестра в актуальном состоянии достаточно после получения нового реестра выполнить:

bl-rkn.py --diff 0 --ip

Аргумент --stat x показывает подробную статистику изменений в реестре

bl-rkn.py --stat 0

Получение ip адресов методом разрешения доменных имен из реестра.

Включается когда в конфигурации Resolver = 1. Запускается автоматически после получения нового реестра

bl-rkn.py --dump

При отображении списка ip адресов, будет выведен результат работы резолвера:

bl-rkn.py --ip

Для получения списка ip из реестра, необходимо в конфигурации сделать Resolver = 0

Как показала практика количество ip адресов полученное методом разрешения доменных имен, почти в два раза меньше, чем в реестре.

Для PostgreSQL:

  • Запуск CLI:

      sudo -u postgres psql
    
  • Установить пароль для пользователя postgres:

      postgres=# \password postgres
    
  • Создать нового пользователя:

      CREATE USER blrkn WITH PASSWORD 'passwd' CREATEDB;
    

Оптимизация настроек сервера PostgreSQL:

mamonsu

pgtune

Документация PostgreSQL:

Документация PostgreSQL на русском языке

Книга Работа с PostgreSQL настройка и масштабирование

Видео администрирование PostgreSQL

Сравнение РСУБД

Примечания:

Описание процедуры получения реестра: http://vigruzki.rkn.gov.ru/docs/description_for_operators_actual.pdf

Версии 1.5.0 и выше не совместимы с предыдущими версиями blacklist-rkn-tool, создайте БД заново, перед этим экспортируйте таблицу history, а затем импортируйте в новую БД.

Обзор аналогов:

GNU GPL утилиты для блокировки сайтов:

nfqfilter

extfilter

Пообщаться с авторами утилит, получить ответы на вопросы forum.nag.ru

Gitter

blacklist-rkn-tool's People

Contributors

ksenz avatar prototype-x avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

blacklist-rkn-tool's Issues

Ошибка на пустой базе

Похоже, что не полная инициализация базы. На пустой базе вылетает эксепшн при попытке чтения Dump.get(Dump.param == 'webServiceVersion').value:

python3 bl-rkn.py --dump
Traceback (most recent call last):
  File "/home/maxim/.pyenv/versions/3.5.2/lib/python3.5/site-packages/peewee.py", line 3097, in get
    return next(clone.execute())
  File "/home/maxim/.pyenv/versions/3.5.2/lib/python3.5/site-packages/peewee.py", line 2271, in next
    obj = self.iterate()
  File "/home/maxim/.pyenv/versions/3.5.2/lib/python3.5/site-packages/peewee.py", line 2253, in iterate
    raise StopIteration
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "bl-rkn.py", line 631, in <module>
    main()
  File "bl-rkn.py", line 627, in main
    BlrknCLI()
  File "bl-rkn.py", line 561, in __init__
    self._get_dump()
  File "bl-rkn.py", line 569, in _get_dump
    srv_msg = self.dump.check_service_upd()
  File "/home/maxim/Dropbox/Python/ver3/blacklist-rkn-tool/core.py", line 42, in check_service_upd
    Dump.get(Dump.param == 'webServiceVersion').value,
  File "/home/maxim/.pyenv/versions/3.5.2/lib/python3.5/site-packages/peewee.py", line 4795, in get
    return sq.get()
  File "/home/maxim/.pyenv/versions/3.5.2/lib/python3.5/site-packages/peewee.py", line 3101, in get
    % self.sql())
db.DumpDoesNotExist: Instance matching query does not exist:
SQL: SELECT `t1`.`param`, `t1`.`value` FROM `dump` AS t1 WHERE (`t1`.`param` = %s)
PARAMS: ['webServiceVersion']

метод cleaner вызывает эксепшн

вызов метода

        if self.check_diff():
            self.cleaner()
            return 1

приводит к
pymysql.err.NotSupportedError: (1235, "This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")

"IndexError: list index out of range" in _url_dedup_sql on finish.

On console:

# /home/rkn/blacklist-rkn-tool/bl-rkn.py --dump
Traceback (most recent call last):
  File "/home/rkn/blacklist-rkn-tool/bl-rkn.py", line 653, in <module>
    main()
  File "/home/rkn/blacklist-rkn-tool/bl-rkn.py", line 649, in main
    BlrknCLI()
  File "/home/rkn/blacklist-rkn-tool/bl-rkn.py", line 581, in __init__
    self._get_dump()
  File "/home/rkn/blacklist-rkn-tool/bl-rkn.py", line 609, in _get_dump
    message = self.report.statistics_show()
  File "/home/rkn/blacklist-rkn-tool/bl-rkn.py", line 104, in statistics_show
    url_add_sql = self._url_dedup_sql(diff, 'ignore', 1)
  File "/home/rkn/blacklist-rkn-tool/bl-rkn.py", line 437, in _url_dedup_sql
    url_diff_sql = URL.select(fn.Distinct(URL.url)).where(URL.add == self.idx_list[diff])
IndexError: list index out of range

In logs:

2018-04-04 23:51:48,970  Starting script.
2018-04-04 23:51:49,160  Check database: PostgreSQL Ok
2018-04-04 23:51:51,078  Current versions: webservice: 3, dump: 2.2, doc: 4
2018-04-04 23:51:51,079  New webservice: 3.1
2018-04-04 23:51:51,083  New dumpFormatVersion: 2.3
2018-04-04 23:51:51,086  New docVersion: 4.8
2018-04-04 23:51:53,789  Send email from ... to ...
2018-04-04 23:51:53,790  Current webservice:3
New webservice: 3.1

Current dumpFormatVersion: 2.2
New dumpFormatVersion: 2.3

Current docVersion: 4
New docVersion: 4.8


2018-04-04 23:51:53,790  Check if dump.xml has updates since last sync.
2018-04-04 23:51:53,794  Current date: lastDumpDate: 2012-01-01 00:00:00, lastDumpDateUrgently: 2012-01-01 00:00:00
2018-04-04 23:51:53,794  Last date: lastDumpDate: 2018-04-04 22:56:00, lastDumpDateUrgently: 2018-04-04 22:56:00
2018-04-04 23:51:53,794  New dump is available.
2018-04-04 23:51:53,798  Sending request.
2018-04-04 23:51:55,735  Checking request status.
2018-04-04 23:51:55,735  Got code 245874f427a272a4deab875eba47fe24
2018-04-04 23:51:55,741  Save code in History
2018-04-04 23:51:55,744  Waiting for a 90 sec.
2018-04-04 23:53:25,823  Trying to get result...
2018-04-04 23:53:28,747  Got a dump ver. 2.3 for the ...
2018-04-04 23:53:28,811  Downloaded dump 6826514 bytes, MD5 hashsum: 53ab1e693f36707235bb42642e8f3941
2018-04-04 23:53:28,811  Unpacking.
2018-04-04 23:53:29,314  dump.xml already exists.
2018-04-04 23:53:30,345  Got updateTime: 1522893360.
2018-04-04 23:53:30,347  Got updateTimeUrgently: 1522893360.
2018-04-04 23:53:30,908  New Item, IP, Domain, URL id: 786432.
2018-04-04 23:53:31,020  New Item, IP, Domain, URL id: 786433.

...

2018-04-05 01:59:41,953  New Item, IP, Domain, URL id: 786430.
2018-04-05 01:59:42,059  New Item, IP, Domain, URL id: 786431.
2018-04-05 02:02:44,339  Dump cleaner run
2018-04-05 02:02:44,341  Item deleted: 0
2018-04-05 02:02:44,342  IP deleted: 0
2018-04-05 02:02:44,343  Domain deleted: 0
2018-04-05 02:02:44,345  URL deleted: 0
2018-04-05 02:02:44,347  History deleted: 1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.