Выгрузка реестра запрещенных сайтов РосКомНадзора Howto

Большая часть взята отсюда
https://www.evernote.com/shard/s185/sh/ceb0b021-47e7-4c61-ab43-bc6db27fe919/c535b6e5047ec69d304519fe81c2c9ac?noteKey=c535b6e5047ec69d304519fe81c2c9ac&noteGuid=ceb0b021-47e7-4c61-ab43-bc6db27fe919

Установка:
iptables ipset

Блокировка выполняется с помощью iptables и утилиты ipset
в iptables установлено правило:

iptables -v -I FORWARD -m set --match-set blacklist src -j DROP

Которое берет ip адреса и списка «blacklist» ,созданного в ipset, и содержащего ip адреса для блокировки. ну и собственно дропает все пакеты проходящие через шлюз с этих ip

Работа с ipset:

Установка

apt-get install ipset

В ipset нет таблиц, а есть set различных типов. Типы позволяют задавать ip адреса из определенной подсети (ipmap тип), связки ip адресов с MAC адресами (macipmap), порты из заданного диапазона (portmap), набор ip адресов или сетей (iphash, nethash), разные комбинации этих set-ов, или даже хранить ip адреса в set только определенное время (iptree). Более подробно советую посмотреть man ipset(8).

Для нашей задачи подходит тип iphash

Создаем (N -new) set с именем blacklist, и смотрим его содержимое:

ipset -N blacklist iphash
ipset -L blacklist
Name: blacklist
Type: hash:ip
Revision: 0
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16480
References: 0
Members:

Добавляем (A — add) ip адреса blacklist и смотрим (L — list) содержимое set:

# ipset -A blacklist 192.168.0.211

Удаляем ip адреса из blacklist set (D — delete):

# ipset -D blacklist 192.168.0.222

Проверяем, есть ли ip в blacklist set (T — test):

ipset -T blacklist 10.10.0.23

Удаляем все ip адреса из blacklist set (F — flush):

# ipset -F blacklist

Удаляем сам set (X):

# ipset -X blacklist

Правило в iptables имеет такой синтаксис:

iptables -v -I FORWARD -m set --match-set blacklist src -j DROP

модуль set (-m set), потом указали какое совпадение set использовать (—match-set blacklist). src — это флаг, который показывает какие ip сравнивать с set, src (source — источник) или dst (destination — назначение) . Если нужно проверить и src и dst, то флаг задается так src,dst.

openssl

На сервере создаем папку в корне: /gost-ssl
ставим openssl(1.0.1c) на этой версии точно работает:

http://www.openssl.org
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

apt-get install libccid libpcsclite1 pcscd libtool
apt-get install zip

Правим конфиг /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

если используем руТокен (флешку с эцп), то необходимо средствами КриптоПро скопировать ключевой контейнер в реестр с возможность экспорта. Чудные товарищи из КриптоПро, ссылаясь на требования ФСБ, не поддерживают экспорт в формате PKCS#12 (сертификат + закрытый ключ), но экспорт осуществить можно при помощи: P12FromGostCSP.zip

Подключаем USB flash устанавливаем триал крипто-про -> запускаем -> владка сервис -> кнопка Просмотреть сертификаты в контейнере -> выбираем флешку -> ОК -> Установить

Пользуясь вышеуказанной утилитой выгружаем сертификат в формате PCKS#12 и кидаем его в /gost-ssl/rzs/

P12FromGostCSP -> Выбираем сертификат из списка (должен содержать название нашей организации) -> ОК -> сохраняем в нужную директорию

проверяем, что у нас нормальный (содержит сертификат и закрытый ключ) 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/

если все впоряде, то идем дальше…

Автоматизация:

Есть уже несколько наработок бравых парней сообщества.
Во всех случаях в системе не хватает необходимых компонентов

apt-get install libxml-twig-perl
apt-get install libxml-simple-perl
apt-get install xmlstarlet

4. Ну и собственно SOAP, Syslog…у кого чего ) у меня лично их небыло

cpan -i SOAP::Lite
cpan -i Sys::Syslog

Берем скрипты из темы и кидаем их в /gost-ssl/rzs
Даем права на выполнение и добавляем в крон

Как работает скрипт:

