tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【git】GnuPG x git-secretでcredentialなどの秘匿情報を含むファイルを暗号化して安全にcommitする - その1

はじめに

gitやgithubにて秘匿情報を含むファイルを安全にcommitするメモです。

具体的にはgit-secretというものを使います。
簡単にいうと、秘匿情報を含むファイルをgpgで暗号化してからcommitすることで安全にリポジトリ管理化に置くというものです。

イメージでいうとこんな感じ。

f:id:tweeeety:20210508033518p:plain

アジェンダ

1. ユースケース例

gitやgithubでこんなときありますよね。

  • ID/Passwordなどの秘匿情報をリポジトに置きたい
  • そのままcommitはしたくない

そんなときは

  • ファイルはおくが.gitignoreしてcommitしない
  • commit hookなどにgit-secretsを仕掛けて気付けるようにする

なんかが浮かびます。

しかし、「ファイルをcommitしない」ということは同時に「そこにファイルを置くよ」という事を気づけなくしてしまいます。
そこで秘匿情報を暗号化したものをcommitし、使う時は限られた人だけが復号化して使えるという状態にする事でファイルを置くことができます。

2. git-secretとは

公式からの引用です。

git-secretは、Privateなデータをgitリポジトリ内に保存するためのbashツールです。 基本的には、gpgを使用して信頼できるすべてのユーザーの公開鍵でファイルを暗号化します。

公式: https://git-secret.io/

というわけで、以下2点をインストールしてから使う必要があります

  • GnuPG
  • git-secret

3. Gnupgのインストールと鍵の生成

Gnupgインストール

Macであればbrewでイケます。
手元のMacでは10分ほどかかったのでわりと長めです。

# インストール
$ brew install gnupg

# brewにインストールされた確認
$ brew list | grep gnupg
gnupg

# gpgの確認
$ gpg --version
gpg (GnuPG) 2.3.1
libgcrypt 1.9.3
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/tweeeety/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
      TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
AEAD: EAX, OCB
ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2

Gnupgで鍵の生成

Gnupgで公開鍵と秘密鍵を生成します。
といってもgpg --gen-keyをするだけです。

途中、名前とアドレスを聞かれます。
のちにgit-secretが、git configのアドレスを使うため、githubで利用しているアドレスにしてください。

また、最後に暗号化/復号化で使うパスフレーズを聞かれるので入力して進めてください。

$ gpg --gen-key
gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: ディレクトリ'/Users/tweeeety/.gnupg'が作成されました
gpg: keybox'/Users/tweeeety/.gnupg/pubring.kbx'が作成されました
注意: 全機能の鍵生成には "gpg --full-generate-key" を使います。

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: tweeeety
電子メール・アドレス: hoge@hoge.com
次のユーザIDを選択しました:
    "tweeeety <hoge@hoge.com>"

名前(N)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。

gpg: 鍵709BC3DB8393B213を究極的に信用するよう記録しました
gpg: 失効証明書を '/Users/tweeeety/.gnupg/openpgp-revocs.d/183C43AD2C2900AD43FE64A2709BC3DB8393XXXX.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   ed25519 2021-05-07 [SC] [有効期限: 2023-05-07]
      183C43AD2C2900AD43FE64A2709BC3DB8393B213
uid                      tweeeety <hoge@hoge.com>
sub   cv25519 2021-05-07 [E] [有効期限: 2023-05-07]

鍵を確認

# 公開鍵の確認
$ gpg --list-keys
gpg: 信用データベースの検査
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 次回の信用データベース検査は、2023-05-07です
/Users/tweeeety/.gnupg/pubring.kbx
----------------------------------
pub   ed25519 2021-05-07 [SC] [有効期限: 2023-05-07]
      183C43AD2C2900AD43FE64A2709BC3DB8393XXXX
uid           [  究極  ] tweeeety <hoge@hoge.com>
sub   cv25519 2021-05-07 [E] [有効期限: 2023-05-07]


# 秘密鍵の確認
$ gpg --list-secret-keys
/Users/tweeeety/.gnupg/pubring.kbx
----------------------------------
sec   ed25519 2021-05-07 [SC] [有効期限: 2023-05-07]
      183C43AD2C2900AD43FE64A2709BC3DB8393XXXX
uid           [  究極  ] tweeeety <hoge@hoge.com>
ssb   cv25519 2021-05-07 [E] [有効期限: 2023-05-07]

4. git-secretのインストール

こちらもbrewでいけるのでお手軽です。

$ brew install git-secret

5. git-secret管理化にする

git-secret管理化にする

git-secret管理化にするには、リポジトリへ移動してgit secret initをします。
すると.gitsecret.gitignoreが作成されます。

# リポジトリへ移動してgit secret init
$ cd [path to your repository]
$ git secret init

# ファイルを確認
$ ll
total 8
drwxr-xr-x   5 tweeeety  tweeeety   160  5  7 21:47 .
drwxr-xr-x  37 tweeeety  tweeeety  1184  5  7 21:46 ..
drwxr-xr-x   9 tweeeety  tweeeety   288  5  7 21:46 .git
-rw-------   1 tweeeety  tweeeety    38  5  7 21:47 .gitignore
drwxr-xr-x   4 tweeeety  tweeeety   128  5  7 21:47 .gitsecret
-rw-r--r--   1 tweeeety  tweeeety    20  5  7 21:40 README.md

アクセス権を与える

特定の人のみが復号化できるようにするためアクセス権を与えます。

$ git secret tell -m
gpg: keybox'[path to your repository]/.gitsecret/keys/pubring.kbx'が作成されました
gpg: [path to your repository]/.gitsecret/keys/trustdb.gpg: 信用データベースができました
git-secret: done. hoge@hoge.com added as user(s) who know the secret.

アクセス許可されてる人を確認

$ git secret whoknows
hoge@hoge.com

6. git-secretによるファイルの暗号化

今回はリポジトリに以下のようなyamlファイルを置く想定で進めます。
basic.yamlはcommitしたくないため、.gitignoreに追加もしておきます。

$ cat basic.yaml
BASIC_AUTH_ID: "hogehoge"
BASIC_AUTH_PW: "fugafuga"

$ echo "basic.yaml" > .gitignore

git secret addでgit-secretへ設定し、git secret hideで暗号化します。

ポイントは以下3点。

  • git secret addするファイルは.gitignoreに登録されていないとエラーになる
  • git secret hideでbasic.yaml.secretというファイルが生成される
  • git secret hide-dオプションで元ファイルを削除する
# git-secretへ設定
$ git secret add basic.yaml

# 設定されたファイルの確認
$ git secret list
basic.yaml

# 暗号化 + ファイルを削除
$ git secret hide -d
git-secret: done. 1 of 1 files are hidden.

# basic.yaml.secretが作成されている
# basic.yamlは削除されている
$ ll
total 24
drwxr-xr-x   7 tweeeety  tweeeety   224  5  8 03:21 .
drwxr-xr-x  37 tweeeety  tweeeety  1184  5  7 21:46 ..
drwxr-xr-x  12 tweeeety  tweeeety   384  5  8 01:07 .git
-rw-------   1 tweeeety  tweeeety    11  5  7 21:52 .gitignore
drwxr-xr-x   4 tweeeety  tweeeety   128  5  7 21:47 .gitsecret
-rw-r--r--   1 tweeeety  tweeeety    20  5  7 21:48 README.md
-rw-r--r--   1 tweeeety  tweeeety   214  5  8 03:21 basic.yaml.secret

7. git-secretによる暗号化ファイルの確認と復号化

暗号化されたファイルの確認

暗号化されたファイルの確認にはgit secret cat [ファイル名]コマンドで確認します。
パスフレーズを聞かれるのでgpg --gen-keyしたときのパスフレーズを入力します。

$ git secret cat basic.yaml.secret
BASIC_AUTH_ID: "hogehoge"
BASIC_AUTH_PW: "fugafuga"

暗号化されたファイルの復号化

次に、暗号化されたファイルを復号化します。
復号化にはgit secret revealコマンドを実行します。
ファイル名の指定は不要です。

$ git secret reveal
git-secret: done. 1 of 1 files are revealed.

# 消えたbasic.yamlが復活
$ ll
total 32
drwxr-xr-x   8 tweeeety  tweeeety   256  5  8 03:25 .
drwxr-xr-x  37 tweeeety  tweeeety  1184  5  7 21:46 ..
drwxr-xr-x  12 tweeeety  tweeeety   384  5  8 01:07 .git
-rw-------   1 tweeeety  tweeeety    11  5  7 21:52 .gitignore
drwxr-xr-x   4 tweeeety  tweeeety   128  5  7 21:47 .gitsecret
-rw-r--r--   1 tweeeety  tweeeety    20  5  7 21:48 README.md
-rw-r--r--   1 tweeeety  tweeeety    52  5  8 03:25 basic.yaml
-rw-r--r--   1 tweeeety  tweeeety   214  5  8 03:21 basic.yaml.secret

8. おまけ: 秘密鍵/公開鍵の削除

GnuPGの秘密鍵、公開鍵は以下のように削除します。
作り直したいときなどは削除してから作り直しましょう。

# 秘密鍵の削除
$ gpg --delete-secret-keys tweeeety
gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


sec  ed25519/30107DCB9CC7XXXX 2021-05-07 tweeeety <hoge@hoge.com>

この鍵を鍵リングから削除しますか? (y/N) y
これは秘密鍵です! 本当に削除しますか? (y/N) y

# 公開鍵の削除
$ gpg --delete-keys tweeeety
gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  ed25519/30107DCB9CC7XXXX 2021-05-07 tweeeety <hoge@hoge.com>

この鍵を鍵リングから削除しますか? (y/N) y

補足: git-secrets(sがついてる)について

ちなみに、なにがしかの秘匿情報を含むファイルを誤ってcommitしてしまわないように、commit時に検出するソリューションとしてgit-secrets(sがついてる)というものもあります。

参考

おわりに

一応、中身はなにもないですがサンプルーコード。
https://github.com/tweeeety/go-gcs_csv-to-bigquery-sample

安全な開発で安心しましょう!