вторник, 22 декабря 2015 г.

Кто устережет сторожей?

Когда вот с такими инициативами:

http://lenta.ru/news/2015/12/22/protectinfo/

выступают представители власти - это, по меньшей мере, понятно - представители власти по определению имеют лица, не изуродованные интеллектом.

Но когда подобные заявления делают так называемые "представители IT-индустрии" - а Касперская наверняка считает себя таковой - возникают сомнения в их профессиональной пригодности и компетентности.

Я объясню на пальцах тем, кто не врубается.

Представьте себе, что в вашей стране - исключительно в целях безопасности! - приняли следующий закон:

При покупке любым гражданином любого замка в любых целях этот любой гражданин обязан в срок 24 часа сдать один из ключей своему участковому по месту своей прописки с ярлыком, на котором указан точный адрес квартиры и место замка, где он будет установлен. Исключительно в целях безопасности!

Вы - лично вы! - готовы - исключительно в целях безопасности! - подчиниться подобному закону? Вам ведь абсолютно нечего скрывать от власти, которая действует исключительно в целях безопасности и ко всеобщему благу?

Впрочем, теперь ведь вам всем -даже самым тупым - наверняка понятно, кто такие чета Касперских? И что надо делать с одноименными продуктами, не правда ли?

воскресенье, 20 декабря 2015 г.

Вы не лучше

Знаете, мальчики и девочки, что я заметил?

Что прыщиксы, которые так любят кричать "Вендекапец" и "Фак животворящий" и онанирующие на исходники, ничем не лучше виндузятников.

Я уже несколько лет наблюдаю, как зачуханные техно-снобы-гики-типа-одмины, гнущие пальцы на форумах, в рассылках и приватных гадюшниках демонстрируют щенячью беспомощность в элементарных вопросах.

Показываю пруф:


Перевожу на русский: человек, называющий себя системным администратором Линукс, устанавливает софт из репозитория (использование репозиториев подобными особями homo само по себе отдельная песня), спотыкается о тривиальный - о, нет, даже не скрипт! - о тривиальный файл сервиса, который пишется за 30 секунд одной рукой, и даже нагуглить руководство не способен.

К слову, файл, о котором идет речь:

 [Unit]  
 Description=Squid Cache Service  
 After=syslog.target  
   
 [Service]  
 ExecStart=/usr/lib/systemd/scripts/init.squid start  
 ExecStop=/usr/lib/systemd/scripts/init.squid stop  
 Restart=on-abort  
   
 [Install]  
 WantedBy=multi-user.target  

Хочется спросить - вам, с*ки, не стыдно гнуть пальцы перед виндузятниками, которых вы обвиняете в установке софта по принципу Next->Next->Next->Next, если вы сами не способны не то, чтобы простенький скрипт на шелле написать, а ставите софт по принципу yum install и не в состоянии простейшие проблемки на своей, как вы восторженно говорите, оси решить, не задавая идиотских вопросов себе подобным? Вы вообще уверены, что вы - IT-специалисты?

Я уже молчу, как я однажды лично был свидетелем организации групповой работы линуксятниками. Открытый блокнот, запущенный тимвьювер, и совместный доступ к этому самому блокноту. 21 век!

Как я вижу, интеллектуальная деградация уже не только пользователей захлестнула. Но и тех, кто по роду деятельности обязаны быть оборудованы функционирующим головным мозгом.

среда, 2 декабря 2015 г.

Здравствуй, Северная Корея

Забавную новость я сегодня узнал:

http://www.computerworld.kz/news/9466/

На случай, чтобы были записаны все ходы, я просто оставлю это здесь:



Перевожу заголовок на обычный русский для тех, кто не понимает и не хочет понимать технических деталей:

С 1 января 2016 года весь шифрованный трафик в Казахстане будет расшифровываться и перлюстрироваться

Это не только прямо противоречит конституции, но и приведет к масштабным утечкам якобы зашифрованных соединений и, как следствие, содержащейся в них информации.

Если, конечно, это правда - так как в казастанских новостях нет абсолютно ни звука, равно как и на сайте Казахтелекома. Закон приняли абсолютно втихую.

Вы готовы поделиться абсолютно всей информацией, включая детали транзакций интернет-банкингов, приватной перепиской, приватными чатами, и другими деталями своей приватной жизни - с АиС и КНБ, причем безо всяких санкций суда?

Я - не готов. Помимо того, что это приведет к масштабным техническим проблемам и может прикончить интернет в Казахстане как таковой - черт бы с ним, с интернетом - это прямое нарушение прав граждан. Вообще, правительства после такого обычно в полном составе уходят в отставку и назначаются досрочные перевыборы. Ну так, между нами говоря. В порядке бреда.

Технические детали

Следует иметь в виду следующее. Речь идет о технологии SSL Bump, которая прозрачным для пользователя образом позволяет дешифровать большинство SSL-туннелей (следует читать TLS, конечно), перлюстрировать их содержимое, и зашифровывать обратно. Особенно уязвимы системы с однослойным шифрованием, т.е. большинство социальных сетей, часть IM, все интернет-банкинги с веб-доступом, и тому подобное. Системы с многослойным шифрованием, с высокой вероятностью, будут просто блокироваться. Отдельный вопрос заключается в возможности использования VPN и SSH. Данная технология не позволяет расшифровывать данные туннели, а блокирование подобного трафика может оказаться фатальным для бизнеса и безопасности администрирования.

Не следует считать, что АиС затевает все это из человеколюбия и для безопасности граждан. Нет. Прежде всего это решение нацелено на тотальную прослушку и слив плюс масштабное накопление критичных данных граждан в Big Data.

Однако есть и хорошие новости.
  1. При правильной реализации TLS выполнение SSL Bump невозможно в принципе
  2. Соединения с certificate pinning взломать нельзя, они будут просто рваться
  3. OCSP-stapling будет невозможен
И я бы очень хотел посмотреть, что эта фигня будет делать с HTTP/2.

Даже в масштабах мало-мальски крупной локальной сети внедрение подобной технологии вызывает ураганные проблемы. В масштабах же всей страны......трудно сказать. Пробуйте.

UPDATE

Коллеги мне подсказывают, что господа из АиС, проживая в собственном мирке розовых пони и радуги по укурке, как-то упустили из виду, что существует в мире не только Андроиды и айфончики. А также огромное количество устройств, которые по своей природе не предусматривают установок каких-либо корневых сертификатов. От слова "совсем".  И которые никто, по вашему желанию, выкидывать или заменять на милый вашему сердцу Андроид, просто не станет. Также в мире, кроме Windows, существуют и другие системы. Ну и, наконец, есть большое количество реально применяемого ПО, которые не используют системных хранилищ сертификатов. Например, Java - да-да, та самая, которая повсеместно нужна для eGovernment, налоговых, всевозможных банкингов. Тоже пошаговые инструкции напишете? Касательно Андроидов - господа из АиС вообще в курсе, что очень многие версии требуют ввода пароля при каждом использовании самодельных сертификатов? Кто-нибудь вообще проводил натурный эксперимент хотя бы в масштабах мало-мальски большой и гибридной локальной сети, прежде, чем пилить и откатывать замахиваться на такую, прямо скажем, технически нереальную и противозаконную деятельность? Вы хотя бы ознакомились с идущей уже два года перепиской профессионалов, которые пытались нечто подобное реализовывать в собственных локальных сетях? Ну так, чтобы прочухать, чем пахнут спелые фиги? А пахнут они фигово. Причем это еще крошечные масштабы. А в рамках страны...

Вы хотя бы на минутку подумали, к каким последствиям приведет утечка - намеренная или по вашей технической безграмотности - приватного ключа вашего национального сертификата после того, как он встанет в каждое устройство? Ибо в вашу техническую компетентность и чистоту помыслов я ни на одну секунду не поверю. Вы потом будете затыкать дыры собственными частями тела, выплачивать прямой и косвенный ущерб - в масшабах страны, отвечать на чертовски неудобные вопросы избирателей? Вы уже определились, кто будет козлом отпущения в результате весьма вероятных и очень неприятных последствий?

UPDATE 2

Гениям с обратным знаком, желающим, несмотря ни на что, вытереть ноги об статью 18 параграф 2 Конституции РК (ну, кстати, и аналогичных статей некоторых других конституций) рекомендую прочесть пару ссылок (надеюсь, вы читать еще умеете?), где умные люди - не чета вам, кстати - все уже сказали:

http://lenta.ru/articles/2015/12/09/ogo/

http://www.gazeta.ru/comments/2015/12/09_e_7945307.shtml

http://www.gazeta.ru/tech/2015/12/09/7945475/you-shall-not-block-messengers.shtml

http://www.gazeta.ru/tech/2015/11/19/7902119/terrorists-vs-cryptography.shtml

Для тех, кто совсем тупой и еще тупее тупого, объясняю на пальцах. Такая ситуация уже была - в области владения граждан огнестрельным оружием. Ограничения преступников не остановили ни на секунду ни в одной стране, но обезоружили граждан в области защиты. В точности то же самое произойдет и с криптографией. Но история - она ведь учит ровно трижды, третий раз для особенно тупых - контрольный в башку. Жаль, что на четвертый дебилов естественный отбор не забирает.

воскресенье, 8 ноября 2015 г.

Solaris: Сборка libevent 2.1.x 64 бита

Как минимум, libevent используется для Tor и Unbound. И, в принципе, можно было бы взять ее из репозитория OpenCSW, но вот беда - там старая библиотека. Мягко говоря. Это вообще беда подавляющего большинства публичных репозиториев - там лежит тухлятина. Которая обновляется раз в пятилетку.

