Архив рубрики: Linux

Наработки и статьи по работе с Linux

PHPMyAdmin: Warning in ./libraries/sql.lib.php#613 count(): Parameter must be an array or an object that implements Countable

После обновления Ubuntu вдруг стала выходить такая ошибка в PHPNyAdmin в варнингах. Все не доходили руки посмотреть, да вот дошли. Это ошибка в файле /usr/share/phpmyadmin/libraries/sql.lib.php. Нужно найти сточку:

|| (count($analyzed_sql_results['select_expr'] == 1)

И исправить её на:

|| ((count($analyzed_sql_results['select_expr']) == 1)

Не правильно скобочки поставили разработчики  😉

Передать сообщение другому пользователю в консоль

Век живи — век учись (с) Не я конечно знал, что что-то такое должно быть, но просто не пользовался — не нужно было. Так вот, для того чтобы отправить сообщение другому пользователю зашедшему в консоль, достаточно выполнить что-то вроде:

write petya pts/3

А, потом нажать Enter и начать вводить текст. Его сразу же будет видеть пользователь petya у себя в консоли. Номер терминала можно увидеть по команде w

 

Пачкой обновляем сертификаты SSL на сервере

Как известно сертификаты LetsEncrypt живут только 3 месяца, и соответственно их нужно регулярно обновлять. Самый хороший и простой способ обновления сертификатов — по записи DNS, однако это подходит не всем. Обновление же сертификата записью файла в «корне» сайта тоже не всегда работает по разным причинам. Выходом может стать следующий «финт ушами»: создаем альтернативный файл виртуальных хостов (рассматриваю вариант с apache, nginx практически не использую), который используется исключительно под получение сертификатов. Т.е. логика следующая: скрипт «подменяет» файл с виртуальными хостами на временный «облегченный», apache перестартовываем, спокойно обновляем сертификаты, затем возвращаем оригинальный файл с виртуальными хостами и снова перестартовываем apache. Особенностью «временного» файла является то что задана единая точка хранения файлов которые требуется создать для обновления сертификатов.

Итак получается скрипт обновления, что-то вроде:

«Временный» файл хостов:

<VirtualHost *:80>
    ServerAdmin pawfvwervwe@mail.ru
    DocumentRoot "/usr/local/www/apache24/sites/lets"
    ServerName ewfer.tv
    ServerAlias www.werfer.tv wer.ru werf.ru rwefwerf.ru # перечисляем все домены которые нужно обновить
    <Directory "/usr/local/www/apache24/sites/lets">
    Options Indexes FollowSymLinks MultiViews
        AllowOverride All
    allow from all
    Require all granted	
    </Directory>    
</VirtualHost>

bash скрипт обновления:

#!/bin/sh
echo "- Подменяю текущий конфиг виртуальных хостов apache"
cp /usr/local/etc/apache24/extra/httpd-vhosts.conf /usr/local/etc/apache24/extra/httpd-vhosts.conf.backup
cp /usr/local/etc/apache24/extra/httpd-vhosts.conf.lets /usr/local/etc/apache24/extra/httpd-vhosts.conf
/usr/local/etc/rc.d/apache24 restart
echo "- Получаю сертификаты"
certbot certonly --agree-tos --email rfer@mail.ru --webroot -w /usr/local/www/apache24/sites/lets/ -d refwer.tv
certbot certonly --agree-tos --email erferf@mail.ru --webroot -w /usr/local/www/apache24/sites/lets/ -d www.ewferf.tv
echo " - Возвращаю конфигурацию виртуальных хостов как было"
cp /usr/local/etc/apache24/extra/httpd-vhosts.conf.backup /usr/local/etc/apache24/extra/httpd-vhosts.conf
/usr/local/etc/rc.d/apache24 restart

 

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

Включаем поддержку SSL в Postfix, FreeBSD 10.x

Предыдущий пост (включение подписи DKIM) не помог избавиться от попадания в папку СПАМ на ящиках gmail, поэтому следующим этапом попробуем включение принудительного шифрования писем SSL на домене.

Сначала сделаем самоподписный сертификат:

openssl req -new -nodes -x509 -out /usr/local/etc/postfix/smtpd.pem -keyout /usr/local/etc/postfix/smtpd.pem -days 3650

Добавляем в Postfix поддержку SSL:

mcedit /usr/local/etc/postfix/main.cf
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

В файле /usr/local/etc/postfix/master.cf нужно добавить:

smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

и перестартовать postfix

Настройка DKIM подписи на FreeBSD 10.4 почтовый сервер Postfix

Зачем она нужна? Например для того чтобы почтовые сервера gmail.com, mail.ru и ряд других не отправляли письма с вашего домена в папку «спам».

Ставим opendkim:

pkg install opendkim

Создадим файл конфигурации opendkim на основе примера:

cat /usr/local/etc/mail/opendkim.conf.sample | egrep -v '^#|^$' > /usr/local/etc/mail/opendkim.conf
mcedit /usr/local/etc/mail/opendkim.conf

Получим файл вида:

Domain			example.com
KeyFile			/var/db/dkim/example.private
Selector		my-selector-name
Socket			inet:port@localhost
Syslog			Yes

Преобразуем его к виду:

Domain			domen.ru
KeyTable			/var/db/dkim/KeyTable
SigningTable		/var/db/dkim/SigningTable
ExternalIgnoreList	/var/db/dkim/TrustedHosts
Selector		relay
Socket			inet:12301@localhost
Canonicalization	relaxed/relaxed
Syslog			Yes

В файл /var/db/dkim/TrustedHosts добавим хосту с которых разрешены подключения:

*.domen.ru
127.0.0.1
localhost

Создаем каталог для хранения ключей и создаем собственно сами ключи:

mkdir -p /etc/opendkim/domen.ru
opendkim-genkey -D /etc/opendkim/tviinet.ru/ --domain tviinet.ru --selector relay

Создадим пользователя opendkim,зададим владельца и права доступа на файлы:

pw useradd opendkim -m -s /usr/sbin/nologin -w no
chown :opendkim /etc/opendkim/domen.ru/*
chmod g+rw /etc/opendkim/domen.ru/*

Создаем таблицу KeyTable. В ней хранится список соответствий между селекторами, доменами и файлами с закрытыми ключами. Формат записей:
<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>

mcedit /var/db/dkim/KeyTable

Например:

relay._domainkey.tviinet.ru domen.ru:relay:/etc/opendkim/tdomen.ru/relay.private

Создаем SigningTable. В данной таблице хранятся соответствия между определенными email-адресами и записями в KeyTable.

mcedit /var/db/dkim/SigningTable

Добавляем в него:

*@domen.ru relay._domainkey.domen.ru

Далее пробуем стартовать сервис:

/usr/local/etc/rc.d/milter-opendkim onestart

Если всё хорошо, правим конфигурацию postfix:

mcedit /usr/local/etc/postfix/main.cf

Добавляем:

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

Перезапускаем postfix:

/usr/local/etc/rc.d/postfix restart

Если всё хорошо, остался последний шаг: правка DNS. Посмотрим содержимое:

cat /etc/opendkim/domen.ru/relay.txt

relay._domainkey	IN	TXT	( "v=DKIM1; k=rsa; "
	  "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPHo37kaZ6zTfi8pZUE2QIDAQAB" )  ; ----- DKIM key relay for domen.ru

Добавим эту запись в зону TXT  DNS. И пробуем отправить письмо например на gmail.com. В «исходном письме» должна присутствовать запись о DKIM.