Updated virtualisation tasks, started lection for postfix, added portfolio tasks, added two link to sql excercises

pull/1/head^2
Vladimir Protsenko 1 year ago
parent 746d20679f
commit 5bf315a4bc

@ -0,0 +1,8 @@
# Экзаменационное задание для портфолио 3
Настройте почтовый сервер на основе Postfix и Dovecot для своего домена studX.myoffice.ru (или любой другой). Заведите один или несколько почтовых ящиков для новых пользователей. Пользователь должен иметь возможность:
- подключиться из мобильного или десктопного почтового клиента к серверу со своим логином и паролем,
- отправить почту на внешний адрес gmail.com/yandex.ru/mail.ru,
- принять почтовое сообщение с внешнего адреса отправленное как ответ на входное письмо.
Сервер должен пройти проверку c помощью валидатора https://esmtp.email/tools/mta-sts/.

@ -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.

@ -599,3 +599,5 @@ FROM pg_stat_user_tables;
- https://www.postgresql.org/docs/ - https://www.postgresql.org/docs/
- https://theartofpostgresql.com - https://theartofpostgresql.com
- https://www.crunchydata.com/developers/tutorials - https://www.crunchydata.com/developers/tutorials
- https://www.sql-ex.ru/
- https://sqlbolt.com/

@ -0,0 +1,7 @@
# Экзаменационное задание для портфолио 4
Выполните задания по настройке Proxmox на виртуальных машинах и предоставьте доступ к веб-интерфейсу по адресу `https://studX.myoffice.ru/proxmox/`. Заведите тестового пользователя, который обладает правами на:
- запуск/выключение созданной для него виртуальной машины,
- может создавать диски,
- может изменять конфигурацию оборудования виртуальной машины,
- может сохранять бекапы и делать снепшоты системы.

@ -1,57 +1,45 @@
# Задания # Задания
## 1. ## 1.
Установите Proxmox на две виртуальные машины Proxmox. Используйте образ диска `proxmox_7.2.1.iso`. Установите Proxmox на две виртуальные машины Proxmox. Используйте образ диска `proxmox_8.0.2.iso`.
Параметры виртуальных машин: Параметры виртуальных машин:
- объем памяти RAM 32ГБ, - объем памяти RAM 16ГБ,
- число ядер 8, - число ядер 4,
- объем жёсткого диска 32ГБ, - объем жёсткого диска 32ГБ,
- сетевое устройство в vlan 15+X (подключенное к мосту vmbr15+X, без указания vlan тега), - сетевое устройство vmbrX.
- IP из сети `192.168.1.0/24`,
- шлюз `192.168.1.1`, Параметры установки:
- IP из сети `192.168.0.0/24` (192.168.0.[201-202]),
- шлюз `192.168.0.1`,
- любой общедоступный DNS, - любой общедоступный DNS,
- стандартный пароль для пользователя root, - стандартный пароль для пользователя root,
- доменные имена `n[1-2].studX.myoffice.ru`. - доменные имена `n[1-2].studX.myoffice.ru`.
Используйте утилиту `pveversion`, чтобы узнать версию Proxmox. Используйте утилиту `pveversion`, чтобы узнать версию Proxmox.
Для удобства, настройте беспарольный доступ между машинами. Так как ключи уже сгенерированы при установке, достаточно выполнить `ssh-copy-id`. Чтобы использовать доменные имена на данном этапе внесите их в `/etc/hosts` каждой машины.
## 2. ## 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 # systemctl restart corosync
root@n1 # pvecm status root@n1 # pvecm status
``` ```
``` ```
root@n2 # pvecm add n1.stud15.myoffice.ru root@n2 # pvecm add n1.studX.myoffice.ru
root@n2 # pvecm status root@n2 # pvecm status
``` ```
## 3. ## 3.
Настройте доступ к веб-интерфейсу с помощью прокси сервера или туннелей. Прокси-машина должна иметь два сетевых интерфейса, каждый в своей vlan: 499 и 15+X. Первая vlan позволяет подключиться к прокси из сети интернет, вторая позволяет обмениваться данными между прокси и новым кластером Proxmox. Настройте доступ к веб-интерфейсу с помощью прокси сервера. Прокси-машина должна иметь два сетевых интерфейса, каждый в своей vlan: 499 и 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
```
Пример настройки прокси сервера nginx. Пример настройки прокси сервера nginx.
``` ```
server { server {
listen 80 default_server; listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri; return 301 https://$host$request_uri;
} }
server { server {
@ -61,19 +49,37 @@ server {
ssl_verify_client off; ssl_verify_client off;
server_name _; server_name _;
location / { location /proxmox/ {
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; proxy_set_header Connection "upgrade";
proxy_pass https://192.168.1.200:8006;
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/;
} }
location /nginx_ha { # hack. better to use subdomains.
rewrite ^/nginx_ha(.*)$ $1 break; location /api2/ {
proxy_pass http://10.160.179.183:80; 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. ## 4.
Создайте виртуальную машину в новом Proxmox. Скачайте образ `Core` проекта `Tiny Core Linux` http://tinycorelinux.net/downloads.html. Создайте виртуальную машину в новом 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 info` или `ls -ls`;
Предупреждение: Никогда не используйте `qemu-img` для изменения образов, используемых запущенной виртуальной машиной или любым другим процессом; это может привести к уничтожению образа. Кроме того, имейте в виду, что запрос образа, которое изменяется другим процессом, может привести к несогласованному состоянию. Предупреждение: Никогда не используйте `qemu-img` для изменения образов, используемых запущенной виртуальной машиной или любым другим процессом; это может привести к уничтожению образа. Кроме того, имейте в виду, что запрос образа, который изменяется другим процессом, может привести к несогласованному состоянию.
## 6. ## 6.
Для восстановления из бекапа используется утилита `qmrestore` (`man qmrestore`). Восстановите из бэкапа виртуальную машину под другим идентификатором. Для восстановления из бекапа используется утилита `qmrestore` (`man qmrestore`). Восстановите из бэкапа виртуальную машину под другим идентификатором.

Loading…
Cancel
Save