block.sh удаляет файлы созданные при предыдущей выгрузке (dump.xml,dump.xml.sig,file.zip)
после этого запускает скрипт download.pl который создает и пописывает файл запроса
далее запускает скрипт download1.pl который отправляет файл запроса роскомнадзору и через минуту забирает архив с дампом
block.sh распаковывает файл архива и выбирает из него IP адреса, сохраняя в файл IP.txt
построчно выбирая ip из списка блочит их с помощью IP set

Коды скриптов:
block.sh

#!/bin/bash
homedir=/gost-ssl/rzs

ipset -N blacklist iphash # создает список blacklist если не создн
ipset -F blacklist # очищает список на случай если какие либо ip были удалены из реестра

rm $homedir/dump.xml
rm $homedir/dump.xml.sig
rm $homedir/file.zip

$homedir/download.pl
echo Создал файл запроса xml и подписал его, ждем минуту пока роскомнадзор примет и обработет запрос
$homedir/download1.pl
echo Cкачал файл дампа
sleep 1

cd $homedir
unzip $homedir/file.zip -d $homedir
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"  $homedir/dump.xml |sort|uniq >$homedir/ip.txt

cat $homedir/ip.txt| while read line
do
echo "$line" 
sudo ipset -A blacklist $line
echo ОК
done
cut -c 60-97 $homedir/dump.xml >> /gost-ssl/rzs/dumpdate.txt #Создает файл для отправки отчета на почту о выгрузка за сутки (почту отправляет другой скрипт раз в сутки в 8:00 по крону он приведен в конце статьи)
cut -c 60-97 $homedir/dump.xml >> /var/log/roskomnadzor.log # создает логфайл о всех выгрузках
echo $dumpdate
echo

download.pl

#!/usr/bin/perl -w

use strict;
use SOAP::Lite;
use MIME::Base64;
use Sys::Syslog qw(:DEFAULT setlogsock);

my %n;
($n{sec},$n{min},$n{hour},$n{mday},$n{mon},$n{year},$n{wday},$n{yday},$n{isdst}) = localtime(time());
$n{year}+=1900;
$n{mon}++;
$n{mon}=~s/^(\d)$/0$1/;
$n{mday}=~s/^(\d)$/0$1/;
$n{hour}=~s/^(\d)$/0$1/;
$n{min}=~s/^(\d)$/0$1/;
$n{sec}=~s/^(\d)$/0$1/;
my $dt="$n{year}-$n{mon}-$n{mday}T$n{hour}:$n{min}:$n{sec}.000+04:00";

        open (XMLREQ, ">/gost-ssl/rzs/request.xml");
        print XMLREQ "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\n";
        print XMLREQ "<request>\n\t<requestTime>$dt</requestTime>\n";
        print XMLREQ "\t<operatorName>Компания ВИСМ</operatorName>\n";
        print XMLREQ "\t<inn>3662140823</inn>\n\t<ogrn>1093668005034</ogrn>\n";
        print XMLREQ "\t<email>mail</email>\n</request>\n";
        close XMLREQ;

    system ("/gost-ssl/bin/openssl smime -sign -in /gost-ssl/rzs/request.xml -out /gost-ssl/rzs/request.bin".
            " -signer /gost-ssl/rzs/provider.pem -outform DER -nodetach");

download1.pl

#!/usr/bin/perl -w

   use MIME::Base64;
   use SOAP::Lite;

   undef $/;

   open REQ,'</gost-ssl/rzs/request.xml';
   $req = <REQ>;
   close REQ;
   encode_base64($req);

   open SIG,'</gost-ssl/rzs/request.bin';
   $sig = <SIG>;
   close SIG;

   $dfv = '2.0';

   $soap = SOAP::Lite->service('http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl');
   $a = $soap->getLastDumpDate();
   @a = $soap->sendRequest($req, $sig, $dfv);

   while(1) {
        sleep 60;
        @b = $soap->getResult($a[2]);
        last if $b[2] ne 0;
   }

   if($b[2] eq 1){
        open ZIP,'>/gost-ssl/rzs/file.zip';
        print ZIP decode_base64($b[1]);
        close ZIP;
   }

Скрипт отправки почты:

homedir=/gost-ssl/rzs
echo "Реестр роскомнадзора скопирован" | mail -s "Выгрузка роскомнадзора" user@domain.ru </gost-ssl/rzs/dumpdate.txt
rm $homedir/dumpdate.txt

 