Единственная возможность - взять на сайте свежую версию и собрать. 

Однако матерых соляристов поджидает один сюрприз. 

2.0.x собирается, все хорошо. Со всеми опциями. А вот 2.1 подхватывает старый openssl (0.9.7), который штатно включен в Солярис.

Можно, конечно, отключить поддержку SSL. Но вот как раз для двух вышеуказанных софтов этого делать и не следует, поскольку именно им поддержка эта как раз и нужна.

Вопрос: Как собрать libevent на Солярис с правильной версией openssl?

Ответ: Есть хинт, как это сделать.

Для начала нужно взять openssl из OpenCSW - там он относительно свежий, но, самое главное - он там дуальный, 32 и 64 бита.

Дело за малым: правильно сконфигурировать libevent перед компиляцией.

 # 32 bit GCC (for 2.1.x)  
 ./configure 'CFLAGS=-O3 -m32 -mtune=native -pipe' 'CPPFLAGS=-I/opt/csw/include' 'PKG_CONFIG_PATH=/opt/csw/lib/pkgconfig'  
 # 64 bit GCC (for 2.1.x)  
 ./configure 'CFLAGS=-O3 -m64 -mtune=native -pipe' 'CPPFLAGS=-I/opt/csw/include' 'PKG_CONFIG_PATH=/opt/csw/lib/pkgconfig'  
   
 gmake && gmake install-strip  
   
 # 64 bit CC (for 2.1.x)  
 # PKG_CONFIG_PATH должен указывать в директорию pkgconfig с нужной версией openssl (для Solaris)  
 export CC=`which cc`  
 ./configure 'CFLAGS=-xO5 -m64 -xtarget=native' 'CPPFLAGS=-I/opt/csw/include' 'PKG_CONFIG_PATH=/opt/csw/lib/pkgconfig'  
   
 make && make install-strip  
   

Пояснение. pkg-config на Солярис по умолчанию идет за библиотеками в /usr/lib/pkgconfig. Где - сюрприз! - лежит описание только старой версии openssl (штатной). Хотя конфигуратор libevent и не содержит документированного параметра PKG_CONFIG_PATH, его можно и нужно задать, направив в директорию CSW вашего сервера, где лежит описание правильной версии openssl (которую вы установили из репозитория).

Вот и все, ребята!

PS. И не забудьте перекомпилировать весь софт, который использует libevent.

пятница, 30 октября 2015 г.

Squid на Windows: мобильная экономия

Вы сколько угодно можете выпендриваться, говоря, "У нас в Москве безлимит стоит 400 рублей в месяц и мне западло даже думать о кэшировании! И вообще, сквид умер и нафиг не нужен!", но это ровно до тех пор, как вам взбрендится воспользоваться LTE/3G/GPRS - не всем повезло жить в Нерезиновой. :) (Но даже и в этом случае - в кризис да и обычно выживают чаще жлобы, чем транжиры).

Не знаю и знать не хочу, как там у вас, в Монстрополисе в Нерезиновой, но повсюду в мире интернет дорогой. Особенно не пиринговый. Особенно мобильный - безлимитные тарифы есть в считанных странах (по пальчикам одной руки черепашки-мутанта).

В остальных странах так называемый безлимит - это курнадцать гигабайт на полной скорости, обычно только облизнуться, а потом - 64/128 кбит. Сосать тырмыз. Да.

Обычные пользователи лезут за бумажником, скорбно вздохнув и матюкнув жлобство ОТПСОСов, но интеллигентные люди чешут репу и припоминают Polipo или, вообще, кэширование всуе.

Мы, однако, не настолько мазохисты и вкрации вкратце, ёпто, вкратце! (Учите родной язык, мать вашу так за ногу, дышлом крещеную!) напишем РУКОВОДСТВО ДЛЯ ЖЛОБОВ.

Как сэкономить на трафике мобильного девайса - общие положения

В случае ноутбука, оснащенного свистком для мобилиздеца, у вас есть два основных пожирателя трафика. Это DNS (описано ранее, как его нужно кэшировать) и HTTP/HTTPS (вот тут вам всякие шибздики типа Polipo нифига не в помощь, HTTPS кэшировать - это вам не хрен сосать в сырую погоду).

Соответственно, у вас, красноглазого, две задачи:
  1. Закэшировать DNS (Unbound вам в помощь)
  2. Закэшировать HTTP/HTTPS
Расточители могут дальше не читать, дочеря и сыновья Рокфеллеров - тоже, а те, которые с красными глазками - добро пожаловать дальше.

В случае мобильного устройства (ноутбука) себя, любимого - кэширование антивирусных баз и обновлений Шиндошс не имеет смысла. Все остальное - по мере возможности по максимуму.

Как это сделать конкретно?

Обычные пользователи на этом месте валят смотреть "Звездные Войны". Дружно. Колонной по четыре. Идите дальше к остальным киборгам и платите 1,85. Боливару не снести двоих.

Красноглазым СЮДА.

Да. Сквид. Который - дабы он годился нам к употреблению - на Шиндошс x64 надо хитро настроить, чтобы: 

а) все летало
б) не улетало бабло
в) чтобы HTTPS тоже кэшить - ну, в большинстве случаев.

Предварительно устанавливаем и настраиваем DNS-кэш. И убеждаемся, что он у нас работает,

Особо продвинутые могут также снабдить свое мобильное устройство Torом и Privoxy, дабы вертеть на детородном органе всяческих запрещаторов и регуляторов - пшли бы они в трещину к ишаку. Видали мы их в гробу, в белых тапках. Мы сами решим, что нам вредно, а что полезно, без санитаров. :)

Вернемся, однако, к нашим баранАм.

Итак, мы тут упоминали HTTPS. Соответственно, понадобится корневой серт, которому мы будем верить.

Создадим его:

 # Создадим ключ, без шифрования и пароля  
 # Его, ежу понятно, надо оберегать  
 openssl genrsa -out rootCA.key 2048  
   
 # Подпишем его  
 openssl req -x509 -sha256 -new -nodes -config D:\OpenSSL-Win64\bin\openssl.cfg -key rootCA.key -days 10950 -out rootCA.crt  
   
 # Конвертируем в DER и установим на свою машину - везде, где он нужен  
 # Файлы ключа и сертификата отложим в сторону, для кэша  
 openssl x509 -in rootCA.crt -inform PEM -out rootCA.der -outform DER  
   

Установим Squid, который ранее скачали. Он будет установлен, добавлен в автоматический запуск сервисов, и запущен с умолчательной конфигурацией. Можно его сразу же остановить - это не то, что нам нужно:

 net stop squidsrv  

Положим сгенерированные сертификаты в директорию:


Не забудем сгенерировать DH-параметры:

 openssl dhparam -outform PEM -out dhparam.pem 2048  

и положим их туда же.

