SSHで安全な通信経路を確立

投稿日:  更新日:

サーバーとクライアント間でデータを受け渡しする際に、安全な通信経路を確立する目的で、SSHが広く使われています。

Android Studio(Gitクライアント)とBitbucketまたはGitHub(Gitサーバー)間も、SSHが利用できます。

今回は「SSHの概要」を、まとめます。

※この記事は「Git:リポジトリのクローンとプル(SSH、Bitbucket編)」から「SSHとは」を分離したものです。加筆も行っています。

スポンサーリンク

SSHとは

SSHは「Secure SHell」の略です。正確には「プロトコル名」を指します。

本来は、リモートホストへログインして、リモート側でシェル(OSのユーザーインターフェース)を安全に使うための仕組みですが、パスワードなどの認証を含む全てのネットワーク上の通信が暗号化できることから、コンピュータ間の通信全般に使われるようになりました。

SSHの概要

スポンサーリンク

SSHプロトコル

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

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やGitHubなどのGitサーバーでは、「公開鍵認証」を用いて行われます。

ユーザー認証

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

スポンサーリンク

OpenSSH

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

OpenSSHのホームページ

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

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

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

スポンサーリンク

関連記事:

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を取り上げて、SSHを使ったリポジトリのクローン(コピー)とプル(履歴の取得)の方法を紹介します。 ※この記事に掲載していた「SSHとは」は、「SSHで安全な通信経路を確立」へ分離しました。 ※環境:Android Studio Electric Eel | 2022.1.1     OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3 ※前提:リモートリポジトリの構築済み ...
Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、アプリパスワードを使ったリモートリポジトリのクローン(コピー)とプル(履歴の取得)の方法を紹介します。 ※環境:Android Studio Electric Eel | 2022.1.1 ※前提:リモートリポジトリの構築済み ...
Android Studioで採用されている、パスワード管理ツール「KeePass」について、まとめます。 ※環境:Android Studio Narwhal 3 Feature Drop | 2025.1.3 ...
Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、リモートリポジトリの構築とGitHubアカウントを使ったプッシュ(履歴の登録)の方法を紹介します。 BitbucketよりGitHubの方がシンプルで使い易いかも... ※環境:Android Studio Narwhal 3 Feature Drop | 2025.1.3     Git version is 2.50.1 ※前提:ローカルリポジトリの構築済み ...
Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、トークンを使ったリモートリポジトリのクローン(コピー)とプル(履歴の取得)の方法を紹介します。 BitbucketよりGitHubの方がシンプルで使い易いかも... ※環境:Android Studio Narwhal 3 Feature Drop | 2025.1.3     Git version is 2.50.1 ※前提:リモートリポジトリの構築済み ...
Android StudioはVCS(Version Control System:バージョン管理システム)を使って、プロジェクトの変更履歴の管理が可能です。 Android Studioで利用可能なVCSはいくつかありますが、Gitを取り上げて、SSHを使ったリポジトリのクローン(コピー)とプル(履歴の取得)の方法を紹介します。 BitbucketよりGitHubの方がシンプルで使い易いかも… ※環境:Android Studio Narwhal 3 Feature Drop | 2025.1.3     Git version is 2.50.1     OpenSSH_for_Windows_9.5p2, LibreSSL 3.8.2     Windows 11 Pro 24H2 ※前提:リモートリポジトリの構築済み ...
スポンサーリンク