Большая часть взята отсюда
https://www.evernote.com/shard/s185/sh/ceb0b021-47e7-4c61-ab43-bc6db27fe919/c535b6e5047ec69d304519fe81c2c9ac?noteKey=c535b6e5047ec69d304519fe81c2c9ac&noteGuid=ceb0b021-47e7-4c61-ab43-bc6db27fe919

Установка:
iptables ipset

Блокировка выполняется с помощью iptables и утилиты ipset
в iptables установлено правило:

iptables -v -I FORWARD -m set --match-set blacklist src -j DROP

Которое берет ip адреса и списка «blacklist» ,созданного в ipset, и содержащего ip адреса для блокировки. ну и собственно дропает все пакеты проходящие через шлюз с этих ip

Работа с ipset:

Установка

apt-get install ipset

В ipset нет таблиц, а есть set различных типов. Типы позволяют задавать ip адреса из определенной подсети (ipmap тип), связки ip адресов с MAC адресами (macipmap), порты из заданного диапазона (portmap), набор ip адресов или сетей (iphash, nethash), разные комбинации этих set-ов, или даже хранить ip адреса в set только определенное время (iptree). Более подробно советую посмотреть man ipset(8).

Для нашей задачи подходит тип iphash

Создаем (N -new) set с именем blacklist, и смотрим его содержимое:

ipset -N blacklist iphash
ipset -L blacklist
Name: blacklist
Type: hash:ip
Revision: 0
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16480
References: 0
Members:

Добавляем (A — add) ip адреса blacklist и смотрим (L — list) содержимое set:

# ipset -A blacklist 192.168.0.211

Удаляем ip адреса из blacklist set (D — delete):

# ipset -D blacklist 192.168.0.222

Проверяем, есть ли ip в blacklist set (T — test):

ipset -T blacklist 10.10.0.23

Удаляем все ip адреса из blacklist set (F — flush):

# ipset -F blacklist

Удаляем сам set (X):

# ipset -X blacklist

Правило в iptables имеет такой синтаксис:

iptables -v -I FORWARD -m set --match-set blacklist src -j DROP

модуль set (-m set), потом указали какое совпадение set использовать (—match-set blacklist). src — это флаг, который показывает какие ip сравнивать с set, src (source — источник) или dst (destination — назначение) . Если нужно проверить и src и dst, то флаг задается так src,dst.

openssl

На сервере создаем папку в корне: /gost-ssl
ставим openssl(1.0.1c) на этой версии точно работает:

http://www.openssl.org
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

apt-get install libccid libpcsclite1 pcscd libtool
apt-get install zip

Правим конфиг /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

если используем руТокен (флешку с эцп), то необходимо средствами КриптоПро скопировать ключевой контейнер в реестр с возможность экспорта. Чудные товарищи из КриптоПро, ссылаясь на требования ФСБ, не поддерживают экспорт в формате PKCS#12 (сертификат + закрытый ключ), но экспорт осуществить можно при помощи: P12FromGostCSP.zip

Подключаем USB flash устанавливаем триал крипто-про -> запускаем -> владка сервис -> кнопка Просмотреть сертификаты в контейнере -> выбираем флешку -> ОК -> Установить

Пользуясь вышеуказанной утилитой выгружаем сертификат в формате PCKS#12 и кидаем его в /gost-ssl/rzs/

P12FromGostCSP -> Выбираем сертификат из списка (должен содержать название нашей организации) -> ОК -> сохраняем в нужную директорию

проверяем, что у нас нормальный (содержит сертификат и закрытый ключ) 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/

если все впоряде, то идем дальше…

Автоматизация:

Есть уже несколько наработок бравых парней сообщества.
Во всех случаях в системе не хватает необходимых компонентов

apt-get install libxml-twig-perl
apt-get install libxml-simple-perl
apt-get install xmlstarlet

4. Ну и собственно SOAP, Syslog…у кого чего ) у меня лично их небыло

cpan -i SOAP::Lite
cpan -i Sys::Syslog

Берем скрипты из темы и кидаем их в /gost-ssl/rzs
Даем права на выполнение и добавляем в крон

Как работает скрипт:

block.sh удаляет файлы созданные при предыдущей выгрузке (dump.xml,dump.xml.sig,file.zip)
после этого запускает скрипт download.pl который создает и пописывает файл запроса
далее запускает скрипт download1.pl который отправляет файл запроса роскомнадзору и через минуту забирает архив с дампом
block.sh распаковывает файл архива и выбирает из него IP адреса, сохраняя в файл IP.txt
построчно выбирая ip из списка блочит их с помощью IP set

Коды скриптов:
block.sh

#!/bin/bash
homedir=/gost-ssl/rzs

ipset -N blacklist iphash # создает список blacklist если не создн
ipset -F blacklist # очищает список на случай если какие либо ip были удалены из реестра

rm $homedir/dump.xml
rm $homedir/dump.xml.sig
rm $homedir/file.zip

$homedir/download.pl
echo Создал файл запроса xml и подписал его, ждем минуту пока роскомнадзор примет и обработет запрос
$homedir/download1.pl
echo Cкачал файл дампа
sleep 1

cd $homedir
unzip $homedir/file.zip -d $homedir
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"  $homedir/dump.xml |sort|uniq >$homedir/ip.txt

cat $homedir/ip.txt| while read line
do
echo "$line" 
sudo ipset -A blacklist $line
echo ОК
done
cut -c 60-97 $homedir/dump.xml >> /gost-ssl/rzs/dumpdate.txt #Создает файл для отправки отчета на почту о выгрузка за сутки (почту отправляет другой скрипт раз в сутки в 8:00 по крону он приведен в конце статьи)
cut -c 60-97 $homedir/dump.xml >> /var/log/roskomnadzor.log # создает логфайл о всех выгрузках
echo $dumpdate
echo

download.pl

#!/usr/bin/perl -w

use strict;
use SOAP::Lite;
use MIME::Base64;
use Sys::Syslog qw(:DEFAULT setlogsock);

my %n;
($n{sec},$n{min},$n{hour},$n{mday},$n{mon},$n{year},$n{wday},$n{yday},$n{isdst}) = localtime(time());
$n{year}+=1900;
$n{mon}++;
$n{mon}=~s/^(\d)$/0$1/;
$n{mday}=~s/^(\d)$/0$1/;
$n{hour}=~s/^(\d)$/0$1/;
$n{min}=~s/^(\d)$/0$1/;
$n{sec}=~s/^(\d)$/0$1/;
my $dt="$n{year}-$n{mon}-$n{mday}T$n{hour}:$n{min}:$n{sec}.000+04:00";

        open (XMLREQ, ">/gost-ssl/rzs/request.xml");
        print XMLREQ "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\n";
        print XMLREQ "<request>\n\t<requestTime>$dt</requestTime>\n";
        print XMLREQ "\t<operatorName>Компания ВИСМ</operatorName>\n";
        print XMLREQ "\t<inn>3662140823</inn>\n\t<ogrn>1093668005034</ogrn>\n";
        print XMLREQ "\t<email>mail</email>\n</request>\n";
        close XMLREQ;

    system ("/gost-ssl/bin/openssl smime -sign -in /gost-ssl/rzs/request.xml -out /gost-ssl/rzs/request.bin".
            " -signer /gost-ssl/rzs/provider.pem -outform DER -nodetach");

download1.pl

#!/usr/bin/perl -w

   use MIME::Base64;
   use SOAP::Lite;

   undef $/;

   open REQ,'</gost-ssl/rzs/request.xml';
   $req = <REQ>;
   close REQ;
   encode_base64($req);

   open SIG,'</gost-ssl/rzs/request.bin';
   $sig = <SIG>;
   close SIG;

   $dfv = '2.0';

   $soap = SOAP::Lite->service('http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl');
   $a = $soap->getLastDumpDate();
   @a = $soap->sendRequest($req, $sig, $dfv);

   while(1) {
        sleep 60;
        @b = $soap->getResult($a[2]);
        last if $b[2] ne 0;
   }

   if($b[2] eq 1){
        open ZIP,'>/gost-ssl/rzs/file.zip';
        print ZIP decode_base64($b[1]);
        close ZIP;
   }

Скрипт отправки почты:

homedir=/gost-ssl/rzs
echo "Реестр роскомнадзора скопирован" | mail -s "Выгрузка роскомнадзора" s.tyuniaev@vism.ru </gost-ssl/rzs/dumpdate.txt
rm $homedir/dumpdate.txt

Ссылки на файлы:

openssl-1-0-1c-tar
block.sh
download.pl
download1.pl
p12fromgostcsp
rzs