以前に、TeraTermで 公開鍵認証(鍵交換)を使ってSSH 接続してみる でTeraTerm を使った公開鍵認証(鍵交換認証)を行いました。
今回は、単純に クライアント用の ssh コマンドを使っって、公開鍵認証(鍵交換認証)にてSSH接続を行ってみます。
今回も、TeraTerm 時の接続時と同じように、公開鍵認証方式による鍵ファイル+パスフレーズ(パスワード)での認証について簡単に解説してみます。
- 目次
- 履歴
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 2048 Generating public/private rsa key pair. # ファイルの出力先、ファイル名ですが、ここではデフォルトのまま使用します。 Enter file in which to save the key (/home/hoge/.ssh/id_rsa): # パスフレーズを入力します。 Enter passphrase (empty for no passphrase): ********* # 再度、パスフレーズを入力します。 Enter same passphrase again: ********* 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 が、クライアント側、サーバー側で実行されたかは、あまり意味がありません。
クライアント側、サーバー側ぞれぞれに、以下のようにファイルを設置する必要があります。
- サーバー側 : 公開鍵(パブリックキー)
- クライアント側 : 秘密鍵(プライベートキー)
- 接続先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/ $ chmod 400 /home/hoge/.ssh/authorized_keys
サーバーで鍵を作成した場合は、単純にファイル名を変更するだけで良いと思います。
この時のファイル名authorized_keysは、SSHDのデフォルトの設定になっていますので、もし、sshd の設定を変更している場合は、その変更したファイル名を指定します。
もし、ファイル名を変更した場合は、sshd のリロードを実行します、$ vi /etc/ssh/sshd_config ... # 公開鍵の設置ファイル名を指定します。 AuthorizedKeysFile .ssh/authorized_keys ...
- クライアント側に 秘密鍵 を設定します。
サーバー側で鍵を作成した場合のみ、サーバーから秘密鍵をダウンロードし、クライアント側に設置します。
ダウンロードの際は、FTPを使わず、FTPS or SFTP or SCP を用いてダウンロードします。
# これは、SFTPの例です。 # サーバーのIPアドレス : 192.168.1.99 だとします。 # クライアント端末から以下のようにsftpコマンドを発行します。 # -ポートを指定する場合、-oPort=22 のようにオプションを追加します。 # -秘密鍵ファイルを指定する場合、-oIdentityFile=id_rsa のようにオプションを追加します。 $ sftp hoge@192.168.1.99 ... Connected to 192.168.1.99 sftp> pwd Remote working directory: /home/hoge sftp> cd .ssh sftp> ls authorized_keys id_rsa id_rsa.pub sftp> get id_rsa Fetching /home/hoge/.ssh/id_rsa to id_rsa /home/hoge/.ssh/id_rsa 100% 1743 1.7KB/s 00:00 sftp> bye
- 接続先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 restart 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.99 # 鍵作成時に設定したパスフレーズを入力します。 Enter passphrase for key 'id_rsa': ********* Last login: Thu Aug 1 07:11:54 2013 from client.example.com [hoge@example ~]$
上記のようにログインできればOKです。
以下のようなワーニングが出力されて、先に進めないことがあります。これは、単純に クライアント側の「秘密鍵 id_rsa のモードが誰でも読めるようになっているのでだめですよ。」という警告メッセージです。@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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).
これで上記の警告は出力されなくなるでしょう。# モードを 600 or 400 へ変更します。 $ chmod 400 id_rsa
以下のエラーは、いろんな場合が考えられるので、非常にやっかいです。
このエラーメッセージ自体は、「Permission denied」なので、拒否されたぐらいの意味でしかありません。$ ssh -p 22 -i id_rsa hoge@192.168.1.99 Enter passphrase for key 'id_rsa': Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
このエラーメッセージは、主に以下のような場合が考えられます。
- クライアント側の秘密鍵が正しく読めない(ファイル名とパーミッションを確認する)
- サーバー側の公開鍵が正しく読めない
- ファイル名がauthorized_keysでない
- ディレクトリが正しくない(ログインするユーザホームディレクトリの .ssh 配下でなければなならい)
- 各ディレクトリ、ファイルのパーミッションが正しくない(*1:参照)
- ユーザがsshdで規制されている
$ ls -l ~/.ssh 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
これ以外にも、いろんな場合が考えられます。
上記に当てはまらない場合は、デバッグ情報を確認されることをおすすめします。
-vvv オプションを追加するとデバッグ情報が出力されます。$ ssh -p 22 -i id_rsa hoge@192.168.1.99 -vvv ...
この設定により、ユーザ+パスワードのみ場合に比べて安全になることは間違いありません。 セキュリティの向上は、常に意識しておいて損はありませんから、是非、やっておきましょう。
また、おまけですが、お名前.com VPS(KVM) や ConoHa VPS では、SSH Private Keyファイルをダウンロードできます。
- SFTPでISOファイルをアップロードする場合
- SSH接続経由でシリアルコンソールへ接続する場合
但し、デフォルトOS(CentOS)の場合のみ使用できる鍵ですから、注意しましょう。カスタムOSや、ISOアップロードで好きなOSをインストール場合は、使えません。
ちょっと参考まで。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :