воскресенье, 19 ноября 2023 г.

Отправка почтового сообщения из консоли сервера Linux по протоколу ESMPT

ESMPT –это расширенная современная версия почтового протокола отправки сообщений SMTP (Extended SMTP). При установлении соединения тут применяется шифрование. И процесс отправки сообщений становиться более сложным чем в протоколе SMPT.

Первоначально необходимо установить безопасное соединение с сервером для этого используется openssl, который обычно есть в каждом сервере Linux
# openssl s_client -connect myserver.ru:465 -crlf
Произойдет установление соединения, вывод завершиться сообщением:
<…>
Start Time: 1700393590
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
220 myserver.ru ESMTP CommuniGate Pro 6.4.0


Теперь нужно представиться серверу. Что бы не возникло ошибок представиться лучше публичным IP адресом, который используется для выхода в Интернет. Узнать свой публичный IP адрес можно обратившись на сайт https://2ip.ru/
EHLO 46.0.100.100
Сервер должен ответить списком допустимых команд:
250-myserver.ru is pleased to meet you
250-DSN
250-SIZE
250-AUTH LOGIN PLAIN
250-ETRN
250-TURN
250-ATRN
250-NO-SOLICITING
250-8BITMIME
250-HELP
250-PIPELINING
250-SMTPUTF8
250 EHLO


Далее запускаем процедуру аутентификации. После запуска процедуры, нужно будет ввести логин и пароль но не в простом обычном виде, а в закодированном по стандарту кодирования Base64. Свои логин и пароль можно закодировать по стандарту Base64 например на сайте: https://www.base64encode.org/
Пример:
AUTH LOGIN
334 VXNlcm5hbWU6
TXlVc2VyQG15c2VydmVyLnJ1 (мой логин MyUser@myserver.ru в Base64)
334 UGFzc3dvcmQ6
TXlTZWNyZXRQYXNzd29yZA== (мой пароль MySecretPassword в Base64)
235 myserver.ru relaying authenticated

Удачная аутентификация завершиться сообщением 235 relaying authenticated

Далее устанавливаем от кого будет написано письмо (адрес отправителя). Нужно отметить, что адрес отправителя не всегда соответствует логину. В данном случае нам нужно указать адрес электронной почты нашего логина.
MAIL FROM: <MyUser@myserver.ru>
Сервер должен ответить сообщением 250 sender accepted

Теперь нужно задать почтовый адрес получателя. Тут важно, что команда RCPT TO вводиться в нижнем регистре, так как символ «R» в начале строки в сессии openssl заставит openssl переконнектиться и адрес получателя установлен не будет
rcpt to: recipient_of_the_letter@yandex.ru
Типичный ответ сервера:
250 recipient_of_the_letter@yandex.ru will relay mail for an authenticated user

Далее вводиться ключевое слово DATA, после чего пользователю предлагается написать письмо и завершить сообщение точкой.
DATA
354 Enter mail, end with "." on a line by itself

Вначале письма обычно нужно еще раз написать адрес отправителя, адрес получателя, а так же тему письма.
После этого написать текст письма и в последней строке написать точки и нажать ENTER.
Например:
from: MyUser@myserver.ru
to: recipient_of_the_letter@yandex.ru
subject: test 2023-11-19
Это тестовое сообщение, отправленное из консоли Linux!!
Отправил Королев В.С.
.

Сервер ответит, что сообщение принято к отправке
250 204410 message accepted for delivery

Для разъединения соединения нужно набрать команду QUIT, сервер ответит DONE, после чего соединение разорвется.
QUIT
DONE



понедельник, 6 ноября 2023 г.

Установка FreeRADIUS с модулем Python3 в RockyLinux 9

Проведем установку FreeRADIUS, затем интегрируем в FreeRADIUS модуль Python, а затем добавим возможность использовать в модуле Python дополнительные библиотеки для работы с PostgreSQL и MySQL (MariaDB).

Обратившись на сайт https://freeradius.org/releases/ определяем последнюю стабильную версию FreeRADIUS. На ноябрь 2023 имеем следующую картину:

Актуальная, стабильная версия – 3.0.x, а именно – 3.0.26.
Определяем, какая версия дистрибутива содержится в наших стандартных репозитариях Rocky Linux 9:
# yum list freeradius
Получаем ответ: 3.0.21-37.el9. Это соответствует стабильной версии 3.0.х, поэтому просто выполняем установку FreeRADIUS стандартными средствами:
# yum install freeradius freeradius-utils
После выполнения установки, основная директория пакета FreeRADIUS будет находиться тут: /etc/raddb.
Основной конфигурационный файл: /etc/raddb/radiusd.conf
Директория с логами: /var/log/radius/

Далее необходимо сгенерировать сертификаты сервера FreeRADIUS, которые будут использоваться в механизмах EAP-TLS, PEAP и EAP-TTLS для установления зашифрованного соединения между авторизуемым клиентом и сервером FreeRADIUS.
Сначала нужно сгенерировать тестовые сертификаты:
# cd /etc/raddb/certs/
# ./bootstrap

И затем попробовать запустить FreeRADIUS
# radiusd –X
Запуск сервера должен пройти без ошибок и закончиться выводом:
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
Listening on auth address :: port 1812 bound to server default
Listening on acct address :: port 1813 bound to server default
Listening on auth address 127.0.0.1 port 18120 bound to server inner-tunnel
Listening on proxy address * port 41210
Listening on proxy address :: port 49147
Ready to process requests

Выход из запущенного процесса - CTRL+C

Далее для работы в действующей сети необходимо сгенерировать индивидуальные сертификаты сервера FreeRADIUS.
Удаляем все ранее созданные сертификаты:
# cd /etc/raddb/certs/
# rm -f *.pem *.der *.csr *.crt *.key *.p12 serial* index.txt*

Редактируем начальные данные корневого сертификата:
# nano ca.cnf
Изменяем пароли по умолчанию в разделе [ req ] на какие-то свои:
input_password = whatever
output_password = whatever

