From 5bf315a4bc4506818766751986ba7c2f72f40979 Mon Sep 17 00:00:00 2001 From: Vladimir Protsenko Date: Fri, 10 Nov 2023 13:26:33 +0000 Subject: [PATCH] Updated virtualisation tasks, started lection for postfix, added portfolio tasks, added two link to sql excercises --- .../exam_portfolio_task3.md | 8 ++ module2/04_postfix_dovecot/lection.md | 119 ++++++++++++++++++ module2/05_sql_postgresql/tasks.md | 4 +- .../06_virtualization/exam_portfolio_task4.md | 7 ++ module2/06_virtualization/tasks.md | 98 ++++++++------- 5 files changed, 189 insertions(+), 47 deletions(-) create mode 100644 module2/04_postfix_dovecot/exam_portfolio_task3.md create mode 100644 module2/04_postfix_dovecot/lection.md create mode 100644 module2/06_virtualization/exam_portfolio_task4.md diff --git a/module2/04_postfix_dovecot/exam_portfolio_task3.md b/module2/04_postfix_dovecot/exam_portfolio_task3.md new file mode 100644 index 0000000..6446895 --- /dev/null +++ b/module2/04_postfix_dovecot/exam_portfolio_task3.md @@ -0,0 +1,8 @@ +# Экзаменационное задание для портфолио 3 + +Настройте почтовый сервер на основе Postfix и Dovecot для своего домена studX.myoffice.ru (или любой другой). Заведите один или несколько почтовых ящиков для новых пользователей. Пользователь должен иметь возможность: +- подключиться из мобильного или десктопного почтового клиента к серверу со своим логином и паролем, +- отправить почту на внешний адрес gmail.com/yandex.ru/mail.ru, +- принять почтовое сообщение с внешнего адреса отправленное как ответ на входное письмо. + +Сервер должен пройти проверку c помощью валидатора https://esmtp.email/tools/mta-sts/. \ No newline at end of file diff --git a/module2/04_postfix_dovecot/lection.md b/module2/04_postfix_dovecot/lection.md new file mode 100644 index 0000000..f9b734c --- /dev/null +++ b/module2/04_postfix_dovecot/lection.md @@ -0,0 +1,119 @@ +Какое нам дело до классов адресов? Классы адресов опеределяют то, как Postfix принимает решения какие письма принимать и куда их доставлять. Класс адреса определяется тремя вещами: +- список доменов, +- список действительных адресов получателей, +- транспорт доставки по умолчанию. + +Можно считать, что класс адресов - это правило, применяемое к полю `Кому:` конверта элекронного письма. Правило имеет вид: +``` +user@domain -> agent(user, domain), +``` +которое применяется, если истинно, что: +``` +user ∈ USERS, +domain ∈ DOMAINS, +agent ∈ AGENTS. +``` + +По умолчанию определён следующий список классов адресов: +- local domain class (локальные почтовые ящики), +- virtual mailbox domain class (виртуальные почтовые ящики), +- virtual alias domain class (виртуальные псевдонимы), +- relay domain class (адреса транзитных smtp серверов), +- default domain class (адреса по умолчанию). + +Для локальных (local domain class) и виртуальных (virtual mailbox class) почтовых ящиков пустое множество в `USER = {}` означает, что проверка пользователей отключена, то есть подходит любое имя пользователя. + +Для разрешения псевдонимов в адреса в классе virtual alias domain class (виртуальные псевдонимы) агент не используется `AGENTS = {}`. + +### 1. local domain class (`domain ∈ mydestination ∪ inet_interfaces ∪ proxy_interfaces`) +Доставка последней мили до почтовых ящиков пользователей в `canonical` доменах, имеющих аккаунты в UNIX системе. Имена `user` определяются параметром `local_recipient_maps`. По умолчанию заничение равно `proxy:unix:passwd.byname $alias_maps`, то есть `/etc/passwd` и `/etc/aliases`. + +Адрес получателя локальный, если его домен совпадает с `mydestination`, `inet_interfaces` или `proxy_interfaces`. + +``` +agent = local из local_transport +USERS = /etc/passwd ∪ /etc/aliases +DOMAINS = mydestination ∪ inet_interfaces ∪ proxy_interfaces +AGENTS = service names ∈ /etc/postfix/master.cf +``` + +### 2. virtual mailbox domain class (`domain ∈ virtual_mailbox_domains`) + +Доставка последней мили до почтовых ящиков пользователей в `hosted` доменах, чьи пользователи не имеют аккаунтов в UNIX системе. Адреса почтовых ящиков вида `user@domain` ищутся в одной или нескольких таблицах указанных в параметре `virtual_mailbox_maps`. + +``` +agent = virtual из virtual_transport +USERS = virtual_mailbox_maps +DOMAINS = virtual_mailbox_domains +AGENTS = service names ∈ /etc/postfix/master.cf +``` + +### 3. virtual alias domain class (виртуальные псевдонимы) +* Назначение: хостинговые домены, в которых каждый адрес получателя псевдонимом привязан к учётной записи локальной UNIX-системы или к удаленному адресу. Пример виртуального псевдонима приведен в файле VIRTUAL_README. + +* Доменные имена перечисляются в virtual_alias_domains. Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_alias_maps. + +* Действительные адреса получателей перечисляются в параметре virtual_alias_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "Пользователь неизвестен в таблице виртуальных псевдонимов". Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_maps. + +* Транспортный параметр доставки почты отсутствует. Каждый адрес должен быть псевдонимом для какого-либо другого адреса. + +``` +agent = +USERS = virtual_alias_maps +DOMAINS = virtual_alias_domains +AGENTS = {} +``` + +### 4. relay domain class (адреса транзитных smtp серверов) +* Назначение: переадресация почты на удаленные адреса, в которых ваша система указана в качестве основного или резервного MX-хоста. Для обсуждения основных деталей конфигурации см. документ BASIC_CONFIGURATION_README. Обсуждение различий между каноническими доменами, размещенными доменами и другими доменами см. в файле VIRTUAL_README. + +* Доменные имена перечисляются с помощью параметра relay_domains. + +* Действительные адреса получателей перечисляются с помощью параметра relay_recipient_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "User unknown in relay recipient table". Если значение этого параметра пустое, то SMTP-сервер Postfix принимает всех получателей для доменов, перечисленных в параметре relay_domains. + +* Транспорт доставки почты задается параметром relay_transport. По умолчанию используется значение relay, которое является клоном агента доставки smtp(8). + +``` +agent = relay из relay_transport +USERS = relay_recipient_maps +DOMAINS = relay_domains +AGENTS = service names ∈ /etc/postfix/master.cf +``` + +### 5. default domain class (адреса по умолчанию) + +* Назначение: пересылка почты в Интернет от имени авторизованных клиентов. Для обсуждения основных деталей конфигурации см. файл BASIC_CONFIGURATION_README. О различиях между каноническими доменами, размещенными доменами и другими доменами см. файл VIRTUAL_README. + +* У этого класса нет таблицы доменов назначения. + +* Этот класс не имеет таблицы действительных адресов получателей. + +* Транспорт доставки почты задается параметром default_transport. По умолчанию используется значение smtp для доставки с помощью агента доставки smtp(8). + +``` +agent = smtp из default_transport +USERS = relay_recipient_maps +DOMAINS = relay_domains +AGENTS = service names ∈ /etc/postfix/master.cf +``` + +Анекдот про выбор протокола шифрования в STARTTLS: +``` +А: Давай по SSL 2.0. +Б: Могу только по SSL 3.0. +А: Тогда предлагаю по TLS 1.0. +Б: У меня TLS 1.1. +А: А TSL 1.2 нет? +Б: Могу без шифрования +А: Договорились +``` + +Возможные структуры почтовой системы: +- Postfix, Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей. +- Dovecot является «бэкендом» для доступа к почтовым ящикам пользователей. При этом подходе, расположение почтовых ящиков, список пользователей, известен только Dovecot. + + + +Источники: +1. https://habr.com/ru/articles/258279/ +2. \ No newline at end of file diff --git a/module2/05_sql_postgresql/tasks.md b/module2/05_sql_postgresql/tasks.md index 010c45f..a7fcac2 100644 --- a/module2/05_sql_postgresql/tasks.md +++ b/module2/05_sql_postgresql/tasks.md @@ -598,4 +598,6 @@ FROM pg_stat_user_tables; - Мартин Грабер — Понимание SQL - https://www.postgresql.org/docs/ - https://theartofpostgresql.com -- https://www.crunchydata.com/developers/tutorials \ No newline at end of file +- https://www.crunchydata.com/developers/tutorials +- https://www.sql-ex.ru/ +- https://sqlbolt.com/ \ No newline at end of file diff --git a/module2/06_virtualization/exam_portfolio_task4.md b/module2/06_virtualization/exam_portfolio_task4.md new file mode 100644 index 0000000..8a42255 --- /dev/null +++ b/module2/06_virtualization/exam_portfolio_task4.md @@ -0,0 +1,7 @@ +# Экзаменационное задание для портфолио 4 + +Выполните задания по настройке Proxmox на виртуальных машинах и предоставьте доступ к веб-интерфейсу по адресу `https://studX.myoffice.ru/proxmox/`. Заведите тестового пользователя, который обладает правами на: +- запуск/выключение созданной для него виртуальной машины, +- может создавать диски, +- может изменять конфигурацию оборудования виртуальной машины, +- может сохранять бекапы и делать снепшоты системы. \ No newline at end of file diff --git a/module2/06_virtualization/tasks.md b/module2/06_virtualization/tasks.md index 1ed06a3..1351b41 100644 --- a/module2/06_virtualization/tasks.md +++ b/module2/06_virtualization/tasks.md @@ -1,79 +1,85 @@ # Задания ## 1. -Установите Proxmox на две виртуальные машины Proxmox. Используйте образ диска `proxmox_7.2.1.iso`. +Установите Proxmox на две виртуальные машины Proxmox. Используйте образ диска `proxmox_8.0.2.iso`. Параметры виртуальных машин: -- объем памяти RAM 32ГБ, -- число ядер 8, +- объем памяти RAM 16ГБ, +- число ядер 4, - объем жёсткого диска 32ГБ, -- сетевое устройство в vlan 15+X (подключенное к мосту vmbr15+X, без указания vlan тега), -- IP из сети `192.168.1.0/24`, -- шлюз `192.168.1.1`, +- сетевое устройство vmbrX. + +Параметры установки: +- IP из сети `192.168.0.0/24` (192.168.0.[201-202]), +- шлюз `192.168.0.1`, - любой общедоступный DNS, - стандартный пароль для пользователя root, - доменные имена `n[1-2].studX.myoffice.ru`. Используйте утилиту `pveversion`, чтобы узнать версию Proxmox. +Для удобства, настройте беспарольный доступ между машинами. Так как ключи уже сгенерированы при установке, достаточно выполнить `ssh-copy-id`. Чтобы использовать доменные имена на данном этапе внесите их в `/etc/hosts` каждой машины. + ## 2. -Объедините узлы в Proxmox кластер. Используйте утилиту `pvecm` (документация утилиты `man pvecm`). Чтобы использовать доменные имена на данном этапе внесите их в `/etc/hosts` каждой машины. +Объедините узлы в Proxmox кластер. Используйте утилиту `pvecm` (документация утилиты `man pvecm`). ``` -root@n1 # pvecm create stud15-cluster +root@n1 # pvecm create studX-cluster root@n1 # systemctl restart corosync root@n1 # pvecm status ``` ``` -root@n2 # pvecm add n1.stud15.myoffice.ru +root@n2 # pvecm add n1.studX.myoffice.ru root@n2 # pvecm status ``` ## 3. -Настройте доступ к веб-интерфейсу с помощью прокси сервера или туннелей. Прокси-машина должна иметь два сетевых интерфейса, каждый в своей vlan: 499 и 15+X. Первая vlan позволяет подключиться к прокси из сети интернет, вторая позволяет обмениваться данными между прокси и новым кластером Proxmox. - -Схема с 2 туннелями -``` -Ноутбук --туннель--> (vmbr499) ens18 studX.myoffice.ru ens19 (vmbr30) <--туннель-- ens18 (vmbr30) n1.studX.myoffice.ru[192.168.1.200] (vlan 15+X) - -n1 $ ssh -R 8006:localhost:8006 stud@studX.myoffice.ru -notebook $ ssh -L 8006:localhost:8006 stud@studX.myoffice.ru -``` -Параметры `-L` и `-R` обозначают точку входа, локальную или на машине, к который подключается ssh. Пакеты отправленные на точку входа будут переданы через туннель, а затем направлены на адрес и порт, указанные после первого порта 8006. - -Возможен более простой вариант с одним туннелем: -``` -Ноутбук --туннель--> (vmbr499) ens18 studX.myoffice.ru ens19 (vmbr30) ------> ens18 (vmbr30) n1.studX.myoffice.ru[192.168.1.200] -notebook $ ssh -L 8006:192.168.1.200:8006 stud@studX.myoffice.ru -``` +Настройте доступ к веб-интерфейсу с помощью прокси сервера. Прокси-машина должна иметь два сетевых интерфейса, каждый в своей vlan: 499 и X. Первая vlan позволяет подключиться к прокси из сети интернет, вторая позволяет обмениваться данными между прокси и новым кластером Proxmox. Пример настройки прокси сервера nginx. ``` server { - listen 80 default_server; - listen [::]:80 default_server; - return 301 https://$host$request_uri; + listen 80 default_server; + return 301 https://$host$request_uri; } server { - listen 443 ssl; - ssl_certificate /etc/letsencrypt/live/stud15.myoffice.ru/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/stud15.myoffice.ru/privkey.pem; - ssl_verify_client off; - server_name _; - - location / { - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_pass https://192.168.1.200:8006; - } - location /nginx_ha { - rewrite ^/nginx_ha(.*)$ $1 break; - proxy_pass http://10.160.179.183:80; - } + listen 443 ssl; + ssl_certificate /etc/letsencrypt/live/stud15.myoffice.ru/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/stud15.myoffice.ru/privkey.pem; + ssl_verify_client off; + server_name _; + + location /proxmox/ { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + proxy_set_header Accept-Encoding ""; + # Standard proxying headers + proxy_set_header Host stud12.myoffice.ru; + proxy_set_header X-Real-IP 193.32.63.182; + # You need to set this manually since we include this file inside a server block on a main config + proxy_set_header X-Forwarded-Host stud12.myoffice.ru; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # SSL proxying headers + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Ssl on; + + # hack. better to use subdomains. + sub_filter_once off; + sub_filter 'src="' 'src="/proxmox'; + sub_filter 'href="' 'href="/proxmox'; + sub_filter_types "text/html" "text/javascript" "application/json"; + + proxy_pass https://192.168.0.201:8006/; + } + # hack. better to use subdomains. + location /api2/ { + proxy_pass https://192.168.0.201:8006/api2/; + } } ``` -Настроено перенаправление с 80 порта на 443, letsencrypt сертификаты, отключена проверка сертификатов для проксируемого сервера (в новом proxmox используются самоподписанные сертификаты на текущий момент). В локации `/` настроено проксирование на `n1.stud15.myoffice.ru`, а также добавление заголовков `Upgrade` и `Connection` для переключения с протокола http на websocket при необходимости (http://nginx.org/en/docs/http/websocket.html). Таким образом узел нового Proxmox кластера доступен по адресу `https://stud15.myoffice.ru/`. Сервер из задания `03_nginx_ha` доступен при обращении к адресу `https://stud15.myoffice.ru/nginx_ha`. ## 4. Создайте виртуальную машину в новом Proxmox. Скачайте образ `Core` проекта `Tiny Core Linux` http://tinycorelinux.net/downloads.html. @@ -91,7 +97,7 @@ $ qemu-img convert -f raw -O vdi /tmp/exported_vm_100_archive/disk-drive-scsi0.r Объем пространства, занимаемый образом, можно определить с помощью команд `qemu-img info` или `ls -ls`; -Предупреждение: Никогда не используйте `qemu-img` для изменения образов, используемых запущенной виртуальной машиной или любым другим процессом; это может привести к уничтожению образа. Кроме того, имейте в виду, что запрос образа, которое изменяется другим процессом, может привести к несогласованному состоянию. +Предупреждение: Никогда не используйте `qemu-img` для изменения образов, используемых запущенной виртуальной машиной или любым другим процессом; это может привести к уничтожению образа. Кроме того, имейте в виду, что запрос образа, который изменяется другим процессом, может привести к несогласованному состоянию. ## 6. Для восстановления из бекапа используется утилита `qmrestore` (`man qmrestore`). Восстановите из бэкапа виртуальную машину под другим идентификатором.