公開鍵認証を用いたSSH接続

平成29年度より,情報センターが運用する遠隔接続向けサーバcc2000に対して学外よりSSH接続するには,公開鍵認証を用いた接続だけしか認められなくなった.

ここでは,Mac端末(及びLinux端末)より公開鍵認証を用いてcc2000へSSH接続する場合を例として説明する.

尚,情報理工学部が運用するGPU計算サーバ gdx 及び,ログインサーバ login での公開鍵認証についても同様の手順で設定できる.

公開鍵認証の概略

公開鍵認証とは,予め生成しておいた公開鍵と秘密鍵の対(鍵ペア)に基づき,遠隔接続要求を受けたサーバが接続を要求している 端末(ユーザ)に対して接続の可否を判断するものである.基本的に,秘密鍵はユーザが手元で利用している端末上で絶対に他者に漏れない ように秘匿するよう配慮し,一方,公開鍵は遠隔接続して利用したいホスト(リモートホスト)に「信頼できる手段」を用いて予め配置しておく. 公開鍵についても出来るだけ他者に対して秘匿しておくことが望ましい.

尚,「信頼できる手段」とは,例えばUSBメモリに公開鍵を書き込み,それを当該リモートホストに直接差して配置するといった方法を指し, 逆に「インターネットを経由したネットワーク転送」は全く信頼出来ない手段であることに注意しよう. 但し,本学のcc2000ホストでは一般学生がUSBメモリを接続するような利用は認められていないので,ここでは 次善の手段として「学内ネットワーク内に限ったネットワーク転送」を用いる. すなわち,遠隔接続させたい手元の端末(自分のパソコン)を学内へ持ち込んでネットワーク接続した状態で公開鍵を転送する, 或いは,公開鍵をUSBメモリに入れて持ち込み,情報処理教室など学内に設置されたパソコン設備より転送するといった方法を用いる.

秘密鍵が手元端末上に,また,公開鍵がリモートホスト上に,それぞれ所定の位置に配置されていれば,それらの鍵情報を用いて 接続端末(正確には利用者)の正当性が検証された上で,手元端末からリモートホストへSSH接続できるようになる.

公開鍵認証を使うための設定手順

鍵ペア生成アルゴリズムについて

公開鍵認証に用いる鍵ペアを生成するアルゴリズムは幾つか存在する.しかし,コンピュータの処理能力向上に伴い, 何れのアルゴリズムであっても,その安全性・秘匿性が月日の経過ととも担保されなくなる. 従って,最新の状況を勘案して,十分に安全なアルゴリズムを選択するよう 常に心がけておく必要がある. 2023年7月時点において概ね十分安全と考えられる推奨アルゴリズムは以下の2つである.

ここでは楕円曲線暗号に基づく公開鍵認証について説明する.

鍵ペアの生成

ターミナルを開き,以下のコマンドを実行して楕円曲線暗号方式(ECDSA 256方式)にて鍵ペアを生成する.

ssh-keygen -t ecdsa

以下のような表示が出力されるはずなので,指示に沿ってキーボード入力を行なう.赤字部分がキーボードよりタイプ入力すべき箇所だ.

Generating public/private ecdsa key pair.
Enter file in which to save the key (/Users/foobar/.ssh/id_ecdsa): (ここでは,そのままリターンキーをタイプ)
Created directory '/Users/foobar/.ssh'.
Enter passphrase (empty for no passphrase): (任意のパスフレーズを入力)
Enter same passphrase again: (上記のパスフレーズをもう一度入力)
Your identification has been saved in /Users/foobar/.ssh/id_ecdsa
Your public key has been saved in /Users/foobar/.ssh/id_ecdsa.pub
The key fingerprint is:
SHA256:o/Mnb3fTgX4+YusSc2wXwwkpr0H5Mm+vR+bowX341NU foobar@snow.cse.kyoto-su.ac.jp
The key's randomart image is:
+---[ECDSA 256]---+
|            . .  |
|           + o   |
|          . + o .|
|           + o =.|
|        S   B . E|
|       . . +.B.*o|
|      o     BoOo=|
|       o. o..=+Oo|
|        .=..=*Boo|
+----[SHA256]-----+
foobar@snow ~ % 

