Git:リポジトリのクローンとプル(SSH、Bitbucket編)

投稿日:  更新日:

Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。

Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、SSHを使ったリポジトリのクローン(コピー)とプル(履歴の取得)の方法を紹介します。

※環境:Android Studio Electric Eel | 2022.1.1
※前提:リモートリポジトリの構築済み

スポンサーリンク

SSH(セキュアシェル)とは

SSHの概要をまとめます。

詳細はネット上に公開されている記事や書籍を参照してください。

SSHプロトコル

SSH(Secure SHellの略)は「正当なサーバとクライアント間で、暗号化された通信経路を確立する」ためのプロトコルです。

SSHプロトコル概要

プロトコルは図に示すような手順を踏みます。

Diffie-Hellman鍵交換法

確立した通信経路で利用される暗号化の方式は「共通鍵暗号化方式」になります。

共通鍵暗号化方式について
「共通鍵暗号化方式」は送信側と受信側で同じ鍵を使用します。送信側で鍵Aを使って暗号化して送信し、受信側で鍵Aを使って複合化して受信します。

SSHの暗号化方式

ですので、通信を始める前に送信側と受信側で暗号鍵を共有しなければなりません。

この暗号鍵(共通鍵)の共有に使われるのが「Diffie-Hellman鍵交換法」です。

Diffie-Hellman鍵交換法

しかし、「Diffie-Hellman鍵交換法」は鍵を交換する相手を確認しません。よって、第三者攻撃に無防備とういう欠点を持ちます。

この欠点を補うために、サーバーとクライアント間で、ホスト認証とユーザ認証を行います。

ホスト認証

ホスト認証とは、クライアントがサーバーの正当性を確認することです。

「公開鍵認証」を用いて行われます。

公開鍵暗号化方式について
「公開鍵暗号化方式」は送信側と受信側で異なる鍵を使用します。送信側で鍵Aを使って暗号化して送信し、受信側で鍵Bを使って複合化して受信します。
※自分が送信・受信側のどちらの立場であるか、念頭に入れて考えましょう!

この鍵AとBは一組のペア鍵で、両者は次の関係を持ちます。

暗号化複合化○:複合できる
×:複合できない
鍵A鍵A
×
鍵A鍵B
鍵B鍵A
鍵B鍵B
×

つまり、「一方の鍵で暗号化したデータは、もう一方の鍵でのみ複合化できる」ということです。

この関係を利用して、次のような仕組みを構築すると、

 (0)受信者側で一組のペア鍵(鍵AとB)を作成
 (1)鍵Aは送信側へ公開、ネットワーク上に公開してよい
 (2)鍵Bは受信側で秘匿、他者へ知られないよう厳重に管理
 (3)送信者は鍵Aで暗号化し送信
 (4)受信者は鍵Bで複合化し受信

第三者が通信経路上の暗号データを取得しても、鍵Bの持ち主以外は複合できないので、元データを見ることができません。よって、データの秘密が守られます。

公開鍵暗号化方式

この鍵Aを「公開鍵」、この鍵Bを「秘密鍵」と呼びます。

公開鍵暗号化方式のアルゴリズムは複数存在しています。代表的なものは、RSA、ElGamal、Ed25519などです。

公開鍵認証について
「公開鍵認証」はベア鍵(公開鍵、秘密鍵)を使って通信相手の正当性を確認します。「公開鍵暗号化方式」を逆に捉えた時の副産物です。
※自分が認証する・される側のどちらの立場であるか、念頭に入れて考えましょう!

「公開鍵暗号化方式」を逆に捉えて、次のような仕組みを構築すると、

 (0)認証される側で一組のペア鍵(公開鍵、秘密鍵)を作成
 (1)公開鍵は認証する側へ渡す、セキュリティ上安全な方法を使う
 (2)秘密鍵は認証される側で秘匿、他者へ知られないよう厳重に管理
 (3)認証される側は秘密鍵で暗号化し送信
 (4)認証する側は公開鍵で複合化し受信、複合できることを確認

受信した暗号データが公開鍵で複合できた時、この暗号データはペアの秘密鍵で暗号化された物です。秘密鍵は秘匿されているので、データの送り主は無二の存在と言えます。

つまり、送信者が正当な通信相手であると、確認できたことになります。

公開鍵認証

この認証で使われる暗号データを「電子署名」といいます。

ちなにみ、認証で使われる暗号データの元データはホスト情報などです。

認証において、すべてのデータを暗号化しません。暗号化が重い処理のためです。

元データはハッシュ関数で固定長(4096ビットなど)のデータに変換してから暗号化し、認証する側へ送られます。

この固定長のデータのことを「メッセージダイジェスト(Message Digest)」といいます。

