Перейти к основному содержимому

Шифрование данных в файлах состояний и Pillar

GPG

GNU Privacy Guard (GnuPG, GPG) — свободное программное обеспечение для шифрования информации и создания электронных цифровых подписей.
GnuPG присутствует во всех свободных операционных системах, включая GNU/Linux, распространяется под свободной лицензией GNU General Public License.

GnuPG полностью совместима со стандартом IETF OpenPGP.
Текущие версии GnuPG могут взаимодействовать с PGP и другими OpenPGP-совместимыми системами.

Основные функции GnuPG:

  • создание ключевых пар,
  • обмен и проверка ключей,
  • шифрование и расшифрование сообщений и документов,
  • аутентификация документов с помощью цифровых подписей.

Принцип работы GPG

GnuPG использует криптографию с открытым ключом.
В системе с открытым ключом у каждого пользователя есть пара ключей: закрытый ключ (private key) и открытый ключ (public key).

Закрытый ключ необходим пользователю для расшифрования сообщений, направляемых ему другими пользователями, и зашифрованных его открытым ключом.
Закрытый ключ должен оставаться в секрете, его не следует раскрывать другим пользователям ни при каких обстоятельствах.
Открытый ключ может быть передан любому корреспонденту для шифрования сообщений, направляемых пользователю.

GnuPG использует схему, в которой у пользователя есть основной ключ и ни одного или более дополнительных подчинённых ключей.
Основные и подчиненные пары ключей объединены для упрощения управления ключами, и это объединение часто можно рассматривать просто как одну пару ключей.

SaltStack GPG Renderer

Создание GPG-ключей для SaltStack

Чтобы создать новую пару ключей GPG для шифрования данных, войдите в командную оболочку мастера как пользователь root и выполните следующие команды:

  1. Создание каталога для хранения ключей:

    mkdir -p /etc/salt/gpgkeys
  2. Отключение любых прав на доступ к каталогу у пользователей группы владельца и у других пользователей:

    chmod 0700 /etc/salt/gpgkeys
  3. Генерация и сохранение GPG-ключей в созданном каталоге:

    gpg --homedir /etc/salt/gpgkeys --gen-key

После запуска утилиты генерации ключей gpg последовательно выполните следующие шаги:

  1. Выберите тип создаваемого ключа.
    Следует выбрать один из двух вариантов: RSA and RSA или DSA and Elgamal.
    Ключ с пометкой sign only не подходит: необходим ключ, поддерживающий шифрование данных, а не только их подписание:

    sudo gpg --gen-key --homedir /etc/salt/gpgkeys
    gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    gpg: keyring `/etc/salt/gpgkeys/secring.gpg' created
    gpg: keyring `/etc/salt/gpgkeys/pubring.gpg' created
    Please select what kind of key you want:
    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
  2. Укажите размер ключа в битах.
    Рекомндуется использовать ключ размером 4096 бит:

    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048)
  3. Установите срок действия ключа:

    Please specify how long the key should be valid.
    0 = key does not expire
    <n> = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
    Key is valid for? (0)
  4. Укажите данные о владельце ключа:

    GnuPG needs to construct a user ID to identify your key.

    Real name: SaltBox
    Email address: saltbox@example.local
    Comment: "SaltBox KEY"
    You selected this USER-ID:
    "SaltBox (SaltBox KEY) <saltbox@example.local>"

    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
  5. Далее утилита создания ключа запросит парольную фразу для ключа.
    Оставьте поле пустым и подтвердите создание ключа.

  6. Убедитесь, что ключ был создан.
    В выводе команд, указанных ниже, должен быть созданный ключ SaltBox:

    gpg --homedir /etc/salt/gpgkeys --list-keys
    gpg --homedir /etc/salt/gpgkeys --list-secret-keys

    Пример вывода команды gpg --homedir /etc/salt/gpgkeys --list-keys в случае её успешного выполнения:

    sec    4096R/3B42DC0F0 2025-04-15
    uid SaltBox (SaltBox KEY) <saltbox@example.local>
    ssb 4096R/3767D6BA 2025-04-15

    Пример вывода команды gpg --homedir /etc/salt/gpgkeys --list-secret-keys в случае её успешного выполнения:

    sec    4096R/3B42DC0F0 2025-04-15
    uid SaltBox (SaltBox KEY) <saltbox@example.local>
    ssb 4096R/3767D6BA 2025-04-15
  7. На основе имеющегося приватного ключа создайте публичный ключ для шифрования данных:

    sudo gpg --homedir /etc/salt/gpgkeys --armor --export  > saltBox.gpg

    Созданный публичный ключ можно передавать пользователям, на стороне которых будет производится шифрование данных (обычно это администраторы SaltStack,которые пишут файлы состояний).

  8. Импортируйте GPG-ключ в профиль пользователя

    С правами пользователя выполните команду:

    gpg --import saltBox.gpg

    Убедитесь в успешном импорте ключа:

    gpg --list-keys

Шифрование данных с помощью публичного ключа

Шифрование данных выполняется следующей командой:

echo -n "encrypted_password" | gpg --trust-model always -ear 'SaltBox'

Пример вывода команды в случае её успешного выполнения:

-----BEGIN PGP MESSAGE-----

hQIMA/PI+003Z9a6AQ/+M6Z1+byu5girZSIIx8ILiRlUDVoGyd0NTInz44OYNiFl
HunSYrb9GD/agDR2ICmbcxUdzSz8Cnm+1GHxFq5pHtQMFB4iK4szs5+PH/yUKR1/
+ijEnBATh3J9SaZjftcf1nVKHNGtsCl7wDEdvOUqfLfekZZmJ15zaedQYFKdB7T4
X9oRs+vxRIZMTlAuJ/g8nbs51eYSno3le5cajrpBUJQr/Fe3gL7aKE/2xQVlXZPP
ONK24ocBhoKJYwqsAyCo15JtYZl+X+yzTpxhaIaOGOTGFUijqvnRqbyiWUToRy9W
4Abf8vu52rhL09SDTgVZQ9Mg++qFXvcd8WaFPocTzBbWu2iRdkCTwxiOPYdfPyAl
XY0/k5zFtEkPicMo6xrpT4HKQ99H5MJ4hxNOjfSTrB4isyHfNjuRzfzRJHMJ9WrL
YFG+3j4CvKKWthtIALNXsFglvBVT3JUsL1bGZXbIdaYkFhVpNTJhF1wkBKe3qwno
TD5y+AYfjuMKYcpKBrrGAvaDEnvWicaAPKu24a4mQNcmHu5q/FVYHy7F/FnKHvZ4
jk3NEMkYrGjrJYkrOpFzW2blrvx1+FIywf95LyoddUc1Bn/1MumC5y5YD2jHbwYT
fRHs6YVZEBAG/86mx1nzyjOSiG64Ct+JMiUsDasGPvNBcsDoJXdmk12B9MhOIUzS
TQG2CTKOeChs9hO48ZKs1hPXqWACseOzpAnuA8GpWOffbIfzD816zcqx6zAhPj5b
x9MfZslQwVE6qG+YOhw0QX9S6Gl56syHRraS4Y2y
=e1eF
-----END PGP MESSAGE-----

Текст, начинающийся строкой -----BEGIN PGP MESSAGE-----
и заканчивающийся строкой -----END PGP MESSAGE-----, необходимо скопировать полностью (вместе с указанными строками) и вставить в файл, содержащий нужный pillar (подробнее в примере зашифрованного файла Pillar).

Шифрование данных в файлах Pillar

Система рендеринга Salt может использоваться для расшифрования данных pillar.
Элементы pillar могут храниться в зашифрованном виде и расшифровываться во время компиляции pillar.

Пример зашифрованного файла Pillar

# pillars/top.sls
secrets:
vault:
foo: |
-----BEGIN PGP MESSAGE-----

hQEMAw2B674HRhwSAQgAhTrN8NizwUv/VunVrqa4/X8t6EUulrnhKcSeb8sZS4th
W1Qz3K2NjL4lkUHCQHKZVx/VoZY7zsddBIFvvoGGfj8+2wjkEDwFmFjGE4DEsS74
ZLRFIFJC1iB/O0AiQ+oU745skQkU6OEKxqavmKMrKo3rvJ8ZCXDC470+i2/Hqrp7
+KWGmaDOO422JaSKRm5D9bQZr9oX7KqnrPG9I1+UbJyQSJdsdtquPWmeIpamEVHb
VMDNQRjSezZ1yKC4kCWm3YQbBF76qTHzG1VlLF5qOzuGI9VkyvlMaLfMibriqY73
zBbPzf6Bkp2+Y9qyzuveYMmwS4sEOuZL/PetqisWe9JGAWD/O+slQ2KRu9hNww06
KMDPJRdyj5bRuBVE4hHkkP23KrYr7SuhW2vpe7O/MvWEJ9uDNegpMLhTWruGngJh
iFndxegN9w==
=bAuo
-----END PGP MESSAGE-----
bar: this was unencrypted already
baz: |
-----BEGIN PGP MESSAGE-----

hQEMAw2B674HRhwSAQf+Ne+IfsP2IcPDrUWct8sTJrga47jQvlPCmO+7zJjOVcqz
gLjUKvMajrbI/jorBWxyAbF+5E7WdG9WHHVnuoywsyTB9rbmzuPqYCJCe+ZVyqWf
9qgJ+oUjcvYIFmH3h7H68ldqbxaAUkAOQbTRHdr253wwaTIC91ZeX0SCj64HfTg7
Izwk383CRWonEktXJpientApQFSUWNeLUWagEr/YPNFA3vzpPF5/Ia9X8/z/6oO2
q+D5W5mVsns3i2HHbg2A8Y+pm4TWnH6mTSh/gdxPqssi9qIrzGQ6H1tEoFFOEq1V
kJBe0izlfudqMq62XswzuRB4CYT5Iqw1c97T+1RqENJCASG0Wz8AGhinTdlU5iQl
JkLKqBxcBz4L70LYWyHhYwYROJWjHgKAywX5T67ftq0wi8APuZl9olnOkwSK+wrY
1OZi
=7epf
-----END PGP MESSAGE-----
qux:
- foo
- bar
- |
-----BEGIN PGP MESSAGE-----

hQEMAw2B674HRhwSAQgAg1YCmokrweoOI1c9HO0BLamWBaFPTMblOaTo0WJLZoTS
ksbQ3OJAMkrkn3BnnM/djJc5C7vNs86ZfSJ+pvE8Sp1Rhtuxh25EKMqGOn/SBedI
gR6N5vGUNiIpG5Tf3DuYAMNFDUqw8uY0MyDJI+ZW3o3xrMUABzTH0ew+Piz85FDA
YrVgwZfqyL+9OQuu6T66jOIdwQNRX2NPFZqvon8liZUPus5VzD8E5cAL9OPxQ3sF
f7/zE91YIXUTimrv3L7eCgU1dSxKhhfvA2bEUi+AskMWFXFuETYVrIhFJAKnkFmE
uZx+O9R9hADW3hM5hWHKH9/CRtb0/cC84I9oCWIQPdI+AaPtICxtsD2N8Q98hhhd
4M7I0sLZhV+4ZJqzpUsOnSpaGyfh1Zy/1d3ijJi99/l+uVHuvmMllsNmgR+ZTj0=
=LrCQ
-----END PGP MESSAGE-----

После компиляции данных pillar результаты будут расшифрованы.

$: salt myminion pillar.items

myminion:
----------
secrets:
----------
vault:
----------
bar:
this was unencrypted already
baz:
rosebud
foo:
supersecret
qux:
- foo
- bar
- baz

Ссылки

Статья о GnuPG в Википедии
Руководство по GnuPG
Шифрование данных в файлах Pillar
SaltSTack GPG Renderer