Шифрование клиент-серверных соединений
При первом запуске миньон устанавливает соединение с мастером, адрес которого указан в конфигурационном файле миньона.
Миньон инициирует процедуру рукопожатия и отправляет свой публичный ключ мастеру.
После установки первичного соединения публичный ключ миньона сохраняется на мастере.
Затем мастер передает миньону свой публичный ключ вместе с ротируемым симметричным ключом 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 и распространяет его на все миньоны |