Теперь напишем в точности вот такой squid.conf и поместим в ту же директорию:
 # -------------------------------------  
 # ACL's  
 # -------------------------------------  
 acl localnet src 10.0.0.0/8     # RFC1918 possible internal network  
 acl localnet src 172.16.0.0/12     # RFC1918 possible internal network  
 acl localnet src 192.168.0.0/16     # RFC1918 possible internal network  
 #acl localnet src fc00::/7    # RFC 4193 local private network range  
 #acl localnet src fe80::/10   # RFC 4291 link-local (directly plugged) machines  
   
 acl SSL_ports port 443  
 acl SSL_ports port 8443  
 acl Safe_ports port 80          # http  
 acl Safe_ports port 21          # ftp  
 acl Safe_ports port 443          # https  
 acl Safe_ports port 70          # gopher  
 acl Safe_ports port 210          # wais  
 acl Safe_ports port 1025-65535     # unregistered ports  
 acl Safe_ports port 280          # http-mgmt  
 acl Safe_ports port 488          # gss-http  
 acl Safe_ports port 591          # filemaker  
 acl Safe_ports port 777          # multiling http  
 acl CONNECT method CONNECT  
   
 # No-cache ACLs  
 acl dont_cache dstdomain rulesofwargame.com imgur.com  
   
 # Privoxy+Tor acl  
 acl tor_url dstdom_regex "C:/Squid/etc/squid/url.tor"  
   
 # -------------------------------------  
 # Access parameters  
 # -------------------------------------  
 # Deny requests to unknown ports  
 http_access deny !Safe_ports  
   
 # Deny CONNECT to other than SSL ports  
 http_access deny CONNECT !SSL_ports  
   
 # Only allow cachemgr access from localhost  
 http_access allow localhost manager  
 http_access deny manager  
 http_access deny to_localhost  
   
 # Rule allowing access from your local networks.  
 # Adapt localnet in the ACL section to list your (internal) IP networks  
 # from where browsing should be allowed  
 http_access allow localnet  
 http_access allow localhost  
   
 # Cache directives  
 cache deny dont_cache  
   
 # Disable alternate protocols  
 reply_header_access Alternate-Protocol deny all  
 # Disable HSTS  
 reply_header_access Strict-Transport-Security deny all  
 reply_header_replace Strict-Transport-Security max-age=0; includeSubDomains  
 # Normalize Vary to reduce duplicates  
 reply_header_access Vary deny all  
 reply_header_replace Vary Accept-Encoding  
   
 # SSL bump rules  
 sslproxy_cert_error allow all  
 acl DiscoverSNIHost at_step SslBump1  
 ssl_bump peek DiscoverSNIHost  
 acl NoSSLIntercept ssl::server_name_regex -i "C:/Squid/etc/squid/url.nobump"  
 acl NoSSLIntercept ssl::server_name_regex -i "C:/Squid/etc/squid/url.tor"  
 ssl_bump splice NoSSLIntercept  
 ssl_bump bump all  
   
 # Privoxy+Tor access rules  
 never_direct allow tor_url  
   
 # And finally deny all other access to this proxy  
 http_access deny all  
   
 # -------------------------------------  
 # HTTP parameters  
 # -------------------------------------  
   
 # Local Privoxy is cache parent  
 cache_peer 127.0.0.1 parent 8118 0 no-query no-digest default  
   
 cache_peer_access 127.0.0.1 allow tor_url  
 cache_peer_access 127.0.0.1 deny all  
   
 # Don't cache 404 long time  
 negative_ttl 5 minutes  
   
 # -------------------------------------  
 # Cache parameters  
 # -------------------------------------  
 # Squid normally listens to port 3128  
 #       dhparams=     File containing DH parameters for temporary/ephemeral  
 #               DH key exchanges. See OpenSSL documentation for details  
 #               on how to create this file.  
 #               WARNING: EDH ciphers will be silently disabled if this  
 #                     option is not set.  
 http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/rootCA.crt key=/etc/squid/rootCA.key options=NO_SSLv3 dhparams=/etc/squid/dhparam.pem  
 sslproxy_cafile /etc/ssl/certs/ca-bundle.trust.crt  
 sslproxy_options NO_SSLv3,SINGLE_DH_USE  
 sslproxy_cipher EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:HIGH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS  
 sslcrtd_program /lib/squid/ssl_crtd -s /var/cache/squid_ssldb -M 4MB  
   
 # Turn off collect per-client statistics  
 client_db off  
   
 # Hide internal networks details outside  
 via off  
 forwarded_for delete  
   
 pipeline_prefetch 4  
 reload_into_ims on  
   
 # Do not show Squid version  
 httpd_suppress_version_string on  
   
 # Specify local DNS cache  
 dns_nameservers 127.0.0.1  
   
 visible_hostname cthulhu_jr  
   
 dns_v4_first on  
   
 # -------------------------------------  
 # Store parameters  
 # -------------------------------------  
 # Uncomment and adjust the following to add a disk cache directory  
 cache_dir ufs C:/squid/var/cache 8192 16 256  
   
 # -------------------------------------  
 # Memory parameters  
 # -------------------------------------  
 cache_mem 256 Mb  
 maximum_object_size_in_memory 2 Mb  
 maximum_object_size 4 Gb  
   
 # -------------------------------------  
 # Tuning parameters  
 # -------------------------------------  
 memory_replacement_policy heap GDSF  
 cache_replacement_policy heap LFUDA  
   
 # Default is 20  
 store_objects_per_bucket 128  
   
 # Shutdown delay before terminate connections  
 shutdown_lifetime 1 second  
   
 # -------------------------------------  
 # Process/log parameters  
 # -------------------------------------  
 # Access log  
 access_log daemon:C:/squid/var/logs/access.log squid  
   
 logfile_rotate 0  
   
 # Cache log  
 cache_log C:/squid/var/logs/cache.log  
   
 # Store log  
 cache_store_log none  
   
 # Leave coredumps in the first cache dir  
 coredump_dir /var/cache/squid  
   
 # Buffered logs. Default is off  
 buffered_logs on  
   
 strip_query_terms off  
   
 # -------------------------------------  
 # Content parameters  
 # -------------------------------------  
 quick_abort_min 100 KB  
 quick_abort_max 1 MB  
 quick_abort_pct 80  
   
 # Keep swf in cache  
 refresh_pattern -i \.swf$     10080     100%     43200     override-expire reload-into-ims ignore-private  
 # .NET cache  
 refresh_pattern -i \.((a|m)s(h|p)x?)$          10080     100%     43200     reload-into-ims ignore-private  
 # Other long-lived items  
 refresh_pattern -i \.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico|svg|webp|flv|f4f|mp4|ttf|eot|woff)(\?.*)?$     14400     99%     518400      override-expire ignore-reload reload-into-ims ignore-private ignore-must-revalidate  
 refresh_pattern -i \.((cs|d?|m?|p?|r?|s?|w?|x?|z?)h?t?m?(l?)|(c|x|j)ss|js(t?|px)|php(3?|5?)|rss|atom|vr(t|ml))(\?.*)?$     10080     90%     86400     override-expire override-lastmod reload-into-ims ignore-private ignore-must-revalidate  
 # Default patterns  
 refresh_pattern -i (/cgi-bin/|\?)     0     0%     0  
 refresh_pattern     .     0     20%     10080     override-lastmod reload-into-ims ignore-private  
 ##  
 #nonhierarchical_direct off  
 #debug_options ALL,0 44,2 11,2  
 ##  

Файл url.tor:

 torproject.*  
 archive\.org.*  
 livejournal\.com.*  
 #wordpress\.com.*  
 #youtube.*  
 #ytimg.*  
 #googlevideo.*  
 #google.*  
 #googleapis.*  
 #googleusercontent.*  
 #gstatic.*  
 #gmodules.*  
 #blogger.*  
 #blogspot.*  
 #facebook.*  
 #fb.*  
   
и файл url.nobump:
 localhost  
 # ICQ  
 icq\.com  
 icq\.net  
 mrim\.mail\.ru  
 # Docs/Clouds  
 e\.mail\.ru  
 docs\.mail\.ru  
 cloud\.mail\.ru  
 drive\.google\.com  
 disk\.yandex\.ru  
 # Banking  
 # WU (Squid 3.5.x and above with SSL Bump)  
 # Only this three sites must be spliced.  
 fe1\.update\.microsoft\.com\.akadns\.net  
 fe2\.update\.microsoft\.com\.akadns\.net  
 fe2\.update\.microsoft\.com  
 # Mozilla services  
 services\.mozilla\.com  

и запустим наш Squid с новыми конфигурациями:
 net start squidsrv  

Осталась мелочь. Настроить нашу машину на использование прокси:


Если вы все сделали правильно, то в логах, разумеется, после прогрева кэша, будет примерно следующее:


а ваш провайдер недополучит примерно 30-40% (в среднем) денег за тот же самый объем трафика (по моей личной статистике - до 50-60%).

И если у вас установлен правильно настроенный Tor Bundle и Privoxy, то в access.log будут вот такие записи при обращении:

 1446552738.421  8015 127.0.0.1 TCP_TUNNEL/200 68644 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.647 10617 127.0.0.1 TCP_TUNNEL/200 136911 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.808  8401 127.0.0.1 TCP_TUNNEL/200 23501 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.969  8605 127.0.0.1 TCP_TUNNEL/200 30266 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552739.131  8687 127.0.0.1 TCP_TUNNEL/200 2796 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552740.910  8015 127.0.0.1 TCP_TUNNEL/200 7841 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
   

И - да, вы имеете полноценный HTTPS-прокси с бампом, который должен показывать для всех сайтов (кроме списка url.nobump) примерно следующее:


Да, в качестве корневого сертификата должен быть корневой сертификат вашего прокси, который вы ранее сгенерировали и установили. Сечете, о чем я? 

PS. Продвинутым красноглазым хочу напомнить - кэш не только экономит ваши деньги, но и защищает. Если вы удосужились настроить ваш локальный кэш DNS с DNSSEC. получаете для него данные через DNSCrypt, и ваш локальный кэширующий прокси снабжен Tor - то вы весьма нешуточно усиливаете вашу защиту от всяких нехороших парней.

PPS. А теперь приняли таблетки и марш в палату! Параноики живут дольше - мы бережем себе подобных! :)

вторник, 27 октября 2015 г.

Squid: SSL Bump и Windows Update

Администраторы новых версий Squid - 3.5.x и 4.x.x - неожиданно для себя выяснили, что Windows Update с использованием SSL Bump не работают.

Для Squid 3.4.x проблема решалась относительно просто. Достаточно было вычислить все IP-диапазоны авторизационных серверов MS, добавить их в ACL no-bump, и порядок. Ну, и время от времени, обновлять эти диапазоны по необходимости. В какой-то момент обеспечивалось достаточное перекрытие сетей MS и бОльшая часть обновлений кэшировалась, а проблем у клиентов не возникало.

С новыми версиями Squid, однако, картинка не настолько радостная. no-bump по dst уже не работает, так как используется принципиально иная алгортимтическая схема peek-n-splice.

И, для того, чтобы выполнить no-bump, а, точнее, splice, нужно указывать не IP, а имя сервера/серверов.

Допустим, что вы - умная маша, сделали sniffing сессии WU, и увидели некоторые адреса авторизационных серверов до получения ошибки WindowsUpdate_80072F8F или чего-то подобного. Вы видите IP, скажем, 191.234.72.190. Делаете реверсивный запрос - обана! - и получаете примерно вот это:


Чешете репу и пытаетесь запихнуть адрес в no-bump. Опа! - не работает.

Все просто, мальчики и девочки. Вам нужно добавить в ACL splice всего три сервера:
 fe1.update.microsoft.com.akadns.net  
 fe2.update.microsoft.com.akadns.net  
 fe2.update.microsoft.com  

Сделайте так. Напишите файл url.nobump:

 # WU (Squid 3.5.x and above with SSL Bump)  
 # Only this three sites must be spliced.  
 fe1\.update\.microsoft\.com\.akadns\.net  
 fe2\.update\.microsoft\.com\.akadns\.net  
 fe2\.update\.microsoft\.com  

