Архив метки: centos

PHP 7 обновление в CentOS 7

Рассмотрим обновление на PHP 7-ой версии в системе CentOS 7 работающей с Nginx. Произведем настройку после обновления необходимых конфигурационных файлов для работы ресурсов использующих php. Процесс обновления сложный требующий внимания и ответственности.

Введение

Рано или поздно приходит время обновить старую версию PHP на новую. Как правило это обусловлено требование при обновлении ресурсов которые не смогут работать со старой версией. Редко обновление приходит без ручного вмешательства в редактирование конфигурационных файлов.

Обязательно перед обновление сделайте резервную копию системы и после обновления максимально проверьте все ресурсы использующие PHP!

В моем случае я обновляю версию которую устанавливал в статье Установка и настройка PHP.

В другой статье вы узнаете как работать с PHP используя репозиторий Remi для CentOS 7.

Удаление старой версии PHP

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

Подготовка перед удалением

Проверим установленную версию:

php -v
= вывод команды =
PHP 5.6.30 (cli) (built: Jan 26 2017 00:22:46) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Выведем весь список установленных пакетов:

rpm -qa | grep php
= вывод команды =
php-pecl-jsonc-1.3.10-2.el7.remi.5.6.x86_64
php-pdo-5.6.31-1.el7.remi.x86_64
php-pecl-memcache-3.0.8-4.el7.remi.5.6.x86_64
php-soap-5.6.31-1.el7.remi.x86_64
php-mbstring-5.6.31-1.el7.remi.x86_64
php-common-5.6.31-1.el7.remi.x86_64
php-xml-5.6.31-1.el7.remi.x86_64
php-cli-5.6.31-1.el7.remi.x86_64
php-pear-1.10.5-2.el7.remi.noarch
php-gd-5.6.31-1.el7.remi.x86_64
php-mysqlnd-5.6.31-1.el7.remi.x86_64
php-xmlrpc-5.6.31-1.el7.remi.x86_64
php-imap-5.6.31-1.el7.remi.x86_64
php-fpm-5.6.31-1.el7.remi.x86_64
php-snmp-5.6.31-1.el7.remi.x86_64
php-pecl-zip-1.15.1-1.el7.remi.5.6.x86_64
php-process-5.6.31-1.el7.remi.x86_64
php-odbc-5.6.31-1.el7.remi.x86_64
php-ldap-5.6.31-1.el7.remi.x86_64
php-opcache-5.6.31-1.el7.remi.x86_64

Исходя из вывода удалим все эти пакеты. Новую версию php мы будем устанавливать с другого репазитория. Репозиторий remi нам больше не нужен и мы его удалим.

Удаление PHP 5.6

Удалим одной командой:

yum remove php-pecl-jsonc php-pdo php-pecl-memcache php-soap php-mbstring php-common php-xml php-cli php-pear php-gd php-mysqlnd php-xmlrpc php-imap php-fpm php-snmp php-pecl php-process php-odbc php-ldap php-opcache

Внимательно смотрим лог обновления на предмет ошибок и предупреждений! Сохраните все ошибки и предупреждения. Уверяю в последствии это сильно сократит время в настройке после обновления!

Удаление репозитория Remi-safe

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

Выведем список всех используемых репозиториев:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.yandex.ru
 * epel: mirror.yandex.ru
 * extras: mirror.yandex.ru
 * remi-safe: mirror.awanti.com
 * updates: mirror.yandex.ru
Идентификатор репозитория репозиторий состояние
!remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64 2 509

В выводе видим точное имя которое мы используем при удалении:

yum-config-manager --disable remi-safe
В случае ошибки установите пакет yum-utils!
yum -y install yum-utils

После всех действий обновим систему чтобы окончательно всё подготовить к установке новой версии:

yum update

Установка новой версии PHP

Выбор репозитория и версии PHP 7

Вероятно есть разные варианты установки PHP 7 версии, но мне нравится репозиторий WebtaticEL про него и расскажу.

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

Перейдя по ссылке вы увидите все варианты версий возможных для установки а так же способы их установки в необходимую вам систему. Мой выбор пал на версию PHP 7.1 так как на данный момент это самая стабильная новая версия.

Добавление репозитория Webtatic

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

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

После добавления любого репазитория необходимо обновить список пакетов. В CentOS это можно сделать командой вывода всех репозиториев которая заодно и обновит весь список пакетов:

yum repolist

Установка PHP 7.1

Установим все нужные мне пакеты исходя из тех что удалял:

yum install php71w-fpm php71w-pdo php71w-soap php71w-mbstring php71w-common php71w-xml php71w-cli php71w-pear php71w-gd php71w-mysqlnd php71w-xmlrpc php71w-imap php71w-fpm php71w-snmp php71w-process php71w-odbc php71w-ldap php71w-opcache

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

Можем уставим все что есть, но решать вам самим что для вас лучше:

yum install php70w-cli php70w-common php70w-bcmath php70w-dba php70w-devel php70w-embedded php70w-fpm php70w-gd php70w-imap php70w-interbase php70w-intl php70w-ldap php70w-mbstring php70w-mcrypt php70w-mysql php70w-odbc php70w-opcache php70w-pdo php70w-pdo_dblib php70w-pear php70w-process php70w-pspell php70w-recode php70w-tidy php70w-xml php70w-xmlrpc

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

Проверка после обновления PHP

После обновления первым делом проверим какая версия php в системе:

php -v
= вывод команды =
PHP 7.1.8 (cli) (built: Aug 9 2017 19:19:49) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
 with Zend OPcache v7.1.8, Copyright (c) 1999-2017, by Zend Technologies

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

Ошибки в логах установки/удаления

В моем случае было несколько предупреждений:

  • warning: /etc/nsswitch.conf created as /etc/nsswitch.conf.rpmnew;
  • предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave;
  • предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave.

Как видите система сказала что в двух случаях она создала новые файлы а старые сохранила с пометкой rpmsave. В случае когда система не смогла создать новый файл она создала его с пометкой rpmnew.

Любыми удобными вам способами сохраните копии созданных новых рабочих файлов. Необходимый вам код из старых сохраненных обновлением файлов перенесите в новые рабочие файлы. Мне было необходимо отредактировать два файла /etc/php-fpm.d/www.conf и /etc/php.ini.

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

Настройка PHP-FPM после обновления

Так как у нас работает Nginx и для связки с php используется php-fpm мы проверим необходимую службу:

systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
 Active: inactive (dead)

Из вывода мы видим что служба остановлена и отсутствует в автозагрузке. Добавим в автозагрузку, запустим и посмотрим статус:

systemctl enable php-fpm.service
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

systemctl start php-fpm.service
= вывод команды говорящей об ошибке запуска= 
Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details.

systemctl status php-fpm.service
= вывод части команды =
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since Пт 2017-09-15 22:00:06 MSK; 13s ago
 Process: 11678 ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf (code=exited, status=78)
 Main PID: 11678 (code=exited, status=78)

[15-Sep-2017 22:00:06] ERROR: [/etc/php-fpm.d/www.conf:2] value is NULL for a ZEND_INI_PARSER_ENTRY
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: Unable to include /etc/php-fpm.d/www.conf from /etc/php-fpm.conf at line 2
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: failed to load configuration file '/etc/php-fpm.conf'

Из вывода команды мы видим ошибку во второй строке файла /etc/php-fpm.d/www.conf. Откроем и посмотрим код:

cat /etc/php-fpm.d/www.conf
= вывод команды =
[www]
#Используем порт 9000 по адресу 127.0.0.1
listen = 127.0.0.1:9000;
listen.allowed_clients = 127.0.0.1
#Пользователь и группа от которой работает php

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

systemctl restart php-fpm.service
= вывод пустой если нет ошибок =

systemctl status php-fpm.service
= вывод команды =
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: active (running) since Пт 2017-09-15 22:02:48 MSK; 4s ago
 Main PID: 11749 (php-fpm)
 Status: "Ready to handle connections"
 CGroup: /system.slice/php-fpm.service
 ├─11749 php-fpm: master process (/etc/php-fpm.conf)
 ├─11750 php-fpm: pool www

сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Видим что служба находится в автозагрузке и работает.

Вывод всех параметров PHP 7

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

<?php phpinfo(); ?>

Достаточно набрать в строке браузера http://IP или ИМЯ/info.php и вы увидите страницу примерно с таким содержанием:

PHP Version 7.1.8

System Linux lemp.sevo44.loc 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64
Build Date Aug 9 2017 19:21:59
Server API FPM/FastCGI
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc
Loaded Configuration File /etc/php.ini
Scan this dir for additional .ini files /etc/php.d

и тд. и тп.

Вывод

Судя по статье может показаться что обновление версии PHP не такое уж и сложное дело но уверяю что эта простота придет только с опытом. Многое зависит от того как долго не обновляли систему, какие ресурсы там работают и какие у каждого в отдельности требования к версии php. В случае если вам досталась система с которой работали разные люди и мало чего комментировали в коде сложностей может возникнуть очень много и единственное что вас спасет от головной боли в случае неправильной работы важных ресурсов это резервное копирование перед выполнением обновления. Лучшим вариантом при обновлении таких систем это сделать клон системы и производить все действия на нем. Конечно при работе с клоном может возникнуть дополнительные сложности но это уже другая тема.