ここでパスフレーズとは鍵ペアを使う際の合言葉である.これにより,万が一,鍵ペアが他者へ漏洩する事態が起きても, その鍵を不正使用される事を防止する.パスフレーズについてはセキュリティ上の観点より使い回しは絶対に避けるべきなので, 公開鍵認証専用のもので十分に複雑で長いものを考えて使うようにすること.

また,端末としてノートパソコンを自分一人で専有して使用している場合には,敢えて意図的にパスフレーズ無しにて生成することも 技術的には可能ではあるが,その場合は秘密鍵が絶対に他者に漏洩しないよう十分に注意する必要がある.

尚,ssh接続の度にパスフレーズをタイプするのが面倒に感じるならば ssh-agent コマンドを用いればパスフレーズ入力無しもssh接続可能に 出来るから,各自の利用状況に合わせて検討してみると良いだろう.ssh-agentの使い方はGoogle検索されたし.

さて,生成された鍵ペアは標準では以下のディレクトリ位置に生成されているはずだ.

種類 パス位置 注意事項
秘密鍵 ~/.ssh/id_ecdsa 他者に絶対に漏れないよう注意すること!
公開鍵 ~/.ssh/id_ecdsa.pub こちらをリモートホスト上へ配置する

鍵ペアの暗号アルゴリズムの確認

SSHでの公開鍵認証において用いる鍵ペアを生成する暗号化アルゴリズムには RSA, DSA, ECDSAなどがあるが, macOSやLinuxで用いられているOpenSSHパッケージでは標準で鍵長2048ビットのRSAアルゴリズムが用いられる. 尚,現在のセキュリティ水準ではRSA暗号化なら2048ビット以上の鍵長であれば概ね十分とされている. ここで念のため,先ほど生成した鍵ペアの状態がECDSAアルゴリズムに基づくものである旨を確認しておこう.以下のコマンドを実行する.

ssh-keygen -l -f ~/.ssh/id_ecdsa.pub

恐らく次のようなメッセージが一行表示されるだろう.

256 SHA256:o/Mnb3fTgX4+YusSc2wXwwkpr0H5Mm+vR+bowX341NU foobar@snow.cse.kyoto-su.ac.jp (ECDSA)

このメッセージの先頭が鍵長,末尾の括弧内がアルゴリズムを表しており,上記の例では256ビットECDSA方式が用いられている事が 示されている.各自の実行結果も同様になっている事を確認しておこう.

公開鍵のリモートホストへの配置

適切な鍵ペアが生成出来たら,そのうち公開鍵だけをリモートホスト上へ信頼出来る手段を 用いて配置する.尚,リモートホスト上での公開鍵の配置位置は以下である.

~/.ssh/authorized_keys

ここでは,遠隔接続させたい端末がMacBookなどのノート型Macであるとして,学内へ持込んで無線LANなど学内ネットワークサービスに接続された状態になっていると想定する.

注意:

ここで,リモートホスト(例えばcc2000)に対して初めてアクセスする場合,以下のようなメッセージが表示されることに注意しよう.

The authenticity of host 'cc2000.kyoto-su.ac.jp (133.101.87.241)' can't be established.
RSA key fingerprint is SHA256:TxhNLOCONlJKoboyeIw0CiulRsxZ7JH9/vawgTLYHqo.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes yes <------- ここで yes とタイプ
Warning: Permanently added 'cc2000.kyoto-su.ac.jp' (RSA) to the list of known hosts.

これは,当該ホストが本当に接続を意図しているホストに間違いないかどうか,当該ホストの fingerprint (電子指紋)を表示して 確認を求めている事を意味している. 通常の場合,ホスト名(ドメイン名)が間違ってないことを再確認した上で yes とタイプすれば良い.

macOS Sierra 10.12以降の新しいmacOSを利用している場合

最近のmacOSには公開鍵をリモートホスト上へ転送して適切に配置してくれるユーティリティコマンド ssh-copy-id が用意されているので, そのコマンドをターミナル上で実行すれば良い.

その使い方は以下の通りである.

ssh-copy-id ユーザ名@リモートホスト名(ドメイン名)

ここで,リモートホスト名には情報センターのcc2000なので,その正式ドメイン名である cc2000.kyoto-su.ac.jp を指示し, また,ユーザ名には各自がcc2000にアクセスする際のユーザ名を指示する.

例えばユーザ名が foobar であるとすると,実行例は以下のようになる.

ssh-copy-id foobar@cc2000.kyoto-su.ac.jp
foobar@cc2000.kyoto-su.ac.jp's password: (ここでcc2000にログインするためのパスワードを入力)

ここで,鍵ペアの生成に用いたパスフレーズとcc2000にログインするためのパスワードを混同しないようにしよう.

リモートホスト名やログインパスワードを間違えていなければ公開鍵はリモートホスト上に適切に配置されるはずだ.

Mac OS X El Capitan 10.11以前を用いている場合

少し古いMac OS(El Capitan以前)では,上記のssh-copy-idコマンドが用意されていない.これでは少々不便なので以下に公開鍵を転送するためのユーティリティをディスクイメージ形式で用意したので,こちらを利用すると良いだろう. (注: このユーティリティは https://github.com/beautifulcode/ssh-copy-id-for-OSX より得たコードを参考にしている.)

公開鍵転送ユーティリティ

上記ディスクイメージをダウンロードし,それを開いてマウントすると以下のようなウィンドウが表示されるだろう.

この ssh-copy-id.command アイコンを開いて起動すると,新たにターミナルが開いてメッセージが表示されるので,それに従って操作する.

尚,このアイコンを開いて起動しようとした際,Mac OSのGatekeeper機能により,以下のダイアログが出て起動出来ないかもしれない.

その場合には上記ダイアログのOKボタンを一旦クリックして閉じてから,改めて ssh-copy-id.command アイコンを右クリックし直して表示されるコンテキストメニューから開くを選び,

本当に開いて実行して良いかどうか確認を求めてくるので開くをクリックする.

Mac OSのGatekeeper機能については,こちらのページを参照のこと.

さて,ユーティリティを起動して行なった操作例を以下に示しておく.やはり,赤字部分がキーボードよりタイプ入力すべき箇所だ.

Last login: Mon Jan 23 18:26:51 on ttys002
/Volumes/SSH公開鍵転送ユーティリティ/ssh-copy_id.command ; exit;
snow:~ foobar$ /Volumes/SSH公開鍵転送ユーティリティ/ssh-copy_id.command ; exit;
公開鍵の転送先を入力して下さい(例: username@cc2000.kyoto-su.ac.jp)
----> foobar@cc2000.kyoto-su.ac.jp
foobar@cc2000.kyoto-su.ac.jp's password: (ここでcc2000にログインするためのパスワードを入力)
------------------------------------------------------------------------
公開鍵のリモートホストへの転送が完了しました.

念のため,以下のコマンド
ssh foobar@cc2000.kyoto-su.ac.jp
にて公開鍵認証を用いてリモートホストへ遠隔ログイン出来ることを確認してください.

また,リモートホスト上の以下の公開鍵ファイルの内容を確認して
~/.ssh/authorized_keys
意図しない余分な公開鍵情報が記載されていない事も確認して下さい.
------------------------------------------------------------------------
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[プロセスが完了しました]

無事に公開鍵の転送が完了したら上記ユーティリティは不要なのでディスクイメージをアンマウントして削除して構わない.

また,上記メッセージに記載の通り,問題なく公開鍵認証にてSSH接続できたら,ホームディレクトリ配下の公開鍵ファイル ~/.ssh/authorized_keys に何か妙な記載が入り込んでないかどうかも確認したほうが良いだろう.その記載内容に誤りがあると公開鍵認証が上手く動作しないなどのトラブルの原因になり得る.

尚,リモートホスト名やログインパスワードをを間違えたりすると,以下のようなエラーメッセージが出るはずなので,何を間違えたのか十分に確認してからやり直すこと.

リモートホスト名を間違えた場合:

Last login: Wed Jan 25 17:29:07 on ttys002
snow:~ oomoto$ /Volumes/SSH公開鍵転送ユーティリティ/ssh-copy_id.command ; exit;
公開鍵の転送先を入力して下さい(例: username@cc2000.kyoto-su.ac.jp)
----> foobar@cc200.kyoto-su.ac.jp
ssh: Could not resolve hostname cc200.kyoto-su.ac.jp: nodename nor servname provided, or not known
----  エラーメッセージ  ----------------------------------------------------
公開鍵のリモートホストへの転送が適切に行なえなかったようです.
もう一度やり直す前にユーザ名や転送先ホストなどを良く確認して下さい.
------------------------------------------------------------------------
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[プロセスが完了しました]
ログインパスワードを間違えた場合:

Last login: Mon Jan 23 18:28:37 on ttys002
snow:~ foobar$ /Volumes/SSH公開鍵転送ユーティリティ/ssh-copy_id.command ; exit;
公開鍵の転送先を入力して下さい(例: username@cc2000.kyoto-su.ac.jp)
----> g1500001@cc2000.kyoto-su.ac.jp
g1500001@cc2000.kyoto-su.ac.jp's password:(ここで誤ったパスワードを入力してしまった!)
Permission denied, please try again.
g1500001@cc2000.kyoto-su.ac.jp's password:(ここでも誤ったパスワードを入力してしまった!)
Permission denied, please try again.
g1500001@cc2000.kyoto-su.ac.jp's password:(さらに誤ったパスワードを入力してしまった!)
Permission denied (publickey,password).
---- エラーメッセージ ----------------------------------------------------
公開鍵の転送が適切に行なえなかったようです.
もう一度やり直す前にユーザ名や転送先ホストなどを良く確認して下さい.
------------------------------------------------------------------------
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[プロセスが完了しました]

その他の場合

Linux環境でもssh-copy-idコマンドは使えるはずなので上記のmacOS Sierra 10.12以降を用いている場合と同様に操作すれば良いはずである.

しかし,Windows環境しかないなど何らかの理由でssh-copy-idコマンドが使えない場合は,以下の方針で公開鍵をリモートホスト上の所定位置へ配置すれば良い.

例えば,Windows環境を手元で使っている場合には,以下のサイトが参考になるだろう.

http://webkaru.net/linux/tera-term-ssh-login-public-key/

公開鍵認証の動作テスト

公開鍵がリモートホスト上に配置できたら,それを用いて正常に公開鍵認証が動作するかどうか確認しよう.

標準的には公開鍵認証が使える場合にはそちらが優先して使われるはずなので,単にcc2000へSSH接続を試みるだけで公開鍵認証が自動的に使われる. 但し,それは学内外を問わないので学内ネットワークからのアクセスであっても公開鍵認証が使われる事に注意すること.

また,接続した際にパスフレーズの入力を求められるはずだが,それは上記の鍵ペア生成時に用いたパスフレーズを使う必要があることに 注意すること.上記で述べた通り,頻繁にssh接続を利用する場合にパスフレーズの入力が煩雑と感じるなら,ssh-agentコマンドを活用する (こちらがお勧め)なり,セキュリティリスクを勘案した上でパスフレーズ無しで鍵ペアを生成するなどして欲しい.


Good Luck!

追伸:  上手く繋がらなくても,当方は質問は受け付けられません.cc2000へのアクセス時のトラブルは情報センターへ問い合わせましょう.

元のページへ戻る