開発者にとってGitとGitHubは必要不可欠なツールです。ほとんどすべてのソフトウェア開発プロジェクトで広く利用されています。

GitlabBitbucketのような他のGitホスティングサービスもありますが、GitHubは最も人気が高く、アカウントのプロフィール欄をこだわって編集すれば、仕事を獲得することさえ可能です。

もちろん、Kinstaでも、GitとGitHubを使用してプロジェクトを整理し、他の開発者とコラボレーションできます。

しかし、GitとGitHubは関連しつつ異なるツールであるため、それぞれのワークフローを常に更新する必要があります。

SSH鍵は、各コンピュータごとに設定するのが最善です。そこでこの記事では、SSH鍵の概要、利点、そしてGitHubのSSH鍵を生成・設定する方法についてご説明します。

SSH鍵の概要

簡単に言うと、SSH鍵は、SSH(Secure Shell)プロトコルで使用される認証情報です。インターネットを介してリモートコンピュータに安全に接続でき、この認証は通常、コマンドライン環境で行われます。

このプロトコルは、クライアントサーバアーキテクチャに基づいており、ユーザー(または「クライアント」)は、SSHクライアントと呼ばれる特別なソフトウェアを使用してリモートサーバーにログインし、コマンドを実行します。ターミナル経由でのGitHubの認証でも、基本的には同じことが行われています。

Gitのプッシュ
Gitのプッシュ

SSHはGitHubだけでなく、Kinsta、Google Cloud、Amazon Web Services(AWS)などの他のサービスへのアクセスでも、安全なチャンネル作成に幅広く使用されています。

SSH鍵がどのように機能するのかを見る前に、公開鍵と秘密鍵の違いを理解しておきましょう。

公開鍵と秘密鍵

基本から始めましょう。

SSHプロトコルは、非対称暗号と呼ばれる暗号技術を使用します。一見複雑に思えますが、言葉通りの仕組みです。

基本的に非対称暗号は、公開鍵秘密鍵というペアの鍵を使用します。

公開鍵は、文字通り誰とでも共有することができます。データを暗号化し、メッセージを秘密のコード、あるいは暗号文に変換するのが主な目的です。この鍵は通常、他のシステム、たとえばサーバーに送信され、データをインターネット経由で送信する前の暗号化に使用されます。

一方、秘密鍵は、自分だけで保持する「秘密」の鍵であり、公開鍵で暗号化されたデータの復号に使用されます。秘密鍵がなければ、暗号化された情報を解読することはできません。

この方法により、ユーザーとサーバー間で情報を送信する安全な通信チャネルを確保できます。

SSHを介してサーバーに接続する際、バックグラウンドでは以下のようなやり取りが行われます。

  1. クライアントがサーバーに公開鍵を送信。
  2. サーバーは、公開鍵で暗号化されたメッセージに秘密鍵を使用して署名するようクライアントに要求。
  3. クライアントがメッセージに署名し、結果をサーバーに転送。
  4. クライアントとサーバーの間に安全な接続を確立。

秘密鍵は安全に保管して、いかなる場合にも誰とも共有しないことが重要です。秘密鍵は、受信するすべての情報の鍵になります。

GitHubでSSH鍵を利用する

2021年8月13日以降、Githubでのコマンドラインからのパスワード認証が非推奨になりました。つまり、個人用のアクセストークンを使用するか、より便利な方法としてSSH鍵を使用して認証する必要があります。

ターミナルからHTTP経由でGitHubのパスワード認証を試みると、次のようなエラーが表示されます。

Username for 'https://github.com': yourusername

Password for 'https://[email protected]':

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.

fatal: Authentication failed for 'https://github.com/yourusername/repository.git/'

GitHubでは、SSH経由でのリポジトリの編集許可に公開鍵が必要になります。

ローカルでSSH鍵を生成する方法を見てみましょう。

ローカルでのSSH鍵の生成方法

SSHプロトコルや、公開鍵と秘密鍵の違いについて少し理解できたところで、コンピュータとGitHubリポジトリとの間に、安全なSSHチャネルをセットアップします。

