sopsの使い方
Kazuki Moriyama (森山 和樹)
sopsとは
- .envなどのクレデンシャルを含むファイルを安全な方法でエンコードしたりデコードする一連のワークフローを提供するコマンドラインツール
- 暗号化のための鍵との接続方式としてAWS KMS、GCP KMSなど複数用意している
- この記事ではAWS KMSに絞って解説する
sopsが解決する課題
- 管理が煩雑な.envなどのクレデンシャルファイルを暗号化した状態でgitに乗せることができるようになる
- クレデンシャルの復号化はkmsへのアクセス権限を持つエンティティに限られる
- terraform apply時のクレデンシャル注入
- sopsとterraformは連携が容易なのでapply時にsopsで暗号化されたファイルからクレデンシャルを読み込むことができる
- .envなどをgitから外した状態で各々管理して参照させる必要がない
sopsのワークフローの全体
sequenceDiagram
actor user
participant sops
participant file as クレデンシャルファイル(暗号化)
participant kms as AWS KMS
Note over user, kms: クレデンシャル初期化
user ->> sops: KMSのARNを指定してクレデンシャルを初期化
sops ->> file: 初期化
sops ->> user: 指定されたエディタでクレデンシャルの中身を表示
user ->> sops: ファイルを編集して保存
sops ->> kms: kmsでファイルの中身を暗号化
sops ->> file: 暗号化された内容を保存
Note over user, kms: クレデンシャル編集
user ->> sops: `sops <クレデンシャルファイル名>`
sops ->> kms: 暗号化されたファイルを復号化
sops ->> user: 復号化された内容をエディタで表示
user ->> sops: 編集して保存
sops ->> kms: kmsでファイルの中身を暗号化
sops ->> file: 暗号化された内容を保存
インストール
- リリースページからインストールする
クレデンシャルファイルの初期化
- ファイル名とkms arnを指定してクレデンシャルファイルを初期化する
sops --kms <kms keyのarn> <file-name(e.g. .env.enc.yaml)>
- 当然だがこのkms keyにアクセスするためのプロファイルが有効化されている必要がある
export AWS_PROFILE=<該当のkms keyにアクセスする権限のあるprofile名>
-
ファイルの形式はYAML、JSON、ENV、INI、BINARY
-
初期化すると
$EDITOR
で指定されたエディタ、もしくはデフォルトでvimで復号化された初期ファイル内容が表示される -
ファイルの編集や保存などはvimなどでの通常の操作と同じように行えば良い
-
生成されたファイルは暗号化された中身と、暗号化関係のメタ情報が載ったファイルになっている
- 例
myapp1: ENC[AES256_GCM,data:Tr7o=,iv:1=,aad:No=,tag:k=] app2: db: user: ENC[AES256_GCM,data:CwE4O1s=,iv:2k=,aad:o=,tag:w==] password: ENC[AES256_GCM,data:p673w==,iv:YY=,aad:UQ=,tag:A=] key: |- ENC[AES256_GCM,data:Ea3kL5O5U8=,iv:DM=,aad:FKA=,tag:EA==] sops: kms: - created_at: 1441570389.775376 enc: CiC....Pm1Hm arn: arn:aws:kms:us-east-1:656532927350:key/920aff2e-c5f1-4040-943a-047fa387b27e
Asume Roleを使用した初期化
- kms keyにアクセスするためのroleを指定して、任意のエンティティからassume roleしてsops操作を行うこともできる
- kms keyのarnだけを使用するとそのkeyに直接アクセス権限のあるprofileでしか操作ができない
- assume role式にすれば任意のaws accountで該当のアクセスroleをassumeできるエンティティならばどれでもsops操作を行えるようになる
- コマンドラインでは+でkms key arnとrole arnを繋げば良い
sops --kms <kms keyのarn>+<role arn> <file-name(e.g. .env.enc.yaml)>
-
roleはkmsを使用するポリシーを持っている必要がある
- 例
{ "Sid": "Allow use of the key", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Principal": { "AWS": [ "arn:aws:iam::927034868273:role/sops-dev-xyz" ] } }
暗号化されたファイルの編集
- コマンドを打てば通常通りvimなどで中身が表示されて編集できる
sops <file-name(e.g. .env.enc.yaml)>
-
表示内容の例
myapp1: app-name app2: db: user: admin password: admin-pass key: |- hogehoge-key
terraformと連携した使用
- sops providerを使用する
- これを使用すればsopsで暗号化されたファイルから直にクレデンシャルを抜き出してterraform内で使用することができる
provider "sops" {}
data "sops_file" "demo-secret" {
source_file = ".env.enc.yaml"
}
output "db-password" {
value = data.sops_file.demo-secret.data["ap2.db.password"]
}