sopsの使い方

 
0
このエントリーをはてなブックマークに追加
Kazuki Moriyama
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: 暗号化された内容を保存

インストール

  • リリースページからインストールする

https://github.com/getsops/sops/releases

クレデンシャルファイルの初期化

  • ファイル名と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を使用する

https://registry.terraform.io/providers/carlpett/sops/latest/docs

  • これを使用すれば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"]
}
info-outline

お知らせ

K.DEVは株式会社KDOTにより運営されています。記事の内容や会社でのITに関わる一般的なご相談に専門の社員がお答えしております。ぜひお気軽にご連絡ください。