Добавьте его в свой squid.conf в группу правил SSL Bump:

 acl DiscoverSNIHost at_step SslBump1  
 acl NoSSLIntercept ssl::server_name_regex -i "/usr/local/squid/etc/url.nobump"  
 ssl_bump splice NoSSLIntercept  
 ssl_bump peek DiscoverSNIHost
 ssl_bump bump all  

Все. Ошибка ушла навсегда. Вам больше не надо вылавливать сети MS, используя сниффер и tcpiputils.com

Одно предупреждение напоследок: Часть обновлений Windows может не кэшироваться ввиду попадания CDN на адреса диапазонов данных серверов. Я вас предупредил.

UPDATE

Не совсем все. Как оказалось, WU в некоторых случаях все еще использует в стартовых соединениях HTTPS с сайферами, использующими RC4 и 3DES. Если вы сконфигурировали свой набор сайферов на прокси по рекомендациям Мозиллы, вы рискуете получить ошибку  WindowsUpdate_80072F8F снова и сразу в момент начала процесса обновления. Чтобы избежать этого, вам необходимо модифицировать список используемых сайферов прокси сделующим образом:

 sslproxy_cipher HIGH:MEDIUM:RC4:3DES:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS  

Такой же набор надо выбрать и на стороне прокси, обращенной к клиенту:

 http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/squid/etc/rootCA2.crt key=/usr/local/squid/etc/rootCA2.key cafile=/usr/local/squid/etc/rootCA12.crt options=SINGLE_ECDH_USE tls-dh=prime256v1:/usr/local/squid/etc/dhparam.pem cipher=HIGH:MEDIUM:RC4:3DES:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS  

среда, 14 октября 2015 г.

Solaris: DNSCrypt High Availability

Хотя возможность использования DNSCrypt в отказоустойчивой конфигурации (в сочетании с кэширующим DNS), в общем, известна, большинство пользователей, не умея писать скрипты, с нетерпением ждут окошечной гуёвой версии отказоустойчивого DNSCrypt.

Между тем, все достаточно просто.

Честно говоря, мне было лениво писать для Solaris настоящий отказоустойчивый SMF, с non-default instances, поэтому я поступил немного проще.

Так как dnscrypt-proxy демонстрирует завидную стабильность как сервис, то я просто тупо и цинично написал SMF из трех файлов, позволяющий запустить перед Unbound любое произвольное число пиров dnscrypt, на разных прослушивающих портах.

Предварительно соберем dnscrypt-proxy из исходников в 64 битах (напоминаю, что пререквизитами являются libsodium и libevent):

 После сборки libsodium в /usr/local/lib и ПЕРЕД сборкой dnscrypt необходимо (Solaris):  
   
 # 32 bit  
 crle -u -l /usr/local/lib  
 crle -u -l /opt/csw/lib  
 crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/lib:/opt/csw/lib  
   
 # 64 bit  
 crle -64 -u -l /usr/local/lib  
 crle -64 -u -l /opt/csw/lib/64  
 crle -64 -c /var/ld/64/ld.config -l /lib/64:/usr/lib/64:/usr/local/lib:/opt/csw/lib/64:/usr/sfw/lib/64  
   
 и лишь затем делать ./configure && gmake && gmake install-strip  
   
 Также может потребоваться установка libevent (если ее еще нет в системе).  
   
 # 32 bit GCC  
 ./configure 'CFLAGS=-O3 -m32'  
   
 # 64 bit GCC  
 ./configure 'CFLAGS=-O3 -m64'  
   
 gmake && gmake install-strip  


Затем напишем три файла.



  • /etc/dnscrypt.conf
 # Base dnscrypt installation directory  
 BASE_DIR="/usr/local"  
   
 # Local address  
 LOCAL_ADDRESS="127.0.0.1"  
   
 # Active requests  
 # Default 250  
 ACTIVE_REQUESTS=4096  
   
 # Specify resolvers names from list.  
 # HA option. List element: <resolver_name>:<local_peer_port>  
 RESOLVERS="4armed:5551 cloudns-can:5552 cloudns-syd:5553 soltysiak:5554 dnsmachine.net-de:5555"  
   
 # Change full path to resolvers CSV if it in non-standard location or name  
 RESOLVERS_LIST="$BASE_DIR/share/dnscrypt-proxy/dnscrypt-resolvers.csv"  
   
 # TCP only flag. Leave empty if not set.  
 # Set to 1 for turn on (if UDP blocking).  
 # Beware, tcp only is SLOWER.  
 USE_TCP_ONLY=""  
   
 # A value below or equal to 512 will disable this mechanism,   
 # unless a client sends a packet with an OPT section providing a payload size.  
 EDNS_PAYLOAD_SIZE="4096"  
   
 # Ephemeral public keys for every query (1.5.x and above)  
 # Default is -E (enabled) or --ephemeral-keys  
 # Leave blank to disable  
 EPHEMERAL_KEYS="--ephemeral-keys"  
   
 # Log level.  
 # 0 - disable  
 LOG_LEVEL="0"  
 #####  

В переменной RESOLVERS задаются ресолверы из списка dnscrypt-resolvers.csv, в виде пары "имя:порт", где "порт" - значение локально прослушиваемого порта, куда будут смотреть настройки форвардинга локального кэширующего DNS. Сколько ресолверов зададите - такая степень отказоустойчивости и будет.
  • /var/svc/manifest/network/dnscrypt-ha.xml
 <?xml version="1.0"?>  
 <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">  
 <!--  Manifest-file for dnscrypt-ha, put this file in  
     /var/svc/manifest/network/dnscrypt-ha.xml   
     and run #svccfg import /var/svc/manifest/network/dnscrypt-ha.xml  
     Fixed by Yuri Voinov (C) 2007,2015  
 -->  
 <service_bundle type='manifest' name='dnscrypt-ha'>  
   
 <service  
     name='network/dnscrypt-ha'  
     type='service'  
     version='1'>  
   
     <create_default_instance enabled='false' />  
   
     <single_instance />  
   
     <dependency name='fs-local'  
         grouping='require_all'  
         restart_on='none'  
         type='service'>  
         <service_fmri  
             value='svc:/system/filesystem/local' />  
     </dependency>  
   
     <dependency name='net-loopback'  
         grouping='require_all'  
         restart_on='none'  
         type='service'>  
         <service_fmri value='svc:/network/loopback' />  
     </dependency>  
   
     <dependency name='net-physical'  
         grouping='require_all'  
         restart_on='none'  
         type='service'>  
         <service_fmri value='svc:/network/physical' />  
     </dependency>  
   
     <dependency name='utmp'  
         grouping='require_all'  
         restart_on='none'  
         type='service'>  
         <service_fmri value='svc:/system/utmp' />  
     </dependency>  
   
     <dependency name='dnscrypt-ha-config'  
         grouping='require_all'  
         restart_on='refresh'  
         type='path'>  
         <service_fmri value='file://localhost/etc/dnscrypt-ha.conf' />  
     </dependency>  
   
     <exec_method  
         type='method'  
         name='start'  
         exec='/lib/svc/method/init.dnscrypt-ha %m'  
         timeout_seconds='60'/>  
   
     <exec_method  
         type='method'  
         name='stop'  
         exec=':kill'  
         timeout_seconds='60' />  
   
     <exec_method  
         type='method'  
         name='restart'  
         exec='/lib/svc/method/init.dnscrypt-ha %m'  
         timeout_seconds='60' />  
   
     <property_group name='startd'  
         type='framework'>  
         <!-- sub-process core dumps shouldn't restart session -->  
         <propval name='ignore_error'  
           type='astring' value='core,signal' />  
     </property_group>  
   
     <property_group name='general' type='framework'>  
         <!-- to start stop squid -->  
         <propval name='action_authorization' type='astring'  
             value='solaris.smf.manage' />  
     </property_group>  
   
     <stability value='Unstable' />  
   
     <template>  
         <common_name>  
             <loctext xml:lang='C'>  
             dnscrypt HA service  
             </loctext>  
         </common_name>  
     </template>  
   
 </service>  
   
 </service_bundle>  

  • /lib/svc/method/init.dnscrypt-ha

