Helm‐Secrets - Kulichanin/speedtest GitHub Wiki

Helm Secret

Редактор для работы с шифрованными данными

Для работы с шифрованными данными используется редактор SOAP.

Installation last version

# Download the binary
curl -LO https://github.com/getsops/sops/releases/download/v3.9.4/sops-v3.9.4.linux.amd64

# Move the binary in to your PATH
mv sops-v3.9.4.linux.amd64 /usr/local/bin/sops

# Make the binary executable
chmod +x /usr/local/bin/sops

Работа с шифрованными данными

Сгенерируем приватный pgp ключ и зашифруем любой текстовый файл

gpg --full-gen-key --batch <(echo "Key-Type: 1"; \
                             echo "Key-Length: 4096"; \
                             echo "Subkey-Type: 1"; \
                             echo "Subkey-Length: 4096"; \
                             echo "Expire-Date: 0"; \
                             echo "Name-Real: Root Superuser"; \
                             echo "Name-Email: [email protected]"; \
                             echo "%no-protection"; )

Для того, чтобы получить информацию про ключ воспользуемся командой

gpg -K
gpg: проверка таблицы доверия
gpg: marginals needed: 1  completes needed: 1  trust model: pgp
gpg: глубина: 0  достоверных:   1  подписанных:   0  доверие: 0-, 0q, 0n, 0m, 0f, 4u
gpg: срок следующей проверки таблицы доверия 2027-12-26
[keyboxd]
---------
sec   rsa4096 2025-02-27 [SCEAR]
      3C44B0A2CFBF076FB983433CC1ACC70DA174087E
uid         [  абсолютно ] Root Superuser <[email protected]>
ssb   rsa4096 2025-02-27 [SEA]

Sops может создать файл или использовать ваши для шифрования

Создадим файл

echo "create_key: true" > data.yaml 

Зашифруем данные в новый файл data.enc.yaml

sops -e --pgp 3C44B0A2CFBF076FB983433CC1ACC70DA174087E data.yaml > data.enc.yaml

После сохранения мы можем посмотреть на получившийся результат:

# cat data.enc.yaml
create_key: ENC[AES256_GCM,data:+Dn1Nw==,iv:E5h5WP+joXU6ZIb5fA9Cu2jN4Qxm9hodaNioJvwev3A=,tag:OvjyL36Xym29+JyE6WzFgw==,type:bool]
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    hc_vault: []
    age: []
    lastmodified: "2025-02-27T09:02:57Z"
    mac: ENC[AES256_GCM,data:B/uMWgLXNuyuCi9PmUZ67cBHljCcWVbbSLORj9+oQ5ghJUp0MjTx3MtkYhkRfXxgEXYJWEoMfCU0uRwfMeJ+pvGv16yefgrya6FRebFbthECeoAx4xrJbW3AvVVrUU1Ik/buQ6TbpwrToV7epZsBuGeZR8yeg+ErwCpATn8aOyo=,iv:6ItUqMta7E1VOew0m9KwYoZ8VOttreYvEjOhfUhK+hI=,tag:4hPONtFSz0fL52KgW5M6LA==,type:str]
    pgp:
        - created_at: "2025-02-27T09:02:57Z"
          enc: |-
            -----BEGIN PGP MESSAGE-----

            hQIMA11BVpmljdThAQ/9Gw4Xp52NulakBw8Q344N2odttJB8vN7vDac6tDHqW0C/
            lThLoWV3nOS9uqyWDdbvmGVFYQ1TPgEhGyzy517qLXbaHvMBPp7ZklxDHDOeFWsl
            PjaT8ilkNNtWmtEFJzcPTkOOuNVssUkaozISkxeFiuml0Qf8hwNT+B0amUuDVoKu
            dWDh5Ze/3TLT7texYjmqb7SL+dcSPiqYRwLfNZZ64dCKKemQLzBgjcvnGD8/F8dC
            SReOWLi7XJLHQXrzW6gcj86Ow5Xeifp1FTkBHNWxFvi2nyXyw6tm4GXwV/vZUUs/
            kZUusF7jVb6ULSR2ErKLwvNS0e1XikCeUSZ3uJ0xwTYvYHwVbkmnc2vSR2ik9K8C
            pVRyok1T1qehYheqCilvTBioe55u1WtNi01qv/qnIqvxSTzlzsy+L99ZH+ffgXZY
            tD/VgibU7MVp6Y0R6AoEwZwB0UQ9dDPm4YWazPqGHCsfHp2GKAwaw/oFOqN74l1z
            OCgp4I/gyLIge6dYdHkADteLJjqtam1qA58waq4gkJfF1IHmY2h+mMEylNEPbvlA
            qq93Kbm9QfATyBcHEk1vW4kWq+bls01nZjSlk2h1toSo24WcNNvYn5zgiIVaz9ji
            n6+7Hba7e/WyaQ6CHOecsJddFcxzb1HsITP03iwTrVY94D+TLgRHhL0V8/d+DrrU
            WwEJAhBYxYx2O395xu/yXwE+bNre6yP8tkoyy4NQ9uvwZ2atyEsKHPXGL1Wu8KNn
            AwNOGQO6L9E14DpkJmc0ucCVhFQGeCrvZRoCX4kaqhx/xL4xs+Xb816+l9I=
            =Hqtb
            -----END PGP MESSAGE-----
          fp: 3C44B0A2CFBF076FB983433CC1ACC70DA174087E
    unencrypted_suffix: _unencrypted
    version: 3.9.2

