🔥

Sopsを触ってみた

2024/04/12に公開

Sops

今年から社内でInfra勉強会が始まりました。その中でSopsという技術について学んだのでアウトプットを兼ねて紹介します👏

紹介すること/紹介しないこと

  • 紹介すること
    • Sopsの概要
    • 基本的な使い方
  • 紹介しないこと
    • 実際の運用やベストプラクティス
    • 関連サービス(GCP KMSなど)

対象プロダクトの紹介

Sopsとは?

暗号化ファイルのエディターです。
YAML、JSON、ENV、INI、BINARY 形式をサポートしており、
AWS KMS、GCP KMS、Azure Key Vaultなど、複数のクラウドサービスに対応しています。

リポジトリはこちら→https://github.com/getsops/sops
(各サービスに対する使い方が割と丁寧に書いてあります🙏)

Sopsを使うメリット

メリットとしては、以下です。

  • jsonやyamlの形式を維持したまま暗号化できる
  • 機密情報を暗号化したファイルで取り扱うことができるので、他のアプリケーションのソースコードと同じようにGitによるバージョン管理ができる

Sopsを使ってみる

1.事前準備

今回は、画像のように事前にGCP KMS上に事前に秘密鍵を用意してある状態とします。
(※GCP KMSのようなキーマネジメントシステムは必須ではありませんが、今回はGCP KMSを利用します)

GCP KMS

まずは、サンプルのSecretファイルを作成します。

sops/sample01.json
{
  "id": "sample_id",
  "password": "sample_password"
}

2.暗号化する

GCP KMSの秘密鍵を使用して、対象ファイルを暗号化します。

$ sops -e --gcp-kms [リソースID(rojects/プロジェクト名/locations/ロケーション名/keyRings/キーリング名/cryptoKeys/鍵名)] sample.json > sample.enc.json
$ sops -e --gcp-kms projects/sample-project/locations/asia-northeast1/keyRings/sops/cryptoKeys/main sample.json > sample.enc.json

暗号化によって以下のような形式のファイルが作成されます。
id、passwordに加え、sopsというkeyが追加されています。

sample.enc.json
{
	"id": "ENC[AES256_GCM,data:<暗号部分>,type:str]",
	"password": "ENC[AES256_GCM,data:<暗号部分>,type:str]",
	"sops": {
		"kms": null,
		"gcp_kms": [
			{
				"resource_id": "projects/sample-project/locations/asia-northeast1/keyRings/sops/cryptoKeys/main",
				"created_at": "2024-03-07T09:23:48Z",
				"enc": "<暗号部分>"
			}
		],
		"azure_kv": null,
		"hc_vault": null,
		"age": null,
		"lastmodified": "2024-03-07T09:46:37Z",
		"mac": "ENC[AES256_GCM,data:<暗号部分>,type:str]",
		"pgp": null,
		"unencrypted_suffix": "_unencrypted",
		"version": "3.8.1"
	}
}

3.編集する

編集する際は、以下のコマンドで編集モードになり、vimと同様の操作で編集できます。

$ sops sample.enc.json

今回は、sample_passwordをsample1_passwordに変更してみます。

sops/sample01.json
{
  "id": "sample_id",
  "password": "sample1_password"
}

また、編集前と編集後をgit diffで差分を確認すると、暗号化されたパスワードのvalueの部分が変わっていることが確認できます。

(編集前のsample.enc.jsonをver1.json、編集後のsample.enc.jsonをver2.jsonとして比較)

4.復号化する

複合化する際は、こちらのコマンドを打つだけです。

$ sops -d sample.enc.json > decrypt_copy.json

sample.enc.jsonを複合化したdecrypt_copy.jsonが作成されます。

decrypt_copy.json
{
  "id": "sample_id",
  "password": "sample_password"
}

まとめ

今回は、Sopsについて紹介させていただきました。

暗号化ファイルのエディターと聞くと難しそうというイメージを持っていましたが、触ってみると簡単に暗号化できて便利だな、と感じました👏

今回は、基本的な内容のみ紹介しましたが、業務でもっと使って使いこなしていきたいです。

参考

https://lab.mo-t.com/blog/secrets-sops

https://blog.g-gen.co.jp/entry/cloud-kms-explained

https://cloud.google.com/security/products/security-key-management?hl=ja

クロスビットテックブログ

Discussion