И затем сам управляющий метод:

 #!/sbin/sh  
   
 #  
 # Control Method for dnscrypt-ha (/lib/svc/method/init.dnscrypt-ha)  
 # Written by Yuri Voinov (C) 2007,2015  
 #  
 # ident "@(#)dnscrypt-ha.sh  2.4  11/10/15 YV"  
 #  
   
 . /lib/svc/share/smf_include.sh  
 . /lib/svc/share/net_include.sh  
   
 #############  
 # Variables #  
 #############  
   
 # Config file, by default,  
 # finds in /etc. Lines, commented with #  
 # in config file, will be skipped  
 config_file="/etc/dnscrypt-ha.conf"  
   
 pid_base="/tmp"  
   
 #  
 # OS Commands location variables  
 #  
 CAT=`which cat`  
 CUT=`which cut`  
 ECHO=`which echo`  
 KILL=`which kill`  
 RM=`which rm`  
 UNAME=`which uname`  
   
 # OS release  
 OS_VER=`$UNAME -r|$CUT -f2 -d"."`  
 OS_NAME=`$UNAME -s|$CUT -f1 -d" "`  
   
 ###############  
 # Subroutines #  
 ###############  
   
 check_os ()  
 {  
  # Check OS version  
  if [ ! "$OS_NAME" = "SunOS" -a ! "$OS_VER" -lt "10" ]; then  
  $ECHO "ERROR: Unsupported OS $OS_NAME $OS_VER"  
  $ECHO "Exiting..."  
  exit 1  
  fi  
 }  
   
 startproc()  
 {  
 # Start dnscrypt daemons  
  program=$1  
  LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH  
  export LD_LIBRARY_PATH  
  for R in $RESOLVERS; do  
  port=`$ECHO $R|$CUT -f2 -d":"`  
  resolver=`$ECHO $R|$CUT -f1 -d":"`  
  pid_file=$pid_base/dnscrypt_ha_$port.pid  
  $DNSCRYPT_PATH/$program --daemonize --pidfile=$pid_file --local-address=$LOCAL_ADDRESS:$port --max-active-requests=$ACTIVE_REQUESTS $USE_TCP $RLIST --resolver-name=$resolver $EDNS $EPHEMERAL_KEYS --loglevel=$LOG_LEVEL  
  done  
 }  
   
 stopproc()  
 {  
 # Stop dnscrypt daemons  
  for R in $RESOLVERS; do  
  port=`echo $R|cut -f2 -d":"`  
  pid_file=$pid_base/dnscrypt_ha_$port.pid  
  $KILL -9 `$CAT $pid_file` && $RM $pid_file  
  done  
 }  
   
 ##############  
 # Main block #  
 ##############  
   
 # Check OS version  
 check_os  
   
 ##########################################################  
 # Check config file exists  
 if [ ! -f "$config_file" -o ! -s "$config_file" ]; then  
  $ECHO "ERROR: Config file not found or is empty."  
  $ECHO "Exiting..."  
  exit 1  
 else  
  # Source config file  
  . $config_file  
 fi  
 #### Check config contents  
 if [ -z "$LOCAL_ADDRESS" ]; then  
  # If local address is not specified, then set it to 127.0.0.1  
  LOCAL_ADDRESS="127.0.0.1"  
 fi  
 if [ ! -z "$USE_TCP_ONLY" ]; then  
  # If TCP flag specified, set option  
  USE_TCP="--tcp-only"  
 fi  
 if [ ! -z "$RESOLVERS_LIST" ]; then  
  # If non-standard location or list name is given, set option  
  RLIST="--resolvers-list=$RESOLVERS_LIST"  
 fi  
 if [ ! -z "$EDNS_PAYLOAD_SIZE" ]; then  
  # If EDNS payload size specified, set option  
  EDNS="--edns-payload-size=$EDNS_PAYLOAD_SIZE"  
 fi  
 # Set other variables  
 # dnscrypt files paths  
 DNSCRYPT_PATH="$BASE_DIR""/sbin"  
 # dnscrypt files  
 DNSCRYPT_BIN_FILE="dnscrypt-proxy"  
 # Check daemon installed  
 if [ ! -f "$DNSCRYPT_PATH/$DNSCRYPT_BIN_FILE" -a ! -x "$DNSCRYPT_PATH/$DNSCRYPT_BIN_FILE" ]; then  
  $ECHO "ERROR: DNSCrypt not found!"  
  $ECHO "Exiting..."  
  exit 1  
 fi  
 ##########################################################  
   
 case "$1" in  
 "restart")  
  stopproc $DNSCRYPT_BIN_FILE  
  startproc $DNSCRYPT_BIN_FILE  
  ;;  
 "start")  
  startproc $DNSCRYPT_BIN_FILE  
  ;;  
 "stop")  
  stopproc $DNSCRYPT_BIN_FILE  
  ;;  
 *)  
  $ECHO "Usage: $0 { start | stop | restart }"  
  exit 1  
 esac  
   
 exit 0  
 ####  

Осталось немного. Загрузить сервисный манифест командой:

 svccfg import /var/svc/manifest/network/dnscrypt-ha.xml  

и запустить сервис:

 svcadm enable dnscrypt-ha  

Убедимся, что пиры запущены:



Осталось лишь добавить записи о них в unbound.conf:

 forward-zone:  
  name: "."  
  forward-addr: 127.0.0.1@5551  
  forward-addr: 127.0.0.1@5552  
  forward-addr: 127.0.0.1@5553  
  forward-addr: 127.0.0.1@5554
  forward-addr: 127.0.0.1@5555

и перезапустить Unbound.

Для совсем ленивых есть полностью готовое решение с ленивчиками установки и удаления сервиса. :)

Замечание

DNSLeakTest будет вам показывать при тестировании сервера dnscrypt, через которые вы ходите, последовательно - так как Unbound обходит пиры форвардеров по round-robin:


так что не паникуйте, так и должно быть.

вторник, 13 октября 2015 г.

DNSSEC: Unbound + DNSCrypt proxy

Большинство из тех, кто использует связку Unbound+dnscrypt, обычно отключает валидацию DNSSEC в Unbound, так как считают, что она не будет работать через dnscrypt.

Это не совсем так. Вообще говоря, это совсем не так.

Если внимательно посмотреть на список ресолверов dnscrypt, то можно увидеть, что некоторое количество из них поддерживает DNSSEC. 

Следовательно, никто не мешает нам использовать DNSSEC. Что, в сочетании с встроенными в Unbound возможностями харденинга, несколько повышает защищенность нашей DNS-системы и опять-таки уменьшает вероятность намеренного отравления нашего DNS.

Итак, как мы это сделаем?

Всегда правой!

Конфигурирование dnscrypt

В настройках dnscrypt нужно выбрать те ресолверы, которые, во-первых, чаще находятся в онлайне (иначе получите непредсказуемые отказы вашей системы DNS), во-вторых, находятся ближе к вам по пингу и быстрее отвечают, и, в-третьих, те, которые поддерживают DNSSEC.

Например, dnsmachine.net-decloudns-cancloudns-syd или 4armed. Чуть позже мы рассмотрим вопрос отказоустойчивой конфигурации dnssec-пиров.

Учтите при выборе один факт. Ваша инфраструктура должна пропускать 443/UDP наружу с сервера, на котором выполняется dnscrypt. По данному порту происходит периодический запрос публичных ключей DNSSEC, во всяком случае у большинства серверов dnscrypt.

После изменения ресолвера (ресолверов) перезапустите ваш dnscrypt-proxy.

Конфигурирование Unbound

Для активации поддержки DNSSEC в Unbound необходимо раскомментировать (или убедиться, что они раскомментированы) следующие параметры:

      # module configuration of the server. A string with identifiers  
      # separated by spaces. "iterator" or "validator iterator"  
      module-config: "validator iterator"  
      # module-config: "iterator"  
   
      # File with trusted keys, kept uptodate using RFC5011 probes,  
      # initial file like trust-anchor-file, then it stores metadata.  
      # Use several entries, one per domain name, to track multiple zones.  
      #  
      # If you want to perform DNSSEC validation, run unbound-anchor before  
      # you start unbound (i.e. in the system boot scripts). And enable:  
      # Please note usage of unbound-anchor root anchor is at your own risk  
      # and under the terms of our LICENSE (see that file in the source).  
      auto-trust-anchor-file: "/usr/local/etc/unbound/root.key"  
   

Учтите одну вещь: auth-trust-anchor-file будет обновляться автоматически. Для того, чтобы этот процесс мог вообще происходить, необходимо разрешить пользователю, от которого исполняется Unbound, запись в директорию конфигурации Unbound.

Для этого нужно, чтобы владельцем всей директории рекурсивно был этот пользователь (включая root.key):


Если вы этого не сделаете, ключ не сможет автоматически обновляться Unbound'ом и, более того, ваш Unbound не сможет работать в режиме DNSSEC validation. Он будет просто падать с первым же запросом.

После завершения конфигурирования перезапустите Unbound.

Для тестирования конфигурации выполните команду:


      dig com. SOA +dnssec  

Вы должны увидеть следующее:


Чтобы окончательно убедиться, что все в порядке, можно найти в Гугле онлайновые тестировщики клиентского ресолвера:

http://dnssec.vs.uni-due.de/

https://dnssectest.sidnlabs.nl/test.php
Если последний тест показывает вам "Permissive mode", задайте в конфигурационном файле Unbound явно значение:

 val-permissive-mode: no  

Должно быть вот так:


That's all, folks!

пятница, 2 октября 2015 г.

Squid: Tor + Privoxy + transparent DNS redirect. Часть III

Ранее я уже писал, как организовать в рамках прокси-сервера торифицированный туннель для контролируемого пробивания разного рода блокировок:
В них, однако, совершенно не рассматривается вопрос (и многие это уже обнаружили) туннелирования HTTPS - соединений.

Суть в том, что для Squid версии 3.4.x это, к сожалению, невозможно. 

Говоря простым языком - HTTPS нельзя наравне с HTTP отправить в кэш-пир, в нашем случае - в туннель.

Совсем нельзя?

В настоящее время - уже можно. С некоторыми оговорками, однако - можно.

Введение


Проблема возникла в тот момент, когда повсюду стали переходить на HSTS. Я, возможно, еще скажу, почему я не считаю волосы на лобке значительной защитой против изнасилования. Хотя это и так очевидно любому, оборудованному головным мозгом.

Итак, два вопроса.

Через описанную ранее конфигурацию невозможно попасть на:

  • https://archive.org
  • https://torproject.org
в рамках нашего, отдельно взятого Мордора.

Может, это все же возможно?


Безусловно.

Два пререквизита.
  1. Вам потребуется Squid версии от 3.5.6 и выше (для версий ниже я не тестировал, ничего сказать не могу)
  2. SSL Bump придется отключить для всех HTTPS-сайтов (т.е. использовать splice), которые надо загонять в туннель (re-crypting, как сказал Амос, не поддерживается в текущих версиях)
