воскресенье, 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 - метка флешки