Merge branch 'main' into v2

pull/3/head
Dmitry Ignatiev 1 year ago
commit b7a3aea537

@ -1,11 +1,28 @@
Какое нам дело до классов адресов? Классы адресов опеределяют то, как Postfix принимает решения какие письма принимать и куда их доставлять. Класс адреса определяется тремя вещами:
# Почтовая система Postfix + Dovecot
Возможные структуры почтовой системы:
1. Postfix, Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей.
2. Dovecot является «бэкендом» для доступа к почтовым ящикам пользователей. При этом подходе, расположение почтовых ящиков, список пользователей, известен только Dovecot.
Далее будет рассмотрен первый вариант. Но в начале следует углубиться в теорию для понимания механизмов работы Postfix. Рассмотрим что такое классы адресов и какие бывают типы доменов. Затем рассмотрим классы адресов с точки зрения менеджмента почтовых ящиков. В конце разберёмся какие проблемы есть у почтовых серверов из-за спама, и как повысить надежность доставки писем вашим почтовым сервером.
## Какое нам дело до классов адресов?
Классы адресов опеределяют то, как Postfix принимает решения какие письма принимать и куда их доставлять. Класс адреса определяется тремя вещами:
- список доменов,
- список действительных адресов получателей,
- транспорт доставки по умолчанию.
Можно считать, что класс адресов - это правило, применяемое к полю `Кому:` конверта элекронного письма. Правило имеет вид:
По умолчанию определёны следующие классы:
1. local domain class (локальные почтовые ящики),
2. virtual mailbox domain class (виртуальные почтовые ящики),
3. virtual alias domain class (виртуальные псевдонимы),
4. relay domain class (адреса транзитных smtp серверов),
5. default domain class (адреса по умолчанию).
Можно считать, что класс - это правило, применяемое к полю `Кому:` конверта элекронного письма. Правило имеет вид:
```
user@domain -> agent(user, domain),
user@domain -> agent(email),
```
которое применяется, если истинно, что:
```
@ -14,24 +31,15 @@ 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 = {}`.
Особенности. Для локальных (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`.
Адрес попадает в данный класс, если его домен или его ip адрес совпадает с одним из `mydestination`, `inet_interfaces` или `proxy_interfaces`.
Адрес получателя локальный, если его домен совпадает с `mydestination`, `inet_interfaces` или `proxy_interfaces`.
Класс предназначен для доставки писем до почтовых ящиков пользователей имеющих аккаунты в UNIX системе. Имена `user` определяются параметром `local_recipient_maps`. По умолчанию это `/etc/passwd` и `/etc/aliases`.
```
agent = local из local_transport
agent = local
USERS = /etc/passwd /etc/aliases
DOMAINS = mydestination inet_interfaces proxy_interfaces
AGENTS = service names ∈ /etc/postfix/master.cf
@ -39,23 +47,23 @@ AGENTS = service names ∈ /etc/postfix/master.cf
### 2. virtual mailbox domain class (`domain ∈ virtual_mailbox_domains`)
Доставка последней мили до почтовых ящиков пользователей в `hosted` доменах, чьи пользователи не имеют аккаунтов в UNIX системе. Адреса почтовых ящиков вида `user@domain` ищутся в одной или нескольких таблицах указанных в параметре `virtual_mailbox_maps`.
Адреса почтовых ящиков вида `user@domain` ищутся в одной или нескольких таблицах указанных в параметре `virtual_mailbox_maps`. Доставка до почтовых ящиков пользователей в доменах, чьи пользователи не имеют аккаунтов в UNIX системе.
```
agent = virtual из virtual_transport
agent = virtual
USERS = virtual_mailbox_maps
DOMAINS = virtual_mailbox_domains
AGENTS = service names ∈ /etc/postfix/master.cf
```
### 3. virtual alias domain class (виртуальные псевдонимы)
* Назначение: хостинговые домены, в которых каждый адрес получателя псевдонимом привязан к учётной записи локальной UNIX-системы или к удаленному адресу. Пример виртуального псевдонима приведен в файле VIRTUAL_README.
Назначение: хостинговые домены, в которых каждый адрес получателя псевдонимом привязан к учётной записи локальной UNIX-системы или к удаленному адресу. Пример виртуального псевдонима приведен в файле VIRTUAL_README.
* Доменные имена перечисляются в virtual_alias_domains. Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_alias_maps.
Доменные имена перечисляются в virtual_alias_domains. Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_alias_maps.
* Действительные адреса получателей перечисляются в параметре virtual_alias_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "Пользователь неизвестен в таблице виртуальных псевдонимов". Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_maps.
Действительные адреса получателей перечисляются в параметре virtual_alias_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "Пользователь неизвестен в таблице виртуальных псевдонимов". Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_maps.
* Транспортный параметр доставки почты отсутствует. Каждый адрес должен быть псевдонимом для какого-либо другого адреса.
Транспортный параметр доставки почты отсутствует. Каждый адрес должен быть псевдонимом для какого-либо другого адреса.
```
agent =
@ -64,17 +72,17 @@ DOMAINS = virtual_alias_domains
AGENTS = {}
```
### 4. relay domain class (адреса транзитных smtp серверов)
* Назначение: переадресация почты на удаленные адреса, в которых ваша система указана в качестве основного или резервного MX-хоста. Для обсуждения основных деталей конфигурации см. документ BASIC_CONFIGURATION_README. Обсуждение различий между каноническими доменами, размещенными доменами и другими доменами см. в файле VIRTUAL_README.
### 4. relay domain class (адреса доменов-ретранляторов)
Назначение: переадресация почты на удаленные адреса, в которых ваша система указана в качестве основного или резервного MX-хоста. Для обсуждения основных деталей конфигурации см. документ BASIC_CONFIGURATION_README. Обсуждение различий между каноническими доменами, размещенными доменами и другими доменами см. в файле VIRTUAL_README.
* Доменные имена перечисляются с помощью параметра relay_domains.
Доменные имена перечисляются с помощью параметра relay_domains.
* Действительные адреса получателей перечисляются с помощью параметра relay_recipient_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "User unknown in relay recipient table". Если значение этого параметра пустое, то SMTP-сервер Postfix принимает всех получателей для доменов, перечисленных в параметре relay_domains.
Действительные адреса получателей перечисляются с помощью параметра relay_recipient_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "User unknown in relay recipient table". Если значение этого параметра пустое, то SMTP-сервер Postfix принимает всех получателей для доменов, перечисленных в параметре relay_domains.
* Транспорт доставки почты задается параметром relay_transport. По умолчанию используется значение relay, которое является клоном агента доставки smtp(8).
Транспорт доставки почты задается параметром relay_transport. По умолчанию используется значение relay, которое является клоном агента доставки smtp(8).
```
agent = relay из relay_transport
agent = relay
USERS = relay_recipient_maps
DOMAINS = relay_domains
AGENTS = service names ∈ /etc/postfix/master.cf
@ -82,22 +90,184 @@ AGENTS = service names ∈ /etc/postfix/master.cf
### 5. default domain class (адреса по умолчанию)
* Назначение: пересылка почты в Интернет от имени авторизованных клиентов. Для обсуждения основных деталей конфигурации см. файл BASIC_CONFIGURATION_README. О различиях между каноническими доменами, размещенными доменами и другими доменами см. файл VIRTUAL_README.
* У этого класса нет таблицы доменов назначения.
Назначение: пересылка почты в Интернет от имени авторизованных клиентов. Для обсуждения основных деталей конфигурации см. файл BASIC_CONFIGURATION_README. О различиях между каноническими доменами, размещенными доменами и другими доменами см. файл VIRTUAL_README.
* Этот класс не имеет таблицы действительных адресов получателей.
У этого класса нет таблицы доменов назначения.
* Транспорт доставки почты задается параметром default_transport. По умолчанию используется значение smtp для доставки с помощью агента доставки smtp(8).
Этот класс не имеет таблицы действительных адресов получателей.
Транспорт доставки почты задается параметром default_transport. По умолчанию используется значение smtp для доставки с помощью агента доставки smtp(8).
```
agent = smtp из default_transport
USERS = relay_recipient_maps
DOMAINS = relay_domains
agent = smtp
USERS = {}
DOMAINS = {}
AGENTS = service names ∈ /etc/postfix/master.cf
```
Анекдот про выбор протокола шифрования в STARTTLS:
## Типы доменов
Большинство систем Postfix являются конечным пунктом назначения только для нескольких доменных имен. К ним относятся имена хостов и [IP-адреса] машин, на которых работает Postfix, а иногда и родительский домен имени хоста. Эти домены называются каноническими ( `canonical` ) доменами. Обычно они реализуются с помощью класса адресов локального домена Postfix, как определено в файле ADDRESS_CLASS_README.
Помимо канонических доменов, Postfix может быть настроен на то, чтобы быть конечным адресатом для любого количества дополнительных доменов. Такие домены называются размещенными ( `hosted` ), поскольку они не связаны непосредственно с именем самой машины. Размещенные домены обычно реализуются с помощью класса виртуального псевдонима домена и/или виртуального домена почтовых ящиков.
Но подождите! Это еще не все. Postfix может быть настроен как резервный MX-хост для других доменов. В этом случае Postfix не будет являться резервным хостом MX для этих доменов. Он просто ставит почту в очередь, когда основной MX-хост работает, и пересылает почту, когда основной MX-хост не работает. Эта функция реализуется с помощью класса адресов доменов-ретрансляторов, как определено в файле ADDRESS_CLASS_README.
Наконец, Postfix может быть настроен как транзитный хост для отправки почты через Интернет. Очевидно, что Postfix не является конечным адресатом такой почты. Эта функция доступна только для авторизованных клиентов и/или пользователей и реализуется классом доменных адресов по умолчанию, как определено в параметре ADDRESS_CLASS_README.
**Таблица. 1 Сводная таблица классов почтовых адресов**
|| 1. Локальные почтовые ящики | 2. Виртуальные почтовые ящики | 3. Виртуальные псевдонимы | 4. Адреса доменов-ретранляторов | 5. Класс доменных адресов по умолчанию |
|-|-|-|-|-|-|
|agent|local|virtual|доставляются после отображения адресов в 1 или 2|relay|smtp|
|USERS|/etc/passwd, /etc/aliases|virtual_mailbox_maps|virtual_alias_maps|relay_recipient_maps|-|
|DOMAINS|mydestination, inet_interfaces, proxy_interfaces|virtual_mailbox_domains|virtual_alias_domains|relay_domains|-|
|AGENTS|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|
# Первая настройка
Первые параметры, представляющие интерес, определяют идентификацию и роль машины в сети. Заполним таблицу:
**Таблица 2. Список вопросов перед настройкой почтового сервера**
|Вопрос|Ответ|Параметр|
|-|-|-|
| Какое доменное имя у машины с Postfix | stud12.myoffice.ru | myhostname |
| Какой домен является родительским | myoffice.ru | mydomain |
| Какие адреса принадлежат доверенной сети от клиентов в которой будут пересылаться письма другим почтовым серверам | 127.0.0.0/8 | mynetworks |
| Какое доменное имя использовать в исходящей почте | stud12.myoffice.ru или myoffice.ru | myorigin = myhostname или mydomain |
| Для каких доменов принимать почту и доставлять локально | stud12.myoffice.ru или myoffice.ru | mydestination = $myhostname localhost.$mydomain localhost |
| С каких клиентов передавать почту | | |
| В какие пункты назначения передавать почту | | |
| Какой метод доставки: прямой или непрямой | прямой | relay or proxy not used? |
Параметр `mydomain` задает родительский домен `myhostname`. По умолчанию он получается из `myhostname` путем удаления первой части (за исключением случаев, когда в результате не будет получен домен верхнего уровня ). И наоборот, если вы укажете `mydomain` в файле `main.cf`, то Postfix будет использовать его значение для генерации полностью определенного значения по умолчанию для параметра `myhostname`.
**Таблица 3. Пример вычисления значений `myhostname`, `mydomain`**
|myhostname||mydomain|
|-|-|-|
| www.stud12.myoffice.space | -> | ? |
| stud12.myoffice.space | -> | myoffice.space |
| myoffice.space | -> | myoffice.space |
| localhost.myoffice.space | <- | myoffice.space |
Рекомендуется сопоставить `myhostname` с тем, что есть в PTR-записи, и проверить, что PTR имеет соответствующую A-запись.
Параметр `myorigin` задает домен, который отображается в почте, размещенной на этой машине. По умолчанию используется имя локальной машины, `myhostname`, которое по умолчанию равно имени машины. Если только вы не используете действительно небольшой сайт, то, вероятно, следует изменить его на `mydomain`, которое по умолчанию соответствует родительскому домену имени машины.
Параметр `mydestination` определяет, на какие домены эта машина будет доставлять локально, а не пересылать на другую машину. По умолчанию принимается почта для самой машины. О том, как настроить Postfix для размещенных доменов, см. файл VIRTUAL_README. (Правда в конфигурационном файле `main.cf.proto` есть комментарий: "Вы ДОЛЖНЫ указать $myhostname в начале текста. Это требование 581 RFC. Самому Postfix безразлично.")
## Пример эволюции конфигурации Postfix - от простого к сложному.
### Несколько доменов в mydestiantion
У вас есть почтовый сервер обслуживающий один домен `myoffice.ru`. Стоит ли заводить ещё один почтовый сервер, если количество доменов увеличилось (появился `myoffice.space`)? Совсем не обязательно.
Самый простой способ размещения дополнительного домена - это добавить имя домена к доменам, перечисленным в конфигурационном параметре Postfix `mydestination`, и добавить имена пользователей в файл паролей UNIX `/etc/passwd`. При таком подходе не делается различий между каноническими ( `canonical` ) и размещенными ( `hosted` ) доменами. Каждое имя пользователя может получать почту в каждом домене.
```
myhostname = stud12.myoffice.ru
mydomain = myoffice.ru
mydestination = myoffice.space $myhostname localhost.$mydomain
```
Ограничениями данного подхода являются:
* Полное отсутствие разделения: почта для info@stud12.myoffice.ru доставляется на ту же системную учетную запись UNIX, что и почта для info@myoffice.space.
* При наличии пользователей в файле паролей UNIX администрирование большого числа пользователей становится неудобным.
### Виртуальные псевдонимы
При использовании подхода, описанного в данном разделе, каждый размещаемый домен может иметь свой собственный адрес электронной почты `info@stud12.myoffice.ru` и `info@myoffice.space`. Однако при этом по-прежнему используются системные учетные записи UNIX для доставки локальных почтовых ящиков.
При использовании виртуальных доменов-псевдонимов каждый размещаемый адрес привязывается к локальной учетной записи UNIX-системы или к удаленному адресу. Они не обязательно должны ссылаться на системные учетные записи UNIX на вашей машине. В приведенном ниже примере показано, как использовать этот механизм для домена myoffice.space.
```
1 /etc/postfix/main.cf:
2 virtual_alias_domains = myoffice.space ...other hosted domains...
3 virtual_alias_maps = hash:/etc/postfix/virtual
```
```
5 /etc/postfix/virtual:
6 postmaster@myoffice.space postmaster
7 info@myoffice.space joe
8 sales@myoffice.space jane
9 # Uncomment entry below to implement a catch-all address
10 # @myoffice.space jim
11 ...virtual aliases for more domains...
```
Виртуальные псевдонимы решает одну проблему: он позволяет каждому домену иметь свой собственный почтовый адрес. Например это даёт возможность работать с ящиками `info@stud12.myoffice.ru` и `info@myoffice.space` разным пользователям.
Но при этом остается один недостаток: каждый виртуальный адрес привязывается к системной учетной записи UNIX. При добавлении большего количества виртуальных адресов увеличивается и количество системных учетных записей UNIX. В следующем разделе эта проблема будет устранена.
### Виртуальные почтовые ящики
По мере увеличения числа доменов и пользователей в системе становится все менее целесообразным предоставлять каждому пользователю собственную учетную запись в системе UNIX.
С помощью агента доставки Postfix virtual(8) каждый адрес получателя может иметь свой собственный виртуальный почтовый ящик. В отличие от доменов виртуальных псевдонимов, домены виртуальных почтовых ящиков не нуждаются в неуклюжей трансляции из каждого адреса получателя в другой адрес, а владельцам адресов виртуальных почтовых ящиков не нужно иметь системную учетную запись UNIX.
Агент доставки виртуальных почтовых ящиков Postfix virtual(8) ищет путь к почтовому ящику пользователя, `uid` и `gid` в отдельных таблицах, которые перебираются вместе с почтовым адресом получателя. Доставка в стиле `Maildir` включается путем завершения имени почтового ящика символом "/".
Если идея нескольких таблиц покажется вам неудобной, помните, что вы можете перенести информацию (после того как она заработает) в базу данных SQL. Если вы пойдете по этому пути, обязательно ознакомьтесь с разделом "local files versus databases" в верхней части документа VIRTUAL_README.
Пример конфигурации:
```
1 /etc/postfix/main.cf:
2 virtual_mailbox_domains = myoffice.space ...more domains...
3 virtual_mailbox_base = /var/mail/vhosts
4 virtual_mailbox_maps = hash:/etc/postfix/vmailbox
5 virtual_minimum_uid = 100
6 virtual_uid_maps = static:5000
7 virtual_gid_maps = static:5000
8 virtual_alias_maps = hash:/etc/postfix/virtual
```
```
10 /etc/postfix/vmailbox:
11 info@myoffice.space myoffice.space/info
12 sales@myoffice.space myoffice.space/sales/
13 # Comment out the entry below to implement a catch-all.
14 # @myoffice.space myoffice.space/catchall
15 ...virtual mailboxes for more domains...
```
```
17 /etc/postfix/virtual:
18 postmaster@myoffice.space postmaster
```
* Строка 2: Параметр virtual_mailbox_domains указывает Postfix, что myoffice.space является так называемым виртуальным почтовым доменом. Если опустить эту настройку, то Postfix будет отклонять почту (relay access denied) или не сможет ее доставить (почта для myoffice.space зацикливается на себе).
НИКОГДА не указывайте виртуальное доменное имя MAILBOX в качестве домена mydestination!\
НИКОГДА не указывайте имя виртуального домена MAILBOX в качестве виртуального домена ALIAS!
* Строка 3: Параметр virtual_mailbox_base задает префикс для всех имен путей виртуальных почтовых ящиков. Это защитный механизм на случай ошибки. Он предотвращает доставку почты по всей файловой системе.
* Строки 4, 10-15: Параметр virtual_mailbox_maps задает таблицу поиска с именами почтовых ящиков (или maildir), индексированных по виртуальному почтовому адресу. В данном примере почта для info@myoffice.space отправляется в почтовый ящик по адресу /var/mail/vhosts/myoffice.space/info, а почта для sales@myoffice.space - в maildir, расположенный по адресу /var/mail/vhosts/myoffice.space/sales/.
* Строка 5: virtual_minimum_uid задает нижнюю границу UID владельца почтового ящика или maildir. Это защитный механизм на случай ошибки. Он предотвращает запись почты в чувствительные файлы.
* Строки 6, 7: Параметры virtual_uid_maps и virtual_gid_maps указывают, что все виртуальные почтовые ящики принадлежат фиксированным uid и gid 5000. Если это не то, что нужно, укажите таблицы поиска, которые ищут по почтовому адресу получателя.
* Строка 14: Закомментированная запись (текст после #) показывает, как можно реализовать универсальный адрес виртуального почтового ящика. Будьте готовы к получению большого количества спама, а также отбитого спама, отправленного от имени anything@myoffice.space.
НИКОГДА не помещайте виртуальный MAILBOX wild-card в виртуальный файл ALIAS!!!
* Строки 8, 17, 18: Как видите, можно смешивать виртуальные псевдонимы с виртуальными почтовыми ящиками. Мы используем эту возможность для перенаправления почты для адреса postmaster сайта myoffice.space на локальный адрес postmaster. Аналогичный механизм можно использовать и для перенаправления адреса на удаленный адрес.
* Строка 18: В данном примере предполагается, что в файле main.cf под параметром mydestination указан $myorigin. Если это не так, укажите явное доменное имя в правой части записей таблицы виртуальных псевдонимов, иначе почта будет отправляться не на тот домен.
# Как увеличить вероятность доставки почты с вашего почтового сервера?
## Чеклист
| Вопрос | Ответ |
|-|-|
| 1. Внесена MX запись на стороне DNS | _______ |
| 2. Настроен SPF на стороне почтового сервера и на стороне DNS | _______ |
| 3. Настроен DKIM на стороне почтового сервера и на стороне DNS | _______ |
| 4. Настроен DMARC на стороне почтового сервера и на стороне DNS | _______|
| 5. Настроен обмен сообщениями по TLS с другими серверами | _______ |
| 6. Получен и настроен сертификат домена от центра сертификации | _______|
Рекомендуется использовать TLS и избегать STARTTLS. Анекдот про то, как выбирается протокол шифрования в STARTTLS:
```
А: Давай по SSL 2.0.
Б: Могу только по SSL 3.0.
@ -108,12 +278,11 @@ AGENTS = service names ∈ /etc/postfix/master.cf
А: Договорились
```
Возможные структуры почтовой системы:
- Postfix, Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей.
- Dovecot является «бэкендом» для доступа к почтовым ящикам пользователей. При этом подходе, расположение почтовых ящиков, список пользователей, известен только Dovecot.
# Dovecot
Для безопасного подключения клиентов к своим почтовым ящикам по сети требуется сервер, который обеспечивает авторизацию пользователя, установку безопасного соединения. Как администратор вы можете организовать подключение по `ssh`, но это очень не удобно, особенно с мобильных устройств. Удобнее использовать графический почтовый клиент общающийся по протоколу POP3 или IMAP. Одной из широко распространённых открытых реализаций является сервера для общения с почтовыми клиентами является Dovecot.
Источники:
1. https://habr.com/ru/articles/258279/
2.
2. https://github.com/vdukhovni/postfix/tree/master/postfix/README_FILES

@ -34,7 +34,9 @@ root@n2 # pvecm status
```
## 3.
Настройте доступ к веб-интерфейсу с помощью прокси сервера. Прокси-машина должна иметь два сетевых интерфейса, каждый в своей vlan: 499 и X. Первая vlan позволяет подключиться к прокси из сети интернет, вторая позволяет обмениваться данными между прокси и новым кластером Proxmox.
Настройте доступ к веб-интерфейсу с помощью прокси сервера.
### Вариант прокси 1 для доступа по адресу https://studX.myoffice.ru/proxmox/
Пример настройки прокси сервера nginx.
```
@ -47,29 +49,15 @@ server {
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 _;
server_name stud12.myoffice.ru;
location / {
# this is for
if ($args ~ ^console) {
proxy_pass https://192.168.0.201:8006;
}
try_files $uri $uri/ =404;
}
location /ha/1 {
return 302 https://stud12.myoffice.ru/ha/1/;
}
location /ha/1/ {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
proxy_pass http://backend/;
}
location /ha/2 {
return 302 https://stud12.myoffice.ru/ha/2/;
}
location /ha/2/ {
proxy_pass http://192.168.0.4/;
}
location /proxmox {
return 302 https://stud12.myoffice.ru/proxmox/;
}
@ -81,8 +69,8 @@ server {
proxy_set_header Accept-Encoding "";
# Standard proxying headers (why do we need this?)
proxy_set_header Host stud12.myoffice.ru;
proxy_set_header X-Real-IP 193.32.63.182;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 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;
@ -92,15 +80,9 @@ server {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
# hack
sub_filter_once off;
sub_filter 'stud12.myoffice.ru/' 'stud12.myoffice.ru/proxmox/';
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/;
}
# Hacks
location ~ ^\/(pve2|api2|novnc|xtermjs|pve-doc|pwt) {
rewrite ^/(.+) /proxmox/$1;
proxy_pass https://192.168.0.201:8006/$request_uri;
@ -108,6 +90,45 @@ server {
}
```
### Вариант прокси 2 для доступа по адресу https://proxmox.studX.myoffice.ru/
```
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/stud12.samara-myoffice.space/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/stud12.samara-myoffice.space/privkey.pem;
ssl_verify_client off;
server_name proxmox.stud12.samara-myoffice.space;
location / {
# for websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Standard proxying headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 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 proxmox.stud12.samara-myoffice.space;
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;
proxy_pass https://10.160.179.184:8006;
}
}
```
## 4.
Создайте виртуальную машину в новом Proxmox. Скачайте образ `Core` проекта `Tiny Core Linux` http://tinycorelinux.net/downloads.html.

@ -16,33 +16,42 @@ Docker это самый известный инструмент, который
## Основные механизмы работы Docker
Как вы уже знаете, в контейнерном механизме используется несколько средств ядра, которые необходимых для изоляции процессов приложений.
### 1. Функции ядра
#### 1.1. Пространства имён
В контейнеризации используется несколько технологий ядра Linux, необходимых для обеспечения изоляции и управления контейнерами.
Пространства имён изолируют контейнерные процессы с точки зрения нескольких функций операционной системы, включая монтирование файловой системы, управление процессами и сетевое взаимодействие.
#### 1.1. Пространства имён (Namespaces)
Например, пространство имён команды `mount` отображает процессы с помощью индивидуального представления иерархии файловой системы. Это аналогично системному вызову `chroot`, который необратимо устанавливает видимый процессу корневой каталог и тем самым отключает доступ к файлам и каталогам хоста, расположенным выше уровня `chroot`.
Namespaces - технология ядра Linux, разработанная в достаточно далёком 2002 году. Docker использует namespaces, такие как PID (Process ID), Network и Mount, для создания изолированных пространств имён. Пространства имён изолируют контейнерные процессы с точки зрения нескольких функций операционной системы, включая монтирование файловой системы, управление процессами и сетевое взаимодействие.
Например, с использованием PID namespaces каждый контейнер видит только свои процессы, что обеспечивает изоляцию процессов между контейнерами. Пространство имён команды `mount` отображает процессы с помощью индивидуального представления иерархии файловой системы. Это аналогично системному вызову `chroot`, который необратимо устанавливает видимый процессу корневой каталог и тем самым отключает доступ к файлам и каталогам хоста, расположенным выше уровня `chroot`.
Контейнеры могут работать на разных уровнях интеграции с операционной системой хоста в зависимости от того, как эти пространства имён были настроены.
#### 1.2. Контрольные группы
#### 1.2. Контрольные группы (Cgroups)
Cgroups (Control Groups) - технология, разработанная внутри компании Google еще в 2006 году. Контрольные группы ограничивают использование системных ресурсов и определяют приоритетность одних процессов над другими. Контрольные группы препятствуют процессам контейнеров, выходящим из под контроля, использовать всю память и всё доступное время процессора. Это позволяет предотвратить «голодание» ресурсов и обеспечить справедливое распределение мощностей между контейнерами.
Контрольные группы ограничивают использование системных ресурсов и определяют приоритетность одних процессов над другими. Контрольные группы препятствуют процессам контейнеров, выходящим из под контроля, использовать вс. память и всё доступное время процессора.
#### 1.3. Слоистые файловые системы (Union File Systems)
#### 1.3. Функциональные возможности
Docker использует «слоистые» файловые системы, такие как AUFS, OverlayFS и Overlay2, чтобы создавать легковесные и эффективные образы контейнеров. Это возможно благодаря тому, что они разделяют общие файлы между собой, экономя дисковое пространство.
#### 1.4. Функциональные возможности (Capabilities)
Функциональные возможности позволяют процессам выполнять определённые чувствительные операции с ядром и системные вызовы. Например, процесс может иметь возможность изменять права собственности на файл или устанавливать системное время.
#### 1.4. Режим защищённых вычислений
Ядро Linux предоставляет разные возможности (capabilities) для выполнения привилегированных действий. Docker позволяет настраивать набор возможностей, доступных контейнеру, для более тонкой настройки безопасности.
#### 1.5. Режим защищённых вычислений (Seccomp)
Для повышения безопасности Docker может использовать Seccomp. Он ограничивает доступ контейнера к системным вызовам, что позволяет уменьшить поверхность атаки и предотвратить выполнение опасных операций. Он обеспечивает более детальный контроль, чем функциональные возможности.
Режим защищённых вычислений ограничивает доступ к защищённым вызовам. Он обеспечивает более детальный контроль, чем функциональные возможности.
### 2. Сеть
Для обеспечение работы по сети используются такие технологии как:
Для обеспечения работы по сети используются такие технологии как:
- встроенные в ядро программные L2 свичи `Linux Bridges`,
- механизмы сетевого экрана `netfilter` NAT (преобразование сетевых адресов) и Port Forwarding (проброс портов),
- опционально правила SELinux/AppArmor.
@ -67,7 +76,7 @@ Docker это самый известный инструмент, который
Docker Hub - это общедоступная служба реестра, поддерживаемая компанией Docker, Inc. В ней содержатся образы многих дистрибутивов, которые вы можете взять в качестве основы для своего образа, и проектов с открытым исходным кодом.
В вашей компании вы можете поднять собственный реестр на основе одного из общедоступных образов реестров. При выборе образа реестра для производственной среды нужно учесть ряд требований к хранилищу данных, к аутентификации и авторизации, и к требованиям выдвигаемым другими задача обслуживания.
В вашей компании вы можете поднять собственный реестр на основе одной из общедоступных реализаций реестров, в том числе поставляемых в виде докер образа. При выборе образа реестра для производственной среды нужно учесть ряд требований к хранилищу данных, к аутентификации и авторизации, и к требованиям выдвигаемым другими задачам обслуживания.
### 5. Механизмы обеспечения персистентности в Docker
@ -79,11 +88,11 @@ Docker реализует три механизма обеспечения по
Docker также поддерживает возможность монтирования локальной директории в контейнер.
Все эти возможности, кроме обеспечения персистентности при хранении данных, также обеспечивают более высокую производительность при записи в файловую \
систему контейнера, по сравнению с верхним слоем `UnionFS`, доступным на запись и чтение.
Все эти возможности, кроме обеспечения персистентности при хранении данных, также обеспечивают более высокую производительность при записи в файловую систему контейнера, по сравнению с верхним слоем `UnionFS`, доступным на запись и чтение.
## Релевантные источники
- Nemeth E. et al. UNIX and Linux system administration handbook. Chapter 25.
- https://containerd.io/
- https://github.com/moby/moby/blob/master/libnetwork/docs/design.md
- https://github.com/containernetworking/cni
- https://habr.com/ru/companies/yandex_praktikum/articles/760076/

@ -1,11 +0,0 @@
---
- hosts: nodepgs
become: yes
tasks:
- import_tasks: tasks/setup_grub.yml
vars:
grub_timeout: 1
- import_tasks: tasks/install_selinux.yml
- import_tasks: tasks/setup_raid1_for_postgres.yml
- import_tasks: tasks/install_postgres.yml
- import_tasks: tasks/setup_weather_db.yml

@ -1,27 +0,0 @@
- name: Install gnupg
apt:
pkg: gnupg
- name: Install key
apt_key:
url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
state: present
- name: Add postgresql repository into sources list as pgdg file
ansible.builtin.apt_repository:
repo: "deb http://apt.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg main"
state: present
filename: pgdg
- name: Install postgre
apt:
pkg: postgresql-15*
register: postgre_installation
- name: Delete old configuration
shell: rm -rf /var/lib/postgresql/*
when: postgre_installation.changed
- name: Init PostgreSQL
shell: pg_createcluster 15 main --start
when: postgre_installation.changed

@ -1,20 +0,0 @@
- name: 'Install SELinux'
apt:
pkg:
- selinux-basics
- selinux-policy-default
- auditd
state: present
- name: 'Activate SELinux'
shell: selinux-activate
when: ansible_selinux.status == "disabled"
- name: 'Reboot after SElLinux install'
reboot:
when: ansible_selinux.status == "disabled"
- name: 'Check SELinux in permissive mode'
ansible.posix.selinux:
policy: default
state: permissive

@ -1,11 +0,0 @@
- name: "Get grub timeout value"
shell: cat /etc/default/grub | grep GRUB_TIMEOUT | sed 's/GRUB_TIMEOUT=//g'
register: current_grub_timeout
- name: 'Configure grub timeout if not already'
shell: sed 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT={{ timeout }}/g' -i /etc/default/grub
when: current_grub_timeout.stdout != "{{ grub_timeout }}"
- name: 'Update grub'
shell: update-grub
when: current_grub_timeout.stdout != "{{ grub_timeout }}"

@ -1,59 +0,0 @@
- name: 'Install mdadm'
apt:
pkg: mdadm
- name: 'Check raid 1 has mount point at /var/lib/postgresql'
command: /bin/mountpoint -q /var/lib/postgresql/
register: raid1_mounted
failed_when: False
- name: 'Configure md raid 1'
shell: mdadm --create /dev/md0 --raid-devices=2 --level=1 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi[1,2] --run
register: "array_created"
when: ansible_facts['devices']['md0'] is undefined and
raid1_mounted.rc == 1
- name: 'Get configuration strings for configured raids'
command: "mdadm --detail --scan"
register: array_details
changed_when: false
- name: 'Persist configuration in /etc/mdadm/mdadm.conf '
lineinfile:
dest: "/etc/mdadm/mdadm.conf"
regexp: "^{{ item }}"
line: "{{ item }}"
state: "present"
with_items: '{{ array_details.stdout_lines }}'
when: array_created.changed
register: updated_mdadm_conf
- name: 'Updating Initramfs'
command: update-initramfs -u
when: updated_mdadm_conf is defined and
updated_mdadm_conf.changed
- name: 'Format raid1, ext4 filesystem'
community.general.filesystem:
fstype: ext4
dev: /dev/md0
- name: 'Update facts about node.'
setup:
- name: 'Create postrgresql folder'
file:
path: /var/lib/postgresql
state: directory
- name: 'Setup permanent mountpoint /var/lib/postgresql for raid1'
ansible.posix.mount:
path: /var/lib/postgresql
src: UUID={{ ansible_facts['devices']['md0']['links']['uuids'][0] }}
fstype: ext4
state: present
register: permanent_raid1_mount
- name: reboot
reboot:
when: permanent_raid1_mount.changed

@ -1,7 +0,0 @@
- name: Copy weather.sql
copy:
src: ./files/weather.sql
dest: /tmp/weather.sql
- name: import wether db to pg
shell: sudo -u postgres psql -f /tmp/weather.sql

@ -1,13 +1,13 @@
# Портфолио
## 1. proxmox
Web интерфейс созданного в задании Proxmox доступен по адресу https://proxmox.studX.startmyoffice.space.
Web интерфейс созданного в задании Proxmox доступен по адресу https://studX.myoffice.ru/proxmox/.
## 2. nginx_ha
Cайт доступен по адресу https://nginx-ha.studX.startmyoffice.space. При остановке активной машины должен обслуживаться резервным сервером.
Cайты доступены по адресу https://studX.myoffice.ru/ha/1/ и https://studX.myoffice.ru/ha/2/. При остановке активной машины должен обслуживаться резервным сервером.
## 3. docker
Cайт с картой еды в Сан-Франциско доступен по адресу https://foodtrucks.studX.startmyoffice.space.
Cайт с демонстрацией развёрнутого в docker приложения доступен по адресу https://studX.myoffice.ru/docker/.
## 4. postfix + dovecot
Из почтового клиента можно отправить почту с почтового ящика stud@studX.myoffice.ru и прочитать входящие сообщения.
Loading…
Cancel
Save