tweeeetyのぶろぐ的めも

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

curlでBasic認証する方法3つ - と、記号を含むとき注意点など

はじめに

コマンドライン(crul)でBasic認証を叩きたいときのメモ。
とくに、Authorization ヘッダで実行したいときに迷ったので自分用のメモです。

アジェンダ

前提情報

このメモ環境はMac環境です。
OS Versionなどで差異はないはずなので今回は記載を省きます。

また、crulする情報は以下として扱います。

URL : https://www.example.com/login
ID  : hogehoge
PASS: fuga@)fuga

1. curlでBasic認証 - オプションで指定

ひとつめはcrulのオプションで指定する方法です。
IDとPASSを: (コロン)で挟んで指定します。

コマンド:  
curl -u <ID>:<PASS> https://www.example.com/login

注意点

<ID>:<PASS>のパスワードに特殊記号を含む場合、エラーになります。
その場合は、ダブルクオートやシングルクオートで囲ってあげましょう。

# エラーになる例
$ curl -u hogehoge:fuga@)fuga https://www.example.com/login
-bash: syntax error near unexpected token `)'

# エラーを回避する例
$ curl -u 'hogehoge:fuga@)fuga' https://www.example.com/login

2. curlでBasic認証 - URL埋め込み

crulのURLに埋め込む方法です。

コマンド:  
https://<ID>:<PASS>@www.example.com/login

コマンド:

注意点

<ID>:<PASS>のパスワードに特殊記号を含む場合、エラーになります。
こちらも、シングルクオートなどで囲むとエラーを回避できます。

ただし、URLとしての正しさも保ちたいですよね。
その場合は、シングルクオートではなくURLエンコードしてやります。

今回はperlのワンライナーを使いますが、URLエンコードしてくれるWebサイトなんかでもかまいません。

# エラーになる例
$ curl -u hogehoge:fuga@)fuga https://www.example.com/login

# エラーを回避する例
## まずは、perlのワンライナーでエンコード文字列を得る
$ echo "hogehoge:fuga@)fuga" | perl -nle 's/([^\w ])/"%".unpack("H2",$1)/eg; s/ /\+/g; print'
hogehoge%3afuga%40%29fuga

## 上記の文字列をつかう
$ curl -u hogehoge:hogehoge%3afuga%40%29fuga https://www.example.com/login

3. curlでBasic認証 - Authorization ヘッダ指定

最後は、Authorization ヘッダを指定する方法です。
curlでのAuthorizationヘッダは−Hオプションで指定します。

コマンド:
curl https://www.example.com/login \
  -H "Authorization:Basic <BASE64エンコードした<ID>:<PASS>>"

注意点

上記の<BASE64エンコードした<ID>:<PASS>>の部分ですが、
BASE64エンコードを事前にコマンドなどで行ってから文字列を指定します。

# BASE64エンコード
$ echo -n "hogehoge:fuga@)fuga" | base64
aG9nZWhvZ2U6ZnVnYUApZnVnYQ==

# BASE64エンコードした文字列を指定
$ curl https://www.example.com/login \
  -H "Authorization:Basic aG9nZWhvZ2U6ZnVnYUApZnVnYQ=="

参考

おわりに

コマンドだけでなく、プログラムから指定する場合なんかもこれでいけますね!

プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける - 書評メモ

はじめに

自分用の書評メモです。

アジェンダ

どんな本か

ひとことでいうと
「組織がアウトカムではなくアウトプットで成功を計測してしまうビルドトラップという状態に陥る説明とそこから抜け出す方法について書いた本」
です。

何が書かれているか

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

  1. プロダクト主導組織がプロダクト開発おこなう上でハマる罠=ビルドトラップについて
  2. ビルドトラップを抜け出すために、組織を継続的に価値を創出できるように最適化するガイド(役割、戦略、プロセス)
  3. ビルドトラップを抜け出すために、組織としてプロダクトを成長させて維持できるようにするガイド(組織)

大事だと思ったこと

第Ⅰ部

次の3点がざっくりわかり学びがありました。

  • プロダクトマネジメントとは?
  • プロダクトマネジメントのビルドトラップとは?
  • ビルドトラップを抜け出すために必要なこととは?

以下にそれぞれ軽く説明します。

プロダクトマネジメントとは?

プロダクトマネジメントとは?と聞かれてもひとことで答えるのは難しいですよね。
本書では以下のように説明されていました。

プロダクトマネジメントは、既知の未知を認識して調査をすることとと、未知の未知をへらすことの双方が含まれます。

f:id:tweeeety:20210924044258p:plain

既知の既知に基づいたソリューションを実行することは簡単です。
一方で、顧客との会話やデータデータ分析では「未知の未知」を発見することになります。
既知の未知や未知の未知を相手にすることがプロダクトマネジメントの手腕のようです。

プロダクトマネジメントのビルドトラップとは?

本書では、プロダクト開発がうまくいかない状態やプロダクト開発にひそむ罠的なものを「ビルドトラップ」と呼んでいます。

本書の定義文面では以下のように言われています。

ビルドトラップとは:
組織がアウトカムではなく、アウトプットで成功を計測しようとして行き詰まっている状態のこと。
実際に生み出された価値ではなく、機能の開発とリリースに集中してしまっている状態。

たとえば、Mission/VisionやOKRがアウトカム志向になっていないということです。
だいぶ心当たりがありますね...。

ビルドトラップを抜け出すために必要なこととは?

ビルドトラップを抜け出すために、以降の部でそれぞれを説明していく流れになっています。

  1. [Ⅱ部] プロダクトマネージャの役割とうまくスケールする構造をどう作るか
  2. [Ⅲ部] 戦略がこの役割をどうサポートするか
  3. [Ⅳ部] プロダクトチームが戦略を達成するためのプロセス
  4. [Ⅴ部] 組織がこれを維持するための方針、文化、報酬制度をどう設定するか

f:id:tweeeety:20210924044310p:plain

第Ⅲ部-戦略、第Ⅳ部-プロセス

Ⅲ部とⅣ部がとても参考になりました。

戦略

まず「戦略」。
本書では戦略について以下のように書いています。

良い戦略とは計画のことではありません。
戦略とは意思決定を下すのに役立つフレームワークのことです。
戦略策定は企業の方向性を決めるプロセスであり、意思決定のフレームワークを作るプロセスです。

戦略フレームワークの強力な点は、細かいことに目を向ける前に全体を考えるように仕向けてくれることというあたりも納得感があります。

戦略展開と戦略策定

戦略、戦略展開、戦略策定について。
戦略展開と戦略策定ははじめて聞きましたが、それぞれ以下の意味らしいです。

  • 戦略: 組織全体で語られるストーリーを相互に結びつけ、特定の時間枠における目的とアウトカムを説明するもの
  • 戦略展開: ストーリーを伝えて足並みをそろえる行為。組織全体を通じて適切なレベルの目標を設定し、チームが行動できるように活動範囲を狭めること
  • 戦略策定: 企業がどの方向に行動すべきかを判断するプロセスであり、意思決定のためのフレームワークを開発するプロセス

戦略展開を図にしたのが以下。

f:id:tweeeety:20210924044320p:plain

プロセス

また、戦略/戦略展開を達成するためのプロセスとして「プロダクトのカタ」があるという話しも参考になりました。
プロダクトのカタは、作るべき適切なソリューションを明らかにするプロセスのことであり、問題解決の観点でのプロダクトを作る方法でもあります。

プロダクトのカタを図にしたのが以下。

f:id:tweeeety:20210924044330p:plain

感想

プロダクトマネジメントに限らず、大きな成果を達成する仕事には戦略やプロセスが必要です。
本書でいう戦略やプロセスは汎用的に参考になると思いました。

おわりに

戦略展開とプロダクトのカタは、わりと普通の仕事でも使えそうですよね!

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

はじめに

自分用の書評メモです。

アジェンダ

どんな本か

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

何が書かれているか

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

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