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 の場合は以下の手順で生成できます。
- puttygen.exeを起動し、[生成] をクリックすると、マウスを動かし乱数を生成すると作成されます。
- 必要に応じてパスフレーズを設定した上で、生成する鍵の種類が「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の場合
- puttygen.exe を起動し、[読込] をクリックし、秘密鍵を指定してインポートします。
- 必要に応じてパスフレーズを入力した上で [秘密鍵の保存] より秘密鍵を保存します。
- puTTYでのログイン時に、puTTYの設定の [SSH] > [認証] を開き、[参照] から秘密鍵を指定します。
- ホスト名を入力して接続します。
- ログインするユーザーを入力すると、パスフレーズを聞いてくるので入力します。
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