公開鍵暗号の準備

Published

January 25, 2025

Abstract
多くのスーパーコンピュータは,リモートログインにあたってSSH(Secure SHell) の公開鍵認証という方式を採用しています.ここでは,その概略と接続のための準備を説明します.

SSHとその認証

SSH (Secure SHell) とは,暗号技術を用いてネットワーク越しのコンピュータに安全に接続するためのプロトコル(方式)のことです.SSHを用いると,手元にないコンピュータに接続し,操作を行うことができます.しかも,その操作でやり取りされる通信内容はすべて暗号化されるという特徴があります.

SSHであるサーバ remote_host(IPアドレス xxx.xxx.xxx.xxx)に接続するには,

$ ssh username@remote-host

あるいは

$ ssh -l username remote-host

とします.サーバ名の代わりにIPアドレスを用いることもできます.接続元のコンピュータでログイン中のユーザー名と接続先におけるユーザー名が異なる場合には,接続先のユーザー名を明記しなければいけません.スーパーコンピュータの多くでは,ユーザー名は自分で選ぶことができず,記号の羅列からなるユーザー名が割り当てられます.

Tip

$ はプロンプト記号であり,入力しません.

公開鍵認証方式

SSHでは,まずネットワーク越しのサーバに接続を試み,アカウントの 認証 をしてログインをします.このときの認証にはいくつかの方法がありますが,主要な方法としてパスワード認証方式と公開鍵認証方式があります.手元のパソコンにログインするときには多くの場合にパスワード認証が利用されていますが,リモートログインにおいてはより安全な公開鍵認証方式の利用が主流です.

公開鍵認証とは,公開鍵と,その公開鍵とペアで生成された 秘密鍵 の2つの鍵ファイル(データ)を用いる認証方式で,ネットワーク上のサーバにログインするための方式として広く用いられています.これらの鍵は,電子署名 を作成し,検証することに用いられます.ある秘密鍵で作成された電子署名は,その秘密鍵とペアで生成された公開鍵によって正しいものであると検証することができます.公開鍵認証方式では,この特徴を用いて,以下のような手続きで認証が行われます.以下では,接続元(手元)のコンピュータを A,接続先(リモート)のコンピュータを B とします.

  1. A において,セットになった公開鍵と秘密鍵を生成する.秘密鍵は A の特定の場所に保管し,自分のアカウント以外では閲覧できない状態にしておく.
  2. 1.で作成した公開鍵を何らかの方法で B の特定の場所に配置する.これを公開鍵を 登録 すると表現する.
  3. 接続の際,A はログインに必要な情報とともに,秘密鍵で生成した署名を B に送信する.
  4. B は受信した署名をあらかじめ登録されていた公開鍵によって検証し,それが正しければ認証成功とする

この方式では,秘密鍵やパスワードそのものはAから外部に送信されません.しかも署名は再利用ができない仕組みです.したがって,上記の通信でパスワードや秘密鍵を盗むことはできず,署名を盗んだとしても再利用できないのです.こうして,安全な接続が確保されています.

実際の接続の際に 3.と4.の手続きは自動的に行われますので,ユーザーがそれを意識したり煩雑な操作をする必要はありません.一方,1.と2.の手続きは初回接続の際にユーザーが行う必要があります.

秘密鍵・公開鍵の作成

以下では,接続元のPCはLinuxやmacOS,あるいはWindows Subsystem for Linux (WSL) のように,Linux(あるいはそれに類する)シェルが使える環境にあることを前提とします.WindowsでWSLを使わずにTera TermやPuttyなどのソフトウェアによって接続する方法はここでは扱いません.

接続元のPCで端末を立ち上げて,

$ cd 
$ ls -a .ssh/id_rsa*

とします.

no such file or directory と出れば(つまり,ファイルがなければ)OKです.

もし id_rsa.pub id_rsa の2つのファイルが表示されたら,公開鍵は作成済みです.作成をスキップするか,あるいは心当たりがなければ rm コマンドで消して,再作成してください.あるいは,別の名前で作成して,.ssh/config ファイルを適切に設定することで,接続先に応じて公開鍵・秘密鍵を使い分けることもできます.

そのうえで,以下のコマンドを実行します.

$ ssh-keygen -t rsa
Enter file in which to save the key (/Users/USERNAME/.ssh/id_rsa): 

のように訊かれます(USERNAME は自分のユーザー名)ので,そのままEnterします.続けて,

Enter passphrase (empty for no passphrase):

とでます.パスワードを入力する画面ですが,公開鍵はそれ自体がある程度のセキュリティを持っていますので,パスワードなし,でも構いません(ただし自己責任).心配なら自分でパスワードを考えて入力しましょう.

Enter same passphrase again: 

と表示されますので,パスワードを入力したのなら同じパスワードを,パスワードなしを選んだのならそのままEnterを入力します.

そうすると,画面にいくらか表示がでて,パスワードの秘密鍵ファイル id_rsa と,公開鍵ファイル id_rsa.pub.ssh/ 以下に作成されます.ls -l すると以下のように表示され, 秘密鍵 id_rsa が自分以外にアクセスできないように自動的に設定されていることがわかります.

$ ls -l ~/.ssh
total 72
-rw-r--r--@ 1 username  group   1274  1 19 13:38 config
-rw-------  1 username  group   2610  2  3  2023 id_rsa
-rw-r--r--  1 username  group    575  2  3  2023 id_rsa.pub
Warning

公開鍵と秘密鍵は鍵と錠前のような関係があります. 公開鍵は外部のサーバに登録する,文字通り公開されるものです. 一方,秘密鍵ファイルは外部に漏らしてはいけません

公開鍵の登録

初回の登録

スーパーコンピュータに公開鍵を登録する方法は,それぞれのスーパーコンピュータで個別の仕組みが用意されています.自分のアカウントでログインできるWebシステムから登録するのが一般的なようです.各システムのマニュアルを参照してください.なお,本Webでも各スパコンの解説で説明しています.

複数台の登録

いったんあるPCから公開鍵を登録し,そこから接続できるようになってしまえば,2台目以降の登録は接続設定済みのPC経由で行えます.

すでに接続設定済みのコンピュータを A, あらたに接続したいマシンを A2, 接続先を B とします.A2 において秘密鍵 id_rsa と 公開鍵 id_rsa.pub を作成したら,A から A2 にリモートログインするなどして,A2 の公開鍵の内容(文字列)を Aのクリップボードにコピーしておきます. そのうえで,A から Bに接続し,B のホームディレクトリ(~)の下の ~/.ssh/authorized_keys というファイルに公開鍵の内容を追記します.authorized_keys ファイルには,すでに設定済みの A の公開鍵も含まれていますから,その後ろで改行して新しい行をつくり,そこにペーストします.Aの公開鍵を間違って削除しないように注意してください.

Tip

コマンドラインから使えるエディタに覚えがなければ, nano コマンドが便利です.最小限の機能をもつテキストエディタで,GUIではありませんが,利用方法のショートカットが常に画面下部に表示されるため,はじめてでも問題なく使えるでしょう.なお,メニューにある ^ctrl キーのことです.^X とあったら,ctrlキーを押しながらXキーを押す,ということを意味します.

これで登録は完了です.このように,公開鍵認証では,接続先の ~/.ssh/authorized_keys ファイルに記載された公開鍵が用いられます.

このページで説明した公開鍵認証の仕組みは,スーパーコンピュータへの接続に限りません.sshで接続できるサーバであれば,authorized_keys ファイルに公開鍵を登録することでパスワード認証のかわりに公開鍵認証を利用できます.

configファイルによる接続設定

SSHでは, ~/.ssh/config というファイルによって,接続のデフォルト設定を行うことができます.たとえば以下のように記述します.

Host (略称)
     HostName (接続ホスト名)
     User (接続ユーザー名)
     IdentityFile ~/.ssh/id_rsa
     ForwardX11 yes

括弧つきの日本語で書かれているところは適宜半角英数字で適切な値に置き換える必要があります(その際括弧は不要です).この設定があれば,

ssh (略称)

とするだけで接続できます.スーパーコンピュータの多くではユーザー名が記号で与えられるため,configファイルに設定しておくと楽になるでしょう.上記の IdentityFile を変更すると,接続先によって秘密鍵を使い分けることもできます.