Secure Shell(SSH)を使うと、コンピューター間で安全に暗号化された通信を行うことができ、解読はほぼ不可能です。macOSでの使い方をご紹介します。
パーソナルコンピュータが登場する以前は、コンピュータラボではメインフレームコンピュータに接続されたタイムシェアリング端末が使用されていました。各ユーザーは、メインフレームコンピュータに接続されたディスプレイとキーボードだけのダム端末の前に座っていました。その後、ミニコンピュータが登場し始めると、端末はネットワークを介して接続されるようになりました。
もともと、ネットワーク上の別のコンピュータにリモートアクセスするために、Telnetと呼ばれるプログラムが使用されていました。Telnetは最も初期のインターネットアプリケーションの一つであり、大学や研究機関で広く使用されていました。当時はまだほとんどの人がインターネットを利用しておらず、大規模なオンライン詐欺も問題になっていなかったため、セキュリティは問題視されていませんでした。
1990年代のインターネットの商業化は、それを一変させました。時が経ち、電子商取引の出現とともに、個人情報や金融データの交換は至る所で行われるようになりました。
Telnetは依然として機能していましたが、インターネットがあらゆる場所に普及した時代に、大きな欠陥がありました。それは、すべてのデータを平文で送受信してしまうことでした。これには個人情報や金融情報、そして最悪なことにパスワードも含まれており、ネットワークトラフィックを傍受している人なら誰でもパスワードを盗むことができるのです。
この問題を解決するために、1999 年にフィンランドの開発者 Tatu Ylonen が Secure Shell (SSH) を作成しました。SSH は、公開鍵インフラストラクチャ (PKI) と組み合わせた暗号化によって、安全でないネットワーク経由でデータを送受信するためのネットワーク プロトコルと UNIX ツールの両方です。
公開鍵インフラストラクチャ
コンピュータセキュリティにおいて最も解決が難しい問題の一つは、リモートユーザーの真正性をいかに保証するかです。ハッカーがユーザーになりすますために使用できる手法はいくつか存在し、サーバーや他のユーザーがなりすましによる不正アクセスを阻止することは困難です。
長くて推測しにくいパスワードでさえ、高性能なスーパーコンピュータなら解読される可能性があります。どんなに優れたパスワードでも安全ではありません。そして最悪なことに、パスワードは盗まれる可能性があります。
必要なのは、接続の両端で双方が検証でき、推測や解読が不可能なほど複雑で、盗難やなりすましが不可能な、より安全なものです。
このようなソリューションは、公開鍵基盤(PKI)にあります。PKIは複雑なトピックなので、ここでは詳しく説明しません。ただ、その仕組みを簡単にまとめておきます。
PKIの基本的な考え方は、コンピュータユーザーが公開鍵と秘密鍵のペアを生成するというものです。どちらの鍵もユーザーのみが知っているパスワードで保護されますが、鍵の使用にはパスワードは必要ありません。
鍵生成時に、アルゴリズムは各鍵内に暗号ハッシュと呼ばれる、暗号化された長いテキストブロックを生成します。秘密鍵はユーザーのコンピュータにファイルとして保存され、送信されたり、外部に公開されたりすることはありません。2つ目の鍵、つまり「公開鍵」には異なるハッシュが含まれますが、それでも秘密鍵と関連しています。
両方のキーをハッシュ解除して比較する方法を知っているのはアルゴリズムだけです。
したがって、与えられた鍵ペアの真正性を検証または否定できるのはアルゴリズムのみです。通信には常に両方の鍵が必要です。片方の鍵が欠けていると、もう片方の鍵は役に立たず、無効になります。
鍵ペアが確立されると、ユーザーは公開鍵をインターネット上に公開します。ユーザーの公開鍵ファイルは、検証のために他の人に渡すこともできます。ただし、ユーザーの秘密鍵はユーザーのコンピューターや所有物から決して持ち出されません。
ユーザーがPKIを使用してサーバーまたはサービスに接続しようとする場合、まずそのサービスの管理者に、サーバーまたはサービス上に存在する承認済み鍵リストに自分の公開鍵を追加するよう依頼します。このリストは、サーバーがユーザー認証時に使用できる、一種の検証済みユーザーリストとして機能します。
次に、ユーザーがリモートサーバーまたはサービスに接続しようとすると、接続元のアプリはユーザーのコンピューターから公開鍵を含むハンドシェイクを送信します。サーバーは既知の鍵のリストを確認し、同じ公開鍵が見つかった場合、要求元のコンピューターにチャレンジを送信します。「あなたの秘密鍵は何ですか?」
送信者が正当な人物であり、元の送信者と同じコンピュータである場合、サーバーはユーザーの秘密鍵を読み取り、暗号化し、ネットワーク経由で安全に送信します。サーバーは秘密鍵を受信すると、サーバー上で復号化し、ユーザーの公開鍵と秘密鍵の両方を逆ハッシュします。
アルゴリズムによってキー ペアが一致することが確認されると、ユーザーが認証され、ハンドシェイク確認が送信者に返され、暗号化された安全な接続が確立されます。
当然のことながら、これらすべてを総合すると、対応する秘密鍵がなければ通信は不可能になります。パスワードを送信する必要も、サーバーになりすます中間者攻撃もありません。リクエスト送信者は、サーバーから要求された際に秘密鍵を保有して送信するか、送信しないかのどちらかです。中間の選択肢はありません。
これがないと、サーバーは接続を拒否します。
この接続アクションのほとんどは透過的に実行されます。ユーザーが意識する必要もなく、意識する必要もありません。サーバーが気にするのは、接続リクエストが対応する秘密鍵を持つコンピューターから送信されたかどうかだけです。そうでない場合は、接続は拒否されます。例外はありません。
これらはすべて少し単純化しすぎていますが、本質的には PKI がどのように機能するかを示しています。
PKIには、使いやすく、煩わしさが少ないという利点もあります。一度設定してインストールすれば、PKI鍵ペアによってパスワードが不要になり、サーバーにログインするたびにパスワードを入力する必要がなくなります。ユーザーのIDは確実に保護され、パスワードは過去のものとなります。
MacでSSHを使用する
AppleのmacOSは完全なUNIXシステムであり、PKIをフルサポートしています。OpenBSDプロジェクトの一部であるOpenSSHを使用しています。macOSでは、独自のPKI鍵ペアを設定するのは非常に簡単です。鍵をMacにインストールすれば、直接アクセスする必要はほとんどありません。ほとんどの場合、鍵はバックグラウンドでアプリケーションによって自動的に使用されます。
macOSでは、SSH鍵は各ユーザーのフォルダ内の「.ssh」という隠しフォルダに保存されます。このフォルダは通常、セキュリティ上の理由から、Finderで非表示ファイルを表示しない限り、非表示になっています。PKI鍵をまだ生成していない場合、このフォルダはおそらく存在しません。鍵を生成する際にシステムによって作成されます。
macOSでPKI鍵ペアを生成する簡単な方法は2つあります。ターミナル、またはGPGToolsなどのサードパーティ製キーチェーンアプリを使用できます。
macOSターミナルでPKIキーペアを生成する方法
ターミナルに次のように入力します:
ssh-keygen -b 4096 -t rsaと入力し、Return キーを押します。
キー ファイルを保存する場所の入力を求めるプロンプトが表示され、ターミナルは「キーを保存するファイルを入力してください (/Users/username/.ssh/id_rsa)」と応答します。この時点で Return キーを押します。
次に、鍵ファイルに使用するパスワードの入力を求められます。ほとんどの場合、Returnキーを押すだけで済みます。必要に応じてパスワードを入力することもできますが、このパスワードは鍵交換には必要ありません。鍵ファイル自体にローカルで変更を加える場合にのみ使用されます。
一般的に、パスワードは PKI では冗長です。キー自体がセキュリティであり、すでに説明したように、パスワードは一般的に安全ではありません。
ssh-keygen UNIXコマンドは、鍵を生成するツールです。鍵生成には様々なオプションと設定があります。ターミナルで「man ssh-keygen」と入力してReturnキーを押すと、ssh-keygenのすべてのオプションが表示されます。
-b 4096オプションは、ssh-keygen に4096ビットの強力な鍵を生成するよう指示します。現在の世界のスーパーコンピュータの速度では、世界最速のスーパーコンピュータでも4096ビットの鍵を解読するには100年以上かかります。つまり、そのセキュリティは保証されているということです。
GPGToolsを使用してPKIキーペアを生成する方法
ターミナルを使ってキーを生成する代わりに、GPGToolsなどのサードパーティ製のキーチェーンアプリをダウンロードしてインストールすることもできます。ダウンロードしたら、インストーラーを実行します。インストーラーが終了したら、閉じて、アプリケーションフォルダにあるGPGキーチェーンアプリを開きます。
Macに以前に鍵がインストールされていない場合、GPG Keychainは鍵生成に使用するメールアドレスとパスワードの入力を求めます。適切な情報を入力し、「生成」をクリックします。数秒後、上記のssh-keygenと同様に、鍵ファイルが.sshフォルダに作成されます。
いずれにしても、ユーザーフォルダ内に.sshフォルダが作成されます。このフォルダ内には以下の5つの項目があります。
- authorized_keys (ssh が Mac への接続を承認できるようにするリモート ユーザー)
- config (ssh 設定情報)
- id_rsa(あなたの秘密鍵)
- i d_rsa.pub (あなたの公開鍵)
- known_hosts (Mac への接続を許可する既知のリモート サーバーのリスト)。
id_rsa.pub 鍵ファイルを TextEdit などのテキストエディタで開くと、公開鍵の後にローカルマシンのユーザー名とマシン名が表示されます。例:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFYeQoBHJD4aNtuJrClanz02mDC74O/qkVuWqMxSFqTohEB/o/E5eUYia+wPnSR HSo8W2aQo69wZusWXqSMIltjsvadsU51v0j1dw9f3pJNsOQEfOQhVq78HGti+crSI7R/1umbGHkLAUldpEEOhcOqFI+/3 UeXTX93SMd1VhD14k32blma8fwbzTY9AUx0osD7FOJWK/Wz7YDEuxjnFmrHUzuPmzDQQGjYR0S8FaO7ICSeoPIzic0ysgWjwcNtfQnDODEXkt+AhWeQUzIdFSMhrxjPDT5fVUbocPwNgCCtDLwnZ74MrFjgm0hARrN+IcyFXbSPkO4KCOOXl1J1n+H [email protected]
実際に、今すぐ実行してください。Users/~/.ssh フォルダーに移動し、テキスト エディターで id_rsa.pub を開いて、全体をコピーします。
公開鍵と秘密鍵は両方とも 2 つのファイルにテキストとして保存されるため、秘密鍵ファイルが侵害されないように注意してください。誰かがあなたの秘密鍵にアクセスした場合、その人はそれを別のコンピューターにインストールしてあなたになりすますことができます。
リモートサーバーへの送信接続だけを気にするのであれば、id_rsaとid_rsa.pub以外のファイルのほとんどは気にする必要はありません。他の3つのファイルは、通常、他のコンピューターからの受信接続リクエストを処理するためのサーバー設定で使用されます。ほとんどの場合、これらについて意識する必要はありません。
id_rsa ファイルと id_rsa.pub ファイルのバックアップをすぐに安全な場所に作成してください。
キーの設定が完了すると、.ssh フォルダーは次のようになります。
known_hosts ファイルは、SSH を使用して初めてサーバーに接続するまでシステムによって生成される場合と生成されない場合がありますが、そのファイルについては以下で説明します。
サーバー側
鍵が配置され、使用準備が整いましたので、接続先のサーバー/サービスでパスワードではなくPKIを使用するように設定する必要があります。設定方法は、サーバーホスティングサービスによって異なります。
ご利用のサーバーホストがcPanelまたは同様のウェブフロントエンドを提供しているウェブホスティングサービスの場合、通常、cPanel内に「セキュリティ」または「ターミナル」というセクションがあります。まずcPanelにログインし、「セキュリティ」パネルに移動してください。
次に、「SSH アクセス」をクリックし、「SSH キーの管理」ボタンをクリックします。
次に、「キーのインポート」をクリックします。
次のページで、上部のボックスにキーの名前を入力し (名前は重要ではありません)、公開キー フィールドに公開キーを貼り付けます。
通常、このフィールドには「公開キーを次のテキスト ボックスに貼り付けます」などのキャプションが表示されます。
秘密鍵のテキストボックスには何も貼り付けないでください。通常、このテキストボックスは「次のテキストボックスに秘密鍵を貼り付けてください」という名前になっています。
cPanelとウェブホストは技術的には安全ですが、リスクを冒したくはありません。そもそも、リスクを冒す必要はありません。コンピュータがSSHを使用してサーバーに接続しようとすると、サーバーはハンドシェイク時にローカルコンピュータに秘密鍵を要求します。
キー生成時にキーパスワードを入力した場合は、「パスフレーズ」フィールドに入力します。それ以外の場合は、このフィールドを空白のままにします。
次に、「インポート」ボタンをクリックし、「戻る」ボタンをクリックします。
公開鍵はcPanelとウェブホストにインポートされましたが、使用するには承認が必要です。cPanelの「公開鍵」ページに鍵が表示されますが、横に「未承認」と表示されます。「管理」ボタンをクリックしてください。
次のページで「承認」ボタンをクリックし、「戻る」ボタンをクリックします。前のページに戻ると、リスト内の公開鍵の横に「承認済み」と表示されているはずです。
接続先のサーバーがcPanelなどのウェブインターフェースを提供しておらず、ベアメタルアクセスのみを提供している場合は、サーバー管理者に連絡して公開鍵をインストールしてもらう必要があります。UNIXまたはLinuxサーバーでは、ほとんどの場合、sshd.confファイルとssh.confファイルでインストールされますが、サーバーのOSやサーバーソフトウェアによって手順が異なる場合があります。
接続中
キーがインストールされ、サーバーがキーの使用方法を認識したので、接続を試してみましょう。
ターミナル ウィンドウを開き、「ssh username@ip-address」と入力してReturn キーを押すと、ターミナルで接続をテストできます。
あるいは、「ssh username@domain-name」と入力してReturnキーを押すこともできます。
前者の場合はサーバーのIPアドレス、後者の場合はドメイン名が必要です。cPanelベースのシステムでは、ユーザー名は通常cPanel名と同じですが、ウェブホスティング会社によるサーバーの設定によっては異なる場合があります。
SSHが接続するデフォルトのUNIXポートは22ですが、多くのウェブホストプロバイダはセキュリティ上の理由からSSHポート番号を別の番号に変更しています。その場合は、ポート番号を確認し、sshコマンドの-pオプションを使用して指定する必要があります。例:
ssh -p 4612 ユーザー名@IPアドレス
-p コマンドの使い方について詳しくは、「ssh man」ページをご覧ください。ポート番号がわからない場合は、ウェブホストプロバイダーに問い合わせるか、オンラインナレッジベースに記載されているかどうかを確認してください。
上記のコマンドを実行すると、MacはサーバーとのSSHセッションを開始します。まずハンドシェイクが行われ、公開鍵が送信されます。サーバーはそれに応じてMacの秘密鍵を要求します。内蔵のSSH機構がディスクから秘密鍵を読み取り、レスポンスとしてサーバーに返します。
これらはすべて静かに起こります。
サーバーが2つのキーをデコードして検証し、一致が確認されると、Macに確認メッセージが送信されます。成功すると、ターミナルに次のような不可解なメッセージが表示される場合があります。
ホスト「example.domain.com (192.168.2.155)」の信頼性を確立できません。RSAキーのフィンガープリントは45:83:45:4a:e3:29:7e:fa:f3:c3:7d:64:ea:3a:6f:58です。接続を続行しますか?(はい/いいえ)
yes と入力して、Return キーを押します。
ターミナルには次のようなメッセージが表示される可能性があります:警告: 'example.domain.com,192.168.2.155' (RSA) が既知のホストのリストに永続的に追加されました。
この設定は、各サーバーにSSH経由で初めて接続する時のみ必要です。その後は、Macがそのサーバーの情報をローカルのknown_hostsファイルに追加します。次回同じSSH接続を開始する際は、まずknown_hostsファイルでサーバーを検索します。見つかった場合は、上記のメッセージは表示されずに接続されます。
SSH 接続を介して接続されると、ターミナルの両方のコンピューター間のすべての通信(入力したすべてのテキストとコマンドを含む)は、安全な暗号化された接続を介して送受信されます。
また、VPNを使用していて、海外から接続している場合、ウェブホストプロバイダがすべてのリモートSSH接続を拒否する場合がありますのでご注意ください。これは、海外のハッカーがウェブホストにアクセスするのを防ぐためです。このような場合は、VPNを無効にして再試行する必要があります。
VPN について話している間に、次のことについて話すのも良いでしょう...
SSHトンネリング
上記の例では、SSHトンネリングに基づく接続を作成しました。トンネリングとは、接続によって安全な「トンネル」が構築され、双方向のすべての通信が完全に暗号化されることを意味します。中間者攻撃者が通信を傍受したり、なりすましを行ったりした場合でも、2台のコンピュータ間で転送されるデータは完全に暗号化されたままです。
秘密鍵にアクセスできない限り、攻撃者はデータを復号化できません。
ほとんどの商用および無料VPNクライアントは、様々なポートでこのようなトンネリングを使用して、他国のVPNサーバーに接続します。実際、ほとんどのVPN接続では、セッションごとに多数のサーバー間でデータの送受信が行われます。ほとんどのVPNサーバー構成では、専用のSSHサーバーが別の場所に配置されていますが、SSHが同じVPNサーバー上に存在する場合もあります(これはセキュリティ上好ましくない慣行とされています)。
データがVPNを通過するにつれて、通信を盗聴している人がデータの発信元と送信先を特定することがますます困難になります。トンネリング暗号化により、セキュリティがさらに強化されます。
GUIアプリを使用したSSH接続
MacでSSHの真価が発揮されるのは、グラフィカルユーザーインターフェースを備えたネットワークアプリ(FTPクライアントなど)を使う時です。このような場合、ほとんどのアプリでは公開鍵を一度指定すれば、次回接続時にすぐに使えるようになります。パスワード入力もプロンプト表示も面倒な作業もありません。
すべてが舞台裏で行われるため、接続が簡単になります。
たとえば、Panic の優れた Transmit アプリには、接続ウィンドウに公開鍵ボタンがあります。
キーアイコンをクリックすると、小さなウィンドウが表示され、システムにインストールされている場合はデフォルトの公開キーが表示されます。
公開鍵をクリックすると設定され、接続ウィンドウの小さな鍵アイコンが緑色に変わります。
次に、サーバーのアドレス、カスタム SSH ポート(ある場合)、ユーザー名、およびアクセスするサーバー上のパスを入力します。
[接続]をクリックします。
すべてがうまくいけば、Transmit は接続し、パスワードの入力を求められることはありません。初回接続時には、GUI 版の「ホストの信頼性を確認できません」というメッセージが表示される場合がありますが、ダイアログで確認すると、上記のターミナルの例と同様に、サーバーの情報がknown_hosts ファイルに追加されます。
次回 Transmit で同じ接続を行うときには、パスワードやプロンプトなど何も表示されず、シームレスに行われるはずです。
すべての FTP データを安全に送受信するには、プレーン FTP ではなく SFTP プロトコルを使用する必要があります。
また、接続ウィンドウの設定を Transmit のお気に入りに保存しておけば、次回からはお気に入りリストから選択するだけですぐに接続できます。Transmit は毎回自動的にキーを記憶します。
Panic には、接続に SSH キーを追加するための簡単な説明ページがあります。
SSHはUNIXインフラストラクチャの強力な構成要素ですが、私たちはまだその表面をなぞったに過ぎません。SSHについて詳しく知りたい方は、O'Reillyの『SSH: The Secure Shell 』などの良書を参照してください。中古本はeBayで20ドル程度で見つかります。
SSHを使えば、パスワードを再度入力する必要がなくなるため、Macでのワークフローを高速化できます。設定には少し手間がかかりますが、鍵をインストールしてサーバーを設定すれば、今までSSHなしでどうやってやっていたのかと不思議に思うでしょう。