サーバー認証

認証に先立って、公開鍵をクライアント(認証する側)へ渡しておく必要がある点に注意してください。※図中の0番がそれに当たる

ユーザー認証

ユーザー認証とは、サーバーがクライアントの正当性を確認することです。

SSHは複数の認証方法をサポートしており、選択が可能になっています。

Bitbucketでは、「公開鍵認証」を用いて行われます。

ユーザー認証

認証に先立って、公開鍵をサーバー(認証する側)へ渡しておく必要がある点に注意してください。※図中の0番がそれに当たる

OpenSSH

OpenSSHはSSHプロトコルを実装したライブラリ(SDK)とコマンド(ssh,scpなど)群を一つにまとめたツールです。

OpenSSHのホームページ

パッケージマネージャ(WindowsのwingetやLinuxのaptなど)を利用してインストールできるように、配布が行われています。

パッケージは「OpenSSHサーバー」と「OpenSSHクライアント」に分割して管理されています。クライアントの機能を使うのであれば、後者のみのインストールで十分です。

OpenSSHはセキュリティに直結する機能です。ですので、常に最新バージョンの利用をお勧めします。

スポンサーリンク

SSHによるアクセス

BitbucketにおけるSSHを使ったアクセスは、次のような特徴があります。
(※「Set up Repository Access keys on Windows」より抜粋

・Grant read-only access to a public or private repository.
(リポジトリへ読み出し専用アクセスを許可する)

・Don't require additional users on your plan.
(アクセスの為に追加のユーザを要求しない)

・Can be added to multiple repositories.
(複数のリポジトリへ追加できる)

・Can't also be associated with an account.
(アカウントに関連付けされない)

・Don't require a passphrase when used for automated processes.
(自動化された処理に使われる時、パスフレーズを要求しない)

重要なのは、Bitbucketのアカウントを持たなくても、アクセスキー(SSHの公開鍵)の登録があれば、アクセスが可能な点です。

ただし、読み出し専用です。実行できるGit処理はクローン(Clone)とプル(Pull)のみになります。

ですので、SSHアクセスは、次のような「読み出し専用でも成り立つ用途」が考えられます。

 ・CIのビルドシステムからの参照
 ・開発プロジェクトの検証チームからの参照

 ※CI:Continuous Integration(継続的インテグレーション)

スポンサーリンク

openSSHのインストール確認

Windows11(Windows10も同じ)はOpenSSHをオプション機能という形で提供します。

しかも、OpenSSHクライアントはWindowsのインストール時に実装(インストール)済みになっています。

openSSHクライアントの確認

Windowsのターミナルを開き、次のコマンドの実行で、実装されたOpneSSHの存在を確認できます。

> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
スポンサーリンク

公開鍵・秘密鍵の作成

ユーザ認証で使用するペア鍵(公開鍵・秘密鍵)を作成します。

Windowsのターミナルを開き、OpenSSHクライアントに含まれるssh-keygenコマンドを使って、次のように行います。

この例は、暗号化アルゴリズム ed25519 を選択しました。

> ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\user_a/.ssh/id_ed25519): [RET]
Enter passphrase (empty for no passphrase): パスフレーズ
Enter same passphrase again: パスフレーズ
Your identification has been saved in C:\Users\user_a/.ssh/id_ed25519  ... 秘密鍵
Your public key has been saved in C:\Users\user_a/.ssh/id_ed25519.pub  ... 公開鍵
The key fingerprint is:
SHA256:P1***************************************dk user_a@hostname
The key's randomart image is:
+--[ED25519 256]--+
|     .oo+=*O+    |
|     .oo=E* o.o o|
|     ...oB o o =+|
|       o* . = o *|
|      o+S. o.+ o+|
|       . ...... o|
|          +   o .|
|           o . . |
|                 |
+----[SHA256]-----+

ペア鍵はデフォルトでホーム(C:\Users\ユーザー名)の.sshフォルダに「”id_”+アルゴリズム名」というファイル名で出力します。このフォルダとファイルがデフォルトで参照される鍵になります。

秘密鍵は他者へ知られないよう厳重に管理してください。.sshフォルダのアクセス許可の範囲(ファイルバーミッション)を制限するのが良いでしょう!

また、秘密鍵は他者へ漏洩した場合を考慮して、パスフレーズによる暗号化が施されます。

ですので、ユーザ認証を行う際に、パスフレーズの入力が求められることになります。

鍵の参照先
OpenSSHにおいてデフォルトで参照される鍵は下記の通りです。

フォルダ:ユーザのホームの.sshフォルダ
       Windows ⇒ C:\Users\ユーザー名
       Linux   ⇒ ~/.ssh
ファイル:"id_" + アルゴリズム名

デフォルト以外の鍵を参照したければ、.ssh/configファイルで明示的に指定します。

Host bitbucket.org
  IdentityFile ~/.ssh/キーファイル名

公開鍵の登録

ユーザ認証で使用する公開鍵をサーバーへ登録します。

各々の階層(リポジトリ・プロジェクト・ワークスペース)に登録が可能です。登録された階層により、対象になるリポジトリの範囲が異なるので注意してください。

公開鍵の登録先対象になるリポジトリの範囲
リポジトリリポジトリのみ
プロジェクトプロジェクト以下のリポジトリ
ワークスペースワークスペース以下のリポジトリ
リポジトリへ登録プロジェクトへ登録ワークスペースへ登録
公開鍵をリポジトリへ登録
↓↓↓ 初回のみ表示 ↓↓↓

公開鍵を登録
公開鍵をプロヘクトへ登録
↓↓↓ 初回のみ表示 ↓↓↓

公開鍵を登録
公開鍵をワークスペースへ登録

「Add SSH key」ウィンドウが開くので、コピー&ペーストでKey情報を入力します。Labelは識別のための名前なので、任意な文字列を指定します。

公開鍵を登録

「Add SSH key」ボタンの押下で登録です。

公開鍵の登録後、ワークスペースの所有者宛にE-Mailで通知が届きます。

アクセスキー登録の通知

メモ:公開鍵の登録は誰がおこなう?
公開鍵の登録は管理者に依頼します。これが正当な方法です。管理者は安全な方法(鍵が漏洩しない方法、例:サーバーの設置場所に赴き、直結された管理端末から登録を行う、など)を使って登録を行います。

ですが…

個人の開発環境は、「管理者=ユーザー(開発者)」である事がほとんどです。結局のところ、ユーザ自身で行うことになります。

スポンサーリンク

クローン(Clone)の実施

リポジトリのクローンを行う方法は、次の2通りがあります。

WelcomパネルからFileメニューから
Welcomパネルからクローン
Fileメニューからクローン

「Clone」ボタンの押下でクローンが実行されます。

サーバー認証:FingerPrintの確認(始めてアクセスする場合)
クライアント(開発用のPC)がサーバ(リポジトリサーバ)へ始めてアクセスする時、ホスト認証でサーバーFingerPrintの確認が求められます。

サーバーFingerPrintの問い合わせ

FingerPrintはBitbuckerの「Configure SSH and two-step verification」に掲載されています。

「Yes」ボタンを押下で認証が成立します。

認証が成立すると、認証済みの公開鍵がknown_hostsファイルに登録されます。次回以降は、このファイルを参照して認証が行われるようになります。ですので、FingerPrintの確認は求められません。

ユーザー認証:パスフレーズの入力
クライアント(開発用のPC)がサーバ(リポジトリサーバ)へアクセスする時、毎回、ユーザ認証でユーザ鍵のパスフレーズの入力が求められます。

パスフレーズの入力

ペア鍵を作成した時に設定したパスフレーズを入力します。

ここで、「Remember」へチェックを行えば、Android Studio内にパスフレーズが記録(KeePassにより管理)できます。次回以降は、Android Studioがパスフレーズの入力を肩代わりしてくれるので、入力は求められません。

※KeePass:Android Studioで採用されているパスワードマネージャー

スポンサーリンク

プル(Pull)の実施

リモートリポジトリから最新の履歴が取得できます。

プルの実行

リポジトリのプルは「Git」メニューから行います。

リポジトリのプル(Pull)

「Pull」ボタンの押下でプルが実行されます。

リモートの定義

クローン後のAndroid Studioプロジェクトはリモートリポジトリが定義されています。

> git config --local  --list
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
submodule.active=.
remote.origin.url=git@bitbucket.org:gittestroom/sampleapp.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

ただし、クローンを行った時に指定したURLがそのまま定義されます。

ですので、リモートリポジトリへのアクセスは読み出し専用になっています。

スポンサーリンク

関連記事:

Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、ローカルリポジトリの構築とコミット(履歴の登録)の方法を紹介します。 ※環境:Android Studio Electric Eel | 2022.1.1 ※Git自体の説明は行いません。 ...
Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、リモートリポジトリの構築とアプリパスワードを使ったプッシュ(履歴の登録)の方法を紹介します。 ※環境:Android Studio Electric Eel | 2022.1.1 ※前提:ローカルリポジトリの構築済み ...
Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、アプリパスワードを使ったリモートリポジトリのクローン(コピー)とプル(履歴の取得)の方法を紹介します。 ※環境:Android Studio Electric Eel | 2022.1.1 ※前提:リモートリポジトリの構築済み ...
スポンサーリンク