先に進む前に、GitHubのアカウントと、Gitがインストールされたターミナルかコマンドプロンプトを用意してください。Windowsユーザーは、Git bashをインストールしてください。Git bashには、これからご紹介する手順に必要なすべてのツールが組み込まれています。

OpenSSHクライアントは、SSH経由での接続に使用される最も人気のオープンソースソフトウェアです。Linux、macOSWindows 10にはデフォルトでインストールされています。

ローカルのSSH鍵を生成するには、Windowsではコマンドプロンプトを、Unixベースのシステムではターミナルを起動します。通常は、アプリケーションパネルで「terminal」、「cmd」、「powershell」を検索し、表示されたアイコンをクリックすると実行できます。

ターミナルアプリケーションの検索
ターミナルアプリケーションの検索

実行すると、次の画像のようなウィンドウが表示されます。

ターミナルアプリケーション
ターミナルアプリケーション

以下のコマンドを実行して、ローカルにSSH鍵のペアを生成します。

ssh-keygen -t ed25519 -C "[email protected]"

ちなみに、このコマンドを覚えている人はほとんどおらず、以下のような理由から、多くの人が使用時に検索しています。

  1. 非常に長く、無作為に数字が並ぶため覚えにくい。
  2. そもそも滅多に使用することがなく、覚える必要がない。

とはいえ、ターミナルから入力するコマンドの理解は重要なため、コマンドの各要素の意味は押さえておきましょう。

  • ssh-keygen:SSH鍵のペアを作成するコマンドラインツール。ssh-keygen helpでフラグを確認できる。
  • -t ed25519-tフラグは、鍵ペアのデジタル署名を作成する際に使用されるアルゴリズムを指定。システムが対応している場合は、「ed25519」がSSH鍵ペアの作成に使用できる最善のアルゴリズム。
  • -C “電子メール”-Cフラグは、公開鍵の末尾にカスタムコメントをつけるもので、通常は鍵ペアの作成者のメールか識別情報を指定する。

ターミナルにコマンドを入力したら、鍵を保存するファイルを指定します。デフォルトでは、ホームディレクトリの隠しフォルダ「.ssh」に保存されますが、必要に応じて変更できます。

次に、鍵ペアに追加するパスフレーズを尋ねられます。デバイスが危険にさらされた場合に備え、セキュリティレイヤーを追加できます。必須ではありませんが、常にパスフレーズは追加するようにしてください。

プロセス全体は次のようになります。

ssh-keygenコマンド
ssh-keygenコマンド

見て分かるように、このコマンドは、選択したディレクトリ(一般的には~/.ssh)に2つのファイル、拡張子が.pubの公開鍵と拡張子のない秘密鍵を生成します。

公開鍵をGitHubアカウントに追加する方法は後ほどご説明します。

ssh-agentへのSSH鍵の追加

ssh-agentはバックグラウンドで実行されるプログラムで、秘密鍵とパスフレーズを安全に保持し、sshで使用できる状態に保ちます。サーバーに接続するたびにパスフレーズの入力の手間を省く素晴らしいユーティリティです。

このエージェントには、新しい秘密鍵を追加する必要があります。手順は以下のとおりです。

  1. ssh-agentがバックグラウンドで動作していることを確認
    eval `ssh-agent`
    # Agent pid 334065

    上のようなメッセージが表示されればOKです。これはssh-agentが特定のプロセスID(PID)で実行されていることを意味します。

  2. SSH秘密鍵(拡張子のないもの)をssh-agentに追加。
    ssh-add ~/.ssh/kinsta_keys

    kinsta_keysはSSH鍵の名前で置き換えてください。初めて作成した鍵であれば、「id_使用したアルゴリズム名」になります(例:id_ed25519)。

GitHubアカウントへのSSH鍵の追加

