AWS
kubernetes
kms
sops

ファイルをAWS KMSで暗号化して安全にgit commitできるようにするmozilla/sopsの使い方

sopsってなに?

sopsはMozillaが作っているファイル暗号化用のコマンドラインツール。Gitコミットするファイルの暗号化などに使える。

使い方

インストール

brew install sops

利用したいAWS KMS Key ARNを指定

環境変数で指定する。

export SOPS_KMS_ARN="arn:aws:kms:ap-northeast-1:<myawsaccountid>:key/<mykeyid>"

エディタで新規暗号化ファイルを作成する

sops newfile.secret.yaml

$EDITORが開いて、それを保存すると暗号化済みファイルが作成される。KMS KeyのARNがYAMLに含まれているので、復号時にはKey ARNを指定する必要はない。

標準入力の内容から新規暗号化ファイルを作成する

できない。

特定の内容の暗号化ファイルを作成する

一時ファイルを経由する必要がある。

以下のようなYAMLをAWS KMSで暗号化したい場合、

$ k create secret generic testsecret --from-literal=foo=bar --dry-run -o yaml
apiVersion: v1
data:
  foo: YmFy
kind: Secret
metadata:
  creationTimestamp: null
  name: testsecret
k create secret generic testsecret --from-literal=foo=bar --dry-run -o yaml > testsecret.secret.yaml

sops -e <平文ファイル>を実行すると、平文ファイルを暗号化したものが標準出力に出力される。

$ sops -e testsecret.secret.yaml
[AWSKMS]     INFO[0000] Encryption succeeded                          arn="arn:aws:kms:ap-northeast-1:<myawsaccountid>:key/<mykeyid>"
apiVersion: ENC[AES256_GCM,data:mIc=,iv:O9cnTy4nWRY5CY3BbXLGICt1e0KyC1HDfYMXxM0wRXw=,tag:UQQ2GeaqYD7J4WLyCvl4lw==,type:str]
data:
    foo: ENC[AES256_GCM,data:v4P4yw==,iv:T89jBOzcxRE5Y8GVpibyrw5IVzlpJBMrbRQtpWtXSz8=,tag:cNJyGYbLPZXTkbMGcOK7yg==,type:str]
kind: ENC[AES256_GCM,data:XwSilhoU,iv:UYDguHZBotJvQ6iyzcUXDrdkjoaKMY097VACkLzZzL4=,tag:e9szbYBA2OvhFA3aZCFxfQ==,type:str]
metadata:
    creationTimestamp: null
    name: ENC[AES256_GCM,data:siTU+Lq+zXM6wg==,iv:q0cwXRIJNoam7zAhHAokYFV0rwRZekroUnAgUogsmH8=,tag:nqeeOK9t9vlLa7vaZ1Q3LQ==,type:str]
sops:
    kms:
    -   arn: arn:aws:kms:ap-northeast-1:<myawsaccountid>:key/<mykeyid>
        created_at: '2017-12-19T11:02:39Z'
        enc: AQICAHj5+CYmKSHMJNh0QQMHsFDjETdV8lkcmL0GEwcYR6rhEQGtPaoRRqxxFtQo1a0hCqItAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMCpsQSf6z3KIrcGyAAgEQgDtNcOq8NJjwdxsHcp0ePon0extUfc3NrOkx5RyUUbB3KyUzi0WpyQy29XGUovRbG58Sisszr53KzJE5hg==
    gcp_kms: []
    lastmodified: '2017-12-19T11:02:39Z'
    mac: ENC[AES256_GCM,data:gyUosrc+BwtiqHKOe9FBNi/3XnHQqDNDazmsDQCjNsRn8efAXNK/0VqI7EOrgy7rGycbB7ZQ0ZZO7AG3m/kpDzlHBMSEDMkB7AyJBXeaqTMXiNfRRrI4Qn6i7FdPBeFOs5w+q6RxDevmiorYFdKpdTQQIFNQW4EPX4WtC4bGkk4=,iv:AZNw88CPip+DkBbPcH6BoG2YYfivoFPNKPyGdsl++cw=,tag:42vXym8ALKDbYy2vyKgfMA==,type:str]
    pgp: []
    unencrypted_suffix: _unencrypted
    version: 3.0.0

ファイルにリダイレクトする。

$ sops -e testsecret.secret.yaml  > testsecret.secret.sops.yaml
[AWSKMS]     INFO[0000] Encryption succeeded                          arn="arn:aws:kms:ap-northeast-1:<myawsaccountid>:key/<mykeyid>

ファイルを復号してパイプする

sops -d <暗号化済みファイル>を実行すると、復号されたものが標準出力に出力される。

$ sops -d testsecret.secret.sops.yaml | k create -f -
[AWSKMS]     INFO[0000] Decryption succeeded                          arn="arn:aws:kms:ap-northeast-1:<myawsaccountid>:key/<mykeyid>"
[SOPS]   INFO[0000] Data key recovered successfully
secret "testsecret" created

暗号化済みファイルを編集する

sopsコマンドをエディタのように使う。具体的には、sops <暗号化済みファイル>を実行すると、そのファイルを復号してから、環境変数EDITORで指定されたエディタ(たいていデフォルトはviになってると思う)で開いてくれる。

sops testsecret.secret.sops.yaml

エディタで内容を編集して、保存、その後にエディタ終了すると、sopsが自動的に結果を再度暗号化してファイルに書き出してくれる。