tweeeetyのぶろぐ的めも

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

ここはウォーターフォール市、アジャイル町 ストーリーで学ぶアジャイルな組織のつくり方 - 書評メモ

はじめに

自分用の書評メモです。

アジェンダ

どんな本か

ひとことでいうと
「チームにゼロからアジャイルを浸透させていくストーリー本」
です。

何が書かれているか

3行でまとめると以下のことが書かれています

  1. どのようにチーム改善をはじめるか
  2. どんな要素をチーム改善に取り入れるか
  3. チーム変革のステップにおける課題やポイント

大事だと思ったこと

第1章、第2章

多様で複雑な社会において、勝てるチームは「早く失敗し学びに変えられる」アジャイルが適しているというのは納得感がありました。

また、以下の言葉が印象に残りました。

  • チームとしてセイチョウし、顧客価値を最大にしていくために、たゆまぬカイゼンをしていくことが大事
  • 重要なのは、アジャイルをする(Do Agile)ではなく、アジャイルになる(Be Agile)こと
  • 問題は、個人ではなくチームで受け止める
  • チームで受け止めるためには、チームで状況を把握し、策をもって退治していく必要がある

第3章

この章は「抵抗」という章代になっています。

チームに新しいことを導入するとき、何かを変えたいとき、たいてい「抵抗勢力」が発生します。
これにどう向き合うかが書かれていて参考になりました。

特に、以下の点が印象に残りました。

  • Backlog導入にて、心を鬼にして、些細なことでもなんでもBacklogに登録してもらうようにメンバーを仕向ける
  • ふりかえりにて、言語化と視覚化によって、各自が感じた変化をチームの共通認識に消化させることができる
  • ふりかえりにて、メンバーが見ている意識や景色が立体的に合わさり、「自分ごと」として変化を楽しめるようになる。それが組織カルチャーになる
  • 「やってみる」は、とにかく小さく少なく短くすることが大事なポイント
  • 「計画」ではなく「実験」を行う

また、ふりかえりからのカイゼンアクションを決めるループが参考になりました。

f:id:tweeeety:20210909043141p:plain

第5章

「問題 vs. わたしたちの構図で考えよう」はよくある話しですが、「その構図のつくり方」という文脈が参考になりました。

  • 問題は誰もが見えるように見える化する
  • 緊急や重要な情報はそれを示す表示にする
  • 図でわかりやすくする(問題の関係性があればまとめる)

第8章

工程のカイゼンにかかれていて、ECRSの考えが参考になりました。

f:id:tweeeety:20210910144145j:plain

ECRSとは:
ECRS(イー・シー・アール・エス、またはイクルス)は、(1)Eliminate(排除)、(2)Combine(統合)、(3)Rearrange(順序入れ替え)、(4)Simplify(簡素化)の頭文字です。
その順番に検証していくことで、無駄な業務を減らし、仕事の効率化を図ることができます。
参考: www.otsuka-shokai.co.jp

感想

アジャイルとは無縁なチーム、アジャイルを導入したことがない人には導入本として雰囲気を掴むのに良いと思いました。

最初の最初はやはりある程度知識を得たくなるものです。
「読了して全体像をつかんでから進めたい」みたいな意図があれば、時間もかからず読めるので良いなと思いました。

おわりに

「Be Agile」をさっそく使ってくw

【go】go modでモジュールのバージョンをupdateする

はじめに

タイトルのまんまですが、golangでモジュールをupdateする方法のメモです。

単にgo getすれば良い

go modを使っているとgo.modファイルでmoduleとversionが管理されると思います。
各moduleをupdateしたい場合、go getすることでversionをupdateできます。

試しに"github.com/gin-gonic/gin"が古いのでupdateしたいていでやってみます。

# まずはgo.modを確認
# 1.7系が出てるがv1.6.3と古い
 cat go.mod | grep -2 gin-gonic
    cloud.google.com/go v0.75.0
    cloud.google.com/go/bigquery v1.15.0
    github.com/gin-gonic/gin v1.6.3
    github.com/go-playground/validator/v10 v10.2.0
    github.com/gobwas/glob v0.2.3 // indirect

# go getする
$ go get github.com/gin-gonic/gin
go: github.com/gin-gonic/gin upgrade => v1.7.2
go: downloading github.com/gin-gonic/gin v1.7.2
go: downloading github.com/go-playground/validator/v10 v10.4.1

