公開鍵認証による SSH接続の方法

SSH(Secure Shell)は、ネットワーク上の通信が暗号化されて行われるプロトコルで、安全にリモートコンピュータと通信することができます。SSHのインストール作業はサーバーで行いますが、導入後はリモートアクセスで作業する事が出来るようになります。

今回は、アカウント公開鍵認証でログインする方法を紹介します。
アカウントとパスワード認証よりセキュリティーが向上します。

SSHをインストール

// インストール
# apt-get install ssh

秘密鍵・公開鍵の作成

SSHでログインしたい一般ユーザーで、ssh-keygen コマンドを実行して秘密鍵・公開鍵を作成します。
※ 秘密鍵:id_rsa、公開鍵:id_rsa.pub

// 鍵作成
$ ssh-keygen -t rsa

// 出力内容
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa):
Created directory '/home/hoge/.ssh'.
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:
a8:a0:47:4a:fc:05:9b:03:4f:0d:6c:25:1e:43:bb:c9 hoge@hostname
The key's randomart image is:
+--[ RSA 2048]----+
|  o*..           |
|  .oB            |
| ..= .           |
|. = *  .         |
| ooE .. S        |
|.+..o.           |
|o ...            |
| .               |
|                 |
+-----------------+

■ 秘密鍵(クライアント側で使用)

/home/hoge/.ssh/id_rsa

■ 公開鍵(サーバー側で使用)

/home/hoge/.ssh/id_rsa.pub

公開鍵の登録(サーバー側)

作成された公開鍵から authorized_keys を作成します。

// 公開鍵を登録
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

// アクセス権変更
$ chmod 600 ~/.ssh/authorized_keys

// 公開鍵削除(不安であれば残しておいても良い)
$ rm ~/.ssh/id_rsa.pub

秘密鍵の登録(クライアント・Windowsの場合)

id_rsa(秘密鍵)を FTP などを使ってダウンロードして下さい。
秘密鍵の登録するには、フリーソフトの puttygen.exeを使います。

登録手順

(1) puttygen.exe の起動
(2) ファイル → 秘密鍵の読込 → 「ファイルの種類」 → 「全てのファイル」
(3) 手元に持ってきたid_rsa(秘密鍵)を選択
(4) パスフレーズ入力(先ほど入力した、SSHログイン用のパスワードを入力)
(5) 鍵インポートの確認 → OK
(6) 秘密鍵の保存

続いて、putty.exe に秘密鍵を登録します。PuTTYを使います。

(1) putty.exe の起動
(2) カテゴリ → 接続 → SSH → 認証 →「認証のためのプライベートキーファイル」
(3) 先ほど生成した秘密鍵を登録します。
(4) セッションに戻り、セッション情報の登録をして保存。
※この段階では、まだ鍵によるSSH接続はできません。SSH側で鍵認証を有効にする必要があります。

秘密鍵の登録(クライアント・Linuxの場合)

// id_rsa(秘密鍵)をSCPコマンドで取得して ~/.ssh に保存します。
$ scp hoge@コピー元サーバーIP:~/.ssh/id_rsa ~/.ssh

// どのサーバーの鍵か分かりやすいようにリネームします。
$ mv ~/.ssh/id_rsa ~/.ssh/hoge_rsa

// アクセス権変更
$ chmod 600 ~/.ssh/hoge_rsa

既に他の秘密鍵がある場合は、下記のように config を作成して登録します。
$ vi ~/.ssh/config を作成します。

IdentityFile ~/.ssh/user_rsa ← 追加:既にある秘密鍵
IdentityFile ~/.ssh/hoge_rsa ← 追加:今回登録する秘密鍵

SSHサーバー設定(鍵認証有効にする)

# vi /etc/ssh/sshd_config を修正します。
下記の sshd_config は既に修正済みです。

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile	%h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

// rootのログインを禁止。
PermitRootLogin yesPermitRootLogin no
// 公開鍵の保存場所を指定。
AuthorizedKeysFile %h/.ssh/authorized_keys
// パスワード認証を禁止(鍵認証で接続が成功してから禁止した方がいいと思います。)
#PasswordAuthentication yesPasswordAuthentication no

設定ファイルのチェック

// チェック
# /usr/sbin/sshd -t

----- OK例 -----
何も表示されなければOK。

----- NG例 -----
/etc/ssh/sshd_config line 81: Bad yes/no argument: yesi

SSHサーバーを再起動(設定反映)

// 再起動
# /etc/init.d/sshd restart

Windowsクライアントからのリモート接続

Windowsクライアントからリモート接続するには、フリーソフトのPuTTYを使います。PuTTY を起動して、ホスト名を入力して開くを押すとサーバーに接続する事が出来ます。

login as: hoge ← 秘密鍵を作成した一般ユーザー。
Authenticating with public key "imported-openssh-key"
Passphrase for key "imported-openssh-key": ******* ←  鍵を作成した時のパスワード

hoge@hostname:~$ su -
パスワード: ******* ← rootのパスワード

hostname:~# ← rootでログインされた。

最後に

生成された秘密鍵を紛失すると、SSHログインが出来なくなりますのでくれぐれもご注意ください。秘密鍵を無くしてしまったら、サーバーの端末を直接操作して、SSHサーバーのパスワード認証を有効にすれば、パスワードでリモート接続出来ます。VPSの場合は、事業者が用意している管理画面にコンソールがあれば、そこからサーバーに接続して同様の手段で対応できます。

読んで頂いて有り難うございます!