пятница, 27 июля 2012 г.

Workflow: SSL сертификаты

Одна из рутинных операций, с которыми приходится сталкиваться системному администратору - управление SSL сертификатами. Я постараюсь собрать на одной странице справочное руководство, которое поможет управлять жизненным циклом сертификата. Для наглядности процесса я буду описывать процедуру в контексте WEB сервера (в остальных случаях многое совпадает, хотя есть и различия).

Для себя я выделяю несколько этапов в жизненном цикле SSL сертификата:
  • создание SSL сертификата
  • установка SSL сертификата
  • мониторинг валидности и срока окончания SSL сертификата

пятница, 13 июля 2012 г.

Создание бинарного пакета с debug-символами в debian

Переодически приходится сталкиваться с ошибками в программах, которые приводят к их аварийному завершению. Типичный пример такой ошибки - завершение по сигналу SEGFAULT. Чтобы выяснить в каком месте и при каких условиях программа завершилась нужны отладчик и отладочные символы для исследуемой программы.

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

$ echo >> debian/control << EOF

Package: tinymount-dbg
Architecture: any
Section: debug
Priority: extra
Depends: tinymount (= ${binary:Version}), ${misc:Depends}
Description: debugging symbols for tinymount
 Tinymount is a simple UI tool to mount/unmount disks using UDisks.
 .
 This package contains the debugging symbols for tinymount.
EOF

$ echo >> debian/rules << EOF
DEB_DESTDIR := $(CURDIR)/debian/tinymount
EOF

После чего увеличил версию пакета:

dch -v '0.2.5~pre-2' 'Added debug symbols'

и собрал его

$ debuild -us -uc

В отчете lintian (его запускает debuild после окончании сборки) помимо отсутствующей страницы man для tinymount была ругань на "пустой пакет" tinymount-dbg. Он оказался почти пустым, т.к. отладочных символов в нем действительно не было.

Дальше было больше часа попыток нагулить причину. Но озарение пришло только после вдумчивого чтения логов сборки пакета (логи рулят!). При выполнении цели install в сгенеренном qmake'ом Makefile'е выполнялся strip для инсталируемого бинарника. Вот потому dh_strip и не находил никаких отладочных символов.

Немного порывшись в документации на qmake, я добавил в debian/rules к параметру DEB_QMAKE_ARGS значение CONFIG+=debug. После этого пересборка пакета и символы появились как и ожидалось.

четверг, 5 июля 2012 г.

Maintenance page для сайтов, которые обслуживаются Apache

Я уже писал про maintenance page для сайтов, которые обслуживаются Nginx, а сегодня добавлю пример такой страницы для Apache.

Содержимое страницы maintenance.html остается прежним:

<html>
<head>
<title>Server Maintenance</title>
</head>
<body>
<center>
<h1>Server maintenance</h1>
Our apologies for the temporary inconvenience. The page is temporarily unavailable as server is down for scheduled maintenance. We will be back soon.
</center>
</body>
</html>
/var/www/maintenance/maintenance.html

Чтобы Apache выдавал страницу с кодом 503, нужно немного доработать .htaccess:

ErrorDocument 503 /maintenance.html 

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/maintenance.html$
    RewriteCond %{REMOTE_ADDR} !1.2.3.4
    RewriteRule .* /maintenance.html [R=503,L]
</IfModule>
/var/www/maintenance/.htaccess

После этого maintenance страницу будет показывать всем кроме тех, кто заходит на сайт с ip 1.2.3.4.

суббота, 30 июня 2012 г.

DEADBEEF 0.5.5

Уже прошел почти месяц с тех пор, как был анонсирована новая версия плеера DEADBEEF 0.5.5. Список изменений у новой версии довольно впечатляющий, хотя по сути все это исправления существующих ошибок.

changelog since 0.5.4

  • fixed converter GUI plugin crash if the converter plugin not found
  • fixed compiling on FreeBSD
  • fixed race condition bug in streamer
  • fixed flac embedded cover loading bug
  • fixed multiline tag field editing
  • fixed vorbis streaming audio bug
  • fixed numlock handling in global hotkeys setup
  • fixed KP_Return not working
  • fixed filename being ignored in the search window
  • fixed session saving on reboot/logout using XSMP via eggsmclient
  • fixed few missing translation strings
  • fixed many instability issues caused by improper use of pl_find_meta[_raw] calls
  • fixed improper use of GtkStyle in playlist and tabs widgets
  • fixed prev/next handling when playback is stopped
  • fixed random playback bug caused by libsidplay2 calling srand(time(NULL))
  • fixed crash in adplug when playing ADL files
  • fixed crash in aac reload metadata
  • fixed Grandia - Parallel Trippers.gbs crash in GME plugin
  • fixed crash in GME plugin when a file doesn't exist
  • fixed integer overflow bug in float32->int32 conversion
  • fixed m3u parser string copy bug
  • fixed several dsp bugs in the converter
  • fixed up/down buttons in the converter's dsp preset editor
  • fixed selected row bugs in dsp preset editors in gtkui preferences and converter
  • fixed parent window of dsp plugin configure window
  • fixed all known issues in gtk3 plugin -- it should be fully working now
На этой неделе в блоге появился комментарий, где спрашивали буду ли я поддерживать обновление версий deadbeef в своем репозитарии. На тот момент я отписался, что буду это делать, если в этом будет смысл, поскольку проект собирает бинарные пакеты, пригодные для Debian/Ubuntu.

Уже позже, вечером, я начал ковырять пакет, который готовит апстрим, чтобы сравнить его с моей последней сборкой (у меня была только версия 0.5.2 в репозитарии). ИМХО недостатки официального пакета:
  • устанавливается в /opt/deadbeef, но не делает ссылку на бинарник в /usr/bin (нет возможности запустить из консоли не прописав полный путь);
  • не работает pause toggle при клике средней кнопкой на иконку deadbeef в трее (в принципе не критично, если настроены глобальные комбинации);
  • не работает регулировка громкости, если прокручивать колесо мыши над иконкой deadbeef в трее;
  • недостающие recommended зависимости приходится ставить руками (поскольку пакет ставится не через APT, то установка проходит нормально, но при запуске пакет ругается в консоли - у меня к примеру не стояли libcddb2 и libzip1).
В принципе ничего критичного нет, но похоже большинство привыкло получать обновления из APT. Потому я зарядил новую подсистему своего buildbot'а на сборку пакета 0.5.5 под Debian/Ubuntu.

В итоге сейчас пакет доступен для:
  • Debian: Squeeze, Wheezy, Sid (i386, amd64);
  • Ubuntu: Maverick, Lucid, Oneiric, Natty, Precise (i386, amd64).
Чтобы добавить себе мой репозитарий, смотрите инструкции тут.

пятница, 29 июня 2012 г.

Увеличение числа одновременно открытых файлов в MySQL сервере

Сегодня довелось решать проблему с превышением лимита одновременно открытых файлов у MySQL сервера. Ошибка, которая свидетельствует о такой проблеме выглядит так:

MySQL Error: Out of resources when opening file './db_name/table_name.MYD' (Errcode: 24)

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

$ perror 24
OS error code  24:  Too many open files

Смотрим сколько разрешено открывать файловых дескрипторов пользователю mysql (пользователь, с правами которого работает MySQL сервер).

$ sudo su - mysql -c 'ulimit -n'
1024

Далее смотрим, сколько дескрипторов разрешено в MySQL:

$ mysql -se "show variables like 'open_files_limit'"
Variable_name       Value
open_files_limit    1024

Увеличим лимит в 4 раза, до 4096:

$ echo 'mysql  -  nofile  4096' | sudo tee -a /etc/security/limits.d/mysql.conf
$ sudo su - mysql -c 'ulimit -n'
4096

Если лимит не изменился, то нужно посмотреть где подключен pam_limits.so в конфигурации PAM.

$ grep -r limits /etc/pam.*
/etc/pam.d/sshd:session    required     pam_limits.so
/etc/pam.d/atd:session    required   pam_limits.so
/etc/pam.d/login:session    required   pam_limits.so
/etc/pam.d/sudo:session required pam_limits.so
/etc/pam.d/cron:session    required   pam_limits.so
/etc/pam.d/su:# session    required   pam_limits.so

Для Debian нужно добавить строку session required pam_limits.so в /etc/pam.d/common-session

$ echo 'session required pam_limits.so' | sudo tee -a /etc/pam.d/common-session

Осталось поправить конфиг MySQL, чтобы сервер начал использовать новый лимит. Для этого в my.cnf в секцию [mysqld] добавляем строчку

open_files_limit = 4096

пятница, 22 июня 2012 г.

Ночные сборки Midnight Commander получили поддержку SFTP

Вчера в багтрекере проекта Midnight Commander был закрыт тикет 1535, который знаменует добавление начальной поддержки протокола SFTP в master ветку репозитария (именно из нее делаются пакеты для nightly ветки моего репозитария).

Для сборки теперь требуется libssh2 с минимальной версией 1.2.5. Однако для полноценной работы с ssh-agent нужна версия старше (в Debian Squeeze сейчас 1.2.6 и с ней авторизация по агенту не работает). Я проводил небольшие изыскания по этому вопросу и остановился на версии 1.3.0 (которая доступна в моем репозитарии).

В этой версии поддерживается работа с ~/.ssh/config. Т.е. теперь вместо указания username@hostname, можно указать соответствующий алиас из конфига. Например у меня есть учетка andrey@192.168.16.170, которая доступна по ssh ключу ~/.ssh/support. Соотвествующая запись в ~/.ssh/config будет

Host support
HostName 192.168.16.170
User andrey
IdentityFile ~/.ssh/support

И при входе по SFTP я укажу support вместо прописывания полной записи. Причем похоже ~/.ssh/config - единственный способ использовать public key авторизацию.

Редко новые фичи бывают без косяков. В этот раз похоже поломали работу с ssh алиасами из ~/.ssh/config при переносе из бранча в master ветку. Так если зайти через username@hostname, то все работает быстро и приятно, а если использовать алиас, то midnight циклически начинает открывать соединения и в итоге их на сервере становится больше 30 (по крайней мере у меня было запущено больше 30 копий sftp-server и тормозило это безбожно).

В дополнении обнаружилась проблема с копированием файлов - они не копируются вовсе (создается пустой файл). Не работает переключение на sftp подключение в списке активных VFS (Ctrl + X A). Там подключение выглядит как //sftp://, вместо sftp://username@hostname/.

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

понедельник, 18 июня 2012 г.

Сборка RPM пакетов без прав root

В дефолтной конфигурации CentOS в качестве корневой директории при сборке пакетов используется /usr/src/redhat. Такой подход требует прав root, поскольку владельцем и группой у /usr/src/redhat является root.

Чтобы избежать возможной порчи системы при сборке новой версии пакета (все вспомнили rm -fr /usr /lib/nvidia у bumblebee) полезно создать отдельного пользователя, например build.

# useradd -s /bin/bash build

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

# su - build
$ mkdir -p ~/RPM/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ cat > ~/.rpmmacros << EOF
%_topdir %(echo $HOME)/RPM
EOF
$ rpmbuild -ta courier-imap-4.9.3.tar.bz2

Собранный пакет будет находиться в ~/RPM/RPMS/x86_64/courier-imap-4.9.3-1.x86_64.rpm (если архитектура x86_64).