Перейти к содержимому
Калькуляторы

Опубликована Процедура блокировки некошерной инфо

С тем, что сайт РКНа падает.

 

Пересоздал файл запроса и подписи. Все равно выдает вот то "некорректное значение". :( В ручном режиме все ок :(

Видимо они стали проверять параметры запроса version-id. Я уже отписался - выпала одна выгрузка, поправил версию на 2.1 - всё работает, но у меня perl... Версия не в коде запроса, а в самом запросе - доппараметр.

 

Для перла примерно так

my @sendresult = $service->sendRequest

$xmlreq,

$xmlreqsig,

"2.1"

);

 

 

Не помогло :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не помогло :(

К местным бегите, чтобы факт зафактить. Остальное в тп запретинфо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня пока все работает без проблем, с версией 2.0.

Но посмотрел логи, за последнюю неделю с десяток сбоев (таймаутов) было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не помогло :(

К местным бегите, чтобы факт зафактить. Остальное в тп запретинфо.

 

Так в ручном режиме все прекрасно прокатывает. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не помогло :(

К местным бегите, чтобы факт зафактить. Остальное в тп запретинфо.

 

Так в ручном режиме все прекрасно прокатывает. :)

 

Версию в запросе автоматом выбираете ? А в скрипте ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня тоже в запросе стоит 2.0, отдаёт 2.1

Из "памятки оператору..." в запросе sendRequest:

dumpFormatVersion

Версия формата, в котором запрашивается выгрузка. Актуальное значение должно быть «2.0» или «2.1». Даже при указании значения «2.0» выгрузка будет выдаваться в обновленном формате «2.1», так как изменения несущественные. В случае отсутствия на входе данного параметра выгрузка будет также выдаваться в формате «2.1»

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да вроде везде поправлено...

исходники скриптов покажите же

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня тоже в запросе стоит 2.0, отдаёт 2.1

Из "памятки оператору..." в запросе sendRequest:

dumpFormatVersion

Версия формата, в котором запрашивается выгрузка. Актуальное значение должно быть «2.0» или «2.1». Даже при указании значения «2.0» выгрузка будет выдаваться в обновленном формате «2.1», так как изменения несущественные. В случае отсутствия на входе данного параметра выгрузка будет также выдаваться в формате «2.1»

 

Ага, несущественные. версия 2.0 в запросе

./download.pl 0

LastDumpDate is not update, do not nothing

 

версия 2.1 в запросе - выгружает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

LastDumpDate is not update, do not nothing

заменить на LastDumpDate is not updated, do nothing

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ага, несущественные. версия 2.0 в запросе

./download.pl 0

LastDumpDate is not update, do not nothing

 

версия 2.1 в запросе - выгружает.

Только что попробовал в запросе версию 2.0:

11.03.2015 10:17:50 Register: Процесс получения выгрузки запущен.

11.03.2015 10:17:50 getLastDumpDateEx: Проверка обновления файла выгрузки на сервере...

11.03.2015 10:17:52 getLastDumpDateEx: Версии: веб-сервиса - 3.1, формата выгрузки - 2.1, памятки оператору связи - 4.2.

11.03.2015 10:17:52 getLastDumpDateEx: Есть срочное обновление выгрузки с временем внесения изменений: 10.03.2015 18:53:00.

11.03.2015 10:17:52 sendRequest: Предупреждение: формирование запроса и ЭЦП отключено.

11.03.2015 10:17:52 sendRequest: Регистрация запроса на получение выгрузки...

11.03.2015 10:17:52 sendRequest: запрос принят, код запроса: 040078..........cd1....

11.03.2015 10:21:12 getResult: Получение выгрузки из реестра...

11.03.2015 10:21:21 getResult: Успешно. Получена выгрузка за 11.03.2015 10:00:00. Изменения для незамедлительного реагирования: 10.03.2015 18:53:00. Записей: domain=7898, ip=12933, url=8654, ip subnet=0.

11.03.2015 10:21:21 getResult: Выгрузка засчитана оператору связи: ООО "компания", ИНН: 6......9.

11.03.2015 10:21:21 Register: Процесс завершен.

Все так, как обещали. Ищите косяк у себя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все так, как обещали. Ищите косяк у себя.

 

А я и не говорю что косяк. Реестр выгружается. Обозвал для себя это фичей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

исходники скриптов покажите же

 

zapret_cheker.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yegorov.p@gmail.com

from xml.etree.ElementTree import ElementTree
from datetime import datetime
from zapretinfo import ZapretInfo
import time
import zipfile
from base64 import b64decode
import argparse
import os.path
import logging

parser = argparse.ArgumentParser(add_help=True, description='Downloads list of restricted websites')
parser.add_argument("-r", "--request", action="store", required=True, type=str,
                   help="full path to request.xml file")
parser.add_argument("-s", "--signature", action="store", required=True, type=str,
                   help="full path to digital signature file (in PKCS#7 format)")
parser.add_argument("-l", "--log", action="store", required=False, type=str,
                   default='rkn_dump.log',
                   help="log filename")

args = parser.parse_args()

XML_FILE_NAME = args.request
P7S_FILE_NAME = args.signature
LOG_FILE_NAME = args.log

logging.basicConfig(filename=LOG_FILE_NAME, filemode='a',
                   format=u'%(asctime)s  %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info('Starting script.')
logger.info('Check if dump.xml already exists.')
if os.path.exists('dump.xml'):
   logger.info('dump.xml already exists.')
   data = ElementTree().parse("dump.xml")

   dt = datetime.strptime(data.attrib['updateTime'][:19], '%Y-%m-%dT%H:%M:%S')
   updateTime = int(time.mktime(dt.timetuple()))
   logger.info('Got updateTime: %s.', updateTime)

   dt = datetime.strptime(data.attrib['updateTimeUrgently'][:19], '%Y-%m-%dT%H:%M:%S')
   updateTimeUrgently = int(time.mktime(dt.timetuple()))
   logger.info('Got updateTimeUrgently: %s.', updateTimeUrgently)

   fromFile = max(updateTime, updateTimeUrgently)
   logger.info('Got latest update time: %s.', fromFile)
else:
   logger.info('dump.xml does not exist')
   fromFile = 0

session = ZapretInfo()

logger.info('Check if dump.xml has updates since last sync.')
if max(session.getLastDumpDateEx().lastDumpDate, session.getLastDumpDateEx().lastDumpDateUrgently) / 1000 <> fromFile:
   logger.info('dump.xml has changed.')
   logger.info('Sending request.')
   request = session.sendRequest(XML_FILE_NAME, P7S_FILE_NAME, '2.1')
   logger.info('Checking request status.')
   if request['result']:
       code = request['code']
       logger.info('Got code %s', code)
       while 1:
           logger.info('Trying to get result...')
           request = session.getResult(code)
           if request['result']:
               logger.info('Got it! Saving dump.')
               with open('result.zip', "wb") as f:
                   f.write(b64decode(request['registerZipArchive']))

               try:
                   logger.info('Unpacking.')
                   zip_file = zipfile.ZipFile('result.zip', 'r')
                   zip_file.extract('dump.xml', '')
                   zip_file.extractall('./dumps/%s' % datetime.now().strftime("%Y-%m-%d %H-%M-%S"))
                   zip_file.close()
               except zipfile.BadZipfile:
                   logger.error('Wrong file format.')
               break

           else:
               if request['resultCode'] == 0:
                   logger.info('Not ready yet. Waiting for a minute.')
                   time.sleep(60)
               else:
                   logger.error(request['resultComment'].decode('utf-8'))
                   break
   else:
       logger.error(request['resultComment'].decode('utf-8'))
else:
   logger.info('No updates.')
logger.info('Script stopped.')

 

zapretinfo.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__version__ = "0.0.9"
__author__ = "yegorov.p@gmail.com"

import suds
from base64 import b64encode
import os

API_URL = "http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl"
# API_URL = "http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl"

class ZapretInfoException(RuntimeError):
   pass


class ZapretInfo(object):
   def getLastDumpDateEx(self):
       '''
       Оставлен для совместимости. Аналогичен getLastDumpDateEx, но возвращает только один
       параметр lastDumpDate.
       '''
       client = suds.client.Client(API_URL)
       result = client.service.getLastDumpDateEx()
       return result

   def getLastDumpDate(self):
       '''
       Метод предназначен для получения временной метки последнего обновления выгрузки из реестра,
       а также для получения информации о версиях веб-сервиса, памятки и текущего формата выгрузки.
       '''
       client = suds.client.Client(API_URL)
       result = client.service.getLastDumpDate()
       return result

   def sendRequest(self, requestFile, signatureFile, versionNum='2.1'):
       '''
       Метод предназначен для направления запроса на получение выгрузки из реестра.
       '''
       if not os.path.exists(requestFile):
           raise ZapretInfoException('No request file')
       if not os.path.exists(signatureFile):
           raise ZapretInfoException('No signature file')

       with open(requestFile, "rb") as f:
           data = f.read()

       xml = b64encode(data)

       with open(signatureFile, "rb") as f:
           data = f.readlines()

       if '-----' in data[0]:
           sert = ''.join(data[1:-1])
       else:
           sert = ''.join(data)

       sert = b64encode(sert)
       client = suds.client.Client(API_URL)
       result = client.service.sendRequest(xml, sert, versionNum)

       return dict(((k, v.encode('utf-8')) if isinstance(v, suds.sax.text.Text) else (k, v)) for (k, v) in result)

   def getResult(self, code):
       '''
       Метод предназначен для получения результата обработки запроса - выгрузки из реестра
       '''
       client = suds.client.Client(API_URL)
       result = client.service.getResult(code)

       return dict(((k, v.encode('utf-8')) if isinstance(v, suds.sax.text.Text) else (k, v)) for (k, v) in result)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ayf, если хотите, можете мне xmlку и ее подпись на yegorov.p@gmail.com отправить, так проще будет разобраться. В целом все выглядит нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то не пойму про blockType="domain". Это блокировка 100% по IP означает ? Ведь нигде не написано, это http имеется введу или https. Или каждую запись смотреть вручную и смотреть открывается ли по https ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то не пойму про blockType="domain". Это блокировка 100% по IP означает ? Ведь нигде не написано, это http имеется введу или https. Или каждую запись смотреть вручную и смотреть открывается ли по https ?

Я уже спрашивал: всем пофигу.

 

Для себя решил блокировать udp/timed для всего домена: :-)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то не пойму про blockType="domain". Это блокировка 100% по IP означает ? Ведь нигде не написано, это http имеется введу или https. Или каждую запись смотреть вручную и смотреть открывается ли по https ?

Глубже, ширше, тщательней... ;) Ибо:

<domain><![CDATA[site2.com]]></domain>

Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена.

 

Если данный атрибут отсутствует либо указано значение «default», то блокировка осуществляется по стандартным правилам.

Если указано значение «domain», то указатели страниц сайтов (URL) для данной реестровой записи будут отсутствовать, необходимо ограничить доступ к домену целиком.

Формально это означает блокировку и https, и ftp, и smtp/pop/imap, и ssh, и даже bittorent со всеми UDP... да и все виды туннелей тоже до кучи положено блокирнуть, если они поднимаются с указанием запрещенного домена.

 

То есть фактически придется перехватывать и подменять запросы к DNS -- другого пути я не вижу.

Если чуть ранее РКН разъяснял, что самостоятельно резолвить домены в URL-ах нельзя, то в случае тега domain чисто технически придется делать ровно наоборот. Причем полностью и наглухо.

 

И насколько я понимаю, формально можно НЕ блокировать ДРУГИЕ домены даже на ЯВНО указанных в записи реестра IP-адресах, если блокируем ЯВНО ЖЕ указанный в теге записи ДОМЕН.

Это технически несколько упрощает задачу НЕблокирования невинно пострадавших сайтов на том же IP -- причем без наличия DPI и раскопок до уровня конкретных URL.

 

Очень вероятно, что здесь упущены какие-то конкретные случаи коллизий и противоречий, давайте выявлять и обсуждать.

Потому что даже в тестовой выгрузке (Приложение 1 Памятки, пример XML-файла) первые же три секции нарушают формально памятку, т.к. содержат одновременно И domain, И URL. Конечно, если не имелось ввиду, что подчеркнутое выше в цитате относится не целиком к реестровой записи в тегах <content>, а только лишь к строчке <domain>, где тупо не будет указания протокола и пути до конкретной странички.

Изменено пользователем Ansy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена.

Речь идет о сайтах. Сайты у нас работают по http и по https, Всё прочие это не сайты, а другие сервиса.

Изменено пользователем AdmSasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена.

Речь идет о сайтах. Сайты у нас работают по http и по https, Всё прочие это не сайты, а другие сервиса.

139 ФЗ

"13) сайт в сети "Интернет" - совокупность программ для электронных вычислительных машин и иной информации, содержащейся в информационной системе, доступ к которой обеспечивается через сеть "Интернет" по доменным именам и (или) по сетевым адресам, позволяющим идентифицировать сайты в сети "Интернет";"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не зря номер 13) сайт в сети "Интернет" - что-то там ... позволяющим идентифицировать сайты в сети "Интернет".

Честно говоря, бред это. Это не к Rivia притензия.

 

Так возвращаясь к вопросу. Как РКН требует блокировать по доменам ? Кто должен отрезольвить домен и через какой DNS сервер (вражеским google dns серверам доверять можно ?) Как часто обновлять DNS запись? Да и не понятен механизм блокировки...

Изменено пользователем AdmSasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена.

Речь идет о сайтах. Сайты у нас работают по http и по https, Всё прочие это не сайты, а другие сервиса.

Да ладно?

Картинко

ftp://dlink.ru -- навскидку, вполне себе открывается браузерами. Вполне себе сайт.

 

Ну нет там HTML-форматирования, ну и ладно... браузер и сам умеет отрисовать каталоги.

Для некоторых видов информации так даже удобнее ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То есть фактически придется перехватывать и подменять запросы к DNS -- другого пути я не вижу.

Погодите. Так блокировка по домену это: что-то://*.domain.ru/*, я не прав ? Какой адрес резольвить ? host1.domain.ru или host2.domain.ru ?

 

Да ладно?
Это сервис FTP. Не важно, что он похож на что либо. Но как тут уже заметили, моё определение в любом случае не верное)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так возвращаясь к вопросу. Как РКН требует блокировать по доменам ? Кто должен отрезольвить домен и через какой DNS сервер (вражеским google dns серверам доверять можно ?) Как часто обновлять DNS запись? Да и не понятен механизм блокировки...

В том и фокус, что домен из реестра НЕ НАДО РЕЗОЛВИТЬ. Можно просто дропнуть запрос на резолв, и это прокатит.

Ну, по желанию, в 127.0.0.1. Или в 46.61.208.33 (это zapret-info.gov.ru).

Чисто локально у себя. Никаким DNS-серверам доверять и не нужно. И обновлять не надо... localhost можно даже в коде константой увековечить ;)

 

Механизм блокировки... ну, не знаю, сканить по Layer7 содержимое UDP-запросов на 53-й порт и подходящие тупо дропать или заворачивать на любой подконтрольный DNS с заглушкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно просто дропнуть запрос на резолв, и это прокатит.

Я плохо представляю как это возможно вообще сделать, если не свой dns сервер. Как то на SCE это делается ? И какой запрос искать hosts1.domain.ru или hosts2.domain.ru это же разные запросы. Не могу же я сказать, "iptables блокируй *.domain.ru" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.