はじめに
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を使用して信頼できるすべてのユーザーの公開鍵でファイルを暗号化します。
というわけで、以下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
安全な開発で安心しましょう!