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