公開鍵認証(鍵交換)を使ってSSH 接続してみる

クライアント用の ssh コマンドを使っって、公開鍵認証(鍵交換認証)にてSSH接続を行ってみます。

開鍵認証方式による鍵ファイル+パスフレーズ(パスワード)での認証について簡単に解説してみます。

目次 ssh コマンド で 公開鍵認証を使ってSSH 接続してみる 履歴 2013.8.1 初版

ssh コマンド で 公開鍵認証を使ってSSH 接続してみる ssh-keygen コマンドで、SSH鍵を作成します。 SSH鍵は、ssh-keygen コマンドで作成することができます。 SSH2に対応した、DSAとRSAの両方の鍵を作成できます。 ここでも先のTeraTerm時と同じように 2048ビットのRSA 鍵を使ってみます。(SSH1対応のRSA1ではないので注意してください。)

2048ビットのRSA鍵ファイルを作成します。

$ ssh-keygen -t rsa -b 2048return Generating public/private rsa key pair.

ファイルの出力先、ファイル名ですが、ここではデフォルトのまま使用します。

Enter file in which to save the key (/home/hoge/.ssh/id_rsa): return

パスフレーズを入力します。

Enter passphrase (empty for no passphrase): *********return

再度、パスフレーズを入力します。

Enter same passphrase again: *******return Your identification has been saved in /home/hoge/.ssh/id_rsa. Your public key has been saved in /home/hoge/.ssh/id_rsa.pub. The key fingerprint is: 5c:42:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:e1:c8 hoge@example.com The key's randomart image is: +--[ RSA 2048]----+ | ... ..o+| | . . ....| | . . .....| | . . . ...| | . . .| | | | | | | | | +-----------------+ 上記の例では、/home/hoge/.ssh/ 配下に 公開鍵 : id_rsa.pub 秘密鍵 : id_rsa が作成されます。 ssh-keygen は、デフォルトでは、ログインユーザの ホームディレクトリ/.ssh/ に各鍵ファイルが作成します。 ssh-keygen が、クライアント側、サーバー側で実行されたかは、あまり意味がありません。 クライアント側、サーバー側ぞれぞれに、以下のようにファイルを設置する必要があります。 サーバー側 : 公開鍵(パブリックキー) クライアント側 : 秘密鍵(プライベートキー) TeraTermなどのクライアントソフトでも鍵を作成できます。 TeraTermでの作成方法は、こちら を参照してください。

接続先SSHサーバー側に 公開鍵 を設定します。 ssh-keygen で作成した公開鍵 を接続先SSHサーバー側にコピーします。 設定するファイル名は、

/ユーザホーム/.ssh/authorized_keys

で作成します。 ここでは、hoge という名前のユーザで解説してみます。

/home/hoge/.ssh/authorized_keys

ssh-rsa AA........PQ== hoge@example.com 公開鍵は、単純なテキストファイルなのでコピー&ペーストでファイルを作成してもOKです。また、SFTPなどでアップロードしてもOKです。 コピーを終えたら、公開鍵の権限を所有者のみ読み込み可(400)とします。 $ chown -R hoge. /home/hoge/.ssh/return $ chmod 400 /home/hoge/.ssh/authorized_keysreturn サーバーで鍵を作成した場合は、単純にファイル名を変更するだけで良いと思います。 この時のファイル名authorized_keysは、SSHDのデフォルトの設定になっていますので、もし、sshd の設定を変更している場合は、その変更したファイル名を指定します。 $ vi /etc/ssh/sshd_configreturn ...

公開鍵の設置ファイル名を指定します。

AuthorizedKeysFile .ssh/authorized_keys ... もし、ファイル名を変更した場合は、sshd のリロードを実行します、

クライアント側に 秘密鍵 を設定します。 サーバー側で鍵を作成した場合のみ、サーバーから秘密鍵をダウンロードし、クライアント側に設置します。 ダウンロードの際は、FTPを使わず、FTPS or SFTP or SCP を用いてダウンロードします。

これは、SFTPの例です。

サーバーのIPアドレス : 192.168.1.99 だとします。

クライアント端末から以下のようにsftpコマンドを発行します。

-ポートを指定する場合、-oPort=22 のようにオプションを追加します。

秘密鍵ファイルを指定する場合、-oIdentityFile=id_rsa のようにオプションを追加します。

$ sftp hoge@192.168.1.99return ... Connected to 192.168.1.99 sftp> pwdreturn Remote working directory: /home/hoge sftp> cd .sshreturn sftp> lsreturn authorized_keys id_rsa id_rsa.pub sftp> get id_rsareturn Fetching /home/hoge/.ssh/id_rsa to id_rsa /home/hoge/.ssh/id_rsa 100% 1743 1.7KB/s 00:00 sftp> byereturn

