はじめに
gitやgithubにて秘匿情報を含むファイルを安全にcommitするメモです。
具体的にはgit-secret
というものを使います。
簡単にいうと、秘匿情報を含むファイルをgpgで暗号化してからcommitすることで安全にリポジトリ管理化に置くというものです。
イメージでいうとこんな感じ。
アジェンダ
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点をインストールしてから使う必要があります
3. Gnupgのインストールと鍵の生成
Gnupgインストール
Macであればbrewでイケます。
手元のMacでは10分ほどかかったのでわりと長めです。
$ brew install gnupg
$ brew list | grep gnupg
gnupg
$ 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
が作成されます。
$ 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 add basic.yaml
$ git secret list
basic.yaml
$ git secret hide -d
git-secret: done. 1 of 1 files are hidden.
$ 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.
$ 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
安全な開発で安心しましょう!