公開鍵認証とsshコマンドの使い方

SSHの公開鍵認証でサーバーにリモートログインする方法について紹介します。クライアントOSはMacです。

作業の流れ

大まかな作業の流れは以下の通りです。

  • クライアント側
    • ssh-keygenコマンドで秘密鍵、公開鍵の生成
  • サーバー側
    • 公開鍵を登録
    • sshの設定調整
  • クライアント側
    • sshコマンドでサーバーにリモートログイン

秘密鍵、公開鍵の生成|クライアント側

ssh-keygen -t rsa -b 4096 -C "comment"

commentのところには任意のコメントを入力してください。

鍵の種類
SSH1プロトコル RSA1
SSH2プロトコル RSA、DSA(RSAのほうが強度が高い)
$ ssh-keygen -t rsa -b 4096 -C "comment"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa): ←秘密鍵のファイル名を入力
Enter passphrase (empty for no passphrase): ←パスフレーズを入力
Enter same passphrase again: ←パスフレーズを入力
Your identification has been saved in /home/xxxx/.ssh/id_rsa.
Your public key has been saved in /home/xxxx/.ssh/id_rsa.pub.
The key fingerprint is:
e9:c9:a6:d5:d1:89:13:95:db:d8:18:64:f1:c1:bb:ec comment
The key's randomart image is:
+--[ RSA 4096]----+
|           .=+.  |
|           oo... |
|          .  B.. |
|         . ++.+  |
|        S + o. . |
|       o o o  o  |
|        * .  .   |
|       +      E  |
|      .          |
+-----------------+

秘密鍵のファイル名を指定しないで作成すると、
秘密鍵( ~/.ssh/id_rsa )と公開鍵( ~/.ssh/id_rsa.pub )が生成されます。

パスフレーズを入力すると、秘密鍵の暗号化が行われます。
SSH接続するたびにパスフレーズの入力が必要になります。

公開鍵の登録|サーバー側

作成した公開鍵をサーバーに設置します。
まず、今回新たにリモートログインするユーザを追加します。

ここでは、例として testuser を追加します。

$ sudo useradd testuser
$ sudo passwd testuser
Changing password for user testuser.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

次に、testuserの公開鍵を作成します。

$ su testuser
Password: 
$ mkdir /home/testuser/.ssh
$ vi /home/testuser/.ssh/authorized_keys

クライアント側で作成した公開鍵ファイルの内容をサーバーの /home/testuser/.ssh/authorized_keys に書き込みます。

authorized_keys は、testuserの権限で読み込みできないとリモートログインできないので権限設定します。

$ chmod 700 /home/testuser/.ssh
$ ls -la /home/testuser | grep ssh
drwx------  2 testuser testuser 4096 Aug 12 05:29 .ssh
$
$ chmod 600 /home/testuser/.ssh/authorized_keys
$ ls -l /home/testuser/.ssh/authorized_keys
-rw------- 1 testuser testuser 733 Aug 12 05:29 /home/testuser/.ssh/authorized_keys

上記設定を忘れると、SSH接続するときクライアント側で下記エラーがでます。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

サーバー側で下記エラーがでます。

Authentication refused: bad ownership or modes for directory /home/testuser/.ssh

SSHの設定|サーバー側

公開鍵認証でログインできるようにSSHを設定します。
root権限になり、/etc/ssh/sshd_config を編集します。

su -
vi /etc/ssh/sshd_config
#Port 22
⇒ Port 適当な番号

#PermitRootLogin yes
⇒ PermitRootLogin no

#PubkeyAuthentication yes
⇒ PubkeyAuthentication yes

#AuthorizedKeysFile     .ssh/authorized_keys
⇒ AuthorizedKeysFile     .ssh/authorized_keys

PasswordAuthentication yes
⇒ PasswordAuthentication no

ポートはデフォルト(22)のまま利用すると攻撃を受けやすくなるので、適当に変更します。

設定ファイルの編集が完了したら、sshdを再起動します。

/etc/init.d/sshd restart

sshコマンドの使い方|クライアント側

ssh [オプション] ホスト名 [コマンド]
ssh -p ポート番号 testuser@192.168.0.100 -i 秘密鍵のパス

-pオプション でポート番号を指定します。22番以外のポート番号であれば指定します。

-iオプション で秘密鍵を指定します。秘密鍵を指定しない場合、 ~/.ssh/id_rsa が利用されます。

ログインに失敗する場合は、 /var/log/secure を確認します。
「SELinux」や「iptables」が原因で接続に失敗する場合があります。

~/.ssh/config

sshのオプションをいちいち入力するのが面倒な場合、~/.ssh/config を利用します。
例えば ~/.ssh/config に次のように記述します。

Host web
 HostName 192.168.0.100
 Port 44422
 User testuser
 IdentityFile ~/.ssh/xxx.key

~/.ssh/config のパーミッションを変更します。

chmod 600 .ssh/config

すると以下2つのコマンドが同じ動きをします。

ssh web
ssh -p 44422 testuser@192.168.0.100 -i ~/.ssh/xxx.key

scpコマンドの使い方|クライアント側

scpコマンドを利用すると、ssh接続でファイルのやりとりができます。

ローカル → サーバー

scp ./tmp.txt -i 秘密鍵のパス hoge@192.168.0.100:~/

サーバー → ローカル

scp -i 秘密鍵のパス -r hoge@192.168.0.100:~/tmp ./tmp