SSHの公開鍵認証の設定

カテゴリ:SSH

CentOS/Ubuntu 両対応

公開鍵暗号方式について

SSHを安全に使用するためには、ユーザー名、パスワードでのログインは無効にし、公開鍵認証のみでログインできるように構成することが推奨されています。

公開鍵認証を設定したクライアントではSSHへの接続時にユーザー名、パスワードの入力が求められずに直ちにログインできます。
公開鍵暗号方式の大きな特徴は「公開鍵で暗号化したデータはペアになる秘密鍵でしか復号化できない、逆に秘密鍵で暗号化したデータもペアになる公開鍵でしか復号化できない」という点です。
この仕組みにより公開鍵暗号方式は成り立っているのです。

SSLで暗号化されたデータはたとえ傍受されたとしても、暗号化に使用した公開鍵とペアになる秘密鍵でなければ復号化出来ません。
公開鍵認証では、公開鍵はサーバー側に置き、秘密鍵はクライアント側に置きます。

また、認証に使用する公開鍵と秘密鍵のペアの内、秘密鍵はクライアント(自分のPC)しか持っていないため、ユーザー名、パスワードによる認証のように他人に盗まれたり、成りすましされることがありません。
逆に言えば、安全を担保するためには、家の鍵と同様に秘密鍵は絶対に盗まれない(漏洩されない)ように管理する必要があります。

公開鍵と秘密鍵のペアを生成する方法

SSHの公開鍵認証を設定する場合、クライアント側で公開鍵と秘密鍵を生成してVPSに公開鍵を設定する方法と、VPS側で用意された(生成した)秘密鍵をSSHクライアントに設定する方法の2つの方法があります。どちらの方法で設定しても問題ありません。ペアとなる鍵の内、VPS側には公開鍵、クライアント側には秘密鍵があればよいのです。

関連 Mac環境ですぐに公開鍵認証を設定したい場合はこちらの記事をご参照ください。

VPS側でSSH鍵が用意されている場合

標準OSをインストールしている場合など、VPS側でSSH鍵が用意されている場合は、すでに鍵認証が設定されているため、コントロールパネルから秘密鍵をダウンロードしてクライアント側に設定します。

VPS側でSSH鍵が用意されていない場合

カスタムOSをインストールしている場合など、VPS側でSSH鍵が用意されていない場合は、以下の手順でクライアント側で鍵のペアを作成します。

ここではクライアント側で公開鍵と秘密鍵を生成する方法を解説します。

SSHクライアントソフトウェア側での生成

puTTY や Tera Term 等のSSHクライアントソフトウェアで鍵のペアを生成します。
例えば puTTY の場合は以下の手順で生成できます。

  1. puttygen.exeを起動し、[生成] をクリックすると、マウスを動かし乱数を生成すると作成されます。
  2. 必要に応じてパスフレーズを設定した上で、生成する鍵の種類が「SSH-2 RSA」になっている事を確認の上、公開鍵を「id_rsa.pub」、秘密鍵を「id_rsa」のファイル名でそれぞれ保存します。

ssh-keygenコマンドでの生成(MacやLinux等)

必要に応じてsuコマンドでrootユーザーに切り替えます。

以下のコマンドで秘密鍵と公開鍵を作成します。
パスフレーズの入力を求められるので2回入力します。

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
...

秘密鍵(id_rsa )と公開鍵(id_rsa.pub)が作成されます。

# cd .ssh/
# ls
id_rsa  id_rsa.pub

クライアント側の操作はこれで終了です。

次にVPSに公開鍵のファイル「authorized_keys」をSSHで接続するユーザーの ~/.ssh 配下に保存または、既存の「authorized_keys」に公開鍵を追記します。

VPSにクライアントで生成した公開鍵を設定する方法

公開鍵をVPSに持っていく一般的な方法は以下となります。

まず、VPS側に ~/.ssh ディレクトリが存在しない場合、事前準備として SSH 等で対象ユーザーで VPS にログインした上で、.ssh ディレクトリを作成しておきます。

# mkdir ~/.ssh

scpコマンドが使用できるクライアントの場合(MacやLinux等)

scpコマンドでVPSに公開鍵をアップロードします。

  • VPSにauthorized_keysがない場合(直接ファイルをコピー):

    $ scp ~/.ssh/id_rsa.pub ユーザー名@IPアドレス:~/.ssh/authorized_keys
    
  • VPSにauthorized_keysが既にある場合(既存のファイルに追記):

    $ scp ~/.ssh/id_rsa.pub ユーザー名@IPアドレス:/home/hoge
    

VPS側で公開鍵をauthorized_keysに追記します。

# cat id_rsa.pub >> /root/.ssh/authorized_keys

VPS側でコピーした公開鍵のパーミッションを変更します。

# chmod 600 ~/.ssh/authorized_keys

scpコマンドが使用できないクライアントの場合(Windows等)

公開鍵と秘密鍵を生成した後、puttygenの「OpenSSHのauthorized_keysファイルにペーストするための公開鍵」に表示されている公開鍵の内容をコピーし、VPSにSSHで接続し、viコマンドで以下のファイルを開きます。

vi ~/.ssh/authorized_keys

コピーしておいた公開鍵をペーストして保存した後、パーミッションを変更します。

# chmod 600 ~/.ssh/authorized_keys

また、ホームディレクトリのパーミッションを 755 にしておきます。

# chmod 755 /home/hoge

設定を反映させるためにsshdを再起動します。

# systemctl restart sshd

VPS側のSSHの公開鍵認証の設定

初期設定では /etc/ssh/sshd_config の PubkeyAuthentication がコメントアウトされているので、コメント(#)を外します。
変更前:

#PubkeyAuthentication yes

変更後:

PubkeyAuthentication yes

設定を反映させるためにsshdを再起動します。

# systemctl restart sshd

SSHクライアントに秘密鍵を設定する方法

ここではVPS側で用意された秘密鍵をSSHクライアントに設定する方法を解説します。

まず秘密鍵をクライアントマシンでダウンロードします。

puTTYの場合

  1. puttygen.exe を起動し、[読込] をクリックし、秘密鍵を指定してインポートします。
  2. 必要に応じてパスフレーズを入力した上で [秘密鍵の保存] より秘密鍵を保存します。
  3. puTTYでのログイン時に、puTTYの設定の [SSH] > [認証] を開き、[参照] から秘密鍵を指定します。
  4. ホスト名を入力して接続します。
  5. ログインするユーザーを入力すると、パスフレーズを聞いてくるので入力します。
login as: root
Authenticating with public key "imported-openssh-key"
Passphrase for key "imported-openssh-key":

これで公開鍵認証による安全なログインが行えます。

MacやLinuxのコンソールの場合

VPSのコントロールパネルから秘密鍵をダウンロードした場合は、コンソールを開き、秘密鍵を ~/.ssh 配下に置きます。

$ cp vpsxxxxx-001.key ~/.ssh

パーミッションを変更します。

# chmod 600 ~/.ssh/vpsxxxxx-001.key

SSHのconfigファイルを作成し秘密鍵を指定します。

# vi ~/.ssh/config
IdentityFile ~/.ssh/vpsxxxxx-001.key

SSHコマンドで接続します。

$ ssh root@hoge.com

公開鍵認証のみに制限する方法

初期設定では /etc/ssh/sshd_config の PasswordAuthentication がコメントアウトされているので、コメント(#)を外し、no を指定します。
変更前:

#PasswordAuthentication yes

変更後:

PasswordAuthentication no

設定を反映させるためにsshdを再起動します。

# systemctl restart sshd

もし秘密鍵を持たないSSHクライアントからログインを試みた場合、以下のように「Permission denied」となり拒否されます。

$ ssh root@linux-svr.com
The authenticity of host 'linux-svr.com (118.27.5.3)' can't be established.
ECDSA key fingerprint is SHA256:iBBqqAKENC0H5ffmwD8LqaLfpYjpJFL7Sd8oXdpJ8P0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'linux-svr.com' (ECDSA) to the list of known hosts.
root@linux-svr.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

公開日時:2014年07月19日 12:02:01
最終更新日時:2024年03月23日 23:48:26

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

SSHに戻る

このページのトップに戻る