например, на
input_password = mypass01
output_password = mypass01

В разделе [certificate_authority] изменяем название страны, организации и пр. Значения по умолчанию:
countryName = FR
stateOrProvinceName = Radius
localityName = Somewhere
organizationName = Example Inc.
emailAddress = admin@example.org
commonName = "Example Certificate Authority"

например, на такие значения:
countryName = RU
stateOrProvinceName = Radius
localityName = BombeyRadius
organizationName = MyOrg
emailAddress = admin@example.ru
commonName = "CA Certificate Authority"

Затем запускаем генерацию корневого сертификата:
# make ca.pem
# make ca.der

Переходим к созданию сертификата сервера:
# nano server.cnf
Изменяем пароли по умолчанию в разделе [ req ] на какие-то свои:
input_password = whatever
output_password = whatever

например, на
input_password = mypass01
output_password = mypass01

В разделе [server] изменяем название страны, организации и пр. Значения по умолчанию:
countryName = FR
stateOrProvinceName = Radius
localityName = Somewhere
organizationName = Example Inc.
emailAddress = admin@example.org
commonName = "Example Server Certificate"

изменяем на:
countryName = RU
stateOrProvinceName = Radius
localityName = BombeyRadius
organizationName = MyOrg
emailAddress = admin@example.ru
commonName = "Certificate Serv Radius Bombey"

Согласно инструкции от FreeRADIUS, поле commonName в сертификате сервера должно отличаться от поля commonName в корневом сертификате. После редактирования файла запускаем генерацию cертификата сервера:
# make server.pem
# make server.csr

Затем открываем файл настроек EAP FreeRADIUS и указываем пароль сертификата в подсекции tls секции eap:
# nano /etc/raddb/mods-enabled/eap
eap {
     <..>
     tls-config tls-common {
        #private_key_password = whatever
        private_key_password = mypass01
        <..>
    }
    <..>
}

Вновь выполняем тестовый запуск FreeRADIUS
# radiusd -X
И вновь запуск команды должен пройти без ошибок.

Примечания:
>> Если не установить пароль сертификата в файле /etc/raddb/mods-enabled/eap, то возникнет ошибка:
tls: (TLS) Failed reading private key file "/etc/raddb/certs/server.pem"
tls: (TLS) error:1C800064:Provider routines::bad decrypt
tls: (TLS) error:11800074:PKCS12 routines::pkcs12 cipherfinal error
tls: (TLS) error:0A080009:SSL routines::PEM lib
rlm_eap_tls: Failed initializing SSL context
rlm_eap (EAP): Failed to initialise rlm_eap_tls
/etc/raddb/mods-enabled/eap[14]: Instantiation failed for module "eap"
>> Если не создать сертификатов сервера, получим следующую ошибку:
Unable to check file "/etc/raddb/certs/server.pem": No such file or directory
/etc/raddb/mods-enabled/eap[183]: Failed parsing configuration item "private_key_file"
rlm_eap_tls: Failed initializing SSL context
rlm_eap (EAP): Failed to initialise rlm_eap_tls
/etc/raddb/mods-enabled/eap[14]: Instantiation failed for module "eap"

Проведем тестовую авторизацию абонента. Для этого необходимо что бы клиент, откуда отправляется radius запрос, был добавлен в раздел клиентов сервера FreeRADIUS и пользователь, выполняющий авторизацию, был добавлен в раздел пользователей.
Клиенты сервера добавляются в файле: /etc/raddb/clients.conf
Тут уже должен быть создан клиент localhost. Ip адрес откуда ожидаются запросу - 127.0.0.1, секрет (пароль) для совершения запроса - testing123
# nano /etc/raddb/clients.conf
client localhost {
    ipaddr = 127.0.0.1
    secret = testing123
    <…>
}

Тестового пользователя добавим в файл /etc/raddb/mods-config/files/authorize
# nano /etc/raddb/mods-config/files/authorize
В первой строке файла пишем данные пользователя:
korolev Cleartext-Password := "pass123"
Тут задается пользовать «korolev» с паролем «pass123».
Вновь запускаем FreeRADIUS в тестовом режиме:
# radius -X
В соседнем окне терминала выполняет тестовую команду авторизации пользователя:
# radtest korolev pass123 127.0.0.1 0 testing123
Sent Access-Request Id 103 from 0.0.0.0:43064 to 127.0.0.1:1812 length 77
    User-Name = "korolev"
    User-Password = "pass123"
    NAS-IP-Address = 127.0.0.1
    NAS-Port = 0
    Message-Authenticator = 0x00
    Cleartext-Password = "pass123"
Received Access-Accept Id 103 from 127.0.0.1:1812 to 127.0.0.1:43064 length 20

Если мы получили в ответе «Access-Accept», значит авторизация пользователя прошла успешно. В случае неудачной авторизации ответ будет содержать «Access-Reject».

Переходим к установке python3 в FreeRADIUS.
Сначала устанавливаем сам python и дополнительные модули для работы с базами данных PostgeSQL и MySQL (MariaDB)
# yum install python3
# yum install pip
# pip install psycopg2-binary
# pip install mysql-connector