Конфигурацию Squid следует скорректировать следующим образом (предполагается, что вы имеете настроенную конфигурацию с отлаженным SSL Bump):

 # Privoxy+Tor acl  
 acl tor_url dstdom_regex "C:/Squid/etc/squid/url.tor"  
   
 # SSL bump rules  
 sslproxy_cert_error allow all  
 acl DiscoverSNIHost at_step SslBump1  
 ssl_bump peek DiscoverSNIHost  
 acl NoSSLIntercept ssl::server_name_regex -i "C:/Squid/etc/squid/url.nobump"  
 acl NoSSLIntercept ssl::server_name_regex -i "C:/Squid/etc/squid/url.tor"  
 ssl_bump splice NoSSLIntercept  
 ssl_bump bump all  
   
 # Privoxy+Tor access rules  
 never_direct allow tor_url  
      
 # Local Privoxy is cache parent  
 cache_peer 127.0.0.1 parent 8118 0 no-query no-digest default  
   
 cache_peer_access 127.0.0.1 allow tor_url  
 cache_peer_access 127.0.0.1 deny all  
   

Замечание
Файлы utl.tor и url.nobump имеют одинаковый формат dstdom_regex. Обратите внимание, что url.tor имеет совпадающий формат с url.nobump и добавлен в ACL для splice.

Если все правильно, в access.log вы увидите следующее:

 1446552738.421  8015 127.0.0.1 TCP_TUNNEL/200 68644 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.647 10617 127.0.0.1 TCP_TUNNEL/200 136911 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.808  8401 127.0.0.1 TCP_TUNNEL/200 23501 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.969  8605 127.0.0.1 TCP_TUNNEL/200 30266 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552739.131  8687 127.0.0.1 TCP_TUNNEL/200 2796 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552740.910  8015 127.0.0.1 TCP_TUNNEL/200 7841 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
   

Вуаля:



Имел я господ цензоров противоестественным образом.

Заключение


До тех пор, пока в МарсТелеКомах нанимают на работу недоумков (по какому угодно признаку, кроме IQ и профессионализма) - нам не страшны никакие DPI. Привет анацефалам от сапиенсов!

среда, 30 сентября 2015 г.

Oracle Database: Disaster Recovery

Введение

Прошедшие 20 лет показали, что базы данных Oracle - вещь весьма надежная и, с использованием адекватных систем хранения (правильно построенных и администрируемых) крайне редко выходят из строя.

Однако такие факторы, как системные администраторы/администраторы баз данных - то есть человеческий фактор - никуда не делись и по-прежнему представляют собой угрозу.

Кроме того, один из самых разрушительных факторов - пожар - все еще является серьезной угрозой.

По моей личной статистике, наиболее частыми катастрофическими факторами для БД являются:

  1. Пожары, связанные с электросистемами
  2. Человеческий фактор
  3. Отказы дисковых систем, в том числе катастрофические - связанные как с предсказуемыми или непредсказуемыми отказами оборудования (отказ кондиционера в серверной - наиболее частая причина массового отказа дисков в массивах), ошибки системных администраторов (ошибочное удаление всей или части БД) с привилегированным доступом, множественный отказ дисков, сопряженный с недостаточно тщательным конфигурированием дисковой системы.
Все три случая довольно часто приводят к тому, что принято называть disaster.

Как защитить БД от катастрофических последствий и как восстановить ее в случае фатального повреждения или уничтожения?

Backup 

Для успешного восстановления в подобных случаях backup settings должны быть правильно заданы и база должна регулярно резервироваться.

Итак, определим задачу.

Допустим, что у нас есть круглосуточно работающая БД в режиме non-stop, которая в идеале работает в режиме 24x7 с минимальным допустимым временем простоя, достаточно большая, чтобы создать проблему простоя при холодном резервировании.

То есть мы не можем делать полные холодные бэкапы. 

Допустим также, что мы получили эту базу в наследство, в работающем состоянии. Архивация логов (ARCHIVELOG) включена, логи собираются, но бэкапы не делались или делались нерегулярно. 

Допустим, что нам надо предпринять все меры по защите от дизастера безотносительно версии БД.

Наша задача - определить подходящий график резервирования, задать его, обеспечить минимальное время восстановления и максимальную его полноту даже в случае внезапного и полного уничтожения основного сервера БД.

Следует выполнить некоторые подготовительные шаги:

  1. Необходимо определить точки монтирования и пути всех основных компонентов БД: файлов данных, redo logs, control files, и архивных логов. Эту информацию необходимо сохранить вне сервера БД и, желательно, вообще вне компьютера. Необходимо обеспечить сохранность этой информации и ее своевременную актуализацию.
  2. Необходимо сохранить конфигурационные файлы сетевой подсистемы (tnsnames.ora и listener.ora) вне сервера БД и также обеспечить их сохранность.
  3. Необходимо сохранить текущий файл параметров (pfile) в текстовом виде вне сервера БД.
  4. Необходимо определить и сохранить вне сервера БД идентификатор базы данных - DBID.
После этого можно приступать к определению стратегии резервирования, к ее детализации и к реализации выбранной стратегии. Стратегия выбирается по многим критериям, детали мы опустим, отмечу лишь, что факторами выбора является критичность БД для бизнеса, допустимая величина потерь, время простоя при восстановлении в случае отказа, и некоторые другие факторы.

В большинстве случаев необходимо определить точку монтирования, в которую будет происходить резервное копирование - обычно это место находится на сервере БД и оттуда происходит перенос резервных копий на ленту (как минимум ежедневный), туда же включается одна из точек назначения архивных логов, и автоматические бэкапы control files, включающие в себя файл параметров. Автобэкапы выполняются каждый раз при существенном изменении структуры БД и/или модификации файла параметров (spfile). 

Все эти данные необходимо переносить на ленту и обеспечить хранение этих данных вне серверной и (второй экземпляр) вообще вне офиса.

Вводная: в нашем гипотетическом случае БД работает круглосуточно, причем днем выполняется текущая активность - в том числе транзакционная - а в нерабочее время идут пакетные DML-задания и бОльшая часть отчетности. График основной активности (интерактивной) - 8x5. Остальная часть задач выполняется в течение оставшейся части суток. Раз в месяц идут крупные группы тяжелых отчетов.

Так как в данном случае остановка базы для выполнения холодных бэкапов не допускается,  и, допустим, что объем базы составляет 1 Тб, определим следующий график резервного копирования:

  1. Раз в неделю, в субботу в полночь, выполняется полный онлайновый бэкап нулевого уровня, являющийся основой для последующих инкрементальных бэкапов.
  2. В остальные дни недели, в полночь, выполняется создание инкрементальных бэкапов.
  3. Бэкапы выполняются с компрессией как backupsets, с включением в бэкап сеты архивных логов и с удалением архивных логов из точек назначения после архивирования для housekeeping.
  4. С целью уменьшения объема и ускорения создания инкрементальных бэкапов, на исходной базе активирован block change tracking file. Также в бэкап включаются и автобэкапы control-файлов.
Резервное копирование будем выполнять средствами RMAN, дабы не зависеть от работы OEM (он бывает достаточно ненадежен), заскриптуем задания и будем выполнять посредством cron по необходимому нам расписанию.

Напишем простой скрипт для резервного копирования:
 #!/usr/bin/sh  
 #  
 # Oracle RMAN backup script  
 # By Y.Voinov (c) 2014,2015  
 #  
   
 # Edit this variables according your installation  
 #ORACLE_BASE=/opt/oracle  
 ORACLE_BASE=/oracle  
 #ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1  
 ORACLE_HOME=$ORACLE_BASE/ora_home10g  
   
 PATH=$PATH:$ORACLE_HOME/bin  
 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib  
   
 export ORACLE_BASE ORACLE_HOME LD_LIBRARY_PATH PATH  
   
 # arg1 - backup type. 0 - full, 1 - incremental  
 backup_type=$1  
 # arg2 - Oracle SID  
 ORACLE_SID=$2  
 # arg3 - backup path. Must starts with / and without trailing /  
 backup_path=$3  
 # arg4 - SYS password  
 sys_pwd=$4  
   
 if [ -z "$backup_path" ]; then  
  echo "ERROR: Backup path not specified. Exiting..."  
  exit 2  
 elif [ -z "$sys_pwd" ]; then  
  echo "ERROR: SYS password is not specified. Exiting..."  
  exit 3  
 elif [ -z "$ORACLE_SID" ]; then  
  echo "ERROR: ORACLE_SID is not specified. Exiting..."  
  exit 4  
 fi  
   
 export ORACLE_SID  
   
 # Re-configure RMAN options  
 $ORACLE_HOME/bin/rman TARGET sys/$sys_pwd@$ORACLE_SID <<EOT  
 configure default device type to disk;  
 configure device type disk parallelism 1 backup type to compressed backupset;  
 configure channel device type disk format '$backup_path/db_%U_%t_%s.bk' maxpiecesize 8 G;  
 configure controlfile autobackup format for device type disk to '$backup_path/%F';  
 configure controlfile autobackup on;  
 EOT  
   
 # Do backup  
 if [ "$backup_type" = "0" ]; then  
 echo "Full DB backup level 0"  
 $ORACLE_HOME/bin/rman TARGET sys/$sys_pwd@$ORACLE_SID <<EOT  
 run{  
  backup as compressed backupset incremental level 0 cumulative tag 'Weekly_FULL_0_level_backup' database;  
  backup as compressed backupset tag 'Weekly_FULL_0_level_backup' archivelog all not backed up delete all input;  
  crosscheck backup;  
  delete noprompt expired backup;  
  }  
 EOT  
 elif [ "$backup_type" = "1" ]; then  
 echo "Incremental DB backup level 1"  
 $ORACLE_HOME/bin/rman TARGET sys/$sys_pwd@$ORACLE_SID <<EOT  
 run{  
  backup as compressed backupset incremental level 1 cumulative tag 'Daily_INC_1_level_backup' database;  
  backup as compressed backupset tag 'Daily_INC_1_level_backup' archivelog all not backed up delete all input;  
  crosscheck backup;  
  delete noprompt expired backup;  
  }  
 EOT  
 else  
  echo "ERROR: First argument must be 0 (full backup) or 1 (incremental). Exiting..."  
  exit 1  
 fi  
   
 unset ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH  
   
 exit 0  
 ########  

Скрипт написан с учетом необходимости housekeeping. Единственным его недостатком является тот факт, что пароль SYS задается из командной строки и на некоторых ОС может быть виден в выводе команды ps. В таком случае можно его модифицировать и задать пароль в теле скрипта, обеспечив необходимые права доступа с целью избежать утечки.

Напоминаю: в целях обеспечения сохранности бэкапов в случае дизастера, необходимо обеспечить как минимум ежедневный перенос бэкапов и их частей на ленту и надежное хранение этих лент вне серверной и вообще вне офиса.

Для гарантированного восстановления нам необходимо хранить все данные резервирования за 14 суток (не менее 2х бэкапов нулевого уровня плюс все инкрементальные между ними) + 1 день.

Таким образом, в данных бэкапов будут: файловые бэкапы, архивные логи, автобэкапы control-файлов и файла параметров. Также в бэкап стоит включить и хотя бы одну копию текущих архивных логов - в нашем случае они будут в интервале 1 суток.

Безусловно, необходимо обеспечить защиту redo - файлов (зеркалирование) на исходной БД. Однако, поскольку мы рассматриваем случай disaster recovery, считайте, что их у вас уже нет и не будет. То есть мы в подобной ситуации заранее миримся с потерей текущей транзакционной активности (в нашем случае максимум за сутки).

Restore and recovery

Для восстановления в случае фатальной катастрофы понадобится определенная последовательность действий:

  1. Необходимо иметь целевой сервер с точками монтирования либо путями, совпадающими с исходным сервером БД. (Технически это не обязательно, однако усложнит восстановление и потребуется больше времени на переименование, зачастую вручную. Обычно при фатальных отказах фактор времени критичен и, чем меньше будет ненужных движений - тем раньше вы вернете БД в строй. Поэтому следует руководствоваться двумя правилами - восстановление нужно делать как можно более простым технически с минимальным количеством шагов и второе - все операции желательно заскриптовать. Это важно в критических ситуациях - меньше вероятность непоправимых ошибок. Разумеется, предполагается, что вы выполнили хотя бы раз тестирование ваших процедур восстановления, в идеале - выполняете регулярно)
  2. Необходимо установить на него ПО, восстановить сетевую конфигурацию базы и запустить листенер.
  3. Необходимо создать файл паролей (orapwd), так как маловероятно, что вы его сохраняли регулярно с исходного сервера БД.
Как я и говорил, желательно заранее написать и подготовить скрипт для восстановления. Его можно написать в общем виде, предоставляю это в качестве самостоятельного упражнения, в качестве основы покажу специфичный для БД скрипт:

 #!/bin/sh  
   
 # Database disaster recovery script  
 # By Y.Voinov (c) 2015  
   
 # Critical parameters  
 dbid="1234567890"  
 dbbackup="/db_backup"  
 autoback="autobackups"  
 auto_maxdays="360"  
 syspwd="syspwd123456"  
   
 # Target host fs parameters  
 db_name="onyma"  
 fs_mountpoint1="/oradata/$db_name"  
 fs_mountpoint2="/oradata2/$db_name"  
 fs_mountpoint3="/redolog1/$db_name"  
 fs_mountpoint4="/redolog2/$db_name"  
 fs_mountpoint5="/oradata2/redologs3"  
   
 ### BEGIN  
   
 # Re-create dirs/mountpoints  
 mkdir -p $fs_mountpoint1  
 mkdir -p $fs_mountpoint2  
 mkdir -p $fs_mountpoint3  
 mkdir -p $fs_mountpoint4  
 mkdir -p $fs_mountpoint5  
   
 # Startup instance in nomount mode  
 sqlplus sys/$syspwd as sysdba <<EOT  
 startup nomount  
 exit  
 EOT  
   
 # Restore & recover database  
 # Scenario: Disaster recovery  
 # DBID: 1234567890  
 # Listener: Configured local (127.0.0.1)  
 # SYS's pwd: syspwd123456  
 # Password file manually created first  
 # No redo.  
 # Initial startup mode: nomount  
 rman target sys/$syspwd <<EOT  
 SET DBID=$dbid  
 SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$dbbackup/$autoback/%F';  
 run{  
 allocate channel d1 type disk format '$dbbackup/db_%t_%s.bk';  
 restore controlfile from autobackup maxdays $auto_maxdays;  
 sql 'alter database mount';  
 restore database;  
 recover database;  
 release channel d1;  
 }  
 exit  
 EOT  
   
 sqlplus sys/$syspwd as sysdba <<EOT  
 alter database open resetlogs;  
 exit  
 EOT  
   
 ### END  

Все описанные в скрипте шаги можно выполнять и вручную, раздельно.

