<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mysyslog.ru</title>
	<atom:link href="http://mysyslog.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://mysyslog.ru</link>
	<description>Всякая IT всячина</description>
	<lastBuildDate>Thu, 08 Jul 2010 13:51:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>mysql_secure_installation cвоими руками во FreeBSD</title>
		<link>http://mysyslog.ru/posts/524</link>
		<comments>http://mysyslog.ru/posts/524#comments</comments>
		<pubDate>Tue, 29 Jun 2010 13:25:40 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=524</guid>
		<description><![CDATA[В большинстве пакетов mysql-server под Linux входи хороший скрипт mysql_secure_installation, которого очень не хватает в порте mysql во FreeBSD. Сделаем все своими руками!

Ставим mysql из портов

cd /usr/ports/databases/mysql51-server/
make install clean
mysql_install_db
chown –R mysql:mysql /var/db/mysql
echo mysql_enable=YES &#62;&#62; /etc/rc.conf
/usr/local/etc/rc.d/mysql-server start

Дальше запускаем консоль командой mysql

UPDATE mysql.user SET Password=PASSWORD('NEWROOTPASSWORD') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
DROP [...]]]></description>
			<content:encoded><![CDATA[<p>В большинстве пакетов mysql-server под Linux входи хороший скрипт mysql_secure_installation, которого очень не хватает в порте mysql во FreeBSD. Сделаем все своими руками!<br />
<span id="more-524"></span><br />
Ставим mysql из портов</p>
<pre class="brush: plain;">
cd /usr/ports/databases/mysql51-server/
make install clean
mysql_install_db
chown –R mysql:mysql /var/db/mysql
echo mysql_enable=YES &gt;&gt; /etc/rc.conf
/usr/local/etc/rc.d/mysql-server start
</pre>
<p>Дальше запускаем консоль командой mysql</p>
<pre class="brush: sql;">
UPDATE mysql.user SET Password=PASSWORD('NEWROOTPASSWORD') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
DROP DATABASE test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
exit
</pre>
<p>Что мы сделали? В порядке выполнения команд получается так:</p>
<li>Установили новый пароль root &#8211; NEWROOTPASSWORD</li>
<li>Удалили анонимных пользователей</li>
<li>Запретили удаленное подключение root</li>
<li>Физически удалили базу test</li>
<li>Удалили все записи о ней в служебной базе mysql</li>
<li>Перечитали служебные данные о правах пользователей</li>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/524/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как узнать версию CentOS</title>
		<link>http://mysyslog.ru/posts/511</link>
		<comments>http://mysyslog.ru/posts/511#comments</comments>
		<pubDate>Fri, 25 Jun 2010 07:32:53 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[centos]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=511</guid>
		<description><![CDATA[Для меня, старого FreeBSD-ка, было несколько неожиданно, что команда uname мне не помогла определить версию системы&#8230;

% uname -a
Linux servername.ru 2.6.18-164.15.1.el5.028stab068.9 #1 SMP Tue Mar 30 18:07:38 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux
%

Т.е. конечно про ядро мне все тут рассказали, но вот какая версия CentOS? Загадка&#8230;
Попробовал иначе:

% cat /proc/version
Linux version 2.6.18-164.15.1.el5.028stab068.9 (root@rhel5-build-x64) (gcc version 4.1.2 20080704 [...]]]></description>
			<content:encoded><![CDATA[<p>Для меня, старого FreeBSD-ка, было несколько неожиданно, что команда uname мне не помогла определить версию системы&#8230;</p>
<pre class="brush: plain;">
% uname -a
Linux servername.ru 2.6.18-164.15.1.el5.028stab068.9 #1 SMP Tue Mar 30 18:07:38 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux
%
</pre>
<p>Т.е. конечно про ядро мне все тут рассказали, но вот какая версия CentOS? Загадка&#8230;<br />
Попробовал иначе:</p>
<pre class="brush: plain;">
% cat /proc/version
Linux version 2.6.18-164.15.1.el5.028stab068.9 (root@rhel5-build-x64) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Tue Mar 30 18:07:38 MSD 2010
%
</pre>
<p>Уже лучше, теперь я знаю, что уши CentOS торчат из указанной версии RedHat&#8230; Хм, все равно не то!<br />
Вот он, правильный вариант!</p>
<pre class="brush: plain;">
% cat /etc/redhat-release
CentOS release 5.4 (Final)
%
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/511/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вывод сообщения в stderr из shell скрипта</title>
		<link>http://mysyslog.ru/posts/506</link>
		<comments>http://mysyslog.ru/posts/506#comments</comments>
		<pubDate>Tue, 01 Jun 2010 10:46:25 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=506</guid>
		<description><![CDATA[Очень полезная вещь &#8211; перенаправление потоков вывода. С ее помощью в shell скриптах можно сделать многое, в том числе и вывод сообщений в stderr. Пример простого скрипта ниже:

#/bin/sh

DEBUG=0

print_debug()
{
  if [ &#34;x$DEBUG&#34; != &#34;x0&#34; ]; then
    echo $* &#62;&#38;2
  fi
}

print_debug hello world

Переменная DEBUG, если не равно 0, указывает, что нужно выводить [...]]]></description>
			<content:encoded><![CDATA[<p>Очень полезная вещь &#8211; перенаправление потоков вывода. С ее помощью в shell скриптах можно сделать многое, в том числе и вывод сообщений в stderr. Пример простого скрипта ниже:</p>
<pre class="brush: bash;">
#/bin/sh

DEBUG=0

print_debug()
{
  if [ &quot;x$DEBUG&quot; != &quot;x0&quot; ]; then
    echo $* &gt;&amp;2
  fi
}

print_debug hello world
</pre>
<p>Переменная DEBUG, если не равно 0, указывает, что нужно выводить сообщения в функции print_debug. Обычное echo выводи строку со всеми аргументами функции (переменная $*) в stdout, которые перенаправляется в stderr ( >&#038;2 ). </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/506/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD-SA-10:04.jail FreeBSD-SA-10:05.opie FreeBSD-SA-10:06.nfsclient</title>
		<link>http://mysyslog.ru/posts/498</link>
		<comments>http://mysyslog.ru/posts/498#comments</comments>
		<pubDate>Thu, 27 May 2010 08:56:32 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[BugTrack]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=498</guid>
		<description><![CDATA[Все три уязвимости достаточно опасны. Особо нужно отметить OPIE уязвимость, она существует прямо из коробки, а две других уязвимости требуют некоторых нестандартных изменений системы, таких как vfs.usermount или изменения флагов запуска jail. Далеко не все сервера им будут подвержены, и для них есть workaround. Однозначно готовимся к патчам системы!

Цитирую opennet:
&#8220;Во FreeBSD обнаружены три опасные уязвимости:

В [...]]]></description>
			<content:encoded><![CDATA[<p>Все три уязвимости достаточно опасны. Особо нужно отметить OPIE уязвимость, она существует прямо из коробки, а две других уязвимости требуют некоторых нестандартных изменений системы, таких как vfs.usermount или изменения флагов запуска jail. Далеко не все сервера им будут подвержены, и для них есть workaround. Однозначно готовимся к патчам системы!</p>
<p><span id="more-498"></span></p>
<p>Цитирую <a href="http://www.opennet.ru/opennews/art.shtml?num=26749">opennet</a>:<br />
&#8220;<strong>Во FreeBSD обнаружены три опасные уязвимости:</strong></p>
<ul>
<li>В коде NFS-клиента обнаружена уязвимость, позволяющая локальному злоумышленнику организовать выполнение кода в контексте ядра и получить привилегии суперпользователя. Для успешной эксплуатации уязвимости в системе должен быть активирован отключенный по умолчанию режим vfs.usermount, позволяющий обычным пользователям выполнять операции по монтированию разделов. Уязвимость вызвана ошибкой в коде проверки длины передаваемых при монтировании параметров. Проблеме подвержены все выпуски FreeBSD начиная с версии 7.2, в качестве временной меры достаточно запретить возможность монтирования непривилегированными пользователями (sysctl vfs.usermount=0). Разработчики отмечают, что даже после применения устраняющего уязвимость патча функции монтирования непривилегированными пользователями не могут быть отнесены к категории безопасных. Большинство реализаций файловых систем FreeBSD реализованы без оглядки на возможность злонамеренных действий (например, монтирование определенным образом поврежденной ФС). Несмотря на то, что подобные ошибки исправляются при обнаружении, полный аудит безопасности кода файловых систем не проводился.</li>
</ul>
<ul>
<li>В реализации библиотеки для работы с одноразовыми паролями OPIE обнаружена возможность переполнения буфера, приводящая к записи дополнительного нулевого байта за конец стека. Ошибка позволяет удаленному злоумышленнику инициировать крах серверного процесса сервиса OPIE при включении в системе режима защиты от переполнения стека. Примечательно, что уязвимости подвержены все поддерживающие OPIE-аутентификацию системные сервисы, даже при отключении поддержки OPIE в системе. Например, можно удаленно вызвать крах ftpd. Не исключена, хотя и отнесена к маловероятным, возможность эксплуатации данной проблемы для организации атакующим выполнения своего кода на сервере. Проблеме подвержены все поддерживаемые выпуски FreeBSD (6.x, 7.x, 8.x). В качестве временной меры достаточно недопустить выполнение связанных с libopie.so серверных приложений.</li>
</ul>
<ul>
<li>В утилите jail, через которую осуществляется запуск процесса в изолированном окружении, не производится по умолчанию смена текущей рабочей директории, что позволяет атакующему получить доступ к файлам вне изолированного окружения, если до момента запуска jail одним из родительских процессов был открыт файловый десктиптор, связанный с данной рабочей директорией. По умолчанию скрипт для инициализации Jail-окружений /etc/rc.d/jail не подвержен данной уязвимости, так как для запуска jail в нем используются опции &#8220;-l -U root&#8221; подразумевающие выполнение вызова chdir. Но если администратор в ручную убрал данные флаги путем использования своего набора параметров jail_*flags в rc.conf, данный скрипт может быть использован для совершения атаки. Проблеме подвержены только выпуски FreeBSD 8.x. В качестве временной меры достаточно при вызове Jail указывать параметры &#8220;-l -U root&#8221;.</li>
</ul>
<p>Ссылки на официальном сайте FreeBSD:<br />
<a href="http://security.freebsd.org/advisories/FreeBSD-SA-10:06.nfsclient.asc">FreeBSD-SA-10:06.nfsclient</a><br />
<a href="http://security.freebsd.org/advisories/FreeBSD-SA-10:05.opie.asc">FreeBSD-SA-10:05.opie</a><br />
<a href="http://security.freebsd.org/advisories/FreeBSD-SA-10:04.jail.asc">FreeBSD-SA-10:04.jail</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/498/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем свой плагин nagios</title>
		<link>http://mysyslog.ru/posts/439</link>
		<comments>http://mysyslog.ru/posts/439#comments</comments>
		<pubDate>Mon, 10 May 2010 18:19:37 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[nagios]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=439</guid>
		<description><![CDATA[Плагины &#8211; это одна из самых сильных сторон системы мониторинга nagios. Для мониторинга базовых служб и параметров системы в комплекте установки уже есть большой набор плагинов. Если нужного плагина среди базовых нет, то можно поискать на сайтах exchange.nagios.org и monitoringexchange.org. Или написать свой плагин.

Теория работы плагинов nagios






Фактически плагин nagios &#8211; это обычная программа, которая взаимодействует [...]]]></description>
			<content:encoded><![CDATA[<p>Плагины &#8211; это одна из самых сильных сторон системы мониторинга nagios. Для мониторинга базовых служб и параметров системы в комплекте установки уже есть большой набор плагинов. Если нужного плагина среди базовых нет, то можно поискать на сайтах <a href="http://exchange.nagios.org/">exchange.nagios.org</a> и <a href="http://www.monitoringexchange.org/">monitoringexchange.org</a>. Или написать свой плагин.<br />
<span id="more-439"></span></p>
<h3>Теория работы плагинов nagios</h3>
<div style="float:left; width:265px; height:265px;">
<script type="text/javascript"><!--
google_ad_client = "pub-5926413875763738";
/* wp-post-250x250 */
google_ad_slot = "6534377323";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<p>Фактически плагин nagios &#8211; это обычная программа, которая взаимодействует с системой мониторинга через коды возврата и стандартного вывода. Коды возврата сообщают nagios о результате проверки, а из стандартного вывода формируется сообщение для web интерфейса. Со стандартным выводом все несколько сложнее, но сперва расскажу про коды возврата. Всего есть четыре кода возврата, которые может передать плагин в систему мониторинга:</p>
<p><span style="color: #339966;"><strong>0 &#8211; OK</strong></span>, т.е. проверка выполнена удачно и все работает как нужно.<br />
<span style="color: #ffff00;"><strong>1 &#8211; WARNING</strong></span>, проверка выполнена успешно, но проверяемая служба выдает показатели, превышающие порог нормальной работы.<br />
<span style="color: #ff0000;"><strong>2 &#8211; CRITICAL</strong></span>, проверка выполнена, но проверяемая служба не работает, или выдает значения, превышающие критический порог.<br />
<span style="color: #ff9900;"><strong>3 &#8211; UNKNOWN</strong></span>, такой код возврата говорит о невозможности плагином выполнить проверку. Причин для этого может быть несколько, например были введены неверные аргументы для плагина проверки или плагин не может создать какой-то дочерний процесс, открыть tcp сокет и т.п.</p>
<p>Один из этих кодов возврата плагин должен вернуть в любом случае. Кроме того плагин должен вывести что-то в стандартный вывод. Причем есть несколько вариантов. В самом простом варианте это должна быть просто одна строка, например:<br />
<span style="color: red;">DISK OK &#8211; free space: / 3326 MB (56%);</span><br />
Этот вывод будет показан в web интерфейсе. Кроме описания произведенной проверки и ее показателей, можно выводить статистику. для разделения вывода в web интерфейс и статистики используется символ | . Формат статистики:<br />
<span style="color: #ff9900;">&#8216;название&#8217;=значение[размерность];[warn];[crit];[min];[max]</span></p>
<p><strong>название</strong> &#8211; текстовое обозначение выводимой величины, например /, или &#8216;Disk /&#8217;. Замечу, что кавычки в названии требуются, только при использовании в нем пробела, знака равно или кавычек.<br />
<strong>значение</strong> &#8211; результат проверки.<br />
<strong>размерность</strong> &#8211; размерность не указывается для значений, показывающих число процессов, пользователей и т.п. Если значение в процентах, то и размерность нужно указать, как <strong>%</strong>. Аналогично для времени (<strong>s</strong>), размеров данных (<strong>B, KB, MB, TB</strong>). Для постоянно увеличивающихся счетчиков используется размерность <strong>c</strong>.<br />
<strong>warn</strong> &#8211; порог предупреждения<br />
<strong>crit</strong> &#8211; порог критического состояния<br />
<strong>min и max </strong>- допустимые минимальное и максимальное значения. Для размерности % указывать их не нужно понятно почему.</p>
<p>Можно выводить несколько параметров через пробел. Т.е. получается что-то такое:<br />
<span style="color: #ff0000;">DISKS OK &#8211; free space: / 3326 MB (56%); /home 184053 MB (27%)</span> | <span style="color: #ff9900;">/=2643MB;5948;5958;0;5968 /home=69357MB;253404;253409;0;253414</span><br />
Кроме того есть третий вариант, который работает в nagios 3.x. Помимо сообщения и статистики можно выводить длинное описание, еще несколько строк, как показано вот в этом примере:<br />
<span style="color: #ff0000;">DISK OK &#8211; free space: / 3326 MB (56%);</span> | <span style="color: #ff9900;">/=2643MB;5948;5958;0;5968</span><br />
<span style="color: #3366ff;">/ 15272 MB (77%);<br />
/boot 68 MB (69%);<br />
/home 69357 MB (27%);<br />
/var/log 819 MB (84%);</span> | <span style="color: #ff9900;">/boot=68MB;88;93;0;98<br />
/home=69357MB;253404;253409;0;253414<br />
/var/log=818MB;970;975;0;980</span><br />
Красным выделено сообщение, оранжевым статистика и синем длинное описание. Помните, я говорил, что сообщение выводится в web интерфейс, а тогда где используется статистика и длинное описание? На самом деле все несколько сложнее. Для обработка каждого из типов вывода используется отдельный макрос:</p>
<table border="1">
<tbody>
<tr>
<th>Макрос</th>
<th>Значение</th>
</tr>
<tr>
<td>$SERVICEOUTPUT$</td>
<td><span style="color: red;">DISK OK &#8211; free space: /  3326 MB (56%);</span></td>
</tr>
<tr>
<td>$SERVICEPERFDATA$</td>
<td><span style="color: #ffa500;">/=2643MB;5948;5958;0;5968 /boot=68MB;88;93;0;98 /home=69357MB;253404;253409;0;253414 /var/log=818MB;970;975;0;980</span></td>
</tr>
<tr>
<td>$LONGSERVICEOUTPUT$</td>
<td><span style="color: blue;">/ 15272 MB  (77%);\n/boot 68 MB (69%);\n/var/log 819 MB (84%);</span></td>
</tr>
</tbody>
</table>
<p>Например статистику можно использовать для построения графиков через команду <strong>service_perfdata_command</strong>.<br />
Теперь пожалуй с теории покончено, осталось только сказать, что в nagios есть механизм защиты от вывода слишком большого объема информации плагином, nagios прочитает только 4КБ данные, все остальное будет отброшено.</p>
<h3>Несколько советов о практике написания плагинов</h3>
<p>Чтобы запустить проверку, т.е. наш плагин, на удаленном сервере нужна некая служба, которая получает команды на запуск плагина от сервера nagios и отдает ему результат проверки. Различные варианты реализации такой службы я бы хотел вынести в отдельную статью, а сейчас давайте поговорим о другой проблеме.<br />
Многие проверки, например проверка состояния raid массива, требует прав суперпользователя. Т.е. у нас есть внешняя служба на сервер, которой с одной стороны очень не хочется давать права суперпользователя, а с другой проверки, которым эти права суперпользователя нужны!<br />
Есть два наиболее часто используемых варианта запуска на удаленном сервере плагина:<br />
1) Плагин check_by_ssh умеет запускать на удаленном сервере заданную команду, т.е. на сервере nagios запускается плагин check_by_ssh, которому в качестве параметров передается имя проверяемого хоста и команду, которую нужно запустить.<br />
2) Служба NRPE, на проверяемом сервере запускается служба NRPE, в ее настройках прописаны команды, которые может &#8220;попросить&#8221; выполнить сервера nagios. На стороне сервера проверка выполняется аналогично варианту с SSH, вызывается плагин check_by_nrpe с параметрами хоста и имени запускаемой команды.<br />
Теперь вернемся к нашей проблеме, нам нужно запустить проверку с правами суперпользователя.<br />
<strong>Вариант первый</strong> &#8211; путь камикадзе. Запускаем службу nrpe от имени root или разрешаем заход по ключу root с сервера nagios. Проблема решена, можно запускать любой плагин с правами суперпользователя. Теперь рассмотрим проблемы с безопасностью, который возникают при таком решении. Запуск любой внешней службы с правами суперпользователя всегда потенциально опасен, если в ней есть критическая уязвимость, то получить после удачного эксплойда права nobody и права root &#8211; это две большие разницы. В принципе при жесткой настройке правил фаервола для nrpe, такой вариант имеет права на жизнь, но с точки зрения системного подхода к обеспечению безопасности это явный fail. Для check_by_ssh вроде бы такой проблемы нет. Но подумайте вот о чем, если сервера nagios будет взломан, то с большой вероятностью злоумышленник получит доступ на все остальные ваши сервера!<br />
<strong>Вариант второй &#8211; sudo</strong>. Данный вариант уже намного лучше. На проверяемом сервере создается пользователь nagios, под которым запускается nrpe или по ключу которого заходит по ssh сервер nagios. В sudo в настройках прописаны правила запуска плагинов проверки для пользователя nagios. Такой вариант намного лучше с точки зрения безопасности, но в данном варианте атака может быть направлена на запускаемый плагин. Атака маловероятная, но возможная. При грамотной настройке фаервола и прочих мерах безопасности данный вариант наиболее часто используется на практике.<br />
<strong>Вариант третий</strong> &#8211; разделение логики проверки на собственно проверку и получение данных сервером nagios. Т.е. плагин, который мы пишем имеет два варианта запуска. В одном он выполняет проверку с правами root и сохраняет результат в какой-то файл. Права на файл выставляются так, чтобы пользователь, от имени которого запускаются проверки, мог прочитать этот файл. Эта проверка запускается через cron. Второй же вариант запуска нужен для чтения фала с результатами проверки. Из нюансов &#8211; нужно помнить, что плагин должен уметь проверять время создания файла, так чтобы не получилось, что проверка по какой-то причине давно не работает, а плагин раз за разом читает давно созданный файл и сообщает, что все ОК. Вариант с разделенной логикой наиболее безопасен, но распространен не очень сильно, так как под него придется переписывать все распространенные плагины.<br />
Вот наверное и все, что нужно для начала написания своего плагина.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/439/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Запись сообщений в syslog из shell скрипта</title>
		<link>http://mysyslog.ru/posts/434</link>
		<comments>http://mysyslog.ru/posts/434#comments</comments>
		<pubDate>Wed, 28 Apr 2010 10:48:45 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[env]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=434</guid>
		<description><![CDATA[Логи в скриптах можно вести несколькими способами, один из самых простых &#8211; записывать новые сообщения в какой-то файл. Но мне такой подход кажется неправильным. В системе уже есть специальный инструмент для ведения логов syslog. Вот его и стоит использовать!
Для добавления сообщений в syslog есть утилита logger. В принципе может писать сообщения и в отдельный файл. [...]]]></description>
			<content:encoded><![CDATA[<p>Логи в скриптах можно вести несколькими способами, один из самых простых &#8211; записывать новые сообщения в какой-то файл. Но мне такой подход кажется неправильным. В системе уже есть специальный инструмент для ведения логов syslog. Вот его и стоит использовать!<br />
Для добавления сообщений в syslog есть утилита logger. В принципе может писать сообщения и в отдельный файл. Напишу небольшую функцию, которую можно будет добавлять в любой скрипт для ведения логов.</p>
<pre class="brush: bash;">
add_log_message ()
{
 local logger='/usr/bin/logger'
 local tag='My Script'
 local port=514
 local host=localhost
 local facility='user'
 local level='notice'
 local message=$1
  if [ -z $message ]; then
        return 1
  else
    $logger -t &quot;$tag&quot; -p ${facility}.${level} -P $port -h $host &quot;$message&quot;
    if [ &quot;x$?&quot; != &quot;x0&quot; ]; then
        return 2
    fi
  fi
}

add_log_message 'Hello world'
</pre>
<p>Опция <strong>-t</strong> задает TAG, фактически TAG можно использовать для идентификации источника сообщения. Так же logger умеет отправлять сообщения syslog-у на другом сервер, т.е. легко можно организовать сбор всех типов логов на один сервер.</p>
<pre class="brush: plain; light: true;">
logger -P 514 -h logger.domain.ru 'Hello World'
</pre>
<p>По умолчанию logger пишет все сообщения в facility user с приоритетом notice, но это можно поменять используя ключ <strong>-p</strong>:</p>
<pre class="brush: plain; light: true;">
logger -p cron.warning 'Hello world'
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/434/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Быстрый способ создать большой файл при помощи dd</title>
		<link>http://mysyslog.ru/posts/430</link>
		<comments>http://mysyslog.ru/posts/430#comments</comments>
		<pubDate>Tue, 20 Apr 2010 15:33:41 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[env]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=430</guid>
		<description><![CDATA[Иногда для тестирования нужно создать какой-то большой файл. Для этого чаще всего применяют утилиту dd.
Файл создается обычно так:

dd if=/dev/zero of=/data/bigfile count=1024 bs=1024k

Получим файл размером в 1GB, причем dd честно 1024 раза запишет нули блоками по 1МБ. С 1Гб можно и потерпеть, но как быть с 10ГБ или 100ГБ? Ждать долго, да и диски жалко. Есть [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда для тестирования нужно создать какой-то большой файл. Для этого чаще всего применяют утилиту dd.<br />
Файл создается обычно так:</p>
<pre class="brush: plain; light: true;">
dd if=/dev/zero of=/data/bigfile count=1024 bs=1024k
</pre>
<p>Получим файл размером в 1GB, причем dd честно 1024 раза запишет нули блоками по 1МБ. С 1Гб можно и потерпеть, но как быть с 10ГБ или 100ГБ? Ждать долго, да и диски жалко. Есть более быстрый и простой способ &#8211; опция <strong>seek</strong>. Смысл ее в том, что запись dd начнет только после нахождения определенного номера блока с начала вывода из if. Если я правильно понимаю физику процесса, то происходит это так: dd создает файл, ждет пока пройдет N блоков, указанных в seek, после чего начинает записывать блоки, указанные в count. Получается &#8220;пустой&#8221; файл большого размера. </p>
<pre class="brush: plain; light: true;">
dd if=/dev/zero of=/data/bigfile count=1 bs=1024k seek=`expr 1024 * 10`
</pre>
<p>Мгновенно получаем файл, размером в 10ГБ!</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/430/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Правильный и красивый способ добавлять модули ядра в автозагрузку в CentOS 5.X</title>
		<link>http://mysyslog.ru/posts/426</link>
		<comments>http://mysyslog.ru/posts/426#comments</comments>
		<pubDate>Tue, 20 Apr 2010 09:07:24 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=426</guid>
		<description><![CDATA[Наткнулся на блог с красивым и правильным методом добавления модулей в автозагрузку centos 5.x.

Все уже есть в самой системе и, как всегда, не нужно изобретать велосипед =) В файле /etc/rc.sysinit есть вот такая конструкция:

# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
  [ -x $file ] &#38;&#38; $file
done

Т.е. для добавления модуля достаточно создать [...]]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на <a href="http://purpleblog.wordpress.com/2008/06/25/centos-modules-autoload/">блог</a> с красивым и правильным методом добавления модулей в автозагрузку centos 5.x.<br />
<span id="more-426"></span><br />
Все уже есть в самой системе и, как всегда, не нужно изобретать велосипед =) В файле /etc/rc.sysinit есть вот такая конструкция:</p>
<pre class="brush: bash;">
# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
  [ -x $file ] &amp;&amp; $file
done
</pre>
<p>Т.е. для добавления модуля достаточно создать файл some_name.modules в каталоге /etc/sysconfig/modules/, внутри которого будет команда на его загрузку. Что-то такое:</p>
<pre class="brush: plain; light: true;">
# cat /etc/sysconfig/modules/some_name.modules
modprobe some_module
</pre>
<p>Попробуем автоматизировать процесс добавления/удаление/просмотра модулей, для этого пишем скрипт:</p>
<pre class="brush: bash;">
#!/bin/sh

check_action ()
{
        if [ $ACTION != &quot;list&quot; ] &amp;&amp; [ $ACTION != &quot;add&quot; ] &amp;&amp; [ $ACTION != &quot;del&quot; ]; then
                show_help
                exit 1
        fi
}

show_help ()
{
        echo Usage: `basename $0` ACTION [ MODULE_NAME ]
        echo ACTION - list\|add\|del
        echo MODULE_NAME - module name for add\|del ACTION
}

make_action ()
{
        case $ACTION in
                &quot;list&quot;)
                        for i in `find $WORKDIR -type f -name &quot;*.modules&quot;`; do
                                module=`echo $i|sed 's/\.modules//'`
                                echo `basename $module`
                        done
                ;;
                &quot;add&quot;)
                        echo &quot;modprobe $MODULE_NAME&quot; &gt; $WORKDIR/$MODULE_NAME.modules
                        chmod 750 $WORKDIR/$MODULE_NAME.modules
                ;;
                &quot;del&quot;)
                        rm -f $WORKDIR/$MODULE_NAME.modules
                ;;

        esac
}

ACTION=&quot;$1&quot;
MODULE_NAME=&quot;$2&quot;
WORKDIR=&quot;/etc/sysconfig/modules/&quot;
: ${ACTION:=&quot;list&quot;}

check_action
make_action
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/426/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ipset в CentOS</title>
		<link>http://mysyslog.ru/posts/423</link>
		<comments>http://mysyslog.ru/posts/423#comments</comments>
		<pubDate>Tue, 20 Apr 2010 08:27:48 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[ipset]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=423</guid>
		<description><![CDATA[CentOS отличается некоторой консервативностью в версиях установленного ПО, что иногда приводит к проблемам с установкой нужной программы, не исключением стал и ipset. 
Первым делом я проверил, есть ли ipset в базовой системе, конечно же его не было. Пробежавшись по сайтам из найденных google по запросу &#8220;ipset centos&#8221;, так же не нашел готового решения. Проблема есть, [...]]]></description>
			<content:encoded><![CDATA[<p>CentOS отличается некоторой консервативностью в версиях установленного ПО, что иногда приводит к проблемам с установкой нужной программы, не исключением стал и ipset. <span id="more-423"></span><br />
Первым делом я проверил, есть ли ipset в базовой системе, конечно же его не было. Пробежавшись по сайтам из найденных google по запросу &#8220;ipset centos&#8221;, так же не нашел готового решения. Проблема есть, а вот методы решения ее самые разные. Большинство отказывались от ядра CentOS в пользу &#8220;чистого&#8221; ядра с kernel.org, патчили и ставили его. Мне такой подход не понравился, так как обновлять ядро хочется все тем же yum, а не каждый раз путем пересборки.<br />
Погуглив еще немного, я нашел способ поставить утилиту ipset и модуль ядра через yum. Для этого нужно подключить дополнительные репозитории: CentALT и epel.<br />
Сразу скажу, что CentALT заточен во многом под ALT Linux, так что софтом из него стоит пользоваться осторожно в CentOS. Устанавливаем:</p>
<pre class="brush: plain; light: true;">
# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
# wget http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
# rpm -iv epel-release-5-3.noarch.rpm
# rpm -iv centalt-release-5-3.noarch.rpm
# yum check-update
</pre>
<p>Если у вас x86_64 архитектура, то просто смените i386 на x86_64 в ссылках.<br />
Теперь можно поставить модуль ядра и утилиту ipset, после проверяем все ли работает:</p>
<pre class="brush: plain; light: true;">
# yum install kmod-ipset.i688 ipset.i386
# modprobe ip_set
# lsmod | fgrep ip_set
ip_set                 23708  0
# ipset -V
ipset v2.5.0 Protocol version 2.
# iptables -m set -h
iptables v1.3.5: Couldn't load match `set':/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory

Try `iptables -h' or 'iptables --help' for more information.
</pre>
<p>Не все так гладко, как хотелось бы! Модуль и утилита ipset есть, а iptables не может с ней работать. Дело в версии iptables, нужна версия старше 1.4, но в CentOS ее нет. Так что придется все же пойти на определенные жертвы. Будем ставить iptables из сорцов. Сносим &#8220;родной&#8221; iptables и ставим более новую версию. Перед этим добавляем в систему gcc, если еще нет:</p>
<pre class="brush: plain; light: true;">
# cp /etc/init.d/iptables /root/
# yum erase iptables
# yum install gcc
# cd /usr/src/
# wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.7.tar.bz2
# tar xjf iptables-1.4.7.tar.bz2
# cd iptables-1.4.7
# ./configure
# make
# make install
# hash -r
</pre>
<p>Создаем тестовую таблицу и проверяем, что все работает:</p>
<pre class="brush: plain; light: true;">
# ipset -N badip iphash
# ipset -A badip 10.10.1.10
# iptables -A INPUT -p icmp -m set --set badip src -j DROP
# iptables -vL
Chain INPUT (policy ACCEPT 24372 packets, 2261K bytes)
 pkts bytes target     prot opt in     out     source               destination
    4   240 DROP       icmp --  any    any     anywhere             anywhere            match-set badip src

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 489 packets, 45302 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain RH-Firewall-1-INPUT (0 references)
 pkts bytes target     prot opt in     out     source               destination
</pre>
<p>Теперь про ложку дегтя, как же без нее. После удаления родного iptables и установки нового произошло несколько неприятных событий:<br />
1) По умолчанию iptables из сорцов ставится в /usr/local/sbin/iptables, в родной был в /sbin/iptables. В принципе не проблема пересобрать нужными опциями (внимательно смотрим ./configure &#8211;help)<br />
2) При удалении родного iptables, удаляется и /etc/init.d/iptables, так что я его я специально сохранил<br />
3) Удаляется несколько полезный утилит типа iptstate<br />
4) Все эти суммарные изменения могут где-нибудь неожиданно вылезти, так что перед вводом сервера в продакшен нужно очень хорошо все проверить.</p>
<p><strong>UPDATE!!!</strong><br />
В репозитории CentAlt есть обновление для iptables с поддержкой ipset, так что достаточно</p>
<pre class="brush: plain; light: true;">
# yum update iptables
</pre>
<p>чтобы все заработало!</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/423/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разработка сетевых программ на Perl</title>
		<link>http://mysyslog.ru/posts/416</link>
		<comments>http://mysyslog.ru/posts/416#comments</comments>
		<pubDate>Thu, 15 Apr 2010 14:39:41 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Прочитать]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=416</guid>
		<description><![CDATA[Очень толковая книга! Перед тем, как начинать писать что-то на perl для сети, советую, прочтите эту книгу. Поверьте, число граблей, на которые вы наступите сократиться в разы.
Написана понятным и легко читаемым язык, что также немало важно. Часто читая в метро отвратительно написанную техническую книгу, ловил себя на том, что уже как минимум полстраницы не понимаю, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ozon.ru/context/detail/id/845797/?partner=mysyslog"><img class="alignleft" style="margin: 5px;" title="Разработка сетевых программ на Perl" src="http://www.ozon.ru/multimedia/books_covers/1000000707.jpg" alt="" width="200" height="284" /></a>Очень толковая книга! Перед тем, как начинать писать что-то на perl для сети, советую, прочтите эту книгу. Поверьте, число граблей, на которые вы наступите сократиться в разы.</p>
<p>Написана понятным и легко читаемым язык, что также немало важно. Часто читая в метро отвратительно написанную техническую книгу, ловил себя на том, что уже как минимум полстраницы не понимаю, что читаю и да и общее состояние мозга близко ко сну. С этой же книгой спать не хочется!</p>
<p>Особенно интересны главы о написании собственных TCP серверов. Очень подробно и на пальцах рассказывается про основные подходы к обработке нескольких одновременных клиентских запросов: fork, prefork, потоковый и мультиплексный. Причем дается не только пример кода, но и хорошая теоретическая база.  </p>
<p>Ссылка на OZON:<br />
<a href="http://www.ozon.ru/context/detail/id/845797/?partner=mysyslog">Разработка сетевых программ на Perl</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/416/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