Проверяем, что python3 установлен и библиотеки могут быть использованы в коде:
# python3
Python 3.9.16 (main, Sep 12 2023, 00:00:00)
[GCC 11.3.1 20221121 (Red Hat 11.3.1-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> import mysql.connector
>>>

Если никаких ошибок не возникает, значит все установилось верно.
Не закрывая среду python, узнаем все системные пути, которые использует python в работе. Они понадобятся далее для интеграции python в FreeRADIUS:
>>> import sys
>>> sys.path
['', '/usr/lib64/python39.zip', '/usr/lib64/python3.9', '/usr/lib64/python3.9/lib-dynload', '/usr/local/lib64/python3.9/site-packages', '/usr/local/lib/python3.9/site-packages', '/usr/lib64/python3.9/site-packages', '/usr/lib/python3.9/site-packages']
>>>

Выход из среды python – CTRL+D.
Теперь устанавливаем модуль python3 для FreeRADIUS
# yum install python3-freeradius
Подключаем модуль Python в рабочую конфигурацию:
# ln -s /etc/raddb/mods-available/python3 /etc/raddb/mods-enabled/python3
Открываем модуль python3 и вносим изменения в конфигурацию:
# nano /etc/raddb/mods-enabled/python3
python3 {
python_path="${modconfdir}/${.:name}:/usr/lib64/python39.zip:/usr/lib64/python3.9:/usr/lib64/python3.9/lib-dynload:/usr/local/lib64/python3.9/site-packages:/usr/local/lib/python3.9/site-packages:/usr/lib64/python3.9/site-packages:/usr/lib/python3.9/site-packages"
module = bombey
mod_authorize = ${.module}
func_authorize = authorize
<…>
}
В конфигурации модуля Python описывается, где будет лежать код модуля python3 и какие функции может обрабатывать этот модуль. В нашем случае модуль будет называться «bombey», функция, которая должна содержаться в модуле должна иметь имя «authorize», а сам файл модуля должен быть в директории ${modconfdir}/${.:name} (в «развернутом виде» – это /etc/raddb/mods-config/python3). В директиве python_path, кроме пути до модуля python3 нужно указать и все системные пути интерпретатора python. Мы получили эту информацию ранее, когда устанавливали python3. Теперь эти пути перечисляем здесь через двоеточие.

Создаем файл модуля bombey:
# nano /etc/raddb/mods-config/python3/bombey.py
И прописываем его содержимое:
#!/usr/bin/python3
import radiusd
def authorize(p):
    print("*** authorize bombey ***")
    print(p)
    return radiusd.RLM_MODULE_OK

Сохраняем файл и делаем его исполняемым:
# chmod +x /etc/raddb/mods-config/python3/bombey.py
В файле определяется функция authorize, которой передается набор данных о авторизации в переменной «p». Данная переменная содержит кортеж данных авторизации: имя пользователя, пароль, IP адрес NAS устройства, формирующего авторизационной пакет, а так же временная метка. Функция authorize в данном случае делает всего несколько вещей – это вывод в консоль текста *** authorize bombey ***, вывод в консоль набора данных переменной «p» и завершение работы функции возвращением переменной RLM_MODULE_OK.
Переменные RLM_MODULE_* содержаться в модуле /etc/raddb/mods-config/python3/radiusd.py и соответствуют кодам завершения обработки модуля python3:
RLM_MODULE_REJECT = 0
RLM_MODULE_FAIL = 1
RLM_MODULE_OK = 2
RLM_MODULE_HANDLED = 3
RLM_MODULE_INVALID = 4
RLM_MODULE_USERLOCK = 5
RLM_MODULE_NOTFOUND = 6
RLM_MODULE_NOOP = 7
RLM_MODULE_UPDATED = 8
RLM_MODULE_NUMCODES = 9
Если функция будет возвращать RLM_MODULE_OK – это говорит о том, что в модуле python3, авторизация прошла удачно. А если возвращается RLM_MODULE_REJECT - авторизация была неуспешной. В файле /etc/raddb/mods-config/python3/example.py имеется ряд примеров разных функций используемых в FreeRADIUS и примеры использования разных конструкций для обработки данных и формирования ответа.

Добавляем модуль python в рабочий экземпляр сервиса FreeRADIUS
# nano /etc/raddb/sites-enabled/default
Нужно добавить в блок authorize использование модуля python между auth_log и chap:
authorize {
    filter_username
    preprocess
    # auth_log
    python3
    chap
    <....>
}

Вновь запускам FreeRADIUS в тесте:
# radius -X
И в соседней консоли пытаемся авторизоваться:
# radtest korolev pass123 127.0.0.1 0 testing123
Авторизация должна пройти как и раньше – успешно. Самое интересное в окне работы сервера.
Обратившись к логам в окне с запущенным сервером FreeRADIUS мы увидим, что модуль python3 работает. В лог выводятся строки:
*** authorize bombey ***
(('User-Name', 'korolev'), ('User-Password', 'pass123'), ('NAS-IP-Address', '127.0.0.1'), ('NAS-Port', '0'), ('Message-Authenticator', '0x690954bf4f3e6a343368af3a92fdc767'), ('Event-Timestamp', 'Nov 5 2023 13:32:17 +04'))
(1) [python3] = ok

В первой строке выводиться просто информация о начале обработки в модуле. Это строка print("*** authorize bombey ***") в файле модуля python – bombey.py.
Затем выводятся данные переданные в модуль. Данные приходят в переменной «p» в виде кортежа: (('User-Name', 'korolev'), ('User-Password', 'pass123'), ('NAS-IP-Address', '127.0.0.1'), ('NAS-Port', '0'), ('Message-Authenticator', '0x690954bf4f3e6a343368af3a92fdc767'), ('Event-Timestamp', 'Nov 5 2023 13:32:17 +04')). Тут содержится все необходимое для авторизации: И имя пользователя, и пароль, и IP адрес устройства, откуда пришел запрос и время запроса.

Теперь подключим к модулю pyhon3 дополнительные модули python для работы с базами данным.
# nano /etc/raddb/mods-config/python3/bombey.py
Дополняем скрипт подключаемыми модулями:
#!/usr/bin/python3
import radius
import mysql.connector
import psycopg2

def authorize(p):
    print("*** authorize bombey ***")
    print(p)
    return radiusd.RLM_MODULE_OK

Перезапускаем сервис FreeRADIUS
# radiusd -X
И вновь пытаемся авторизоваться. Никаких ошибок при авторизации и в логах сервера быть не должно.

Примечание: На данном этапе может возникнуть следующая ошибка:
Python version: 3.9.16 (main, Sep 12 2023, 00:00:00) [GCC 11.3.1 20221121 (Red Hat 11.3.1-4)]
Failed loading libpython3.9m.so: libpython3.9m.so: cannot open shared object file: No such file or directory
Failed loading libpython symbols into global symbol table
python_function_load - Module 'bombey' not found
python_error_log:200, Exception type: <class 'ImportError'>, Exception value: /usr/lib64/python3.9/lib-dynload/_hashlib.cpython-39-x86_64-linux-gnu.so: undefined symbol: PyExc_ValueError
python_error_log:220, full_backtrace: ['Traceback (most recent call last):\n', ' File "/etc/raddb/mods-config/python3/bombey.py", line 4, in <module>\n import mysql.connector\n', ' File "/usr/local/lib/python3.9/site-packages/mysql/connector/__init__.py", line 37, in <module>\n from .connection import MySQLConnection\n', ' File "/usr/local/lib/python3.9/site-packages/mysql/connector/connection.py", line 31, in <module>\n from .authentication import get_auth_plugin\n', ' File "/usr/local/lib/python3.9/site-packages/mysql/connector/authentication.py", line 26, in <module>\n from hashlib import sha1\n', ' File "/usr/lib64/python3.9/hashlib.py", line 77, in <module>\n import _hashlib\n', 'ImportError: /usr/lib64/python3.9/lib-dynload/_hashlib.cpython-39-x86_64-linux-gnu.so: undefined symbol: PyExc_ValueError\n']
python_function_load - Failed to import python function 'bombey.authorize'
python_error_log:192, Unknown error
/etc/raddb/mods-enabled/python3[9]: Instantiation failed for module "python3"
Это говорит о том, что Python3, запущенный из как модуль FreeRADIUS не видит библиотеку libpython3.9m.so.
Проверяем, какие есть аналоги в нашей системе:
# ls -l /usr/lib64/libpython*
-rwxr-xr-x. 1 root root 3486512 Oct 5 21:10 /usr/lib64/libpython3.9.so.1.0
-rwxr-xr-x. 1 root root 14944 Oct 5 21:10 /usr/lib64/libpython3.so
И делаем символьную ссылку на наиболее подходящую:
# ln -s /usr/lib64/libpython3.9.so.1.0 /usr/lib64/libpython3.9m.so
Теперь сервер запуститься удачно.

Отключаем элементы сервиса FreeRADIUS, которые использовать не будем.
Например, можно отключить экземпляр FreeRADIUS, определенный в файле inner-tunnel. Для этого необходимо удалить символьную ссылку:
# rm -f /etc/raddb/sites-enabled/inner-tunnel
Затем можно отключить проксирование. Это делается в глобальном файле конфигурации:
# nano /etc/raddb/radiusd.conf
Устанавливаем директиву proxy_requests в no И комментируем строку $INCLUDE proxy.conf
proxy_requests = no
#$INCLUDE proxy.conf


Добавляем сервис FreeRADIUS в автозагрузку и стартуем:
# systemctl enable radiusd
# systemctl start radiusd

Проверка работы сервиса:
# systemctl status radiusd
# netstat -ltupn | grep radiusd



Для того что бы отключить использование IPv6, необходимо в настройках экземпляра сервиса FreeRADIUS default, закомментировать строки, касающиеся прослушивания портов ipv6:
##listen {
## type = auth
## ipv6addr = :: # any. ::1 == localhost
## port = 0
# interface = eth0
# clients = per_socket_clients
## limit {
## max_connections = 16
## lifetime = 0
## idle_timeout = 30
## }
##}
##listen {
## ipv6addr = ::
## port = 0
## type = acct
# interface = eth0
# clients = per_socket_clients
## limit {
# max_pps = 0
# idle_timeout = 0
# lifetime = 0
# max_connections = 0
## }
##}

И затем рестартовать сервис:
# systemctl start radiusd
# netstat -ltupn | grep radiusd


На этом базовая настройка FreeRADIUS с модулем python3 завершена.

суббота, 4 ноября 2023 г.

Windows XP. Обновление сертификатов для браузера. Решение проблемы открытия страниц в браузерах.

На старых версиях ОС, например, на легендарной ОС Windows XP в текущем 2023 году есть проблема открытия современных web-ресурсов по протоколу HTTPS. Проблема заключается в использовании на Windows XP старых сертификатов. Как правило, это сертификат под названием «IdenTrust DST Root CA X3». С 1 октября 2021 года срок действия этого сертификата закончился. Из-за этого пользователи ПК / ноутбуков на Windows XP могут столкнуться с проблемой появления ошибки: «ERR_CERT_DATE_INVALID» и «ERR_DATE_INVALID» в браузерах при входе на многие сайты. Пример:


Для решения этой проблемы нужно скачать сертификат isrgrootx1.der и установить его.
Скачать сертификат можно с ресурсов:
https://letsencrypt.org/certs/isrgrootx1.der
https://wifi.nstu.ru/cert/isrgrootx1.der
https://profit-zip.ru/upload/eniweb/isrgrootx1.der
https://www.upload.ee/files/13525456/isrgrootx1.der.html

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

Затем нажать «Установить сертификат» и пройти, нажимая «Далее» шаги мастера установки сертификатов:



На данном этапе нажимаем «Да» и затем работа мастера завершиться информационным окном, где нужно нажать «Ок»

После этого проблем с открытием страниц web-ресурсов в Windows XP быть не должно.




Rocky Linux 9. Подключение к системе по SSH по сети под пользователем root.

По умолчанию в новых версиях ОС подключение по SSH через сеть под учеткой root заблокировано.
Это сделано для обеспечения большей безопасности.

Пользователю предлагается подключаться по SSH с использованием сертификата.
Для этого следует на своей машине сгенерить приватный и публичный ключ EdDSA.
Затем публичный ключ помещается (добавляется, если файл уже есть) в файл /root/.ssh/authorized_keys

Можно так же сконфигурировать сервер sshd на сервере Rocky Linux 9 таким образом, что бы подключение под учеткой root по сети по SSH было возможным.
Для этого подключаемся к машине другим способом, переходим в root и открываем файл конфигурации сервера ssh для редактирования
# nano /etc/ssh/sshd_config
Тут ищем директиву PermitRootLogin
и заменяем
PermitRootLogin prohibit-password (по умолчанию)
на
PermitRootLogin yes
Затем производим рестарт сервиса ssh:
# systemctl restart sshd

четверг, 2 ноября 2023 г.

Форматирование флешки в Linux

Действие выполняется в следующей последовательности:
1. Подключаем флешку к ПК с Linux
2. Определяем идентификатор флешки
3. Отмонтируем флешку, если она примонтировалась автоматически
(примечание: При подключении флешки в Astra Linux релиз "Орел" флешка автоматически не примонтируется)
4. Форматируем флешку

Итак. 
Подключаем флешку.
Смотрим, как она определилась. Для этого используем команды:
# fdisk -l
# lsblk
# df -h
# mount
По размеру накопителя нам нужно определить идентификатор этой флешки, например /dev/sdb1
И нужно понять примонтирована ли флешка куда-то.

Далее нужно отмонтировать флешку, если она примонтирована. Например так:
# umount /dev/sdb1

И теперь нужно запустить команду форматирования:
# mkfs -t ntfs -L FLASH16 /dev/sdb1
Тут
ntfs - тип файловой системы,
FLASH16 - метка флешки

четверг, 19 октября 2023 г.

Установка и начало работы с PostgreSQL в RockyLinux 9. Pgadmin4

Установка PostgreSQL в RockyLinux:
# yum install postgresql-server postgresql
После установки необходимо выполнить команды инициализации PostgreSQL
# postgresql-setup --initdb
* Initializing database in '/var/lib/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

Выполняем добавление PostgreSQL в автозагрузку и запускаем сервис:
# systemctl enable postgresql.service
# systemctl start postgresql.service

Сервер баз по умолчанию слушает localhost на порту 5432.
Данные базы будут в каталоге /var/lib/pgsql/data
Логи сервера будут записываться в файлы в директорию: /var/lib/pgsql/data/log/
Имя файла с текущим логом: /var/lib/pgsql/data/current_logfiles
Конфигурационный файл: /var/lib/pgsql/data/postgresql.conf
Проверка работы сервиса:
# systemctl status postgresql
# netstat -ltupn | grep 5432


Подключиться к базе PostgreSQL под root нельзя. Служебные подключения для настройки базы выполняются под пользователем postgres.
# sudo -i -u postgres
$ psql
psql (13.11)
Type "help" for help.
postgres=#


После установки PostgreSQL обычно требуется создать базу данных и пользователя для работы с этой базой данных.
Создадим базу данных с именем «bombey2» и пользователем «bombey2» для работы с этой базой данных.
Создание базы данных:
postgres=# CREATE DATABASE bombey2;
Создаем пользователя этой базы данных с именем bombey2 и паролем ‘12345’
postgres=# CREATE USER bombey2 WITH PASSWORD '12345';
Даем пользователю bombey2 все права на базу bombey2:
postgres=# GRANT ALL PRIVILEGES ON DATABASE bombey2 to bombey2;
Подключаемся к созданной базе и даем все права пользователю bombey2 на работу со всеми таблицами этой базы
postgres=# \c bombey2
bombey2=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "bombey2";
Теперь нужно изменить поведение сервера PostgreSQL в части методов аутентификации. Дело в том, что по умолчанию к базе могут подключаться только пользователи самой операционной системы. Изменим поведение, что бы к базе мог подключаться пользователь bombey2 под учеткой, созданной нами ранее:
Изменения вносятся в файл /var/lib/pgsql/data/pg_hba.conf
$ nano /var/lib/pgsql/data/pg_hba.conf
Добавляем ПЕРЕД строкой
host all all 127.0.0.1/32 ident
Строку:
host bombey2 bombey2 127.0.0.1/32 md5
То есть должно получиться:
# IPv4 local connections:
host bombey2 bombey2 127.0.0.1/32 md5
host all all 127.0.0.1/32 ident

Рестартуем postgresql
# systemctl restart postgresql
Теперь к базе можно подключиться под пользователем bombey2 так:
# psql -h 127.0.0.1 -d bombey2 -U bombey2 -W
Password: <вводим_пароль_пользователя_bombey2>
psql (13.11)
Type "help" for help.
bombey2=>


Далее установим pgadmin4 – программное обеспечение, позволяющее управлять PostgreSQL через web-интерфейс.
Для этого скачаем репозитарий, ссылку на который найдем на странице https://ftp.postgresql.org/pub/pgadmin/pgadmin4/yum
# rpm -i https://ftp.postgresql.org/pub/pgadmin/pgadmin4/yum/pgadmin4-redhat-repo-2-1.noarch.rpm
При установке репозитария выдается предупреждение, на которое можно не обращать внимание.
warning: /var/tmp/rpm-tmp.4CvePz: Header V4 RSA/SHA256 Signature, key ID 210976f2: NOKEY
Теперь устанавливаем само программное обеспечение pgadmin4:
# yum install pgadmin4-web
После установки необходимо провести запуск сценария развертывания pgadmin4 в системе. Скрипт развертывания интегрирует pgadmin в web-сервер Apache, на котором будет работать сервер pgadmin4
# /usr/pgadmin4/bin/setup-web.sh
Во время работы сценария будет необходимо ввести адрес электронной почты и пароль, которые будут использоваться для входа в панель администрирования pgAdmin.
Enter the email address and password to use for the initial pgAdmin user account:
Email address: v.korolev@domain.ru
Password: *****
Retype password: *****

На вопрос
The Apache web server is running and must be restarted for the pgAdmin 4 installation to complete. Continue (y/n)?
Отвечаем «y»
После перезапуска apache, сервис pgadmin4 готов к работе
Если 80 порт в системе еще не открыт, то его нужно открыть:
# firewall-cmd --add-port=80/tcp --permanent
# firewall-cmd --reload
Теперь обратиться к Pgadmin4 можно по ссылке:
http://<ip-адрес>/pgadmin4 
Вводим имя пользователя и пароль заданные ранее, выбираем язык интерфейса «English» и входим в интерфейс программы:



Добавим (регистрируем в системе) новый сервер PostgreSQL для подключения.
Для этого выбираем иконку «Add New Server». На вкладке «General» задаем имя сервера и устанавливаем параметр обеспечивающий незамедлительное подключение к серверу после регистрации.


На вкладке «Connection» задается IP адрес сервера, название базы, имя пользователя, пароль. Включаем переключатель «Save Password?» в положение «ON».

После нажатия кнопки «Save» произойдет подключение к серверу PostgreSQL и откроется примерно такой Dashboard:



Управление базой будет доступно через пункты меню, открывающиеся в древовидной структуре слева.
Для добавления таблицы в базу нужно пройти по дереву меню слева: Databases—> bombey2 (имя базы) —> Schemes —> public —> Tables. Кликнуть по Tables правой кнопкой мыши и выбрать из контекстного меню: Create —> Table

После этого откроется мастер создания таблиц.
Для примера создадим таблицу состоящую из полей:
id – первичный индекс, большое число, увеличивающееся при добавлении строки в таблицу (auto_incremenet в терминах MySQL)
fio – ФамилияИмяОтчество, Текстовое поле длинной 300 символов
dr - День рождения, типа данных «Дата»
На первой вкладке вписываем имя таблицы, например «test3»

На второй вкладке «Columns» через знак «+» добавляем три строки.
Первая строка с названием «id» – первичный индекс. Тип данных «bigserial». Вторая строка – текстовое поле с названием «fio» и типом character varying. Максимальная длинна строки указывается в поле «Length». Третья строка – это дата рождения. Название поля «dr», тип поля «date».


После определения полей нажимаем кнопку «Save». Таблица добавиться в список таблиц нашей базы данных.
Автоувеличивающееся поле «id» при таком создании будет создано хитрым образом. В PostgreSQL для того что бы создать поле с увеличивающимся целым числом задается специальная сущность – Последовательность «Sequences». Ее можно увидеть в дереве объектов pgadmin:

Последовательность test3_id_seq связана с полем id в основной таблице test3. При добавлении новой строки в таблицу test3 происходит обращение к счетчику сущности test3_id_seq, оттуда извлекается последний выданный номер последовательности, счетчик увеличивается на 1, выдается число для записи в поле id. Затем счетчик последовательности увеличивается на 1.
Связность последовательности и поля первичного ключа описывается конструкцией nextval. Запрос SQL создания вышеописанной таблицы будет следующий:
CREATE SEQUENCE IF NOT EXISTS public.test3_id_seq
   INCREMENT 1
   START 1
   MINVALUE 1
   MAXVALUE 9223372036854775807
   CACHE 1
   OWNED BY test3.id;
CREATE TABLE IF NOT EXISTS public.test3
(
   id bigint NOT NULL DEFAULT nextval('test3_id_seq'::regclass),
   fio character varying(300) COLLATE pg_catalog."default",
   dr date,
   CONSTRAINT test3_pkey PRIMARY KEY (id)
)


Создание индекса для таблицы выполняется с помощью диалога создания индекса. Для вызова этого диалога нужно в дереве объектов pgadmin найти нужную таблицу, кликнуть по «Indexses» правой кнопкой мыши и выбрать Create —> Index...
Для создания типового индекса с настройками по умолчанию достаточно выбрать индексируемую колонку. Для этого в диалоге создания индекса сразу переходим на вкладку «Columns». Тут отключаем переключатель «Is expression» и в поле column выбираем индекируемое поле.

Затем нажимаем кнопку «Add». Выбранное поле переместиться в таблицу индексов. Переключатель «Is expression» вернется в изначальное положение:

Нажимаем кнопку «Save». Индекс будет создан.

Для работы ы SQL запросами в pgadmin вызывается окно запросов «Query Tool». Это делается через контекстное меню объекта таблиц. Меню вызывается правой кнопкой мыши:

Для просмотра / редактирования данных таблицы вызывается меню «View/Edit Data»


воскресенье, 24 сентября 2023 г.

Grafana Loki. Логи самого приложения Loki

По умолчанию Grafana Loki отправляет логи своей работы в системный журнал. В системах с systemd – это journal. Если в системе работает так же rsyslog, то вероятно данные собираются еще и в файле /var/log/messages.

Просмотр сообщений loki можно вывести так:
# journalctl -eu loki.service
# tail -f /var/log/messages | grep loki

Мы увидим, что логируется все, включая обычные запросы. Все потому, что по умолчанию уровень логирования в Loki установлен в «info». 

Что бы это изменить нужно определить переменную log_level в файле конфигурации Loki в разделе server.
# nano /etc/loki/loki-local-config.yaml
server:
  <….>
  log_level: warn


Затем рестартуем сервис Loki:
# systemctl restart loki.service

Теперь количество логов, генерируемых самим Loki существенно снизиться.

воскресенье, 10 сентября 2023 г.

DNF. Отключение логирование. Автообновление пакетов (отключение, изменение)

В RokyLinux (fedora. redhat) нативной утилитой управления пакетами является утилита DNF. DNF в автоматическом режиме постоянно пытается подключиться к Интернету и скачать обновление кешей метаданных из репозитариев пакетов. А при установленных пакетах dnf-automatic и PackageKit, DNF еще и пытается провести обновление.
DNF запущена, по умолчанию, в режиме DEBUG, что бы в случае проблем с ОС можно было по логам определить что устанавливалось в ОС и послужило причиной сбоя.
Такое поведение приводит к постоянно пишущимся логам в файлы:
/var/log/dnf.librepo.log
/var/log/dnf.log
/var/log/hawkey.log

Конфигурация основных параметров DNF выполняется в файле: /etc/dnf/dnf.conf
В секции [main] есть параметр logfilelevel.
Согласно документации данный параметр может быть установлен в диапазоне от 0 до 10. Чем выше число, тем больше отладочных данных заносится в журналы. По умолчанию значение = 9. Путем экспериментов установил, что изменение данного параметра не влияет на уровень логов.
Но если установить параметр в 0, то логирование не будет выполняться.
Для отключения логирования выполняем:
# nano /etc/dnf/dnf.conf
и допишем снизу строку:
logfilelevel=0
Рестартовать ничего не нужно.

Что бы совсем отключить автоматическое обновление службой DNF необходимо:
1) Отключить обновление кешей метаданных:
# systemctl disable dnf-makecache.service
# systemctl disable dnf-makecache.timer

Затем в файле /etc/dnf/dnf.conf внизу прописать параметр:
metadata_timer_sync=0
2) Удалить, если они установлены, службы, выполняющие автообновление пакетов:
# dnf remove dnf-automatic PackageKit