接続先SSHサーバーの SSHの設定を変更します。 接続先SSHサーバーの SSHの設定を 公開鍵認証を可とし、パスワードによる認証を不可とします。 /etc/ssh/sshd_config

...

プロトコルバージョンを2固定とします。

Protocol 2 ...

rhost RSA認証を不可にします。

RhostsRSAAuthentication no

host based 公開鍵認証を不可にします。

HostbasedAuthentication no

/etc/ssh_known_hosts または ~/.ssh/known_hosts を無視します。

IgnoreUserKnownHosts yes

rhost を無視します。

IgnoreRhosts yes ...

RSA認証を不可にします。

RSAAuthentication no

公開鍵認証を可にします。

PubkeyAuthentication yes

公開鍵の設置場所をユーザディレクトリ配下の .ssh/authorized_keys にします。

AuthorizedKeysFile .ssh/authorized_keys

公開認証時のコマンドは実行しません。

AuthorizedKeysCommand none

公開認証時のコマンド実行時のユーザは、nobodyとします。

AuthorizedKeysCommandRunAs nobody ...

パスワード認証を不可とします。

PasswordAuthentication no

空パスワードを不可とします。不要なのでコメントアウトします。

PermitEmptyPasswords no

... ここでは、念のため不必要な認証は、すべて不可にしています。 ここで最小限必要な項目は、以下のものです。

PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no 設定を終えたら、sshd の再読み込みか、再起動します。

$ /etc/init.d/sshd restartreturn sshd を停止中: [ OK ] sshd を起動中: [ OK ]

sshコマンドを使って接続してみます。 ここまで設定を終えたら、sshコマンドを使って接続してみます。

サーバーのIPアドレス : 192.168.1.99 だとします。

クライアント端末から以下のようにsshコマンドを発行します。

-ポートを指定する場合、-p 22 のように指定します。

秘密鍵ファイルを指定する場合、-i id_rsa のように指定します。

$ ssh -p 22 -i id_rsa hoge@192.168.1.99return

鍵作成時に設定したパスフレーズを入力します。

Enter passphrase for key 'id_rsa': *********return Last login: Thu Aug 1 07:11:54 2013 from client.example.com [hoge@example ~]$ 上記のようにログインできればOKです。 以下のようなワーニングが出力されて、先に進めないことがあります。 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for 'id_rsa' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. bad permissions: ignore key: id_rsa Permission denied (publickey,gssapi-keyex,gssapi-with-mic). これは、単純に クライアント側の「秘密鍵 id_rsa のモードが誰でも読めるようになっているのでだめですよ。」という警告メッセージです。

モードを 600 or 400 へ変更します。

$ chmod 400 id_rsareturn これで上記の警告は出力されなくなるでしょう。 以下のエラーは、いろんな場合が考えられるので、非常にやっかいです。 $ ssh -p 22 -i id_rsa hoge@192.168.1.99return Enter passphrase for key 'id_rsa': Permission denied (publickey,gssapi-keyex,gssapi-with-mic). このエラーメッセージ自体は、「Permission denied」なので、拒否されたぐらいの意味でしかありません。 このエラーメッセージは、主に以下のような場合が考えられます。 クライアント側の秘密鍵が正しく読めない(ファイル名とパーミッションを確認する) サーバー側の公開鍵が正しく読めない ファイル名がauthorized_keysでない ディレクトリが正しくない(ログインするユーザホームディレクトリの .ssh 配下でなければなならい) 各ディレクトリ、ファイルのパーミッションが正しくない(1:参照) ユーザがsshdで規制されている (1) $ ls -l ~/.sshreturn drwx------ 2 hoge hoge 4096 8月 1 10:16 2013 .ssh

/home/hoge/.ssh: -rw-r--r-- 1 hoge hoge 421 8月 1 10:16 2013 authorized_keys

これ以外にも、いろんな場合が考えられます。 上記に当てはまらない場合は、デバッグ情報を確認されることをおすすめします。 $ ssh -p 22 -i id_rsa hoge@192.168.1.99 -vvvreturn ... -vvv オプションを追加するとデバッグ情報が出力されます。

うまく接続できたでしょうか。 この設定により、ユーザ+パスワードのみ場合に比べて安全になることは間違いありません。 セキュリティの向上は、常に意識しておいて損はありませんから、是非、やっておきましょう。

また、おまけですが、お名前.com VPS(KVM) や ConoHa VPS では、SSH Private Keyファイルをダウンロードできます。 お名前.com VPS(KVM) SFTPでISOファイルをアップロードする場合 SSH接続経由でシリアルコンソールへ接続する場合 に使えます。また、デフォルトOSの場合は、VPSへの root による SSH接続 のためにも使用できます。(ConoHaでは、デフォルトでこの鍵認証になります) 但し、デフォルトOS(CentOS)の場合のみ使用できる鍵ですから、注意しましょう。カスタムOSや、ISOアップロードで好きなOSをインストール場合は、使えません。 ちょっと参考まで。