2018年10月24日水曜日

git credential を使おう

概要

git の認証を毎回入力するのは面倒なので localhost 上に認証情報を保存することができます
今回は基本的な使い方を紹介します

環境

  • Ubuntu 16.04
  • git 2.7.4

永続的に保存 (store)

認証情報をファイルに保存する方法です
認証情報が消えることはないので登録すればそれ以降はパスワードを尋ねられることはないですが残念ながら保存方法が平文しかありません

永続的に保存する場合は store を使います

  • git config --global credential.helper store
  • cat ~/.gitconfig
[credential]
        helper = store

これで store を使う準備ができました
あとは認証情報を記載したファイルを作成するだけです

  • git credential-store store

で対話的に登録することができます
以下のような感じで入力していけば OK です

protocol=https
host=github.com
username=hawksnowlog
password=xxxxxxxxxxxxxx

Ubuntu の場合、認証情報が登録されるデフォルトのファイルは ~/.git-credentials になります
中身を確認すると平分で保存されているのが分かると思います

https://hawksnowlog:xxxxxxxxxxxxxx@github.com
  • git credential fill

で対話的に認証情報を検索することもできます

暗号化するには

とは言えパスワード情報なので暗号化したくなるので普通です
その場合には git-credential-libsecret を使います
ただこれを条件として

  • Xserver が必要
  • git の 2.11+ が必要

があります
なので使える状況としてはデスクトップ Ubuntu として使っている場合かなと思います

一応使う場合は以下の通りです
まず Ubuntu で git の最新版を使えるようにします

  • add-apt-repository ppa:git-core/ppa
  • apt -y install git

これで最新版が使えるようになります
あとは libsecret helper を作成し登録します

  • make --directory=/usr/share/doc/git/contrib/credential/libsecret/
  • git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
  • cat ~/.gitconfig
[credential]
        helper = /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret

これで一度パスワードを聞かれたあとに認証情報を入力すれば、その後は聞かれなくなると思います

ちなみに Mac で Github などに認証するときにパスワードを聞かれなくなるのは osxkeychain という helper を使っているためです

  • git config --list
credential.helper=osxkeychain

macOS に含まれてる「キーチェーンアクセス」という認証情報を管理する仕組みを使っています
キーチェーンアクセスを開いて保存されているパスワードの一覧を開くと Github の認証が保存されているのを確認できると思います
git_credential1.png

Tips: git-credential-gnome-keyring は deprecated になっている

以下の方法は deprecated になっているようです

  • apt install -y libgnome-keyring-dev
  • make --directory=/usr/share/doc/git/contrib/credential/gnome-keyring
  • git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring

一時的に保存 (cache)

認証情報をメモリに一時的に保存する方法もあります
デーモンが常駐しそのデーモンが認証情報をキャッシュしてくれます
指定された timeout が過ぎると自動的に認証情報が削除されます
helper に cache を登録すれば完了です

  • git config --global credential.helper cache
  • cat ~/.gitconfig
[credential]
       helper = cache

timeout のデフォルトは 900sec (15miin) になっているようです
--timeout で指定することもできます

  • git config --global credential.helper cache --timeout 30000

cache の場合指定時間で認証情報は消えてしまいますが store のように平文ファイルを作らないため安全です
また緊急で全キャッシュを削除したい場合は

  • git credential-cache exit

で可能です

実は helper は自分で作れる

これまでビルトインである store と cache を紹介しましたが同じように自分でも helper を作ることはできます
git 側で決められたフォーマットで出力すれば良いだけなので簡単に作れます
このページに簡単な Ruby のスクリプトヘルパもあります

例えば認証情報を格納した json ファイルからパスワードを取り出して認証させるみたいなヘルパを作成することもできます

この辺の git のアーキテクチャは素晴らしいなと思いました

最後に

git-credential を使ってみました
ヘルパという外部のプログラムと連携することで認証情報を任意の場所に補完して取り出すことができるようになります
ビルトインは store と cache が使えるようです

またヘルパは独自で作成することもできます
認証情報をすでに管理している仕組みがあるのであればそこにアクセスして取ってくるみたいなことができるようになります

参考サイト

0 件のコメント:

コメントを投稿