С целью поддержания ОС в актуальном состоянии рекомендуется все же включить автоматические обновления пакетов, относящихся к безопасности.
Для этого необходимо установить (или включить, если установлено), утилиту dnf-automatic. DNF будет автоматически выполнять работу по обновлению системы.
Если пакет не установлен, то установить его можно так:
# yum install dnf-automatic
В конфигурационном файле dnf-automatic - /etc/dnf/automatic.conf можно изменить поведение автоустановщика.
Во-первых можно устанавливать только пакеты безопасности:
За это отвечает директива upgrade_type в секции [commands]
upgrade_type = security
И можно установить параметр debuglevel в секции [base] в 0 для минимизации записи в лог-файл
debuglevel = 0
Затем запускаем сервис:
# systemctl enable dnf-automatic
# systemctl restart dnf-automatic


вторник, 29 августа 2023 г.

Восстановления пароля пользователя admin в Grafana

При утере пароля admin от web-интерфейса Grafana, можно воспользоваться следующим способом его восстановления.

Данные о пользователях Grafana по умолчанию храняться в базе данных SQLLite, расположенной в файле /var/lib/grafana/grafana.db

Установим приложение для работы с SQLLite:
# yum install sqlite

Подключаемся к базе данных:
# sqlite3 /var/lib/grafana/grafana.db

