Большая часть взята отсюда
https://www.evernote.com/shard/s185/sh/ceb0b021-47e7-4c61-ab43-bc6db27fe919/c535b6e5047ec69d304519fe81c2c9ac?noteKey=c535b6e5047ec69d304519fe81c2c9ac¬eGuid=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¬eGuid=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