# 再度確認してみる
# updateされた
$ cat go.mod | grep -2 gin-gonic
    cloud.google.com/go v0.75.0
    cloud.google.com/go/bigquery v1.15.0
    github.com/gin-gonic/gin v1.7.2
    github.com/go-playground/validator/v10 v10.4.1
    github.com/gobwas/glob v0.2.3 // indirect

おわりに

go modですら、久しぶりに触ってないと忘れてしまうものですね!

【git】GnuPG x git-secretでcredentialなどの秘匿情報を含むファイルを暗号化して安全にcommitする - その2: 複数人で扱う場合

はじめに

gitやgithubでcredentialやtokenなどの秘匿情報を含むファイルを暗号化してcommitするメモを書きました。

今回は、それを複数人であつかう場合のメモです。

アジェンダ

1. ながれのイメージ

流れを単純にしたくて図を書いてみました。
説明は図にお任せでご参考あれ。

f:id:tweeeety:20210510020507p:plain

ということで、以降は上記の図のに沿って説明します。

出てくる人はこんな2人のイメージ。

  • Aさん: 既存リポジトリ担当者
  • Bさん: 新規メンバー

また、Aさん、BさんともにMac環境でgpggit-secretはインストール済みの想定です。
インストールに関してはコチラをご参考ください。

2. [Aさん] 秘匿情報をgit secret管理化にする

gpgでkeyの生成

$ 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 --full-generate-key" を使います。

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

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

~ 省略 ~ 

リポジトリを用意する

この記事のサンプル用に、
ユーザAさんとBさん想定のためgit configでnameとemailを登録しておきます。
また、暗号化したい秘匿情報を含むファイルをbasic.yamlとして作ります。お手元の任意のファイルに置き換えて読んでください。

すでに運用されてるリポジトリではここは行わなくても大丈夫です。

# 既存リポジトリをclone
# [sample repo]はリポジトリのurlに置き換えてください。
$ git clone [sample repo]

# gitのnameとemailを設定
$ git config user.name "A-san"
$ git config user.email a-san@example.com

# 暗号化する秘匿情報を含むファイルを作成済みのてい
$ cat basic.yaml
BASIC_AUTH_ID: "hogehoge"
BASIC_AUTH_PW: "fugafuga"

git-secret管理化にする

リポジトリをgit−secret管理化にします。

# git-secret管理化にする
$ git secret init

# まだ誰も登録されてない事を確認
$ git secret whoknows
git-secret: abort: no public keys for users found. run 'git secret tell email@address'.

# git-secretに自身の権限を付与
$ git secret tell -m
gpg: keybox'/Users/tweeeety/github/git-secret-sample-02/.gitsecret/keys/pubring.kbx'が作成されました
gpg: /Users/tweeeety/github/git-secret-sample-02/.gitsecret/keys/trustdb.gpg: 信用データベースができました
git-secret: done. a-san@example.com added as user(s) who know the secret.

# 自分が登録されてることを確認
$ git secret whoknows
a-san@example.com

# 暗号化するファイルの登録
$ git secret add basic.yaml

git push する

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    .gitignore
    .gitsecret/
    basic.yaml.secret

$ git add .
$ git commit -m 'add git-secret sample'
$ git push origin main

3. [Bさん] gpg keyの作成&エクスポート

gpg keyの作成&エクスポート

gpg keyを作成してエクスポートします。
エクスポートした公開会議はAさんにファイル共有などで渡します。

$ 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 --full-generate-key" を使います。

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

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

$ gpg --list-keys
/Users/tweeeety/.gnupg/pubring.kbx
----------------------------------
pub   ed25519 2021-05-09 [SC] [有効期限: 2023-05-09]
      3E34718C10CA6CAC878459D286823EB8769B15F9
uid           [  究極  ] B-san <b-san@example.com>
sub   cv25519 2021-05-09 [E] [有効期限: 2023-05-09]

# エクスポート
$ gpg -o B_san_key.pub --export B-san

エクスポートした鍵(B_san_key.pub)は、ファイル共有やメールなどでAさんに渡します。

この時点で復号化を試してみる

当然できないのですが、できないことを確認してみます。
まず最初に、擬似的に複数人の想定用のサンプルとしてuserとemailも変えていいます。

# リポジトリの取得と設定を行う
$ git clone [sample repo]
$ git config user.name "B-san"
$ git config user.email b-san@example.com

次に git secretで復号化できるかを試します。