Выполняем волшебную команду, которая установит для пользователя «admin», пароль «admin»:
sqlite> update user set password = '59acf18b94d7eb0694c61e60ce44c110c7a683ac6a8f09580d626f90f4a242000746579358d77dd9e570e83fa24faa88a8a6', salt = 'F3FAxVm33R' where login = 'admin';
Выходим из sqllite, нажимая CTRL+D

Теперь обращаемся к web-интерфейсу Grafana http://<IPадрес>:3000/
Вводим admin / admin и попадаем в форму задания нового пароля пользователю admin
Вводом новый пароль, вводим его еще раз и нажимам «Submit».
Все, пароль пользователя admin восстановлен.

понедельник, 28 августа 2023 г.

Grafana Loki. Установка в RockyLinux 9. Базовая настройка.

Выполним установку grafana loki из исходных кодов. Перед установкой необходимо поставить базовые инструменты: git и wget.
# yum install git wget

Для сборки Grafana из исходных кодов необходимо установить Golang. На странице https://go.dev/dl/ получаем ссылку на архив кодов для Linux
В моем случае это будет https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
# cd /usr/src/
# wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
# tar -v -C /usr/local -xzf go*.tar.gz

Редактируем файл /etc/profile для того что бы добавить указание системе смотреть путь до среды Go.
# nano /etc/profile
В самый конец файла добавляем
export PATH=$PATH:/usr/local/go/bin
Сохраняем изменения в файле.
Теперь из консоли выполним ту же команду, что бы путь до среды Go появился в системе немедленно
# export PATH=$PATH:/usr/local/go/bin
Теперь к go можно обращаться без использования пути. Проверим, установленную версию go:
# go version
go version go1.21.0 linux/amd64


