はじめに
現在、Rasberry Pi4(以降、ラズパイと表記)に Ubuntu Server をインストールし、ラズパイをサーバと想定したときの、サーバへのデプロイについて実装を通して学習しています。
以前、『初めてのラズパイサーバ構築 MacからSSH接続する方法【Part2】』 の記事において、作成した簡易プログラムをファイル転送したことをまとめました。
今回は、ファイルの転送ではなく、現場でも使用されているとされている、GitHubとの SSH連携 によって、実際に作成したプログラムファイルをサーバに配置して使えるようにしようと考えました。
この記事では、実際にラズパイと GitHub をどのようにしてSSH連携するのかについて、できるだけわかりやすくまとめていきます。
実装環境
Wifiルータを中心とした同一ネットワーク内に、ラズパイとPCがある状態
SSHの基礎を理解するために参考にしたURL
SSHがどのような仕組みで動いているのかについては、主に以下の記事を参考にしました。
SSH連携を選択した理由
本番環境を想定したため
本番環境では、開発したコードをGitHubにアップロードし、そのコードをGitHubからサーバが git pull
してコードの更新を行なうことが一般的です。
この環境を疑似的に作り出すため、今回ラズパイを使って実装しました。
また、サーバへのリモートアクセスの練習としてもラズパイが最適だと判断し使用しています。
「ラズパイとGitHubをSSH連携する」とは
一度、認証用の鍵ペアを交換しておくことで、今後はパスワード不要で安全に通信できる状態にすることを意味します。
ラズパイとGitHubのSSH連携は、TLSのような「共通鍵を使った暗号化通信の準備」ではなく、「公開鍵認証方式で"信頼された端末"として登録するための一度きりの認証手続きを行なう」ものです。
この手続きを済ませておくことで、以降はGitHubに安全に接続できるようになります。
今回、セキュリティをより強化するため、パスフレーズも設定しました。
ラズパイとGitHubをSSH連携する手順
前提として、ラズパイをSSHクライアント、GitHubをSSHサーバとして、公開鍵認証方式を使用しました。
1. ラズパイでSSH鍵ペアの生成と登録
ssh-keygen -t ed25519 -C "example@example.com"
※ -t ed25519
: 現在推奨されているアルゴリズムです。RSAより安全&軽量という特徴があります。
※ -C "example@example.com"
: コメントとしてメールアドレスを登録しています。これにより、多くの鍵が登録されている環境で、「これは誰の鍵か?」とならないためのラベルの役割を果たします。
GitHubやサーバー管理者がSSH公開鍵を受け取るとき、誰の鍵かを一目で判別できるようになります。
パスフレーズを登録している場合
パスフレーズを入力し、Enterキーを押下すると、以下のように文字列が生成され、公開鍵ファイル・秘密鍵ファイルが保存されます。
※ 今回のケースでは以下のディレクトリに保存されています。
- 秘密鍵: home/ubuntu/.ssh/id_ed25519
- 公開鍵: home/ubuntu/.ssh/id_ed25519.pub
cat ~/.ssh/id_ed25519.pub
コマンドを実行することで、いつでも確認できます。
2. GitHubに公開鍵を登録
2-1. ラズパイで公開鍵の中身を表示
cat ~/.ssh/id_ed25519.pub
2-2. 表示された文字列をコピー
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILrTmTgD9cbE6Y6qGnWst3G+A8IkiwwAdJ0k4ANWLymb example@example.com
2-3. GitHubにログイン
2-3-1. 「Settings」を選択
2-3-2. 「SSH and GPG keys」を選択
2-3-3. 「New SSH key」を選択
2-3-4. 「Title」「Key」に必要事項を入力し、「Add SSH key」を選択
-
Title
GitHubと連携する鍵の名前をつけます。任意の名前をつけることができます。 -
Key
先ほどの 2-2. でコピーした文字列を貼り付けます。 -
Add SSH key
必要事項を入力し、クリックします。
これにより、GitHubは「この公開鍵に対応する秘密鍵を持っている人だけを本人とみなす」という状態になります。
3. GitHubアカウントのパスワードを入力
パスワードの入力を求められるので、GitHubアカウントのパスワードを入力します。
4. ラズパイからGitHubにアクセスできるか確認
ssh -T git@github.com
これは、サーバ(今回のケースでは GitHub が SSHサーバ)のなりすましを防ぐため、サーバの公開鍵フィンガープリントをSSHクライアントであるラズパイが事前に知っているかどうかを確認しています。
SSHクライアントはSSHサーバ( GitHub )から公開鍵を受け取ります。
クライアントは受け取った公開鍵にハッシュ関数(SHA256など)をかけてフィンガープリント(ハッシュ値)を計算します。
そのフィンガープリントを known_hosts に保存・照合します。
事前にフィンガープリントが known_hosts に保存されている場合は、接続されます。
もし、フィンガープリントが保存されていない場合は、以下のようなメッセージが出力されます。
The authenticity of host 'github.com (IP)' can't be established.
Are you sure you want to continue connecting (yes/no)? ← yes
このコマンドは、GitHub(SSHサーバ)が信頼できる相手かどうかを確認します。
もし初めての接続であれば、以下のようなメッセージが出て「yes」と答えることで GitHub の公開鍵フィンガープリントが known_hosts に登録されます。
正常に接続できると、以下のようなメッセージが表示されます。
これで、SSH接続ができました。
※ ラズパイの.sshディレクトリには以下のファイルが存在します。
GitHubからクローン・pullしてみる
git clone git@github.com: Mavo39/backend-portfolio
これにより、ラズパイに GitHub で管理していたリポジトリをクローンすることができました。
動作確認
ラズパイ側では実行環境を整える必要があり、仮想環境の構築やmarkdownモジュールのインストールを行ないました。
その結果、簡易CLIプログラムが正常に動作することを確認できました。
詳細は以下の記事をご参照ください。
『【ポートフォリオ 03】Raspberry Piにデプロイして動作確認をした結果』
まとめ
Ubuntu Serverをインストールしたラズパイをサーバとして、GitHubとSSH連携する方法をまとめました。
これにより、GitHub上のリポジトリの状態をいつでも git pull
して更新できる環境が整いました。
今回のデプロイ過程を通じてSSHの基礎や公開鍵認証の流れを理解でき、処理内容を把握しながら進めることができました。
今後はこの環境を活用し、プログラムの規模に応じて動作確認や自動化などにも挑戦していきたいと思います。
最後までお読みいただき、ありがとうございました。
参考・画像引用元URL