Шифрование клиент-серверных соединений
При первом запуске миньон устанавливает соединение с мастером, адрес которого указан в конфигурационном файле миньона.
Миньон инициирует процедуру рукопожатия и отправляет свой публичный ключ мастеру.
После установки первичного соединения публичный ключ миньона сохраняется на мастере.
Затем мастер передает миньону свой публичный ключ вместе с ротируемым симметричным ключом AES, используемым для шифрования и дешифрования сообщений, передаваемых мастером.
Ключ AES передается зашифрованным публичным ключом, полученным ранее от миньона.
Весь дальнейший обмен между мастером и миньоном шифруется ключами AES.
Ротируемый ключ AES используется для шифрования команд, отправляемых мастером миньону, и для шифрования соединений с файловым сервером мастера SaltStack.
Ключ генерируется повторно при каждом перезапуске мастера, а также каждый раз, когда ключ миньона удаляется командой salt-key.
После ротации ключа все миньоны должны выполнить повторную аутентификацию для получения обновленного ключа.
Это позволяет выполнять ротацию ключа AES без необходимости прерывания соединения с миньоном.
Данные публикаций между мастером и миньоном шифруются ключом AES с ротацией.
При прямом взаимодействии мастера и миньона данные шифруются уникальным ключом AES для каждой сессии.
На Рис. 1 показана диаграмма процедуры взаимной аутентификации сервера и миньона.
Взаимодействия, указанные на диагрмме, описаны в таблице 1.
Таблица 1. Переходы (взаимодействия) диаграммы процедуры взаимной аутентификации сервера и миньона
| № взаимодействия | Описание |
|---|---|
| 1 | Сервер генерируют пару ключей: приватный и публичный |
| 2 | Миньон генерируют пару ключей: приватный и публичный |
| 3 | Миньон отправляет свой открытый ключ серверу каждые 30 секунд, пока ключ не будет принят сервером |
| 4 | Если ключ не был принят ранее, сервер записывает его в файл <pki_dir>/master/minions_pre/<minion_id> |
| 5 | Если ключ уже был принят ранее, сервер записывает его в файл <pki_dir>/master/minions_denied/<minion_id> |
| 6 | Администратор получает запрос на принятие ключа нового миньона |
| 7 | Администратор принимает ключ миньона, выполнив команду salt-key -a minion_id |
| 8 | Файл <minion_id> с ключом миньона перемещается в каталог <pki_dir>/master/minions/ |
| 9 | Сервер отправляет свой публичный ключ миньону |
| 10 | Миньон помещает файл minion_master.pub с публичным ключом сервера в свой каталог <pki_dir>/minion/ |
| 11 | Сервер отправляет миньону симметричный ключ AES, который используется для шифрования и дешифрования в дальнейшем процессе обмена данными с сервером. Ключ AES шифруется публичным RSA-ключом клиента |
| 12 | Администратор получает запрос на принятие ключа нового миньона |
| 13 | Администратор отклоняет ключ миньона |
| 14 | Файл <minion_id> с ключом миньона перемещается в каталог <pki_dir>/master/minions_rejected. |
| 15, 16 | Сервер выполняет ротацию ключа AES и распространяет его на все миньоны (т.к. ключ миньона отклонён) |
| 17, 18, 19 | Сервер ежедневно выполняет ротацию ключа AES и распространяет его на все миньоны |
| 20 | Любой миньон был отклонён или удалён |
| 21, 22, 23 | Сервер выполняет ротацию ключа AES и распространяет его на все миньоны |