Загружаем исходные данные проекта Grafana Loki и выполняем сборку программы из исходного кода:
# git clone https://github.com/grafana/loki
# cd loki/
# go build ./cmd/loki

В результате этого действия в текущей директории сформируется исполняемый файл «loki».
Этот файл перенесем на постоянное место – к другим исполняемым файлам
# mv loki /usr/local/bin/
Далее необходимо создать конфигурационный файл Loki
# mkdir /etc/loki
# touch /etc/loki/loki-local-config.yaml
# nano /etc/loki/loki-local-config.yaml

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /data_loki/loki
  storage:
    filesystem:
      chunks_directory: /data_loki/loki/chunks
      rules_directory: /data_loki/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

#Запрет Loki отправлять отчеты в штаб-квартиру Grafana
analytics:
  reporting_enabled: false
/data_loki - Это директория, в которой будут содержаться данные сервиса loki
Создадим эту директорию:
# mkdir /data_loki

Grafana Loki запускается по умолчанию на порту 3100. Данный порт нужно открыть в firewalld.
# firewall-cmd --permanent --add-port=3100/tcp
# firewall-cmd --reload


Выполняем первый запуск сервиса Loki:
# /usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml
При первом запуске будут созданы директории для хранения данных сервиса Loki - в /data_loki. Если в выводе нет никаких ошибок, значит все идет хорошо.
Теперь не останавливая сервис заглядываем по URL
http://<IPадрес>:3100/metrics
Мы видим метрики сервиса Loki, значит все работает правильно.
В консоли сервере останавливаем Loki, выполняя CTRL+C

Что бы сервис запускался автоматически необходимо создать пользователя «loki» и юнит systemd:
# useradd --no-create-home --shell /bin/false loki
# chown loki:loki /usr/local/bin/loki
# chown -R loki:loki /etc/loki
# chown -R loki:loki /data_loki

Создаем юнит:
# nano /etc/systemd/system/loki.service
Содержимое файла:
[Unit]
Description=Grafana Loki Service
After=network.target

[Service]
User=loki
Group=loki
Type=simple
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target


Перезапускаем демон systemd и стартуем сервис:
# systemctl daemon-reload
# systemctl start loki
# systemctl enable loki

Проверка работы сервиса:
# systemctl status loki

Примечание:
Если забыть дать права на директорию с данными сервиса Loki (/tmp/loki), то сервис не запуститься, будет выдана ошибка:
Aug 27 13:57:25 SMA-VM-TESTKVS.net systemd[1]: loki.service: Scheduled restart job, restart counter is at 5.
Aug 27 13:57:25 SMA-VM-TESTKVS.net systemd[1]: Stopped Grafana Loki Service.
Aug 27 13:57:25 SMA-VM-TESTKVS.net systemd[1]: loki.service: Start request repeated too quickly.
Aug 27 13:57:25 SMA-VM-TESTKVS.net systemd[1]: loki.service: Failed with result 'exit-code'.
Aug 27 13:57:25 SMA-VM-TESTKVS.net systemd[1]: Failed to start Grafana Loki Service.