# 復号化できない確認
$ git secret cat basic.yaml.secret
gpg: 公開鍵の復号に失敗しました: No secret key
gpg: 復号に失敗しました: No secret key
git-secret: abort: problem decrypting file with gpg: exit code 2: /Users/tweeeety/github/git-secret-sample-02/basic.yaml.secret

# 権限の付与もできない
$ git secret tell b-san@example.com
git-secret: abort: no key found in gpg user keyring for: b-san@example.com

以下のことがわかります。

  • git secret cat: public keysにuserがいないので復号化できない
  • git secret tell: GPGにemailが登録されてないのでアクセス権を与えることはできない

4. [Aさん] GPGとgit-secretにBさん情報を設定

Bさんからエクスポートした鍵を受け取っておきます。

主に以下の3点を行います。

  • GPGにB -san鍵をインポート
  • git-secretにBさん権限の付与
  • git-secretで新たに暗号化

GPGにB -san鍵をインポート

# インポート前に確認
$ gpg --list-keys
/Users/tweeeety/.gnupg/pubring.kbx
----------------------------------
pub   ed25519 2021-05-08 [SC] [有効期限: 2023-05-08]
      6CC788FE396E2487410953356499DF1CBBB499CF
uid           [  究極  ] A-san <a-san@example.com>
sub   cv25519 2021-05-08 [E] [有効期限: 2023-05-08]

# Bさんの鍵をインポート
$ gpg --import B_san_key.pub
gpg: 鍵606D84736C69D687: 公開鍵"B-san (create sample gpg-key) <b-san@example.com>"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1

# インポートされた確認
$ gpg --list-keys
/Users/tweeeety/.gnupg/pubring.kbx
----------------------------------
pub   ed25519 2021-05-08 [SC] [有効期限: 2023-05-08]
      6CC788FE396E2487410953356499DF1CBBB499CF
uid           [  究極  ] A-san <a-san@example.com>
sub   cv25519 2021-05-08 [E] [有効期限: 2023-05-08]

pub   rsa1024 2021-05-08 [SC]
      18ECA6436499ADF3A0598B00606D84736C69D687
uid           [  不明  ] B-san (create sample gpg-key) <b-san@example.com>
sub   rsa1024 2021-05-08 [E]

git-secretにBさん権限の付与

GPGのBさん鍵を追加したら、git-secretでBさんの権限を付与します。

# この時点の登録を確認
$ git secret whoknows
a-san@example.com

# Bさんにアクセス権を与える
$ git secret tell b-san@example.com
git-secret: done. b-san@example.com added as user(s) who know the secret.

# 確認するとBさんが追加されている
$ git secret whoknows
a-san@example.com
b-san@example.com

git-secretで新たに暗号化

リポジトリにはAさん、Bさんの公開鍵で暗号化したファイルをあげる必要があります。
そこで、一度、復号化してから再度暗号化を行います。

# 暗号化されたbasic.yaml.secretしかない
$ ll
total 32
drwxr-xr-x   8 tweeeety  staff   256  5  9 06:40 .
drwxr-xr-x  39 tweeeety  staff  1248  5  8 22:38 ..
drwxr-xr-x  12 tweeeety  staff   384  5  9 03:27 .git
-rw-------   1 tweeeety  staff    11  5  8 22:53 .gitignore
drwxr-xr-x   4 tweeeety  staff   128  5  8 22:49 .gitsecret
-rw-rw-r--   1 tweeeety  staff   684  5  9 05:24 B_san_key.pub
-rw-r--r--   1 tweeeety  staff    23  5  8 22:39 README.md
-rw-r--r--   1 tweeeety  staff   214  5  8 22:55 basic.yaml.secret

# 一度復号化
# basic.yamlができている
$ git secret reveal
git-secret: done. 1 of 1 files are revealed.

# 再度、暗号化することで
# Aさん、Bさんの鍵で暗号化される
$ git secret hide -d
git-secret: done. 1 of 1 files are hidden.

git push

リポジトリに追加します。

$ git commit -a -m 'add B-san to git-secret'
$ git push

4. [Bさん] 暗号化された秘匿情報ファイルを復号化

暗号化された秘匿情報ファイルをgit pullします。

以下のいずれかで復号化できることが確認できます。

  • 確認のみ: git secret cat 暗号化されたファイル
  • 復号化: git secret reveal
# pushされた暗号化ファイルをgit pull
$ git pull

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

# 復号化
$ git secret reveal

サンプル

中身は特にないですがサンプル リポジトリはこちら。

おわりに

git secretを複数人で使う想定でためしたく、
手元のMacの他にLinux/VPSを用意しましたがGPGのversionがあわずに断念…。

使ってないMacBook Proをひっぱりだして試しました。

MacとLinuxで行う場合はGPGのversion合わせるのがわりと時間がかかる、ということがわかってよかった……
のか?w

【GnuPG】linuxにsshして実行したgpg --gen-keyが止まる対応メモ

はじめに

タイトルの通りなのですが、gpgで鍵を生成したくgpg --gen-keyを実行すると止まったようなハングしたような感じになります。

それの対応方法。

もくじ

原因

これは「SSH越しだとキーボードやマウスの入力割り込みを取得でずにエントロピーの収集がなかなかできないことが原因」とのこと。

やりかた

別のターミナル(セッション)でSSHして、ディスクアクセスをすればよいとのこと。

# 別のターミナルで
$ ssh [your host]

# 無駄にディスク書き込み
$ dd if=/dev/urandom of=/tmp/mass bs=1M count=16384

#
# gpg --gen-key が終わったら...
#

# でかいファイルができてしまうので削除
$ rm /tmp/mass

gpg --gen-keyのほう

# 実行

$ gpg --gen-key
gpg (GnuPG) 2.0.14; Copyright (C) 2009 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.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 1024
Requested keysize is 1024 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: B-san
Email address: b-san@example.com
Comment: create sample gpg-key
You selected this USER-ID:
    "B-san (create sample gpg-key) <b-san@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

can't connect to `/home/tweeeety/.gnupg/S.gpg-agent': No such file or directory
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

# 
# ここでかなり時間がかかる
# 別の端末で入ってディスクアクセスしている中
# 


gpg: key 6C69D687 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   1024R/6C69D687 2021-05-08
      Key fingerprint = 18EC A643 6499 ADF3 A059  8B00 606D 8473 6C69 D687
uid                  B-san (create sample gpg-key) <b-san@example.com>
sub   1024R/8F252715 2021-05-08

参考

おわりに

別端末でディスクアクセスさせないと30分くらい待ってた気がする...。

【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

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

【git】git-secrets: 誤ってsecret, credential, ID/Passwordなどの秘匿情報をcommitしてしまうのを防ぐメモ

はじめに

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

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

通常は.gitignoreに指定しておけば良い。
しかし、一時的にファイル名を変えて使いたい時(たとえば一時的にID/Passファイルをコピーして使うなど)に.gitignoreをすり抜けてcommitしてしまうことがあります。

その状態で、もしcommit & pushしてしまうとgithub上にはログとして残ってしまうので面倒...!

そんなことを未然に防止するgit-secretのメモです。

(ちなみにこの記事はMac環境で試しています)

アジェンダ

1. git-secretsとは

git-secretsというものを使います。

公式は以下です。
https://github.com/awslabs/git-secrets

descriptionの通りですが以下が説明です。

git-secretsは、commits, commit messagesをスキャンして、gitリポジトリにシークレットが追加されないようにします。 commits, commit messagesが禁止されている正規表現パターンと一致する場合、コミットは拒否されます。

2. git-secretsのインストール

Mac環境であればbrewでインストールできます。楽ちん。

$ brew install git-secrets

3. git-secrets管理化にする

これも簡単で、対象のリポジトリでgit secrets --installとするだけです。

# 対象のリポジトリでinitかcloneをする
$ git clone / git init 

# 対象のリポジトリをgit secrets管理化にする
$ git secrets --install
✓ Installed commit-msg hook to .git/hooks/commit-msg
✓ Installed pre-commit hook to .git/hooks/pre-commit
✓ Installed prepare-commit-msg hook to .git/hooks/prepare-commit-msg

4. git-secretsにcommitさせたくない文字列を登録する

正規表現の形でマッチさせることができます。
複数登録できるので、マッチさせたい文字列ごとに登録します。

git secrets --add "BASIC_AUTH_ID\:\s*\".+\""

ちなみに、登録した検出パターンの確認は--listオプションで。

$ git secrets --list
secrets.patterns BASIC_AUTH_ID\:\s*".+

5. commit時にgit-secretsによりエラーになる確認

適当なファイルを作ってadd / commitしてみます。
commit時にエラーになることが確認できます。

今回は、BASIC認証のID/Passwordのファイルを置く必要があると想定します。
basic.yamlというファイルを作成し、add / commitします。