Как видно из вывода - наш файл стал нечитаемым. Чтобы прочитать его мы можем указать опцию -d (decrypt):

# sops -d data.enc.yaml
create_key: true

Как можно заметить внутри зашифрованного файла sops записал public fingerprint, чтобы иметь возможность найти приватный pgp ключ и расшифровать данные (fp: 3C44B0A2CFBF076FB983433CC1ACC70DA174087E). Помимо этого, sops указал нам конфигурацию unencrypted_suffix:_unencrypted - благодаря этому суффиксу мы можем указывать переменные в файле, которые sops шифровать не будет. Давайте попробуем открыть файл на редактирование и добавить какую-нибудь переменную, например create_key_unencrypted:

sops data.enc.yaml
# cat data.enc.yaml
create_key_unencrypted: false
create_key: ENC[AES256_GCM,data:+Dn1Nw==,iv:E5h5WP+joXU6ZIb5fA9Cu2jN4Qxm9hodaNioJvwev3A=,tag:OvjyL36Xym29+JyE6WzFgw==,type:bool]
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    hc_vault: []
    age: []
    lastmodified: "2025-02-27T09:06:46Z"
    mac: ENC[AES256_GCM,data:sI/bvOONjt7S3wC5alBCtXCERcclE3gbqyimLjOJRa3sytFcC3usSAPbcDhrj0UMV85dMY8kIeuzZvkyQfpURnA3+tYjOuLan9E2/Hs76hwvu0ACxEnMjAWixDZU7nAEhv4/zLWZxF6R93IME8tUc/mVThNB4g+C9c+G9WcEoLY=,iv:0Cmy4uHlrzaVaK6DE3Ba4uBhJGZJ+4m7fyaKBcivgb4=,tag:hl4Y6YThbMWj76K8NnvcDg==,type:str]
    pgp:
        - created_at: "2025-02-27T09:02:57Z"
          enc: |-
            -----BEGIN PGP MESSAGE-----

            hQIMA11BVpmljdThAQ/9Gw4Xp52NulakBw8Q344N2odttJB8vN7vDac6tDHqW0C/
            lThLoWV3nOS9uqyWDdbvmGVFYQ1TPgEhGyzy517qLXbaHvMBPp7ZklxDHDOeFWsl
            PjaT8ilkNNtWmtEFJzcPTkOOuNVssUkaozISkxeFiuml0Qf8hwNT+B0amUuDVoKu
            dWDh5Ze/3TLT7texYjmqb7SL+dcSPiqYRwLfNZZ64dCKKemQLzBgjcvnGD8/F8dC
            SReOWLi7XJLHQXrzW6gcj86Ow5Xeifp1FTkBHNWxFvi2nyXyw6tm4GXwV/vZUUs/
            kZUusF7jVb6ULSR2ErKLwvNS0e1XikCeUSZ3uJ0xwTYvYHwVbkmnc2vSR2ik9K8C
            pVRyok1T1qehYheqCilvTBioe55u1WtNi01qv/qnIqvxSTzlzsy+L99ZH+ffgXZY
            tD/VgibU7MVp6Y0R6AoEwZwB0UQ9dDPm4YWazPqGHCsfHp2GKAwaw/oFOqN74l1z
            OCgp4I/gyLIge6dYdHkADteLJjqtam1qA58waq4gkJfF1IHmY2h+mMEylNEPbvlA
            qq93Kbm9QfATyBcHEk1vW4kWq+bls01nZjSlk2h1toSo24WcNNvYn5zgiIVaz9ji
            n6+7Hba7e/WyaQ6CHOecsJddFcxzb1HsITP03iwTrVY94D+TLgRHhL0V8/d+DrrU
            WwEJAhBYxYx2O395xu/yXwE+bNre6yP8tkoyy4NQ9uvwZ2atyEsKHPXGL1Wu8KNn
            AwNOGQO6L9E14DpkJmc0ucCVhFQGeCrvZRoCX4kaqhx/xL4xs+Xb816+l9I=
            =Hqtb
            -----END PGP MESSAGE-----
          fp: 3C44B0A2CFBF076FB983433CC1ACC70DA174087E
    unencrypted_suffix: _unencrypted
    version: 3.9.2

Наша переменная create_key_unencrypted: false осталась незашифрованной. Эта функция специально добавлена в sops, чтобы вы могли хранить как зашифрованные, так и открытые данные в одном и том же файле.

Также можно и наоборот.

Создание файла с суффиксом private_vars для зашифрованных данных

sops --encrypted-suffix private_vars --pgp 3C44B0A2CFBF076FB983433CC1ACC70DA174087E data.sec.yaml 

Добавим в конец файла переменную с именем

private_vars:
    test_private_var: secret

Просмотрим файл

#cat data.sec.yaml
hello: Welcome to SOPS! Edit this file as you please!
example_key: example_value
# Example comment
example_array:
    - example_value1
    - example_value2
example_number: 1234.56789
example_booleans:
    - true
    - false
private_vars:
    test_private_var: ENC[AES256_GCM,data:MknyJF6Q,iv:CawrxZWaH1qNtGmxiBZ1tq4D+Pcd0NFPZTEP7bfq9Uo=,tag:gerC31b+uh9x3qb190QhNw==,type:str]
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    hc_vault: []
    age: []
    lastmodified: "2025-02-27T11:37:18Z"
    mac: ENC[AES256_GCM,data:up2FD0y4yhy2ToV7xArMLnl0ESpX4vmbUQua29PY9RKpOmiYojcm9XFxvxY94DhrSV8KuI2RxSkrC8iZ8Ftdd+c9IHHyBJqX5uB+DcEkqdVmVKSLhYxlHiceWYNE4fR3sJe/NPowluaZUfaVJ75hCLNzF6AL5XX3hr3Z1ia6nzg=,iv:3PE5p1YedbXm0Dd9gvO7qJyXcfKmTNEpNvSQXezu04U=,tag:shDJztAbbicWywefgkH1Ow==,type:str]
    pgp:
        - created_at: "2025-02-27T11:36:07Z"
          enc: |-
            -----BEGIN PGP MESSAGE-----

            hQIMA11BVpmljdThARAAiakkr1kfPrEWaNx734uw3PQFeKSGbxcTiSTOURFeL4li
            90ZKqla/5pyTVZSta3Lhb6noAhLJ/Ri96AdTANHpe1FZOs0SM4bBU0WMLPkpFEeG
            LwXVjs8Znr2+Cz7xG5PW5980OXZluApKJRxso7MVDzk5vySzIXHceWCOjUwcztgf
            YCKURJX/aSiiHayysuZP1AlOZdq2gaJdpZfbVRrMUk3uK0dHz9OYC4fTmkqbFEV3
            h7PWTvv6OJ0iHpGByWXn/8fr+Hnc86WMwmuvXKLSMVI24Sca3y96Mi/D4ZIisVM7
            ITVJ0HULRiU5GjAMqdtjCAZkGyxge2/7iHEvKoZ/8jIkErwyamqJg7voxfSyJfAM
            V2ipD6yXVkEEwk/zmpttAXYHpBw6aonCVT7WPSPn2RAY+GKsrr7kEb2ayRuTMdHa
            hjumEt1eGn6SAXsHZYPdpjaBlJwAOxdhq06w8b3KrdoUOrg9W2nP6N2ChTFqcoua
            lYOcCjiIwA7iGmF9eyeeh29SZve8sd2KviU3upMdHCbCWpLiwR0nf47x0mE1+efK
            VJYBhBcdKKAIEXx0lIloT0zxCLBG1sKERz84qbEmA2SreUqnLrIiPsuFkS1EPfPv
            lXZtan+Wdutp6+Ik6bvmN2XTOfRp8Nqu3iTfrr6WnDpUTKrbZcmSCLz59EtrQtDU
            ZgEJAhBSdIQX0ITpKf6WB2C3p11Sfik+jD6VnaHMEdswTUVbH0Fy+PxjAjLvAE2P
            JAdxksujWohlmlUkK62GdLVbo3DDvxbaxQY+TsqqygmsGgM+KE6nR44kPOS2ow3t
            G2d2Fwhi8w==
            =qiws
            -----END PGP MESSAGE-----
          fp: 3C44B0A2CFBF076FB983433CC1ACC70DA174087E
    encrypted_suffix: private_vars
    version: 3.9.2

Как видно зашифрованы только данные с префиксом private_vars

Совместная работа с секретами

Для передачи ключа необходимо использовать экспорт gpg

gpg -o private.asc --armor --export-secret-key 3C44B0A2CFBF076FB983433CC1ACC70DA174087E

Полученный файл можно передать коллеги и он сможет импортировать его с помощью:

gpg --import private.asc

Helm plugins

Для работы с секретами необходимо в helm есть специмальный плагин helm-secret

helm plugin install https://github.com/jkroepke/helm-secrets

Если машина с helm без pgp ключа, то его необходимо установить

gpg --allow-secret-key-import --import helm_file

Для работы с секретами через helm нужно использовать специальную новую команду secrets в helm. При запуске в этом режиме, secrets плагин запустит sops и расшифрует values файл, а после этого вызовет helm, который будет использовать уже расшифрованную версию values.yaml. Выглядеть это может примерно так (на примере нашего data.yaml):

# helm secrets upgrade --install data -f data.yaml ./data
[helm-secrets] Decrypt: data.yaml
... skipped ...