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

# sopsってなに?

[sops](https://github.com/mozilla/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が自動的に結果を再度暗号化してファイルに書き出してくれる。