簡介

在 IaC (Infrastructure as Code) 盛行的時代,任何基礎設施都可以寫成檔案,方便上版控管理每一次更動。檔案中不免會有機敏資訊,此時可以將資訊抽出寫到 .env,再將其丟入 .gitignore 排除。

AGE

AGE 是一個簡單的加密工具,不需要任何設定直接產生一組加解密金鑰,並且可以將金鑰分享給其他人。AGE 也可以將加密過的檔案傳送給其他人,只要對方有金鑰就可以解密。

age is a simple, modern and secure file encryption tool, format, and Go library. It features small explicit keys, no config options, and UNIX-style composability.

SOPS

SOPS 全名為 Secrets OPerationS,他提供了另一個方式讓我們儲存基礎設施設定檔。根據官方敘述:

SOPS is an editor of encrypted files that supports YAML, JSON, ENV, INI and BINARY formats and encrypts with AWS KMS, GCP KMS, Azure Key Vault, age, and PGP.

簡單來說,SOPS 可以幫助我們加密 YAMLJSON 等等常見的資料格式,也可以加密 AWS、GCP 之類的雲端服務設定。不過有趣的是 SOPS 加密不是對整個檔案,key-value 中的 key 會保留,value 才會被處理。

輕鬆上手

macOS 可以使用 homebrew 安裝兩者套件

$ brew install sops age

AGE

產生公私鑰

$ age-keygen -o age.key
# Public key: age1d3k30aqxamz66323d464es42caw5jf32mnew5pdktnv4rxv6npws3sxfc8

我們可以查看 age 產生的金鑰內容

$ cat age.key
# # created: 2024-05-21T14:34:59+08:00
# # public key: age1d3k30aqxamz66323d464es42caw5jf32mnew5pdktnv4rxv6npws3sxfc8
# AGE-SECRET-KEY-1PM05035R5PKU7YXVYMCPXX9D3CASVM5AG3Z0PHVRY8WZYQNG0GSQ36QHQ5

這樣我們就可以使用這把金鑰,搭配 SOPS 加密檔案了

SOPS

先設置環境變數

$ export SOPS_AGE_KEY_FILE="${PWD}/age.key"

假設有一個檔案叫做 secrets.yaml

$ cat secrets.yaml
# cluster:
#     id: buUIh....
#     secret: khlN....
# secrets:
#     bootstraptoken: qwt....
#     secretboxencryptionsecret: 3kGCa....
# trustdinfo:
#     token: 5kyafg.ce2cod17...
# certs:
# ...

加密檔案中每一個值,並覆蓋原始內容

$ sops --encrypt -i --age $(cat age.key | sed -n 's/^# public key: \(.*\)/\1/p') secrets.yaml

此時檔案會變成這樣

secrets.yaml
cluster:
    id: ENC[AES256_GCM,data:9b2...=,tag:L...==,type:str]
    secret: ENC[AES256_GCM,data:KoA...4=,tag:S4D...==,type:str]
secrets:
    bootstraptoken: ENC[AES256_GCM,data:EKm...=,tag:gh...==,type:str]
    secretboxencryptionsecret: ENC[AES256_GCM,data:zbrq...=,tag:iOb...==,type:str]
trustdinfo:
    token: ENC[AES256_GCM,data:x2b...=,tag:adV...==,type:str]
certs:
...
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    hc_vault: []
    age:
        - recipient: age12c...
          enc: |
            -----BEGIN AGE ENCRYPTED FILE-----
            YWdlLW...==
            -----END AGE ENCRYPTED FILE-----
    lastmodified: "2024-05-21T06:52:59Z"
    mac: ENC[AES256_GCM,data:x5Xts6...=,tag:7wt...==,type:str]
    pgp: []
    unencrypted_suffix: _unencrypted
    version: 3.8.1

在加密的狀態下查看檔案

$ sops talsecret.sops.yaml

解密檔案,並覆蓋原始內容

$ sops --decrypt -i talsecret.sops.yaml

其他參考資料