# basic.yamlを作成
$ vim basic.yaml
----vim追記----
BASIC_AUTH_ID: "hogehoge"
BASIC_AUTH_PW: "fugafuga"
--------------

# add / commit
$ git add basic.yaml
$ git commit -m 'sample commit'
basic.yaml:1:BASIC_AUTH_ID: "hogehoge"

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive

無事、エラーになることが確認できました。

6. git-secretsに登録した文字列を削除する

公式には削除するオプションはなさげでした。
そのため手動で削除します。

まず、どこに登録されるのか。
それは[your repo]/.git/configに登録されます。

つまり、config内から直接消せばOKです。

# .git/configを確認してみる
$ tail -n 2 .git/config
[secrets]
    patterns = BASIC_AUTH_ID\\:\\s*\".+\"

# vimなりで直接消す
$ vim .git/config

# ↑で消したてい
# 再度確認してみる
git secrets --list

参考

おわりに

team開発で設定する場合はshなんかにしておきたいですね!

【BigQuery】GolangでGCSのCSVデータからBigQueryにデータを取り込むメモ

はじめに

GolangでBigQueryをざつに扱っています。

GolangでGCSにおいたCSVデータをBigQueryに取り込むメモです。

この記事のサンプルコードは以下においてあります。

アジェンダ

1. サンプルコード

いきなり本題ですが、サンプルコードです。

※ constでProjectID, Dataset, Table, GcsURIは指定していますがサンプルコードでは省いています。

func main() {
    // client
    ctx := context.Background()
    client, err := bigquery.NewClient(ctx, projectID)
    if err != nil {
        log.Printf("err: %+v", err)
    }
    defer client.Close()

    // create table from gcs csv
    gcsRef := bigquery.NewGCSReference(GcsURI)
    gcsRef.SkipLeadingRows = 1
    gcsRef.Schema = bigquery.Schema{
        {Name: "id", Required: true, Type: bigquery.StringFieldType},
        {Name: "name", Required: true, Type: bigquery.StringFieldType},
        {Name: "age", Required: true, Type: bigquery.IntegerFieldType},
    }
    loader := client.Dataset(dataset).Table(table).LoaderFrom(gcsRef)
    loader.WriteDisposition = bigquery.WriteEmpty

    job, err := loader.Run(ctx)
    if err != nil {
        log.Printf("err: %+v", err)
    }

    status, err := job.Wait(ctx)
    if err != nil {
        log.Printf("err: %+v", err)
    }

    if status.Err() != nil {
        log.Printf("job completed with error: %v", status.Err())
    }
}

2. 要点

Golangで普通にBigQueryのschema指定 + Table作成にGCSのデータをかませる感じです。

gcsRef := bigquery.NewGCSReference(GcsURI)GCSReference structを生成し、それをもとにごにょごにょする感じです。

また、Schemaはjsonファイルなどからも生成できます。
以下をご参照ください。

3. 確認

GCS CSVからBigQueryにデータ取り込み

$ go run main.go

tableを確認

$ bq show --format=prettyjson your-project:sample_csv_dataset.sample_csv_table
{
  "creationTime": "1619006997787",
  "etag": "LfUpW/GsO3bWS5M3GW/cBQ==",
  "id": "your-project:sample_csv_dataset.sample_csv_table",
  "kind": "bigquery#table",
  "lastModifiedTime": "1619006997787",
  "location": "US",
  "numBytes": "51",
  "numLongTermBytes": "0",
  "numRows": "3",
  "schema": {
    "fields": [
      {
        "mode": "REQUIRED",
        "name": "id",
        "type": "STRING"
      },
      {
        "mode": "REQUIRED",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "REQUIRED",
        "name": "age",
        "type": "INTEGER"
      }
    ]
  },
  "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/your-project/datasets/sample_csv_dataset/tables/sample_csv_table",
  "tableReference": {
    "datasetId": "sample_csv_dataset",
    "projectId": "your-project",
    "tableId": "sample_csv_table"
  },
  "type": "TABLE"
}

データを確認

$ bq query --use_legacy_sql=false 'SELECT id, name, age FROM your-project.sample_csv_dataset.sample_csv_table'
Waiting on bqjob_r2039930c1e6e05d_00000178f45820d3_1 ... (0s) Current status: DONE
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1  | hoge |  20 |
| 2  | fuga |  25 |
| 3  | piyo |  30 |
+----+------+-----+

おわりに

意外とサクッとできますね!