Итак, для восстановления вы выполняете следующие шаги (считаем, что предыдущие подготовительные операции вы уже выполнили):
  1. Берете файл параметров из ваших бэкапов, кладете его в $ORACLE_HOME/dbs, создаете SPFILE.
  2. Создаете файл паролей в той же директории.
  3. Подготавливаете все ваши бэкапы за 8 суток (7 дней +1), включая как минимум один нулевой в точке $dbbackup, заданной в вашем скрипте.
  4. Выполняете восстановление.
 -bash-2.05b$ sqlplus sys/XXXXXXXXXXXX as sysdba <<EOT
 > startup nomount  
 > exit  
 > EOT  
   
 SQL*Plus: Release 10.2.0.4.0 - Production on Mon Sep 21 00:37:26 2015  
   
 Copyright (c) 1982, 2007, Oracle. All Rights Reserved.  
   
 Connected to an idle instance.  
   
 SQL> ORA-32004: obsolete and/or deprecated parameter(s) specified  
 ORACLE instance started.  
   
 Total System Global Area 1.6777E+10 bytes  
 Fixed Size         2113472 bytes  
 Variable Size      1.3220E+10 bytes  
 Database Buffers     3472883712 bytes  
 Redo Buffers        81772544 bytes  
 SQL> Disconnected from Oracle Database 10g Enterprise Edition Release - 64bit Production  
 With the Partitioning, OLAP, Data Mining and Real Application Testing  
   
 -bash-2.05b$ rman target sys/XXXXXXXXXXXX <<EOT  
 > SET DBID=1234567890  
 > SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/db_backup/autobackups/%F';  
 > run{  
 > allocate channel d1 type disk format '/db_backup/db_%t_%s.bk';  
 > restore controlfile from autobackup maxdays 360;  
 > sql 'alter database mount';  
 > restore database;  
 > recover database;  
 > sql 'alter database open resetlogs';  
 > release channel d1;  
 > }  
 > exit  
 > EOT  
   
 Recovery Manager: Release 10.2.0.4.0 - Production on Mon Sep 21 00:37:44 2015  
   
 Copyright (c) 1982, 2007, Oracle. All rights reserved.  
   
 connected to target database: onyma (not mounted)  
   
 RMAN>   
 executing command: SET DBID  
   
 RMAN>   
 executing command: SET CONTROLFILE AUTOBACKUP FORMAT  
 using target database control file instead of recovery catalog  
   
 RMAN> 2> 3> 4> 5> 6> 7> 8> 9>   
 allocated channel: d1  
 channel d1: sid=320 devtype=DISK  
   
 Starting restore at 21-SEP-15  
   
 channel d1: looking for autobackup on day: 20150921  
 channel d1: looking for autobackup on day: 20150920  
 channel d1: looking for autobackup on day: 20150919  
 channel d1: looking for autobackup on day: 20150918  
 channel d1: looking for autobackup on day: 20150917  
 channel d1: looking for autobackup on day: 20150916  
 channel d1: looking for autobackup on day: 20150915  
 channel d1: looking for autobackup on day: 20150914  
 channel d1: autobackup found: /db_backup/autobackups/c-2978122531-20150914-01  
 channel d1: control file restore from autobackup complete  
 output filename=/db_backup/control.bkp  
 Finished restore at 21-SEP-15  
   
 sql statement: alter database mount  
   
 Starting restore at 21-SEP-15  
   
 skipping datafile 2; already restored to file /oradata/onyma/undotbs01.dbf  
 skipping datafile 4; already restored to file /oradata/onyma/ONYMA_0.dbf  
 skipping datafile 5; already restored to file /oradata/onyma/ONYMA_1.dbf  
 skipping datafile 8; already restored to file /oradata2/onyma/ONYMA_STAT_0.dbf  
 skipping datafile 9; already restored to file /oradata2/onyma/ONYMA_STAT_1.dbf  
 skipping datafile 13; already restored to file /oradata/onyma/undotbs02.dbf  
 skipping datafile 14; already restored to file /oradata2/onyma/ONYMA_STAT_2.dbf  
 skipping datafile 15; already restored to file /oradata/onyma/ONYMA_2.dbf  
 skipping datafile 16; already restored to file /oradata2/onyma/ONYMA_STAT_3.dbf  
 skipping datafile 18; already restored to file /oradata2/onyma/ONYMA_STAT_5.dbf  
 skipping datafile 19; already restored to file /oradata/onyma/undotbs03.dbf  
 skipping datafile 28; already restored to file /oradata/onyma/ONYMA_6.dbf  
 channel d1: starting datafile backupset restore  
 channel d1: specifying datafile(s) to restore from backup set  
 restoring datafile 00001 to /oradata/onyma/system01.dbf  
 restoring datafile 00003 to /oradata/onyma/sysaux01.dbf  
 restoring datafile 00006 to /oradata/onyma/ONYMA_3.dbf  
 restoring datafile 00007 to /oradata/onyma/ONYMA_4.dbf  
 restoring datafile 00010 to /oradata/onyma/users01.dbf  
 restoring datafile 00011 to /oradata/onyma/xdb01.dbf  
 restoring datafile 00012 to /oradata/onyma/AP.dbf  
 restoring datafile 00017 to /oradata2/onyma/ONYMA_STAT_4.dbf  
 restoring datafile 00020 to /oradata2/onyma/ONYMA_ANALYS_2.dbf  
 restoring datafile 00021 to /oradata2/onyma/ONYMA_STAT_6.dbf  
 restoring datafile 00022 to /oradata/onyma/ONYMA_5.dbf  
 restoring datafile 00023 to /oradata2/onyma/ONYMA_STAT_7.dbf  
 restoring datafile 00024 to /oradata2/onyma/ONYMA_STAT_8.dbf  
 restoring datafile 00025 to /oradata2/onyma/ONYMA_STAT_9.dbf  
 restoring datafile 00026 to /oradata2/onyma/ONYMA_ANALYS_1.dbf  
 restoring datafile 00027 to /oradata2/onyma/ONYMA_ANALYS_0.dbf  
 restoring datafile 00029 to /oradata/onyma/drsys01.dbf  
 restoring datafile 00030 to /oradata2/onyma/ONYMA_STAT_10.dbf  
 restoring datafile 00031 to /oradata2/onyma/ONYMA_STAT_11.dbf  
 channel d1: reading from backup piece /db_backup/onyma/ukqh0gvg_1_1  
 channel d1: restored backup piece 1  
 piece handle=/db_backup/onyma/ukqh0gvg_1_1 tag=BACKUP_ONYMA_FULL__091215100002  
 channel d1: restore complete, elapsed time: 10:45:20  
 Finished restore at 21-SEP-15  
   
 Starting recover at 21-SEP-15  
 channel d1: starting incremental datafile backupset restore  
 channel d1: specifying datafile(s) to restore from backup set  
 destination for restore of datafile 00001: /oradata/onyma/system01.dbf  
 destination for restore of datafile 00002: /oradata/onyma/undotbs01.dbf  
 destination for restore of datafile 00003: /oradata/onyma/sysaux01.dbf  
 destination for restore of datafile 00004: /oradata/onyma/ONYMA_0.dbf  
 destination for restore of datafile 00005: /oradata/onyma/ONYMA_1.dbf  
 destination for restore of datafile 00006: /oradata/onyma/ONYMA_3.dbf  
 destination for restore of datafile 00007: /oradata/onyma/ONYMA_4.dbf  
 destination for restore of datafile 00008: /oradata2/onyma/ONYMA_STAT_0.dbf  
 destination for restore of datafile 00009: /oradata2/onyma/ONYMA_STAT_1.dbf  
 destination for restore of datafile 00010: /oradata/onyma/users01.dbf  
 destination for restore of datafile 00011: /oradata/onyma/xdb01.dbf  
 destination for restore of datafile 00012: /oradata/onyma/AP.dbf  
 destination for restore of datafile 00013: /oradata/onyma/undotbs02.dbf  
 destination for restore of datafile 00014: /oradata2/onyma/ONYMA_STAT_2.dbf  
 destination for restore of datafile 00015: /oradata/onyma/ONYMA_2.dbf  
 destination for restore of datafile 00016: /oradata2/onyma/ONYMA_STAT_3.dbf  
 destination for restore of datafile 00017: /oradata2/onyma/ONYMA_STAT_4.dbf  
 destination for restore of datafile 00018: /oradata2/onyma/ONYMA_STAT_5.dbf  
 destination for restore of datafile 00019: /oradata/onyma/undotbs03.dbf  
 destination for restore of datafile 00020: /oradata2/onyma/ONYMA_ANALYS_2.dbf  
 destination for restore of datafile 00021: /oradata2/onyma/ONYMA_STAT_6.dbf  
 destination for restore of datafile 00022: /oradata/onyma/ONYMA_5.dbf  
 destination for restore of datafile 00023: /oradata2/onyma/ONYMA_STAT_7.dbf  
 destination for restore of datafile 00024: /oradata2/onyma/ONYMA_STAT_8.dbf  
 destination for restore of datafile 00025: /oradata2/onyma/ONYMA_STAT_9.dbf  
 destination for restore of datafile 00026: /oradata2/onyma/ONYMA_ANALYS_1.dbf  
 destination for restore of datafile 00027: /oradata2/onyma/ONYMA_ANALYS_0.dbf  
 destination for restore of datafile 00028: /oradata/onyma/ONYMA_6.dbf  
 destination for restore of datafile 00029: /oradata/onyma/drsys01.dbf  
 destination for restore of datafile 00030: /oradata2/onyma/ONYMA_STAT_10.dbf  
 destination for restore of datafile 00031: /oradata2/onyma/ONYMA_STAT_11.dbf  
 channel d1: reading from backup piece /db_backup/onyma/usqh5imh_1_1  
 channel d1: restored backup piece 1  
 piece handle=/db_backup/onyma/usqh5imh_1_1 tag=BACKUP_ONYMA_INC_1_091415080002  
 channel d1: restore complete, elapsed time: 00:34:27  
   
 starting media recovery  
   
 channel d1: starting archive log restore to default destination  
 channel d1: restoring archive log  
 archive log thread=1 sequence=40431  
 channel d1: reading from backup piece /db_backup/onyma/uuqh5jm0_1_1  
 channel d1: restored backup piece 1  
 piece handle=/db_backup/onyma/uuqh5jm0_1_1 tag=BACKUP_ONYMA_INC_1_091415080002  
 channel d1: restore complete, elapsed time: 00:41:27  
 archive log filename=/db_backup/arch/1_40431_689284067.dbf thread=1 sequence=40431  
 unable to find archive log  
 archive log thread=1 sequence=40432  
 released channel: d1  
 RMAN-00571: ===========================================================  
 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============  
 RMAN-00571: ===========================================================  
 RMAN-03002: failure of recover command at 09/21/2015 12:39:25  
 RMAN-06054: media recovery requesting unknown log: thread 1 seq 40432 lowscn 11839023228093  
   
 RMAN>   
   
 Recovery Manager complete.  
 -bash-2.05b$ pwd  
 /opt/oracle  
 -bash-2.05b$ cd /redolog1  
 -bash-2.05b$ ls -al  
 total 8  
 drwxr-xr-x  4 oracle  oinstall    256 Sep 19 14:57 .  
 drwxr-xr-x 38 oracle  oinstall    4096 Sep 19 01:51 ..  
 drwxr-xr-x  2 root   system     256 Sep 10 14:53 lost+found  
 drwxr-xr-x  2 oracle  oinstall    256 Sep 19 15:53 onyma  
 -bash-2.05b$ cd onyma  
 -bash-2.05b$ ls -al  
 total 0  
 drwxr-xr-x  2 oracle  oinstall    256 Sep 19 15:53 .  
 drwxr-xr-x  4 oracle  oinstall    256 Sep 19 14:57 ..  
 -bash-2.05b$ rman target sys/XXXXXXXXXXXX  
   
 Recovery Manager: Release 10.2.0.4.0 - Production on Mon Sep 21 12:43:47 2015  
   
 Copyright (c) 1982, 2007, Oracle. All rights reserved.  
   
 connected to target database: ONYMA (DBID=1234567890, not open)  
   
 RMAN>   
   
 Recovery Manager complete.  
 -bash-2.05b$ sqlplus sys/XXXXXXXXXXXX as sysdba  
   
 SQL*Plus: Release 10.2.0.4.0 - Production on Mon Sep 21 12:45:28 2015  
   
 Copyright (c) 1982, 2007, Oracle. All Rights Reserved.  
   
   
 Connected to:  
 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Prod  
 With the Partitioning, OLAP, Data Mining and Real Application Testing   
   
 SQL> alter database open resetlogs;  
   
 Database altered.  
   
 SQL>   
   

Восстановление завершено. Убедитесь, что архивные логи пишутся и можно приступать к проверке полноты восстановления БД.

Обратите внимание на следующее: онлайновые логи будут созданы автоматически на последнем шаге, точки их расположения должны существовать. Текущая транзакционная активность, разумеется, не будет восстановлена. Глубина потерь зависит от степени активности базы в последние сутки. Контрол-файлы будут восстановлены в местах и с именами, заданными в файле параметров, который использовался при восстановлении. Кроме того, заметьте - две самые длительные процедуры - это восстановление данных с лент и restore. Собственно recovery выполняется весьма быстро. Последняя операция - открытие базы - также требует времени ввиду создания redo logs.