MediaWiki c VisualEditor на CentOS 7

Установка и настройка MediaWiki c визуальным редактором VisualEditor на CentOS 7. Удобная работа с ресурсом как в локальной сети так и с интернета. Подключим сертификат SSL. Удобное добавление информации гарантия хорошего наполнения сайта.

Введение

Для меня работа с любым сайтом это прежде всего удобство добавления нужной информации. Стандартный редактор добавления статей в MwdiaWiki не удобный, так как всё отображение вносимого текста строится вводом определенных знаков. Добавление редактора WikiEditor немного улучшает вид самой панели но не решает проблему с отображением вводимой информации. Существует замечательное дополнение VisualEditor но при установки оно требует наличия на сервере сервиса Parsoid который необходим для работы. Готового решения для установки его на CentOS 7 из пакетов нет. В статье мы и рассмотрим как установить Parsoid и MediaWiki на одной машине с CentOS 7. Работать ресурс будет на базе Nginx в локальной сети. Для удобной работы с ресурсом как в локальной сети так и с интернета мы сделаем запись в DNS необходимого домена указав нужный статический IP.

Установка MediaWiki на Nginx

Нравится мне работать с Nginx поэтому и стараюсь везде его использовать где это возможно.

Для начала нам надо определиться с версиями которые мы будем устанавливать. На сайте из документации по расширению Extension:VisualEditor сказано что стабильная работа гарантирована на версии MediaWiki  1.28. Можно попробовать установить и на тестовых версиях, но я не сторонник такого подхода, поэтому будем прислушиваться к рекомендациям и устанавливать стабильные версии.

Из предыдущих статей вы можете узнать все необходимое перед установкой MediaWiki:

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

На сайте разработчика вы найдёте всю необходимую информацию.

Перейдем в необходимую папку на сервере.

cd /web/sites/wiki.sevo44.ru

Скачаем необходимую нам версию.

wget https://releases.wikimedia.org/mediawiki/1.28/mediawiki-1.28.2.tar.gz
= вывод команды =
--2017-09-10 14:30:11-- https://releases.wikimedia.org/mediawiki/1.28/mediawiki-1.28.2.tar.gz
Распознаётся releases.wikimedia.org (releases.wikimedia.org)... 91.198.174.217, 2620:0:862:ed1a::3:d
Подключение к releases.wikimedia.org (releases.wikimedia.org)|91.198.174.217|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 32965916 (31M) [application/x-gzip]
Сохранение в: «mediawiki-1.28.2.tar.gz»

100%[======================================>] 32 965 916 2,35MB/s за 11s

2017-09-10 14:30:23 (2,77 MB/s) - «mediawiki-1.28.2.tar.gz» сохранён [32965916/32965916]

Распаковываем архив.

tar -zxvf mediawiki-1.28.2.tar.gz

Переименовываем папку mediawiki-1.28.2 в www.

mv mediawiki-1.28.2 www

Дадим необходимые права для Nginx на все папки и файлы.

chown -R nginx:nginx /web/sites/wiki.sevo44.ru

Параметры настройки MediaWiki для Nginx c SSL

Создадим необходимые настройки для работы MediaWiki в Nginx c SSL сертификатом.

Как установить свободный сертификат на сайт вы можете из статьи SSL бесплатный для сайта Nginx.

vi /etc/nginx/conf.d/wiki.sevo44.conf
= необходимые параметры =
# wiki.sevo44.ru
server {
# Переводим на nttps. http2 - включит работу сайта по этому протоколу!
listen 443 ssl http2;
#listen 80;
server_name wiki.sevo44.ru www.wiki.sevo44.ru;
root /web/sites/wiki.sevo44.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/wiki.sevo44.ru/log/access.log main;
error_log /web/sites/wiki.sevo44.ru/log/error.log;
# Для ssl
ssl_certificate /etc/letsencrypt/live/wiki.sevo44.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.sevo44.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#### ssl_ciphers "HIGH:!RC4:!aNULL:!MD5:!kEDH";
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header Strict-Transport-Security 'max-age=604800';
#/ Для ssl
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
location ^~ /maintenance/ {
return 403;
}
 
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
try_files $uri /index.php;
expires max;
log_not_found off;
}
location = /_.gif {
expires max;
empty_gif;
}
location ^~ /cache/ {
deny all;
}
#gzip on; #включаем сжатие gzip для ускорения отдачи страниц
#gzip_min_length 1000;
#gzip_proxied expired no-cache no-store private auth;
#gzip_types text/plain application/xml;
location ~ \.php$ {
#try_files $uri $uri/ /index.php?$args;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /web/sites/wiki.sevo44.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/wiki.sevo44.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/wiki.sevo44.ru/www$fastcgi_script_name;
fastcgi_param PHP_VALUE "
max_execution_time = 30
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 32M
max_input_time = 60
date.timezone = Europe/Moscow
#always_populate_raw_post_data = -1
";
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
#fastcgi_param REQUEST_METHOD $request_method;
#fastcgi_param CONTENT_TYPE $content_type;
#fastcgi_param CONTENT_LENGTH $content_length;
#fastcgi_intercept_errors on;
#fastcgi_ignore_client_abort off;
#fastcgi_connect_timeout 60;
#fastcgi_send_timeout 180;
#fastcgi_read_timeout 180;
#fastcgi_buffer_size 128k;
#fastcgi_buffers 4 256k;
#fastcgi_busy_buffers_size 256k;
#fastcgi_temp_file_write_size 256k;
}
}
# Редирект с http
server {
listen 80;
server_name wiki.sevo44.ru www.wiki.sevo44.ru;
rewrite ^ https://wiki.sevo44.ru$request_uri? permanent;
}

Проверим правильность.

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Применим изменения.

systemctl reload nginx.service

Непосредственная установка MediaWiki

Теперь для начала установки нам надо либо добавить наш сайт на DNS сервер или прописать нужную строчку в необходимый файл на компьютере с которого будем работать с сайтом. Для систем с Linux надо сделать следующее:

cat /etc/hosts
= необходимое дополнение =
192.168.1.101 wiki.sevo44.ru

Запись необходимо добавлять если в локальной сети нет DNS сервера. В нашем случае DNS присутствует и все локальные компьютеры будут работать с сайтом в локальной сети без дополнительных настроек.

Набрав в браузере необходимый адрес wiki.sevo44.ru мы попадем на страницу установки MediaWiki.

Внимание! В случае появления ошибки при попытке установки
/wiki/mw-config/index.php MediaWiki\Services\ServiceDisabledException from line 340 of /storage/c/12/69/colegiovertice3/public_html/wiki/includes/services/ServiceContainer.php: Service disabled: DBLoadBalancer
Выполните действия

cd /var/lib/php/
chown nginx:nginx session/

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

Настройка файла LocalSettings.php для MediaWiki

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

Свой логотип на сайт MediaWiki

Файл должен иметь размер 160х160 пикселей.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php 
= необходимое изминение =
$wgLogo = "https://wiki.sevo44.ru/wiki_sevo44.png";

Убираем index.php из URL

В настройках Nginx мы добавили нужный параметр осталось добавить нужный код в файл настройки MediaWiki.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Скрываем index.php из url
$wgArticlePath = "/$1";
# /Скрываем index.php из url

Добавляем ico на сайт MediaWiki

Загружаем файл favicon.ico в корень сайта и добавляем строчку в файл настройки.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение = 
$wgFavicon = "../favicon.ico";

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

Добавим нужный код в файл настройки MediaWiki.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Запрет редактирования не авторизованным
$wgGroupPermissions['*']['createaccount'] = true;
$wgGroupPermissions['*']['read'] = true;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;
# /Запрет редактирования не авторизованным

Установка дополнения WikiEdit

При установке я сознательно не выбирал установку расширений. Сделаем это вручную. Всю необходимую документацию вы можете найти на странице Extension:WikiEditor/ru.

Согласно документации нам необходимо добавить в файл настроек  LocalSettings.php небольшой код.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Extension WikiEditor
wfLoadExtension( 'WikiEditor' );
# Расширение включено по умолчанию, однако пользователь может отключить его в настройках.
$wgDefaultUserOptions['usebetatoolbar'] = 1;

# Enables link and table wizards by default but still allows users to disable them in preferences
$wgDefaultUserOptions['usebetatoolbar-cgd'] = 1;

# Показывает вкладки «Предпросмотра» и «Изменений»
$wgDefaultUserOptions['wikieditor-preview'] = 1;

# Показывает кнопки «Публикации» и «Отмены» справа сверху
$wgDefaultUserOptions['wikieditor-publish'] = 1;
# / Extension WikiEditor

Я сознательно в коде который редактирую добавляю пометки для последующей удобной работы с ним как самому так и тем кто будет его смотреть после меня.

# Extension WikiEditor — говорит о начале правки кода.

# / Extension WikiEditor — говорит о конце добавляемого кода.

Установка дополнения VisualEditor

Вся документация по установке находится по ссылке Parsoid/Setup но к сожалению готового пакета для CentOS 7 нет. Мы будем использовать документацию Parsoid/Developer Setup в которой указаны варианты установки на другие системы. Все что надо для работы VisualEditor указано в документации по настройке Extension:VisualEditor. На мой взгляд документация немного не точна и размыта.

Установка Parsoid на CentOS 7

Работать Parsoid будет на той же машине что и MediaWiki. Не вижу смысла поднимать отдельно сервер на другой системе для которой есть готовые пакеты.

Установим все необходимые пакеты.

yum install nodejs npm vim-enhanced git policycoreutils-python
= вывод команды =
Ошибка: Пакет: 1:nodejs-6.11.1-1.el7.x86_64 (epel)
 Необходимо: http-parser >= 2.7.0
Ошибка: Пакет: 1:nodejs-6.11.1-1.el7.x86_64 (epel)
 Необходимо: libhttp_parser.so.2()(64bit)

Как видим установить не удалось из за того что http-parser должен быть >= 2.7.0.

Установим необходимый пакет.

yum install https://kojipkgs.fedoraproject.org//packages/http-parser/2.7.1/3.el7/x86_64/http-parser-2.7.1-3.el7.x86_64.rpm

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

yum -y install nodejs npm vim-enhanced git policycoreutils-python

После установки проверим необходимую версию node.

node --version
v6.11.1

Создадим папку opt в корне сервера куда и будем устанавливать.

mkdir /opt
cd /opt

Выполним клонирование.

git clone https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid
= вывод команды =
Cloning into 'parsoid'...
remote: Counting objects: 502, done
remote: Finding sources: 100% (124/124)
remote: Getting sizes: 100% (69/69)
remote: Compressing objects: 100% (2232324/2232324)
remote: Total 49985 (delta 46), reused 49937 (delta 40)
Receiving objects: 100% (49985/49985), 12.28 MiB | 1.72 MiB/s, done.
Resolving deltas: 100% (40561/40561), done.

Запустим команду установки предварительно зайдя в эту папку с консоли.

cd /opt/parsoid
npm install
= вывод части команды =
npm WARN prefer global jshint@2.9.4 should be installed with -g

> dtrace-provider@0.8.5 install /opt/parsoid/node_modules/dtrace-provider
> node scripts/install.js

parsoid@0.7.1 /opt/parsoid
├── abbrev@1.0.9 
├── accepts@1.3.3 
├── acorn@5.0.3 

и тд. и тп.

Произведем тестирование.

npm test
= часть вывода команды =
Везде должно быть - No errors logged. 
В дальнейшем выводе везде должны стоять зелёные галочки!

В моем случае тестирование длилось 8 минут.

Перед тем как приступить к дальнейшей настройке скажем серверу где находится наш сайт.

vi /etc/hosts
192.168.1.101 wiki.sevo44.ru

Отредактируем файл localsettings.js для обратной совместимости, и поддержки не статическиx настроек. Сделаем копию и приведем файл к необходимому виду.

cp localsettings.example.js localsettings.js
vi localsettings.js
= вывод команды с необходимыми изменениями =
'use strict';

exports.setup = function(parsoidConfig) {
 // Do something dynamic with `parsoidConfig` like,
 parsoidConfig.setMwApi({
 uri: 'http://wiki.sevo44.ru/api.php',
 });
};

По пути wiki.sevo44.ru/api.php у вас обязательно должна открыться страница с заголовком «Справка MediaWiki API». Без открытия этой страницы работать Parsoid не будет.

Скопируем образец и настроим конфигурационный файл Parsoid.

cp config.example.yaml config.yaml
vi config.yaml
= вывод команды с необходимыми настройками =
worker_heartbeat_timeout: 300000

logging:
 level: info

services:
 - module: lib/index.js
 entrypoint: apiServiceWorker
 conf:
 # For backwards compatibility, and to continue to support non-static
 # configs for the time being, optionally provide a path to a
 # localsettings.js file. See localsettings.example.js
 localsettings: ./localsettings.js

# Set your own user-agent string
 # Otherwise, defaults to:
 # 'Parsoid/<current-version-defined-in-package.json>'
 #userAgent: 'My-User-Agent-String'

# Configure Parsoid to point to your MediaWiki instances.
 mwApis:
 - # This is the only required parameter,
 # the URL of you MediaWiki API endpoint.
 uri: 'http://wiki.sevo44.ru/api.php'
 # The "domain" is used for communication with Visual Editor
 # and RESTBase. It defaults to the hostname portion of
 # the `uri` property above, but you can manually set it
 # to an arbitrary string. It must match the "domain" set
 # in $wgVirtualRestConfig.
 domain: 'wiki.sevo44.ru' # optional

Запустим Parsoid выполнив команду из папки /opt/parsoid.

cd /opt/parsoid
npm start
= вывод команды =
> parsoid@0.7.1 start /opt/parsoid
> service-runner

{"name":"parsoid","hostname":"lemp.sevo44.loc","pid":3320,"level":30,"levelPath":"info/service-runner","msg":"master(3320) initializing 4 workers","time":"2017-09-10T15:14:18.866Z","v":0}
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3330,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:22.615Z","v":0}
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3330,"level":30,"levelPath":"info","msg":"ready on :8000","time":"2017-09-10T15:14:22.711Z","v":0}
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3340,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:26.381Z","v":0}
/
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3360,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:34.026Z","v":0}
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3360,"level":30,"levelPath":"info","msg":"ready on :8000","time":"2017-09-10T15:14:34.108Z","v":0}
{"name":"parsoid","hostname":"lemp.sevo44.loc","pid":3320,"level":40,"levelPath":"warn/service-runner","msg":"Startup finished","time":"2017-09-10T15:14:34.111Z","v":0}

Самое главное в выводе это отсутствие ошибок и фраза Startup finished говорящая о том что Parsoid успешно запущен.

Оставляем эту консоль в покое и открываем новую где и будем устанавливать VisualEditor. При работе или ошибках в работе визуального редактора мы сможем увидеть всё в выводе консоли. При настройке такой способ очень удобный. В последствии мы настроим автоматический запуск в системе CentOS 7 создав юнита parsoid.service для работы в systemd.

Создание сервиса parsoid.service для работы в SystemD

Создадим файл с необходимыми настройками.

vi /etc/systemd/system/parsoid.service
= необходимые данные =
[Unit]
Description=Mediawiki Parsoid web service on node.js
Documentation=http://www.mediawiki.org/wiki/Parsoid
Wants=local-fs.target network.target
After=local-fs.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=nobody
Group=nobody
WorkingDirectory=/opt/parsoid
#EnvironmentFile=-/etc/parsoid/parsoid.env
ExecStart=/usr/bin/node /opt/parsoid/bin/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog

Добавим в автозагрузку и запустим.

systemctl enable parsoid.service
systemctl start parsoid.service

Проверим как работает сервис.

systemctl status parsoid.service
● parsoid.service - Mediawiki Parsoid web service on node.js
 Loaded: loaded (/etc/systemd/system/parsoid.service; enabled; vendor preset: disabled)
 Active: active (running) since Вс 2017-09-10 23:29:06 MSK; 1min 4s ago
 Docs: http://www.mediawiki.org/wiki/Parsoid
 Main PID: 908 (node)
 CGroup: /system.slice/parsoid.service
 ├─ 908 /usr/bin/node /opt/parsoid/bin/server.js
 ├─2324 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
 ├─2384 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
 ├─2394 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
 └─2409 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js

сен 10 23:29:28 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:32 lemp.sevo44.loc node[908]: Domain should be unique in ParsoidConfig#setMwApi calls: ....loc
сен 10 23:29:32 lemp.sevo44.loc node[908]: (It doesn't have to be an actual domain, just a unique string.)
сен 10 23:29:32 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:32 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: Domain should be unique in ParsoidConfig#setMwApi calls: ....loc
сен 10 23:29:36 lemp.sevo44.loc node[908]: (It doesn't have to be an actual domain, just a unique string.)
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"parsoid","hostname":"lemp.sevo44.loc","pid":908,...":0}
Hint: Some lines were ellipsized, use -l to show in full.

Видим что все хорошо.

Установка и настройка VisualEditor

Переходим в папку с расширениями и клонируем себе версию которая стабильная для нашей версии MediaWiki.

cd /web/sites/wiki.sevo44.ru/www/extensions/
git clone -b REL1_28 https://gerrit.wikimedia.org/r/p/mediawiki/extensions/VisualEditor.git
= вывод команды =
Cloning into 'VisualEditor'...
remote: Counting objects: 2101, done
remote: Finding sources: 100% (109865/109865)
remote: Getting sizes: 100% (9091/9091)
remote: Compressing objects: 100% (368092/368092)
remote: Total 109865 (delta 87211), reused 109794 (delta 87171)
Receiving objects: 100% (109865/109865), 20.18 MiB | 1.18 MiB/s, done.
Resolving deltas: 100% (87211/87211), done.

Перейдем в папку VisualEditor и выполним важную команду без которой по заверению разработчиков визуальный редактор работать не будет!

cd ./VisualEditor
git submodule update --init
= вывод команды =
Submodule 'lib/ve' (https://gerrit.wikimedia.org/r/p/VisualEditor/VisualEditor.git) registered for path 'lib/ve'
Cloning into 'lib/ve'...
remote: Counting objects: 3549, done
remote: Finding sources: 100% (108614/108614)
remote: Getting sizes: 100% (5062/5062)
remote: Compressing objects: 100% (468795/468795)
remote: Total 108614 (delta 91819), reused 108561 (delta 91798)
Receiving objects: 100% (108614/108614), 20.37 MiB | 1.29 MiB/s, done.
Resolving deltas: 100% (91819/91819), done.
Submodule path 'lib/ve': checked out '5fc8c7f0fe9da80aa97c456fa323acb8685bb792'

На сайте разработчика сказано с какими версиями скинов визуальный редактор совместим. Мне нравится стандартный Vector его и будем использовать.

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

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= Необходимое дополнение =
# Extension VisualEditor
wfLoadExtension ( 'VisualEditor' );

// Включение по умолчанию для всех , 
$wgDefaultUserOptions['visualeditor-enable'] = 1;

// Дополнительно: Набор VisualEditor по умолчанию для анонимных пользователей 
// в противном случае им придется перейти на VE 
// $wgDefaultUserOptions['visualeditor-editor'] = "visualeditor";

// Не позволяют пользователям отключить его 
$wgHiddenPrefs[] = 'visualeditor-enable';

// ВАРИАНТ: Включить экспериментальный код VisualEditor о функциях 
#$wgDefaultUserOptions['visualeditor-enable-experimental'] = 1;

# Для Parsoid
$wgVirtualRestConfig['modules']['parsoid'] = array(
 // URL to the Parsoid instance
 // Use port 8142 if you use the Debian package
 'url' => 'http://wiki.sevo44.ru:8000',
 // Parsoid "domain", see below (optional)
 'domain' => 'wiki.sevo44.ru',
 // Parsoid "prefix", see below (optional)
 'prefix' => 'wiki.sevo44'
);
# /Для Parsoid
# /Extension VisualEditor

После всех проделанных действий вы увидите напротив статьи две ссылки «Править» и «Править вики-текст». Дальше рассказывать нет смысла сами всё поймёте.

Доступ к локальному сайту из интернета

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

  1. Иметь статический IP;
  2. Пробросить до локальной машины необходимый 443 порт;
  3. Сделать запись в DNS указав необходимый IP и доменное имя.

Предпочитаю использовать DNS для домена компании Yandex. Достаточно добавить запись «wiki — A — IP» и через несколько часов всё заработает.

Вывод

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

MariaDB работа из консоли

Основные моменты работы с базами данных MariaDB из консоли. Не всегда под рукой имеется PhpMyAdmin, который удобен в работе а произвести необходимые работы с базами необходимо. Будьте внимательность при работе в консоли!

Введение

В статье вы узнаете как можно работать с базами данных MariaDB из консоли.

О том как производить оптимизацию после установки можно из статьи MariaDB оптимизация и установка.

Просмотр из консоли баз MariaDB

Подключение к серверу баз

mysql -u root -p
= вывод команды =
Enter password: указываем пароль root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 100985
Server version: 5.5.50-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Вывод списка имеющихся баз

MariaDB [(none)]> SHOW DATABASES;
= вывод команды =
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wiki_sevo44 |

+--------------------+
4 rows in set (0.01 sec)

Просмотр базы с выводом параметров

MariaDB [(none)]> SHOW CREATE DATABASE `wiki_sevo44`;
= вывод команды =
+-----------+--------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------+
| wiki_sevo44 | CREATE DATABASE `wiki_sevo44` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

Подключение к необходимой базе

MariаDB [(none)]> USE wiki_sevo44;
= вывод команды =
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariаDB [wiki-sevo44]>

Просмотр всех таблиц из базы

MariаDB [wiki-sevo44]> SHOW tables;
= вывод команды =
+-----------------------+
| Tables_in_wiki_sevo44 |
+-----------------------+
| l10n_cache |
| langlinks |
| log_search |
| logging |
| module_deps |
| objectcache |
| user_former_groups |
| user_groups |
| user_newtalk |
| user_properties |
| valid_tag |
| watchlist |
+-----------------------+
12 rows in set (0.00 sec)

Просмотр содержания нужной таблицы

MariаDB [wiki-sevo44]> SELECT * FROM page;
= вывод команды =
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| page_id | page_namespace | page_title | page_restrictions | page_is_redirect | page_is_new | page_random | page_touched | page_links_updated | page_latest | page_len | page_content_model | page_lang |
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| 1 | 0 | Заглавная_страница | | 0 | 1 | 0.6843282599 | 20170826182609 | NULL | 1 | 1035 | wikitext | NULL |
| 2 | 0 | Тестовая 3 | | 0 | 1 | 0.485584249082 | 20170830191050 | 20170830191052 | 2 | 20 | wikitext | NULL |
| 3 | 0 | Тестовая | | 0 | 1 | 0.027751067675 | 20170831130200 | 20170831130201 | 3 | 19 | wikitext | NULL |
| 4 | 0 | Тестовая 2 | | 0 | 0 | 0.213026978763 | 20170831131024 | 20170831131025 | 6 | 1120 | wikitext | NULL |
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
4 rows in set (0.00 sec)

Добавление базы в MariaDB

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

Добавление базы с параметрами

MariаDB [(none)]> CREATE DATABASE `base` CHARACTER SET utf8 COLLATE utf8_general_ci;
= вывод команды =
Query OK, 1 row affected (0.00 sec)

Удаление базы

MariaDB [(none)]> DROP DATABASE `base`;
= вывод команды =
Query OK, 0 rows affected (0.01 sec)

Просмотр пользователей с выводом их прав

MariaDB [(none)]> SELECT User,Host FROM mysql.user;
= вывод команды =
+--------+-----------+
| User   | Host      |
+--------+-----------+
| root   | localhost         |
| mysql  | localhost |
+--------+-----------+
2 rows in set (0.005 sec)

Права пользователя баз данных MariaDB

В случае необходимости подключатся к базе с других компьютеров необходимо создать пользователя с нужным параметром и дать права на доступ в настройках сервера MariaDB!

Права на доступ к серверу баз данных делается в двух местах:

  1. Параметр bind-address=0.0.0.0 в конфигурационном файле самого сервера баз MariaDB разрешающий подключатся с любого адреса (или укажите конкретный IP) в разделе [mysqld] ;
  2. Права пользователя на возможность удаленного подключения к базе данных.

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

Менять права пользователя root не желательно, но можно создать пользователя и дать ему полные права. Держать ещё одного пользователя с полными правами не разумно, но иногда необходимо. Добавляются пользователю полные права командой:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* to 'имя пользователя'@'%';

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

Например, ниже представлена полная версия команд после выполнения которых будет создан пользователь sevo44 с полными правами:

mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE USER `sevo44`@`%` IDENTIFIED BY 'ПАРОЛЬ';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* to 'sevo44'@'%';
Query OK, 0 rows affected (0.017 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

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

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

# Команда смены прав доступа пользователя на подключение с любого адреса (параметр %)
MariaDB [(none)]> UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='имя_пользователя';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

# Команда смены прав доступа на базы
MariaDB [(none)]> UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='имя_пользователя';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 0 Changed: 0 Warnings: 0

Добавление пользователя

# Права на доступ только с localhost
MariаDB [(none)]> CREATE USER `base_user`@localhost IDENTIFIED BY 'ПАРОЛЬ';

# Права на доступ с любого адреса (при использовании знаков в названиях код заключается в кавычки! 
MariаDB [(none)]> CREATE USER `base_user`@`%` IDENTIFIED BY 'ПАРОЛЬ';

# Права на доступ с адреса 10.10.0.2 (при использовании знаков в названиях код заключается в кавычки!
MariаDB [(none)]> CREATE USER `base_user`@`10.10.0.2` IDENTIFIED BY 'ПАРОЛЬ';

= правильный вывод команды для любой команды =
Query OK, 0 rows affected (0.10 sec)

Назначение пользователя базе

# При назначении прав выставляем пользователя с нужными правами!
MariaDB [(none)]> GRANT ALL PRIVILEGES ON base.* to base_user@localhost;
= вывод команды =
Query OK, 0 rows affected (0.04 sec)

После всех манипуляция с базами необходимо обновить права доступа

MariаDB [(none)]> FLUSH PRIVILEGES;
= вывод команды =
Query OK, 0 rows affected (0.02 sec)

Выход с сервера MariaDB

Выход производиться командой

MariаDB [(none)]> exit
= вывод команды =
Bye

Резервное копирование и восстановление баз MariaDB

Создадим необходимую папку для бэкапов и перейдем в неё

mkdir backup
cd backup

Создание резервной копию базы с указанием даты создания

mysqldump -u base_user -p base > base-dump_10092017.sql
= вывод команды =
Enter password: вводим пароль пользователя базы и жмем Enter

Восстановление резервной копии базы

mysql -u base_user -p base < base-dump_10092017.sql
= вывод команды =
Enter password: вводим пароль пользователя базы и жмем Enter

Вывод

В консоли без проблем можно делать все основные манипуляции с базой данных. Для более удобной работы удобней использовать PhpMyAdmin, установку и настройку которой я рассмотрел в своей статье PhpMyAdmin на Nginx.

FirewallD базовая настройка

FirewallD появился в CentOS 7 и на первый взгляд может вам показаться неудобным. Рассмотрим основные моменты работы с сервисом который удовлетворит большинство потребностей стандартного сервера. Тонкая настройка возможна при доскональном изучении руководства.

Вступление

С появлением FirewallD многие советуют отключать его и пользоваться старым проверенным механизмом iptables. Мне обычно надо открывать доступ по определенным службам или портам, делать шлюз для выхода в интернет и пробрасывать необходимые порты или службы внутрь локальной сети. Все эти настройки делаются просто, если понять суть и логику работы о которой я и расскажу.

Установка и команды работы сервиса FirewallD

Проверка наличия

systemctl status firewalld
= вывод команды =
Unit firewalld.service could not be found.

Установка

Установим FirewallD вез вопросов

yum -y install firewalld

Добавление в автозагрузку и запуск

systemctl enable firewalld
systemctl start firewalld

Проверка работы

systemctl status firewalld
 ● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
 Active: active (running) since Чт 2017-04-13 20:22:40 MSK; 14s ago
 Docs: man:firewalld(1)
 Main PID: 2099 (firewalld)
 CGroup: /system.slice/firewalld.service
 └─2099 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

апр 13 20:22:39 fd.sevo44.loc systemd[1]: Starting firewalld - dynamic firewall daemon...
 апр 13 20:22:40 fd.sevo44.loc systemd[1]: Started firewalld - dynamic firewall daemon.

Или короткой командой

firewall-cmd --state
= вывод команды =
running

Опция —permanent для FirewallD

Особое внимание хочу сразу обратить на параметр —permanent который указывается в командах. Команды введенные в консоли без этого флага будут работать только в период данной сессии. После перезагрузки службы или компьютера все настройки вернутся в начальное состояние. Не забывайте этот важный момент! На практике это очень удобно использовать, когда надо дать временный доступ или настраиваете и хотите проверить как будут работать настройки. Если что то пошло не так достаточно перезагрузить сервер и все вернется в исходное состояние.

Применение изменений FirewallD

После каждого введенного нового правила необходимо их применить чтобы они стали работать

firewall-cmd --reload
= вывод команды =
success

Вывод «success» после любой команды показывает что все хорошо и команда выполнена успешно.

Что такое Зоны в FirewallD

Просмотр списка всех имеющихся зон

firewall-cmd --get-zones
= вывод команды =
work drop internal external trusted home dmz public block

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

Добавление своей зоны

firewall-cmd --permanent --new-zone=custom_zone

Важно понять то что каждый сетевой интерфейс может быть привязан только к одной зоне. К любой зоне можно привязать хоть все интерфейсы. Зоной по умолчанию считается public и именно туда и попадут все подключенные сетевые интерфейсы.

Изменение зоны по умолчанию

firewall-cmd --permanent --set-default-zone=home

После этого все новые подключенные сетевые интерфейсы попадут в эту зону.

Примеры настройки FirewallD

Рассмотрим все основные моменты настройки. Первое что нам надо это вывести и посмотреть настройки всех зон.

Просмотр всех зон

firewall-cmd --list-all-zones
= вывод части команды =
work
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

internal
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client mdns samba-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

external
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: ssh
 ports: 
 protocols: 
 masquerade: yes
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

home
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client mdns samba-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

public (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3 enp0s8
 sources: 
 services: dhcpv6-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

Из вывода мы видим настройки каждой зоны. Полный вывод не всегда удобен и поэтому лучше вывести список активных зон.

Вывод активных зон

firewall-cmd --get-active-zones
= вывод команды =
public
 interfaces: enp0s3 enp0s8

Видим что есть два сетевых интерфейса которые работают согласно правилам зоны public.

Информация о конкретной зоне

firewall-cmd --list-all --zone=public
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3 enp0s8
 sources: 
 services: dhcpv6-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

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

Создание правил для зоны FirewallD

Правила можно создавать как для сервисов так и для необходимых портов и их диапазонов.

Правила для сервисов

Выведем все доступные сервисы командой

firewall-cmd --get-services
= вывод команды =
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

В случае если необходимо понять какие порты работают в сервисе можно это посмотреть в файле (на примере ssh)

cat /usr/lib/firewalld/services/ssh.xml
= вывод команды =
<?xml version="1.0" encoding="utf-8"?>
<service>
 <short>SSH</short>
 <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
 <port protocol="tcp" port="22"/>
</service>

Из вывода видно что сервис SSH работает на 22 порту. Все сервисы вы можете посмотреть в папке /usr/lib/firewalld/services/ и при необходимости по аналогии можно добавить любой свой сервис указав все необходимые параметры. Можно изменить порт по которому будет работать ssh в файле или добавить нужный порт в необходимую зону, все зависит от ваших пожеланий.

Добавление разрешение для службы http в зоне public и применим изменении:

firewall-cmd --permanent --zone=public --add-service=http
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success

Правила для портов

Добавление необходимого порта в зону public

firewall-cmd --permanent --zone=public --add-port=25555/tcp
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success

Добавление диапазона портов в зоне public

firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp
= вывод команды =
success
firewall-cmd --reload 
= вывод команды =
success

Удаление ненужного сервиса с зоны public

firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success

Настройка сетевых интерфейсов в FirewallD

Для начала нам надо понять где сидят сетевые интерфейсы

ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host 
 valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:05:ba:20 brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.172/24 brd 192.168.0.255 scope global dynamic enp0s3
 valid_lft 31948sec preferred_lft 31948sec
 inet6 fe80::37:68ea:f655:3c2c/64 scope link 
 valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:a8:9d:bf brd ff:ff:ff:ff:ff:ff
 inet 10.10.0.1/24 brd 10.10.0.255 scope global enp0s8
 valid_lft forever preferred_lft forever
 inet6 fe80::a00:27ff:fea8:9dbf/64 scope link 
 valid_lft forever preferred_lft forever

Из вывода видно что enp0s3 работает с внешней сетью а enp0s8 с внутренней.

Отнесем внешнюю сеть в зону external а внутреннюю в зону internal.

Существует два способа назначения интерфейса в зону:

  • Удалить из текущей зоны и добавить в новую;
  • Сразу назначить в нужную зону.

Удаление и добавление

= внешняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=enp0s3
firewall-cmd --permanent --zone=external --add-interface=enp0s3
= внутренняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=enp0s8
firewall-cmd --permanent --zone=internal --add-interface=enp0s8

Назначение в нужную зону

firewall-cmd --permanent --zone=external --change-interface=enp0s3
firewall-cmd --permanent --zone=internal --change-interface=enp0s8

Настройка интернет шлюза

Для того чтобы у нас внутренняя сеть имела доступ в интернет нам необходимо на зоне работающей во внешней сети настроить маскарад (masquerade).

Проверим состояние masquerade на внешнем интерфейсе

firewall-cmd --zone=external --query-masquerade
= вывод команды =
yes

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

firewall-cmd --permanent --zone=external --add-masquerade

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

Проброс порта на внутреннюю сеть

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

Пробросим порт на котором работает SSH до компьютера внутренней сети с адресом 10.10.0.10

firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toaddr=10.10.0.10

firewall-cmd --reload

Можно пробросить входящие на 22 порт с изменением порта назначения (с 22 на 20155):

firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=20155:toaddr=10.10.0.10

firewall-cmd --reload

Посмотрим что в итоге получилось с настройками

###
firewall-cmd --get-active-zones
= посмотрим активные зоны =
internal
 interfaces: enp0s8
external
 interfaces: enp0s3
###
firewall-cmd --list-all --zone=internal
= посмотрим внутреннюю зону =
internal (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s8
 sources: 
 services: mdns samba-client ssh http https
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 
###
firewall-cmd --list-all --zone=external
= посмотрим внешнюю зону =
external (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3
 sources: 
 services: ssh
 ports: 
 protocols: 
 masquerade: yes
 forward-ports: port=22:proto=tcp:toport=:toaddr=10.10.0.10
 sourceports: 
 icmp-blocks: 
 rich rules:

Результат

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

RSA или авторизация SSH по ключу

Настроим авторизацию по ключу RSA для SSH сервера. Помимо удобства в использовании мы сильно обезопасим нашу систему от взлома. Рассмотрим разные варианты использования подключения по ключу. Надежное хранение приватных ключей гарантия подключения.

Введение

Не на долго удалось мне отложить настройку этого варианта подключения к серверу. Необходимость настройки доступа по ключу пришла откуда я даже не думал. Неожиданно обнаружил что резервные копии периодически не проходят на Yandex.Disk.  Резервирование сайтов у меня производится скриптом который резервирует вначале файлы сайта а потом базу. Пропуски были как с файлами так и с базами.  Решил настроить резервное копирование на сервер с которым идет соединение ssh.

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

Расскажу как настроить подключение к данным web сервера используя протокол sftp по файлу с ключом расширением ppk.

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

Генерация пары ключей RSA

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

Можно не указывать путь куда мы будем устанавливать ключи и тогда они создадутся в папке по умолчанию с базовым названием. Я не буду менять путь по умолчанию для ключей а лишь буду создавать их со своим удобным мне названием.

Создадим связку ключей указав тип -t rsa, длину ключа -b 2048 и место с необходимым нам названием:

ssh-keygen -t rsa -b 2048 -f /home/user/.ssh/rsa_sevo44
= вывод команды =
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/rsa_sevo44.
Your public key has been saved in /home/user/.ssh/rsa_sevo44.pub.
The key fingerprint is:
SHA256:A9d+2cz6M1GK482oOxf/zweqt9B18WPox04m+Deczgc user@H4530
The key's randomart image is:
+---[RSA 1024]----+
| |
| . |
| . . . . |
| o . =. +|
| S . oo==o|
| . o*oE..|
| .oo@.O.|
| ..B.&*o|
| +B.o+BO|
+----[SHA256]-----+

По результату видим что создалась пара ключей с названием rsa_sevo44.

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

Настройка SSH сервера

Настройка сервера на всех системах Linux сводится к редактированию конфигурационного файла ssh сервера:

mcedit /etc/ssh/sshd_config
= необходимые параметры с пояснениями =
RSAAuthentication yes
PubkeyAuthentication yes
PubkeyAcceptedKeyTypes ssh-dss
#Путь к файлу с публичными ключами
AuthorizedKeysFile %h/.ssh/authorized_keys
#Отключение возможности авторизации по паролю
PasswordAuthentication no
#Вид публичного ключа для авторизации
PubkeyAcceptedKeyTypes ssh-rsa

Не советую сразу отключать подключение по паролю. Отключите его только после проверки авторизации по ключу!

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

Перезагрузим сервер SSH:

systemctl restart ssh

Добавление публичного ключа RSA

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

ssh-copy-id -i /home/user/.ssh/rsa_sevo44.pub -p 25555 root@10.10.0.1
= вывод команды =
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/rsa_sevo44.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.10.0.1's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@10.10.0.1'"
and check to make sure that only the key(s) you wanted were added.

После введения пароля от пользователя к которому мы хотим повесить публичный ключ он добавится в список который находится в файле /root/.ssh/authorized_keys.

Проверим добавление ключа на сервере:

cat /root/.ssh/authorized_keys
= вывод команды =
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCHkWoBv8b+j11IJ685m4WrYCdgx/v5bqwC3AahFyySH4yK0CV8ZJA7H6e3bbkPEI1Aw2xB6xRUS7NC4B3dGciDycMJJumX/OGpocm7A4BdrdODXfHzW5ap/WTN46/nlq7pMZH/8sa8GLzhpOv3OokUogLZFh1zZaFD4M0Hiseyw== user@H4530

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

При желании вы можете добавить открытую часть сертификата руками.

Для этого смотрим публичную часть сертификата:

cat /home/user/.ssh/rsa_sevo44.pub
= вывод команды =
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCHkWoBv8b+j11IJ685m4WrYCdgx/v5bqwC3AahFyySH4yK0CV8ZJA7H6e3bbkPEI1Aw2xB6xRUS7NC4B3dGciDycMJJumX/OGpocm7A4BdrdODXfHzW5ap/WTN46/nlq7pMZH/8sa8GLzhpOv3OokUogLZFh1zZaFD4M0Hiseyw== user@H4530

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

vim /root/.ssh/authorized_keys
= добавляем код =
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCHkWoBv8b+j11IJ685m4WrYCdgx/v5bqwC3AahFyySH4yK0CV8ZJA7H6e3bbkPEI1Aw2xB6xRUS7NC4B3dGciDycMJJumX/OGpocm7A4BdrdODXfHzW5ap/WTN46/nlq7pMZH/8sa8GLzhpOv3OokUogLZFh1zZaFD4M0Hiseyw== user@H4530

Запоминаем пароль с помощью ssh-agent

Так как мы указали нестандартное название то без указания места нашего приватного ключа система его не будет видеть.

На многих новых версиях систем всё работает из коробки и наставить то что описано ниже не надо.

Для добавления ключей в список для использования во время работы на компьютере используем сервис ssh-agent.

Проверим состояние ssh-agent:

ps -C ssh-agent
= вывод команды =
 PID TTY TIME CMD
 4564 ? 00:00:00 ssh-agent

Теперь нам надо добавить нужный ключ командой:

ssh-add /home/user/.ssh/rsa_sevo44
= вывод команды =
Enter passphrase for /home/user/.ssh/rsa_sevo44: вводим пароль
Identity added: /home/user/.ssh/rsa_sevo44 (/home/user/.ssh/rsa_sevo44)

После перезагрузки данную процедуру придется повторить!

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

ssh-add -l
= вывод команды =
1024 SHA256:A9d+2cz6M1GK482oOxf/zweqt9B18WPox04m+Deczgc /home/user/.ssh/rsa_sevo44 (RSA)

Для удаления всех ключей применим опцию -D:

ssh-add -D
= вывод команды =
All identities removed.

Такую команду удобно использовать когда мы работали на чужом компьютере. Для удаления только своего ключа можно использовать опцию -d путь к ключу.

Права на ключи RSA

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

Выставим необходимые права (на примере ключа с именем rsa_sevo44 пользователя local):

chmod 0600 /home/local/.ssh/rsa_sevo44
chmod 0644 /home/local/.ssh/rsa_sevo44.pub

Для проверки выведем полную информацию о файлах
ls -l
= Необходимая часть =
-rw------- 1 local local  986 июл 15 21:24 rsa_sevo44
-rw-r--r-- 1 local local  225 июл 15 21:24 rsa_sevo44.pu

Авторизация по ключу в SSH

Только после добавления необходимого ключа командой ssh-add возможно подключится по ключу!

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

ssh -p 4223442 root@10.10.0.2 -v
= вывод части команды с комментариями =
OpenSSH_7.5p1-hpn14v12, OpenSSL 1.0.2k 26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to 10.10.0.2 [10.10.0.2] port 4223442.
debug1: Connection established.
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:i8TBEPr+jQo0HT49dpo1zOgCX9xPUOlvFEDCU63tHQA
debug1: Host '[10.10.0.2]:4223442' is known and matches the ECDSA host key.
debug1: Found key in /home/user/.ssh/known_hosts:20
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_SERVICE_ACCEPT received
# В этой строчке мы видим возможные варианты подключения к серверу
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/user/.ssh/rsa_sevo44
debug1: Server accepts key: pkalg ssh-rsa blen 151
debug1: Authentication succeeded (publickey).
Authenticated to10.10.0.2 ([10.10.0.2]:4223442).
debug1: HPN to Non-HPN Connection
debug1: Final hpn_buffer_size = 2097152
debug1: HPN Disabled: 0, HPN Buffer Size: 2097152
debug1: channel 0: new [client-session]
debug1: Enabled Dynamic Window Scaling
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jul 16 00:28:36 2017 from 10.10.0.3
root@proxmox:~#

FileZilla авторизация по ключу PPK

В статье SFTP настройка для веб хостинга я рассказывал как настроить подключение к данным web сервера по sftp.

Расскажу как подключатся используя сертификат.

Вначале необходимо из действующего сертификата создать файл с расширение ppk. Так как, программа FileZilla понимает только этот формат.

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

apt install putty-tools openssh-client

Переходим в папку где находится закрытая и открытая часть необходимого ключа и создаём в корневой папке своего профиля файл c ключoм:

cd /home/local/.ssh/
puttygen rsa_sevo44 -o ~/rsa_sevo44.ppk

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

Заключение

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

PXE загрузочный сервер

Настроим загрузочный PXE сервер. Загрузить настроенную операционную систему на компьютере без жесткого диска всегда приятно. Использовать утилиты для диагностики и работы с жесткими дисками удобно и практично. Настройка на любом дистрибутиве Linux.

Введение

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

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

  • Загружать операционную систему Calculate Linux,
  • Проверить память программой Memtest86+,
  • Проверить жесткие диски программами MHDD и Victoria,
  • Работать с жесткими дисками программой Clonezilla.

Вся настройка производится на операционной система CentOS 7. Настроить можно и на любой другой системе, так как используемые пакеты присутствую во всех операционных системах Linux.

Подготовка системы для работы PXE сервера

Для загрузки по PXE в Bios подключаемого компьютера должна быть включена и настроена данная функция.

Установим необходимые пакеты без вопросов:

yum -y install dhcp xinetd tftp tftp-server nfs-utils syslinux

Настройка DHCP сервера

В локальной сети должен работать только один сервер DHCP.

Мои настройки будут производится на системе работающей в качестве шлюза локальной сети. Я не буду рассматривать настройку самого шлюза а лишь затрону моменты необходимые для нас.

Параметры сетевой карты которая смотрит во внутреннюю сеть:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_PEERDNS=no
IPV6_PEERROUTES=no
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=d785f929-dcfb-436a-8ba7-59189a394aa6
DEVICE=enp0s8
# Загрузка при старте
ONBOOT=yes
IPADDR=192.168.1.1
PREFIX=24

Как видна моя внутренняя локальная сеть будет 192.168.1.0/24

Приведем конфигурационный файл DHCP сервера к следующему виду:

vim /etc/dhcp/dhcpd.conf
= вывод команды с необходимыми изменениями =
default-lease-time 32400;
max-lease-time 604800;
min-lease-time 7200;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name "sevo44.loc";
option domain-name-servers 192.168.1.1;
range 192.168.1.150 192.168.1.220;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option ntp-servers 192.168.1.1;
#PXE SERVER IP
next-server 192.168.1.1;
filename "pxelinux.0";
}

Добавляем в автозагрузку:

systemctl enable dhcpd

Запустим службу:

systemctl start dhcpd

Использование DHCP сервера очень удобно, так как позволяет указывает различные параметры которые значительно упрощают жизнь при работе с локальной сетью.

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

host hp4530 {
hardware ethernet 64:31:50:95:b1:b7; 
fixed-address 192.168.1.5;
}

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

systemctl restart dhcpd

Настройка TFTP сервера

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

vim /etc/xinetd.d/tftp
= вывод команды с необходимыми изменениями =
service tftp
 {
 socket_type = dgram
 protocol = udp
 wait = yes
 user = root
 server = /usr/sbin/in.tftpd
 # Путь для расположения файлов
 server_args = -s /var/lib/tftpboot
 # Для включения поменяем yes на no
 disable = no
 per_source = 11
 cps = 100 2
 flags = IPv4
 }

Добавляем в автозагрузку:

systemctl enable xinetd

Запустим службу:

systemctl start xinetd

Настройка NFS сервера

Приведем файл настройки к виду:

vim /etc/exports
= вывод команды с необходимыми изменениями =
/var/lib/tftpboot/ 192.168.1.0/24(rw,no_root_squash)

Например, я использую сервер nfs для размещения бэкапов виртуальных машин Proxmox.

В моем случае необходимо добавить строчку:

/sevo44/pve/backup 192.168.0.100(rw,sync,no_root_squash,no_all_squash)

Где параметры имеют следующие значения:

  • /sevo44/pve/backup — расшариваемая директория;
  • 192.168.0.100 — IP адрес клиента с которого может быть подключение (можно указать 192.168.0.0/24 тогда будет возможность подключения для всей под сети);
  • rw – доступ на чтение и запись (может принимать значение ro-только чтение);
  • sync – синхронный режим доступа(может принимать обратное значение- async). sync (async) — указывает, что сервер должен отвечать на запросы только после записи на диск изменений, выполненных этими запросами. Опция async указывает серверу не ждать записи информации на диск, что повышает производительность, но понижает надежность, т.к. в случае обрыва соединения или отказа оборудования возможна потеря данных;
  • no_root_squash – запрет подмены uid/gid для суперпользователя (root). По умолчанию пользователь root на клиентской машине не будет иметь доступа к разделяемой директории сервера. Этой опцией мы снимаем это ограничение. В целях безопасности этого лучше не делать;
  • all_squash / no_all_squash — установка подмены идентификатора от всех пользователей all_squash — подмена запросов от ВСЕХ пользователей (не только root) на анонимного uid/gid, либо на пользователя, заданного в параметре anonuid/anongid. Используется обычно для публичного экспорта директорий. no_all_squash — запрет подмены uid/gid для от всех пользователей.

Создание папки и назначение прав доступа осуществляется командами:

mkdir -p /sevo44/pve/backup
chmod -R 777 /sevo44/pve/backup

Для полноценной работы необходимо открыть доступ необходимым портам. Для FirewallD команды имеют вид:

firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=54302/tcp
firewall-cmd --permanent --add-port=20048/tcp
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=46666/tcp
firewall-cmd --permanent --add-port=42955/tcp
firewall-cmd --permanent --add-port=875/tcp
firewall-cmd --permanent --zone=public --add-service=nfs
firewall-cmd --permanent --zone=public --add-service=mountd
firewall-cmd --permanent --zone=public --add-service=rpc-bind
= применим изменения =
firewall-cmd --reload

Внимательно отнеситесь к указанию зоны! Более подробно можно прочитать в статье FirewallD базовая настройка.

Добавляем в автозагрузку:

systemctl enable nfs-server

Запустим службу:

systemctl start nfs-server

Создание загрузочного меню PXE сервера

Скопируем необходимые файлы для работы меню:

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
cp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot
cp /usr/share/syslinux/memdisk /var/lib/tftpboot
cp /usr/share/syslinux/mboot.c32 /var/lib/tftpboot
cp /usr/share/syslinux/chain.c32 /var/lib/tftpboot

Создадим папку для файлов меню загрузки:

mkdir /var/lib/tftpboot/pxelinux.cfg

Создание главного меню PXE сервера

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

Создадим файл главного меню:

mcedit /var/lib/tftpboot/pxelinux.cfg/default
= необходимые параметры с комментариями =
default vesamenu.c32
# Фон для меню
menu background backgrounds/fon.png
prompt 0
# Время через которое стартует первый пункт меню
timeout 100

menu title ##### PXE BOOT MENU: #####

Label 10
menu label Calculate 17 KDE & SEVO44
kernel live/calculate/cld17kde/boot/vmlinuz
append initrd=live/calculate/cld17kde/boot/initrd root=nfs:192.168.1.1:/var/lib/tftpboot/live/calculate/cld17kde calculate=lang:ru_RU,keymap:ru_RU,timezone:Europe/Moscow rw selinux=0

LABEL # ADMIN SETTINGS

LABEL 20
# Пароль для запуска
menu passwd 777
MENU LABEL Utilits
KERNEL vesamenu.c32
APPEND pxelinux.cfg/utilits

Label # BOOT LOCAL

label 30
menu label Boot from local drive
localboot 0

Файл фонового изображения меню должен быть размером 640х480 пикселей, в формате PNG или JPEG.

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

mkdir /var/lib/tftpboot/live
mkdir /var/lib/tftpboot/backgrounds

Загружаем необходимый iso образ любыми удобными вам способами и копируем содержимое в нужную папку.

При использовании образа с графической оболочкой KDE для стабильной работы необходимо использовать 4 G оперативной памяти!

Приведу лишь команды которые необходимы для монтирования и размонтирования образа iso:

mount -o loop /root/calculate_kde_sevo44.iso /mnt/iso
umount /mnt/iso

Настройки параметров для загрузки разных операционных систем различаются.

В данной настройке по умолчанию грузится live образ. В случае если вам необходима по умолчанию загрузка с жесткого диска, то разместите необходимый пункт первым в меню.

Моё главное меню:

Создание подменю для PXE сервера

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

Мой файл подменю для utilits выглядит так:

mcedit /var/lib/tftpboot/pxelinux.cfg/utilits
= вывод команды с пояснениями =
default vesamenu.c32
menu background backgrounds/fon.png

menu title ##### Utilits: #####

label # TEST

LABEL 10
MENU LABEL Memtest86+
KERNEL utilits/memtest86

LABEL 11
MENU LABEL MHDD
kernel memdisk
initrd utilits/mhdd32ver4.6.iso
append iso raw

LABEL 12
MENU LABEL Victoria 3.5 HDD
kernel memdisk
initrd utilits/v35.iso
append iso raw

label # Backup/Recovery

LABEL 20
MENU LABEL Clonezilla Live 2.5.2-17
KERNEL utilits/zilla/live/vmlinuz
APPEND initrd=utilits/zilla/live/initrd.img boot=live username=user union=overlay config components quiet noswap edd=on nomodeset nodmraid locales=ru_RU.UTF-8 keyboard-layouts=NONE ocs_live_run="ocs-live-general" ocs_live_extra_param="" video=uvesafb:mode_option=1024x768-16 ocs_live_batch=no net.ifnames=0 nosplash noprompt fetch=tftp://192.168.1.1/utilits/zilla/live/filesystem.squashfs

Label ###
LABEL 30
MENU LABEL NEXT
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default

Скачать необходимый iso образ Clonezilla вы на сайт разработчика. На сайте вы можете найти всю необходимую информацию для настройки и работы с этой замечательной системой.

Скачать утилиты использованные в данном описании.

Моё меню с утилитами:

Видео

На видео показано как работает система Calculate Linux которую я настроил под свои нужды запускаемая с помощью PXE сервера.

Вывод

Имея под рукой такой сервер я без труда могу запустить на любом компьютере, с возможностью PXE загрузки, операционную систему и поработать в ней. Можно загрузить ClineZilla и произвести любые манипуляции с жесткими дисками. Конечно система с KDE тяжеловата и я обязательно настрою образ с XFCE, для работы на компьютерах со слабыми техническими параметрами.

Vim текстовый редактор

Рассмотрим основные команды работы с текстовым редактором Vim основном на более старом Vi. Если вы нацелены на серьезную дальнейшую работу в качестве системного администратора изучайте этот редактор. Vi универсальный редактор, который есть везде.

Почему выбираем VIM

Долгое время пользовался редактором mcedit, который входит в текстовый редактор Midnight Commander, и он вполне меня устраивал. Периодически видел в сети рекомендации опытных админов использовать редактор vim, но никак не мог понять чем же он так хорошо и почему советуют именно его.

Как оказалось этот редактор имеет смысл использовать исходя из двух основных причин:

  1. Других редакторов нет на других системах по умолчанию (например Solaris), Vi это универсальный редактор, который есть везде с 80-x годов;
  2. При редактировании с mc возможны ошибки, если случайно задел что-то и появился непечатный символ — глазами его не увидеть, а голову потом ломать можно очень долго почему что-то не работает как надо.

Этих причин мне хватило чтобы осознано изучить как работать с редактором Vim.

В случае отсутствия редактора установите пакет vim согласно правил выбранного дистрибутива.

Учебник VIM

Введем в консоли команду и увидим учебник по vim:

vimtutor
= вывод команды =
===============================================================================
= Д о б р о п о ж а л о в а т ь в у ч е б н и к VIM -- версия 1.7 =
===============================================================================

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

Вам потребуется приблизительно 25-30 минут на освоение данного учебника в
 зависимости от того, сколько времени вы потратите на эксперименты.

Внимание! Командами в уроках вы будете изменять этот текст. Создайте
 копию этого файла, чтобы попрактиковаться на ней (если вы запустили
 "vimtutor", то это уже копия).

Важно помнить, что этот учебник предназначен для обучения в процессе
 использования. Это означает, что вы должны запускать команды для того,
 чтобы как следует их изучить. Если вы просто прочитаете этот текст, то
 не запомните команды!

Теперь убедитесь в том, что клавиша CapsLock не включена, и нажмите
 клавишу j несколько раз, так, чтобы Урок 1.1 полностью поместился на
 экране.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Урок 1.1: ПЕРЕМЕЩЕНИЕ КУРСОРА
** Для перемещения курсора нажмите клавиши h,j,k,l так, как показано ниже. **
!!! Остальная часть учебника не показана !!!

На прохождение всех уроков и выписывания всех команд в удобной мне форме у меня ушел день. Советую обязательно пройти эти уроки! Если вам покажется что используемые команды разбросаны по своим функциональным назначения вы можете воспользоватся моим списком команд.

Смена цветовой схемы

Все схемы для CentOS можно посмотреть по пути /usr/share/vim/vim74/colors

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

:colorscheme

Для просмотра цветовой схемы в текущей сессии набираем:

:colorscheme scheme_name

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

= переходим в папку пользователя =
cd
= создаем необходимый файл =
vim .vimrc
= вносим необходимые параметры
syntax on
colorscheme scheme_name

Список основных команд VIM

ESC — снимает все режимы и переводит в Normal mode.

Навигация и Поиск

СТРЕЛКИ — перемещение курсора.
0 — (ноль) перемещение к началу строки.
Ctrl + G — внизу экрана появится статус с именем файла и номером строки.
Shift + G  — перемещение к концу файла.
:№ строки — переход к нужной строке.

/искомая фраза — поиск после курсора.
/искомая фраза\с — игнорировать регистр только для одного поиска.
n — повтор поиска.
Shift + N — поиск в обратном направлении.
?искомая фраза — сразу поиск в обратном направлении.

Опции для поиска:
:set ic — игнорирование регистра при поиске.
:set is — отображение частичных совпадений при поиске.
:set hls — подсветка всех совпадений при поиске.
Для отключения добавляется`no’ перед параметром.

Поиск парных скобок:
Ставим курсор на нужный символ { [ и тд. и знак % перенесет на парную скобку.

Выход и Сохранение

:q! — выйти из редактора БЕЗ СОХРАНЕНИЯ любых сделанных изменений.
:q — закрыть если не делали никаких действий с файлом.
:wq — выход с СОХРАНЕНИЕМ всего что сделано.
:w!q — выход с СОХРАНЕНИЕМ когда у файла есть атрибуты на запрет изменений. Не путать с правами доступа!

Аналоги команд:
w! — это W
q! — это Q

:w test — создаст файл test  в текущей директории.
:w /home/test — создаст файл по указанному пути.

Сохранения части текста в файл:
v — перевод в визуальный режим редактора (выделение стрелками).
:'<,’>w /root/test — параметр ‘<,’> говорит что сохраниться только выделенная часть  файл test.

Редактирование

:noh — убрать выделения.

i — вставка текста под курсором.
a — вставка текста после курсора.
A — добавление текста в конце строки.

yy — копирование строки.
v — переводит в визуальны режим. Стрелками выделяется нужный текст.
y — копирование выделенного текста.
p — вставка последнего удалённого текста или того что было скопировано по команде y.

r — замена символа под курсором.
R — замена нескольких символов.

ce — удаление символов в слове после курсора и переход в режим вставки.
с$ — после курсора в строке всё удалит и перейдет в режим вставки.

Клавиша Backspace может использоваться для исправления при наборе!

o — создание пустой строки ПОД курсором и переход в режим вставки.
O — создание пустой строку НАД курсором и переход в режим вставки.

:r TEST — вставка текст из файла TEST.
:r !ls — прочитает вывод команды ls и вставит его ниже курсора.

u — отмена (откат) предшествующих действий.
U — отмена (откат) предшествующих действий в строке.
CTRL+ R — отмена отмены (если случайно отменили то что не надо было отменять).

:s/было/стало — заменит первое найденное вхождение в строке.
:s/уводю/увожу/g — заменит все найденные в строке вхождения.
:#,#s/было/стало/g — где #,# номера этих строк для замены всех вхождений.
:%s/было/стало/g — замена всех вхождений во всем файле.
:%s/было/стало/gc — поиск всех вхождений во всем файле и запроса подтверждения замены.

x — удаление символа под курсором.
dd — удаление всей строки.
2dd удаление двух строк.
dw — удаление от курсора до конца слова, включая последующий пробел.
de -удаление от курсора до конца слова, НЕ включая последующий пробел.
d$ -удаление от курсора до конца строки.
d^ -удаление от курсора до начала строки.

Выполнение внешних команд

:sh — переход в консоль (для возврата набрать exit).
:!ls — команда добавит список файлов в текущем каталоге.

Вывод

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

Thunderbird Enigmail шифрование PGP

Установим и настроим почтовую программу Mozilla Thunderbird для обмена защищенными сообщениями с помощью дополнения Enigmail для PGP шифрования. Настройка одинаково проста как в системах Linux так и Windows. Не ленитесь защищать свою переписку.

Вступление

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

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

Пример настройки рассмотрим на системе Windows. Для Linux все действия идентичны. В Calculate Linux при установке Thunderbird всё необходимое уже установлено и останется только настроить шифрование для необходимой почты.

Упускаю процесс установки и добавления почтового ящика.

Установка дополнения Enigmail

Расширение Enigmail необходимо для работы с шифрованием почты.

Открываем настройки программы и выбираем «Дополнения».

Выбираем «Получить дополнения» и жмем ссылку справа «Подробнее».

По поиску находим Enigmail и добавляем в Thunderbird.

После установки в меню Thunderbird появится закладка Enigmail.

Настройка Enigmail

В меню Thunderbird в закладке Enigmail выбираем «Мастер установки».

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

Нажимаем «Установить…»  и выполним установку.

После установки переходим к созданию ключа шифрования.

Создадим сертификат отзыва ключа.

После всех выполненных действий почтовая программа готова к работе с шифрованными сообщениями.

Работа с шифрованными сообщениями в Thunderbird

Для обмена шифрованными сообщениями вам необходимо обменяться открытыми ключами с нужными контактами!

Зашифрованные сообщения без расшифровки будет выглядеть таким образом.

Все ваши ключи мы можем посмотреть перейдя в Меню Thunderbird —> Enigmail —> Менеджер ключей.

Отправка открытого ключа

Выбираем нужный ключ и по нажатию правой кнопки мыши выбираем «Отправить открытые ключи по электронной почте».

Установка открытого ключа

Полученный открытый ключ добавим  в Менеджере ключей перейдя по ссылке Файл —> «Импортировать ключи из файла»

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

Пример зашифрованного сообщения

Вывод

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