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

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

ここでは,Mac端末(及びLinux端末)より公開鍵認証を用いてcc2000へSSH接続するための設定について説明する.

公開鍵認証の概略

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

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

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

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

鍵ペアの生成

ターミナルを開き,以下のコマンドを実行する

ssh-keygen

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

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/foobar/.ssh/id_rsa): (ここでは,そのままリターンキーをタイプ)
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_rsa.
Your public key has been saved in /Users/foobar/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Z234dnmifami11qIo+Lq/hoePM9VnOXbPTlZT4gO6OU foobar@snow.cse.kyoto-su.ac.jp
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|           .     |
|        ..+o . . |
|        S+*.+ . o|
|  .    ..=.=+ .o=|
|   =   ..oEo=o+*+|
|  . *.. . .+.= ++|
|  o*==.. .o.+.o. |
+----[SHA256]-----+

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

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

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

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

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

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

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

2048 SHA256:KouzXpEB+4fvbkktn3dSQNT2mCZqF7ph9CMXZaogWHo foobar@snow.cse.kyoto-su.ac.jp (RSA)

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

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

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

~/.ssh/authorized_keys

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

注意:

以下の操作ではリモートホストへSSH接続が行われる事になるが,そのリモートホスト(例えばcc2000)に対して初めてアクセスする場合,以下のようなメッセージが表示されるだろう.

The authenticity of host 'cc2000.kyoto-su.ac.jp (133.101.87.240)' can't be established.
RSA key fingerprint is SHA256:gbGQmUesGOXa/Arm1rcX/NK8G93Qak22nc82uRiC8VY.
Are you sure you want to continue connecting (yes/no)? yes <------- ここで yes とタイプ
Warning: Permanently added 'cc2000.kyoto-su.ac.jp,133.101.87.240' (RSA) to the list of known hosts.

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

macOS Sierra 10.12以降を用いている場合

この場合,公開鍵をリモートホスト上へ転送してくれるユーティリティコマンド 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接続を試みるだけで公開鍵認証が自動的に使われる.但し,それは学内外を問わないので学内ネットワークからのアクセスであっても公開鍵認証が使われる事に注意すること.

また,接続した際にパスフレーズの入力を求められるはずだが,それは上記の鍵ペア生成時に用いたパスフレーズを使う必要があることに注意すること.


Good Luck!

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

元のページへ戻る