Изменение времени хранения логов.

В настройках по умолчанию в Grafana Loki все логи попавшие в базу Loki храняться вечно. Но это поведение можно изменить. Изменения выполняются в конфигурационном файле Loki, который обычно храниться тут: /etc/loki/loki-local-config.yaml
Для то что бы задействовать автоматическое удаление необходимо специальным образом активировать компонент Loki - Compactor. Compactor сжимает данные за сутки в базе Loki и может удалять старые данные.
Текущую конфигурацию Loki и compactor можно посмотреть тут:
http://10.10.49.166:3100/config 

За удаление данных отвечает главная директива: retention_enabled. Значение true обяжет compactor проводить удаление старых данных.
Период хранения указывается в директиве retention_period, который записывается в разделе limits_config.
Данные удаляются сразу порциями, соответствующими периоду индексации в настройках хранилища.
По умолчанию - это одни сутки. (раздел schema_config, параметр period: 24h)

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

# nano /etc/loki/loki-local-config.yaml

compactor:
  working_directory: /data_loki/loki/compactor
  shared_store: filesystem
  compaction_interval: 10m
  retention_enabled: true
  retention_delete_delay: 2h
  deletion_mode: filter-and-delete
  retention_delete_worker_count: 150
  delete_request_cancel_period: 2h

limits_config:
  retention_period: 7d

Перезапускаем сервис Loki
# systemctl restart loki.service

Теперь логи старше 7 дней будут не доступны к выводу и будут удаляться компонентом Compactor.


Grafana Loki и ошибки запросов

При выполнении запросов к базе Loki через Grafana в логах могу появляться следующие ошибки:
1) err="context canceled"
2) msg="error processing requests from scheduler" err="rpc error: code = Canceled desc = context canceled"
 
Они говорят о том, что данные из базы не успевают загрузиться в web-интерфейс по какой-то причине. Вот ряд действий, которые помогут избежать подобных ошибок:
 
 1) Необходимо увеличить timeout оболочки Grafana.
 Это делается в настройках источника данных Loki

2) Необходимо изменить конфигурацию Loki в части таймаута ответа http сервера.
 По умолчанию время таймаута составляет 30 секунд. Можно его увеличить до 300 секунд (5 минут).
 server:
  http_server_read_timeout: 300s
  http_server_write_timeout: 300s 
 
3) Необходимо изменить конфигурацию Loki в части ответа на запросы query. В глобальной конфигурации нужно в разделе limits_config установить параметр query_timeout равным 3 минуты:
limits_config:
  query_timeout: 3m

После изменений конфигурации Loki, нужно перезапустить сервис Loki
# systemctl restart loki.service


суббота, 26 августа 2023 г.

Graylog. Сбор данных syslog

Сервис Graylog собирает данные через так называемые входы (inputs).
Подключаемся к web-интерфейсу graylog под стандартным логином «admin».
http://10.10.49.166:9000/
Тут 10.10.49.166 – IP адрес сервера Graylog
Перед использованием Graylog входы необходимо описать в web-интерфейсе.
Это делается в меню System–>Inputs.
Для описания входа, принимающего сообщения syslog выбираем в выпадающим списке «Select Input» - «Syslog UDP» и нажимаем «Launch new input».


В форме описания нового входа необходимо выбрать:
1) Node (узел) обрабатывающий данные сообщения
2) Title - указать заголовок входа, например "syslog"
3) Bind Address - IP адрес, который будет прослушивать сообщения syslog
Для задействования всех интерфейсов - пишем 0.0.0.0
4) Port - указывается прослушиваемый порт.
Graylog не рекомендует использованием портов для описания входов меньше чем 1024, поэтому вместо стандартного 514 порта для syslog пробуем использовать 5140.
Остальные параметры оставляем по умолчанию.



После внесения данных в форму нажимаем "Save".
Будет создан источник, обеспечивающий прием сообщений syslog.

Для проверки работы входа syslog выполняем из консоли сервера:
# echo "Hello world" | nc -w 1 -u localhost 5140
# echo "Hello SAKURA2.1" | nc -w 1 -u 10.10.49.166 5140

На странице описания входов нажимаем по кнопке "Show received messages".
Мы должны увидеть принятое сообщение "Hello world"

Для приема сообщений с других серверов, мы должны открыть порт 5140 на нашем сервере:
# firewall-cmd --permanent --add-port=5140/udp
# firewall-cmd --reload


На сервере, с которого будем отправлять информацию syslog (с демоном rsyslog), создаем конфигурацию, обеспечивающую передачу syslog сообщений на сервер:
# nano /etc/rsyslog.d/90-graylog.conf
Содержимое файла:
*.* @10.10.49.166:5140;RSYSLOG_SyslogProtocol23Format
После внесения изменений перезагружаем демон rsyslog
# systemctl restart rsyslog
Теперь сервер будет старательно отправлять данные syslog на сервер graylog.
Что бы посмотреть на сообщения, полученные в сервере Graylog. Необходимо перейти по ссылке «Search»: