Can’t load private ssl_key: Key is for a different cert than ssl_cert

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

# tail -5 /var/log/mail
Jul 09 07:36:43 ***** dovecot[862]: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul 09 07:36:43 ***** dovecot[764]: master: Error: service(imap-login): command startup failed, throttling for 2 secs
Jul 09 07:37:31 ***** dovecot[862]: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul 09 07:37:31 ***** dovecot[764]: master: Error: service(imap-login): command startup failed, throttling for 4 secs
Jul 09 07:38:51 ***** dovecot[862]: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert

Вывод журнала systemd:

# journalctl -b -u dovecot
Jul  9 08:30:23 ***** dovecot: pop3-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:30:23 ***** dovecot: master: Error: service(pop3-login): command startup failed, throttling for 2 secs
Jul  9 08:30:25 ***** dovecot: pop3-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:30:25 ***** dovecot: master: Error: service(pop3-login): command startup failed, throttling for 4 secs
Jul  9 08:30:25 ***** dovecot: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:30:25 ***** dovecot: master: Error: service(imap-login): command startup failed, throttling for 2 secs
Jul  9 08:30:27 ***** dovecot: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:30:27 ***** dovecot: master: Error: service(imap-login): command startup failed, throttling for 4 secs
Jul  9 08:34:56 ***** dovecot: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:34:56 ***** dovecot: master: Error: service(imap-login): command startup failed, throttling for 8 secs
Jul  9 08:46:12 ***** dovecot: pop3-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:46:12 ***** dovecot: master: Error: service(pop3-login): command startup failed, throttling for 8 secs
Jul  9 08:46:20 ***** dovecot: pop3-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:46:20 ***** dovecot: master: Error: service(pop3-login): command startup failed, throttling for 16 secs
Jul  9 08:46:21 ***** dovecot: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:46:21 ***** dovecot: master: Error: service(imap-login): command startup failed, throttling for 16 secs
Jul  9 08:46:37 ***** dovecot: imap-login: Fatal: Can't load private ssl_key: Key is for a different cert than ssl_cert
Jul  9 08:46:37 ***** dovecot: master: Error: service(imap-login): command startup failed, throttling for 32 secs

Для начала выводим конфигурацию dovecont:

doveconf -n

Нас интересует расположение сертификата и ключа:

ssl_cert = </etc/exim/ssl/exim.crt
ssl_key = </etc/exim/ssl/exim.key

Переходим в указанный каталог:

cd /etc/exim/ssl/

Генерируем самоподписанный сертификат:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout exim.key -out exim.crt

Перезапустим exim и dovecot:

service dovecot restart
service exim restart

add-apt-repository: command not found

Дата: 22.06.2017Метки:

Часто при заказе VPS на сервер устанавливается система с минимальным набором пакетов. Вот недавно на новом VPS при выполнении команды add-apt-repository получил вот такую ошибку:

add-apt-repository: command not found

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

apt-get install software-properties-common python-software-properties

Установка PHP 5.6 в Ubuntu 16.04

Дата: 22.06.2017Метки: ,

В Ubuntu 16.04 Xenial уже давно из репозитория убрали PHP 5.6 и вместо него по умолчанию устанавливается новая версия PHP 7.0. Но как быть тем, кто по той или иной причине не может перейти на новую версию? В этом случае, если вы хотите использовать PHP 5.6 вам необходимо предварительно добавить репозиторий для старой версии.

Добавим ppa-репозиторий в систему:

sudo add-apt-repository ppa:ondrej/php
upt-get update

Далее запускаем установку PHP 5.6 и дополнительно указываем необходимые модули:

sudo apt-get install php5.6-mbstring php5.6-mysql php5.6-gd php5.6-xml

SMART мониторинг SSD в Linux

Дата: 21.06.2017Метки:

У каждого производителя SSD есть специализированная утилита для мониторинга состояния диска в Windows. Что касается Linux, то ситуация состоит сложнее. По моему опыту я сталкивался с наличием такой утилиты под Linux только для PRO и энтерпрайз серии SSD дисков. Но если говорить по сути, то особой нужды в них нет. В качестве альтернативы мы будем использовать утилиту smartmontools доступную для большинства дистрибутивов Linux.

Для начала выполним установку. В CentOS необходимо выполнить команду:

yum install smartmontools

Для Debian и Ubuntu аналогично:

apt-get install smartmontools

Если не знаете название диска, то список всех подключенных дисков можно посмотреть командой:

find /dev -name 'sd*'

Теперь, когда известно название диска, можем вывести информацию SMART. У меня результат выполнения команды выглядит следующим образом:

# smartctl -A /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-514.21.1.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       215
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       9
177 Wear_Leveling_Count     0x0013   100   100   000    Pre-fail  Always       -       0
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   069   063   000    Old_age   Always       -       31
195 Hardware_ECC_Recovered  0x001a   200   200   000    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x003e   100   100   000    Old_age   Always       -       0
235 Unknown_Attribute       0x0012   099   099   000    Old_age   Always       -       2
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       1357065631

Теперь немного информации о данных, которые содержат важную информацию о состоянии вашего диска. В первую очередь обратите внимание на значение RAW_VALUE для параметра Reallocated_Sector_Ct — количество переназначенных секторов. Нулевое значение говорит нам, что диск в полном порядке. Далее обратите внимание на Power_On_Hours, параметр отображает информацию о суммарном времени работы диска. Информация может быть полезна при аренде сервера и дает общее представление о времени его работы. Далее второй по значимости параметр Total_LBAs_Written — общее количество записанных байт.

Что бы предоставить информацию из Total_LBAs_Written можно воспользоваться онлайн калькулятором. В калькуляторе важно указать размер сектора диска, его можно посмотреть командой:

fdisk -l /dev/sda

phpbb_sessions’ is marked as crashed and should be repaired

Дата: 21.06.2017

Вот недавно после некорректной перезагрузки сервера, где установлен форум phpBB словил вот такую ошибку:

General Error
SQL ERROR [ mysqli ]

Table '.\forum\phpbb_sessions' is marked as crashed and should be repaired [145]

An sql error occurred while fetching this page. Please contact an administrator if this problem persists.

Лечится очень просто. Для этого необходимо выполнить команду восстановление таблицы:

REPAIR TABLE phpbb_sessions;

Установка ionCube Loader в Ubuntu 16.04

IonCube — расширение модуля PHP, которое загружает зашифрованные файлы PHP и ускоряет выполнение PHP-скриптов. Для установки ionCube необходимо прописать соответствующий модуль в файл конфигурации php.ini. Краткий мануал по установке ionCube Loader в Ubuntu 16.04. Предварительно система подготовлена следующим образом. На сервер автоматически установлен PHP 7 вместе с установкой панели Vesta.

Скачиваем последнюю версию Ioncube Loader для системы 64-bit:

cd /tmp
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz

Или Ioncube Loader для системы 32-bit:

cd /tmp
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz

Распаковываем:

tar xfz ioncube_loaders_lin_x86.tar.gz

Что бы определить расположение файла php.ini выполните команду:

php --ini |grep Loaded
Loaded Configuration File:         /etc/php/7.0/cli/php.ini

Следует отметить что путь будет указан для php-cli, каталог для php.ini модуля php-fpm должен быть на уровень выше.

Выясним расположение каталога модулей PHP:

# php -i |grep extension_dir
extension_dir => /usr/lib/php/20151012 => /usr/lib/php/20151012

Копируем модуль Ioncube Loader в каталог с расширениями:

cd /tmp/ioncube
cp ioncube_loader_lin_7.0.so /usr/lib/php/20151012

Добавим загрузку модуля в файл php.ini. Откройте файл:

nano /etc/php.ini

И добавьте в его начало следующую строку:

zend_extension = "/usr/lib/php/20151012/ioncube_loader_lin_7.0.so"

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

Перезапустим php-fpm или apache:

service restart apache2
service restart php-fpm

Если все сделали правильно, то вы должны увидеть следующий результат выполнения команды:

# php -v
PHP 7.0.15-0ubuntu0.16.04.4 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with the ionCube PHP Loader (enabled) + Intrusion Protection from ioncube24.com (unconfigured) v6.0.8, Copyright (c) 2002-2015, by ionCube Ltd.

Самые низкие цены на регистрацию доменов

Наверняка вы не любите переплачивать, а тем более если речь идет о регистрации доменов. Представляю вам сервис Domcomp, который поможет найти самые низких цены на регистрацию доменов среди более чем 30 наиболее известных регистраторов. Что касается доменных зон, то тут их просто огромное количество.

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

Проксирование в Nginx

Дата: 20.05.2017Метки:

Простой пример конфига Nginx для проксирования HTTP трафика. Смысл заключается в том, что бы перенаправить запросы с frontend сервера, который у меня обозначен как 1.1.1.1 на back-end сервер 2.2.2.2. Дополнительно мы включаем кэширование, что позволяет существенно снизить нагрузку на сервер.

Для начала кратко напишу про настройки кэширования Nginx. В proxy_cache_path мы указываем расположение кэша. Для максимальной производительности я буду хранить его в оперативной памяти. Параметр levels задаёт уровни иерархии кэша. В нашем случае файлы будут сохранятся в каталог по аналогии примеру ниже:

/var/run/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c

Далее мы указываем имя зоны, время хранения файлов и размер кэша. Если к данным не обращаться более 8 минут, то закэшированные элементы будут удалены. Директива proxy_cache_key используется для создания схемы идентификации — оставляем без изменений. В proxy_cache_valid задаем время кэширования кодов ответа.

В директивах listen 1.1.1.1:80 и server_name proxy.com мы указываем ip-адрес и доменное имя сервера на котором запущен Nginx. После чего proxy_pass указываем адрес сервера на который будут передаваться запросы.

proxy_cache_path /var/run/proxy_cache levels=1:2 keys_zone=backcache:8m max_size=100m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

server {
    listen 1.1.1.1:80;
    server_name proxy.com;

    location / {
        proxy_pass http://2.2.2.2;

        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_cache backcache;
        proxy_cache_bypass $http_cache_control;
        add_header X-Proxy-Cache $upstream_cache_status;
    }
}

Ограничить количество одновременных подключений в iptables

Дата: 26.04.2017Метки:

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

В таком случае для ограничения потребления ресурсов сервера наиболее эффективно использовать cgroups — механизм ядра, который ограничивает вычислительные ресурсы для групп процессов. Используя cgroups мы можем предотвратить полную утилизацию вычислительных ресурсов процессора и памяти сервера, которые могут вызваны нагрузкой на веб-сервер и PHP. Таким образом мы всегда можем сохранить контроль над сервером и обеспечить доступ к серверу по SSH.

О использовании cgroups я постараюсь рассказать позже. Но даже если правильно настроить cgroups, в случае всплеска нагрузки, работа сайта будет нарушена. Как вариант решения проблемы предлагаю с помощью iptables ограничить количество одновременных подключений к серверу. Таким образом можно попытаться отсечь основной источник нагрузки, сохранив доступность ресурса для других посетителей.

Ситуацию я привел в качестве примера, но думаю, что ее можно адаптировать для других задач. Теперь переходим непосредственно к примеру, для начала добавьте следующие правила в iptables:

iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

Здесь мы разрешаем все входящие соединения на порт 80 нашего сервера. Чтобы ограничить количество одновременных подключений к серверу с одного ip-адреса, необходимо добавить следующие правила:

iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 --connlimit-mask 32 -j DROP

Это правило устанавливает ограничение на 30 одновременных подключений с одного ip-адреса.

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

iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 500 -j DROP

Пример готового скрипта для ограничения подключений к серверу:

iptables -F INPUT 
iptables -P INPUT DROP 
iptables -P FORWARD ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP 
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 2 -j DROP

VirtualBox: cannot register the hard disk

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

Не удалось открыть файл виртуального жёсткого диска /home/disck.vdi
Cannot register the hard disk '/home/disck.vdi' with UUID {UUID} because a hard disk '/home/old.vdi' with UUID {UUID} already exists.

В отличии от VMware в VirtualBox процесс переноса образа диска немного отличается. Для решения проблемы открываем VirtuaBox — меню File — Virtual Media Manager и удаляем перемещенный образ из реестра. Затем переходим в настройки виртуальном машины, в меню Storage снова подключаем образ виртуального диска.