最後に、GitHubアカウントに公開鍵を追加します。以下の手順に従ってください。

  1. SSH公開鍵をクリップボードにコピーします。テキストエディターでファイルを開いてコピーするか、ターミナルを使用してその内容を表示してコピーします。
    cat ~/.ssh/kinsta_keys.pub
    # ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJl3dIeudNqd0DPMRD6OIh65tjkxFNOtwGcWB2gCgPhk [email protected]
  2. GitHubにログインし、ページの右上のセクションに移動。プロフィール写真をクリックして、「Settings」を選択します。

    GitHubのSettings
    GitHubのSettings

  3. プロフィールの設定で、「SSH and GPG keys」をクリックします。

    SSH and GPG keys
    SSH and GPG keys

  4. 「New SSH key」ボタンをクリックします。

    「New SSH key」ボタン
    「New SSH key」ボタン

  5. 新しいSSH鍵にGitHub上での「タイトル」を付けます。通常は鍵を使用するデバイス名です。次に、鍵を「Key」フィールドに貼り付けます。

    新規SSH鍵追加フォーム
    新規SSH鍵追加フォーム

  6. 「Add SSH key」をクリックします。

    「Add SSH key」ボタン
    「Add SSH key」ボタン

リポジトリへのプッシュによるSSH接続のテスト

続いて、ここまでの作業をテストします。SSHを使用して、既存のリポジトリの1つを変更、コミット、プッシュし、接続が正しく設定されていることを確認します。

ここでは例として、こちらの記事で作成した、シンプルなHTMLサイトを変更します。

まず、リポジトリをローカルに複製します。GitHubのリポジトリページにアクセスし、SSHアドレスをコピーします。

SSHクローンコマンド
SSHクローンコマンド

次にターミナルを使用してリポジトリを複製します。

git clone [email protected]:DaniDiazTech/HTML-site.git

ここでindex.htmlファイル内に、シンプルな<h1>タグを追加します。

...
<div class="container my-2">
    <h1 class="text-center">A new title!<h1>
</div>

<div class="container my-3">
...
シンプルなHTMLサイト
シンプルなHTMLサイト

変更を最小限に留めるため、JavaScriptやCSSには一切触れません。余談ですが、JavaScriptに精通していて、Kinstaで働くことに興味がある方はこちらをチェックしてみてください。

ファイルの編集後、変更をコミットしてください。

git commit -am "Added a simple title"

そして通常と同じようにGitHubにプッシュします。

git push

問題がなければ、以上で終了です。これで、ローカルのコンピュータとGitHubの間にSSH接続をセットアップできました。

異なるGitHubアカウントでの複数のSSH鍵の管理

GitHubのアカウントが複数ある場合(個人プロジェクト用と仕事用のものなど)、SSHの使い分けは複雑になります。通常は、異なるGitHubアカウントの認証のために別のコンピュータが必要です。

これは、SSH構成ファイルで簡単に解決できます。

  1. 別のSSH鍵ペアを作成し、それをもうひとつのGitHubアカウントに追加します。新しい鍵を割り当てたファイル名を覚えておきます。
    ssh-keygen -t ed25519 -C "[email protected]"
  2. SSH構成ファイルを作成します。構成ファイルはsshプログラムに動作を指示します。デフォルトでは構成ファイルは存在しない可能性があるため、.ssh/フォルダの中に作成します。
    touch ~/.ssh/config
  3. SSH構成ファイルを変更します。構成ファイルを開き、以下のコードを貼り付けます。
    #Your day-to-day GitHub account
    
    Host github.com
      HostName github.com
      IdentityFile ~/.ssh/id_ed25519
      IdentitiesOnly yes
    
    # Work account
    Host github-work
      HostName github.com
      IdentityFile ~/.ssh/work_key_file
      IdentitiesOnly yes

これで、仕事用のアカウントやセカンダリアカウントを使用してSSHで認証する際には、以下のリポジトリのSSHアドレスをその下のものに変更するだけでOKです。

[email protected]:workaccount/project.git

以下に変更しましょう。

git@github-work:workaccount/project.git

まとめ

今回は、SSHでのGitHub接続に必要な基礎知識をご紹介しました。

SSHプロトコルの必要性、公開鍵と秘密鍵の違い、鍵の生成とGitHubへの追加方法、さらにはGitHubアカウントごとに複数のSSH鍵を管理する方法についてご説明しました。重要な点として、アクセス権を失うことのないよう、秘密鍵は誰にも共有せず、安全な場所に保管してください。

この記事を参考に、GitとGitHubを使用した完璧なワークフローを構築し、コーディング作業を進めてみてください。

Daniel Diaz

Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech