1. 序章

近年、 git は、Subversionなどの他のSCMシステムよりも人気が急上昇しています。 GitHubやGitLabなどの無料プラットフォームの台頭により、安全なバージョン管理がこれまでになく簡単になり、アプリケーションコードを保存できます。

ただし、資格情報を常に入力するのは面倒で、自動化されたCI/CDパイプラインを作成するのは難しい場合があります。 したがって、このチュートリアルでは、手動で入力する必要がないようにgitクレデンシャルを構成する方法を見ていきます。

2. 資格情報の入力

リモート接続で認証が必要な場合は常に、gitには使用する資格情報を探す方法がいくつかあります

資格情報が構成されていない基本から始めましょう。 gitがリモート接続にアクセスするためにユーザー名とパスワードが必要な場合は、次の手順でユーザーに入力を求めます。

まず、ユーザーが資格情報を入力できるようにするアプリケーションを呼び出そうとします。 使用するアプリケーションを決定するために、次の値が(順番に)チェックされます。

  • GIT_ASKPASS環境変数
  • core.askPass構成変数
  • SSH_ASKPASS環境変数

これらのいずれかが設定されている場合、アプリケーションが呼び出され、ユーザーの入力が標準出力から読み取られます。

これらの値のいずれも設定されていない場合、gitはコマンドラインでの入力をユーザーに求めるプロンプトに戻ります。

3. クレデンシャルの保存

ユーザー名とパスワードの入力は、特に1日を通して頻繁にコードをコミットする場合は、面倒な場合があります。 パスワードを手動で入力するとエラーが発生しやすく、自動パイプラインの作成も困難になります。

これを支援するために、gitはユーザー名とパスワードを保存するいくつかの方法を提供します。 次のセクションでは、それぞれの方法について説明します。

3.1. URLのユーザー名とパスワード

一部のgitプロバイダーでは、リポジトリのURLにユーザー名とパスワードを一緒に埋め込むことができます。 これは、リポジトリのクローンを作成するときに実行できます。

git clone https://<username>:<password>@gitlab.com/group/project.git

パスワードに特殊文字が含まれている場合は、シェルがそれらを解釈しようとするのを防ぐために、それらをエスケープする必要があることに注意してください。

または、リポジトリ内のgit configファイルを編集して、ユーザー名とパスワードを含めることもできます。

url = https://<username>:<password>@<code class="language-shell">gitlab.com/group/project.git

いずれにせよ、ユーザー名とパスワードはプレーンテキストで保存されていることを忘れないでください。リポジトリにアクセスできる人なら誰でもそれらを見ることができます。

3.2. クレデンシャルコンテキスト

Gitでは、コンテキストごとに資格情報を構成することもできます。 次のコマンドは、特定のユーザー名を使用するように特定のgitコンテキストを構成します。

git config --global credential.https://github.com.username <your_username>

または、グローバルgit設定ファイルを直接編集することもできます。 これは通常、ホームディレクトリの .gitconfig という名前のファイルにあり、次の行を追加します。

[credential "https://github.com"]
	username = <username>

ユーザー名がプレーンテキストで保存されているため、このメソッドも安全ではありません。 また、パスワードの保存も許可されていないため、gitは引き続きパスワードの入力を求めます。

4. クレデンシャルヘルパー

Gitは、クレデンシャルをより安全に保存するためのクレデンシャルヘルパーを提供します。 クレデンシャルヘルパーは、複数の方法でデータを保存でき、パスワードキーチェーンなどのサードパーティシステムと統合することもできます。

箱から出して、gitは2つの基本的なクレデンシャルヘルパーを提供します

  • キャッシュ:短期間にメモリに保存されたクレデンシャル
  • 保存:ディスクに無期限に保存された資格情報

次にそれぞれを見ていきます。

4.1. キャッシュクレデンシャルヘルパー

キャッシュクレデンシャルヘルパーは、次のように構成できます。

git config credential.helper cache

クレデンシャルはUnixソケットを使用してアクセスできますが、キャッシュクレデンシャルヘルパーがディスクにクレデンシャルを書き込むことはありません。 これらのソケットは、それらを保存したユーザーに制限されているファイル権限を使用して保護されているため、一般的には安全です。

キャッシュクレデンシャルヘルパーを構成するときに、timeout引数を指定することもできます。 これにより、クレデンシャルがメモリに保持される期間を制御できます。

git config credential.helper 'cache --timeout=86400'

これにより、クレデンシャルを入力してから1日間メモリに保存されます。

4.2. ストアクレデンシャルヘルパー

ストアクレデンシャルヘルパーは、クレデンシャルをファイルに無期限に保存します。 ストアクレデンシャルヘルパーは次のように構成できます。

git config credential.helper store

 

ファイルの内容は暗号化されていませんが、ファイルを作成したユーザーへのファイルシステムアクセス制御を使用して保護されています

デフォルトでは、ファイルはユーザーのホームディレクトリに保存されます。 コマンドにfile引数を渡すことで、ファイルの場所を上書きできます。

git config credential.helper 'store --file=/full/path/to/.git_credentials'

4.3. カスタムクレデンシャルヘルパー

上記の2つのデフォルトのクレデンシャルヘルパーに加えて、カスタムヘルパーを構成することができます。 これらにより、サードパーティのアプリケーションとサービスに委任することで、より高度な資格管理を行うことができます。

カスタムクレデンシャルヘルパーの作成は、ほとんどのユーザーが心配する必要のあるものではありません。 ただし、役立つ理由はいくつかあります。

  • macOSのキーチェーンなどのオペレーティングシステムツールと統合する
  • LDAPやActiveDirectoryなどの既存の企業認証スキームを組み込む
  • 二要素認証などの追加のセキュリティメカニズムを提供する

5. SSHキー

最新のgitサーバーのほとんどは、HTTPS経由のユーザー名とパスワードの代わりにSSHキーを使用してリポジトリにアクセスする方法を提供します。 SSHキーはパスワードよりも推測が難しく、侵害された場合は簡単に取り消すことができます

SSHを使用することの主な欠点は、非標準のポートを使用することです。 一部のネットワークまたはプロキシがこれらのポートをブロックし、リモートサーバーとの通信を不可能にする場合があります。 また、サーバーとクライアントの両方でSSHキーを設定するための追加の手順が必要であり、大規模な組織では煩雑になる可能性があります。

gitリポジトリでSSHを有効にする最も簡単な方法は、プロトコルのクローンを作成するときにsshを使用することです。

git clone [email protected]:group/project.git

既存のリポジトリの場合、次のコマンドでリモートを更新できます。

git remote set-url origin [email protected]:group/project.git

SSHキーを構成するプロセスは、gitサーバーごとにわずかに異なります。 一般的に、手順は次のとおりです。

  • マシン上で互換性のある公開鍵と秘密鍵の組み合わせを生成します
  • 公開鍵をgitサーバーにアップロードします

ほとんどのUnix/Linuxユーザーは、ホームディレクトリにSSHキーのペアを作成して構成し、既存の公開キーをアップロードしています。 念のため、秘密鍵をアップロードしたり共有したりしないでください。

6. 結論

このチュートリアルでは、gitクレデンシャルを構成するさまざまな方法を見てきました。 最も一般的な方法は、組み込みのクレデンシャルヘルパーを使用して、クレデンシャルをローカルのメモリまたはディスク上のファイルに保存することです。 クレデンシャルを保存するためのより洗練された安全な方法はSSHを使用することですが、これはより複雑になる可能性があり、すべてのネットワークで機能するとは限りません。