公開鍵認証によるサーバSSH接続

公開鍵認証によるSSH接続

サーバへのSSH接続で、セキュリティ面でパスワード認証よりも推奨されている公開鍵認証の概要と、
Mac環境のクライアントで実現するための手順をまとめていきます。

公開鍵認証の概要

公開鍵認証は公開鍵暗号方式という暗号化技術を利用した認証方式です。

鍵ペアの作成

まず、接続を行うクライアント側で公開鍵と秘密鍵と呼ばれる鍵のペアを作成し、公開鍵の方を接続するサーバー側へ登録しておきます。

認証に必要となる公開鍵と秘密鍵からなる鍵ペアはクライアント側、サーバ側どちらで作成しても問題ありません。

ただ、秘密鍵の方は接続元となるクライアント(ユーザ本人)しか持つことが許されないため、サーバへの不正侵入などによる万が一のリスクを考えて最初からクライアント側で作成して保存しておくことが無難でより安全だと言えます。
(秘密鍵は他人に知られてはいけません)

接続時にクライアント側だけで保存する秘密鍵とサーバー側の公開鍵を称号し、
電子署名という仕組みによって接続の正当性が確かめられます。

ディジタル署名によるなりすましの検知

接続時にクライアント側(ユーザ)が鍵ペアのうちの秘密鍵によって作成したディジタル署名という署名データを、サーバが鍵ペア作成時に登録しておいたクライアントの公開鍵で復号できるかによって、許可されたユーザ本人であるかどうかを確認します。

これは、サーバに保存してあるクライアントの公開鍵で署名を復号できたということはクライアントが送信してきた署名データは間違いなくクライアントが持つ秘密鍵から生成されたものだと証明できるためです。(クライアントは秘密鍵を持っている正当なユーザである)

同じSSH接続でも、パスワードそのものを認証に使用するパスワード接続方式と違い、鍵認証の場合は秘密鍵から生成した流用困難なディジタル署名を認証に使用するので、より安全性が高い接続方式となります。

ディジタル署名の流用が困難である理由

SSHによるクライアント・サーバ通信ではセッション識別子と呼ばれる、認証ごとに生成される一意なIDがディジタル署名に含まれるため、例え悪意を持った利用者に奪われてしまったとしても流用することは困難ということになります。

共通鍵暗号方式による通信の暗号化

公開鍵認証は前述のとおり、公開鍵暗号方式を基盤とするディジタル署名の仕組みによって、利用者のなりすましとデータ改ざんを検知しますが、第三者からの盗み見を防ぐための、通信経路の暗号化に関しては共通鍵暗号方式という暗号化技術が用いられています。

こちらは、公開鍵と秘密鍵のペアを利用する公開鍵暗号方式とは違い、暗号化用と復号化用で同じ鍵を用いる暗号化技術であり、公開鍵暗号方式と比較して、処理速度が早いというメリットがあるために採用されています。

また、この共通鍵暗号方式で用いられる鍵データ自体は、SSH2という規格により、公開鍵と秘密鍵の鍵ペアをクライアントとサーバがお互いに持っていることで、自動的に生成される仕組みとなっています。

Mac環境での鍵ペア作成とサーバ接続の手順

Mac環境でサーバへの公開鍵認証を実現する手順を解説します。

環境 : (クライアント)Mac OS X, (サーバ) CentOS 7

認証鍵ペアを作成する

Macの場合、標準のターミナルから ssh-keygen コマンドで公開鍵・秘密鍵のペアを作成することが出来ます。
$ ssh-keygen -t rsa

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ken/.ssh/id_rsa):         
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/ken/.ssh/id_rsa.
Your public key has been saved in /Users/ken/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EvAb0Oa4PBr+ON5Ag3GYjAVUgPSnt3AEZseUwjGrlEc ken@KENnoMacBook-ea
The key's randomart image is:
+---[RSA 2048]----+
|===E*+.          |
|++*o=*o          |
|=+.+.*+          |
|.+o = .+         |
|..o+ +o S        |
| ...B ..         |
| ..o o           |
|  ++             |
| .ooo            |
+----[SHA256]-----+

鍵を作成する場所(デフォルトではホーム配下の不可視ディレクトリ.ssh)と
鍵を使用するためのパスフレーズを設定して実行すると公開鍵・秘密鍵のペアが作成されます。

鍵の名前はデフォルトで、公開鍵が「 id_rsa.pub」、秘密鍵が「 id_rsa 」となります。
(rsa方式の場合)

※鍵の名前はssh-keygenコマンドの -fオプション で任意で決めることも出来ます。

公開鍵を接続先へコピーする

作成した認証鍵のうち、.pubの拡張子がついた公開鍵を接続先のサーバへコピーします。
サーバへ保存する方法はSFTPに対応したクライアントソフトを使用する等の方法もありますが、ここではそのままターミナルからSCPコマンドを使用して接続先のサーバへコピーする方法を紹介します。

SCPコマンドはSSHの仕組みを使用してファイル転送を行うためのコマンドです。

$ scp .ssh/id_rsa.pub XXX.XX.XXX.XX:/home/ken

scp  ローカル上の公開鍵の保存パス 接続先ホスト名(ipアドレス): (コロン)コピー先のディレクトリ

※sshのポート番号を変更している場合は、-Pオプションでポート番号を指定します。
(sshコマンドと違い、大文字のPとなります)

ポート番号 10022の場合
$ scp -P 10022 .ssh/id_rsa.pub XXX.XX.XXX.XX:/home/ken

コピー先に指定する場所は接続先サーバー内のhome配下ログインするユーザアカウントのディレクトリを指定しています。
(コマンド実行時にアカウントのパスワードを入力します)

$ scp .ssh/id_rsa.pub XXX.XXX.XX.XXX:/home/ken
ken@XXX.XXX.XX.XXX's password: 
id_rsa.pub              100%  401     3.9KB/s   00:00

コピーした公開鍵を認証用のファイルに書き込む

scpコマンドでサーバーへ公開鍵のコピーが完了したら、
公開鍵の内容を認証用ファイル .ssh/authorized_keys に書き込む必要があります。

※ /etc/ssh/sshd_config ファイルの AuthorizedKeysFile の項目で決められています。

一度サーバーへSSH接続します。(パスワード認証)

$ ssh ken@XXX.XX.XXX.XX
ken@XXX.XX.XXX.XX's password:

公開鍵のコピーがちゃんと出来ているかも確認しておきます。

[ken@(remotehost) ~]$ ls
id_rsa.pub
ホームに.sshディレクトリを作成する(無い場合)

$ mkdir .ssh

.sshディレクトリの権限を編集する
$ chmod 700 .ssh/

公開鍵を.ssh/authorized_keysに書き込む

$ cat id_rsa.pub >> .ssh/authorized_keys
authorized_keysというファイルが同時に作成されます

.ssh/authorized_keysの権限を編集する
$ chmod 600 .ssh/authorized_keys

公開鍵認証での接続を確かめる

サーバの接続を一度切ってから、公開鍵認証(以降、鍵認証)による接続が出来るようになったかを確かめます。

秘密鍵の権限を確認・変更する

(接続を行う前に)
接続先の .ssh/authorized_keys と同様、クライアントの秘密鍵もアクセス権が広すぎるとssh接続のキーとして使用出来ませんので権限を変更します。

秘密鍵の権限を変更する
$ chmod 600 .ssh/id_rsa

秘密鍵の権限を確認する
$ ls -l .ssh/id_rsa

sshコマンドで接続

sshコマンドの -iオプションで秘密鍵のパスを指定します。

$ ssh -i .ssh/id_rsa ken@XXX.XX.XX.XX
ssh -i 秘密鍵のパス ユーザ名@ホスト名

キーペア作成時に設定したパスフレーズを入力して接続出来れば鍵認証成功です。
(パスフレーズはサーバ接続に対するパスワードではなく、クライアントに秘密鍵の使用許可を通すための合言葉のようなものです)

$ ssh -i .ssh/id_rsa ken@XXX.XX.XX.XX
Enter passphrase for key '.ssh/id_rsa': 
Last login: Mon Jul 15 18:56:31 2019 from .....jp
[ken@XXX.XX.XX.XX ~]$
パスフレーズの入力を省略するには

キー接続時にパスフレーズを毎回入力しないで済むように設定します。
クライアント側で ssh-add コマンドを実行し、キーに設定したパスフレーズを入力します。

$ ssh-add .ssh/id_rsa
ssh-add (キーのパス)

パスワードによるSSH接続を禁止する

鍵認証による接続が成功したらパスワード認証によるSSH接続が出来ないようにサーバ側で設定します。

注意
こちらを行うと鍵認証以外の接続の手段が無くなってしまいますので
必ず鍵認証による接続が成功した後に行ってください。

(サーバへ接続)

rootユーザに切り替えて ※ /etc/ssh/sshd_configの内容を変更します。
※ssh_configファイルの方ではありません

# vi /etc/ssh/sshd_config

(Vi INSERTモード)

PasswordAuthentication の行を探し、コメントアウトを外してnoに変更します。

(変更前)#PasswordAuthentication yes
(変更後)PasswordAuthentication no

編集、保存が完了したらSSHサービスを再読み込みして設定を反映させます。
# systemctl reload sshd.service

パスワードによるログインが不可となっていれば設定完了です。

パスワード認証を優先したい場合

鍵認証を設定するとSSH接続時にパスワード認証よりも優先されます。
パスワード認証を禁止にしていない状態であれば以下の方法で公開鍵認証よりも優先して行うことが出来ます。

$ ssh -o PubkeyAuthentication=no ken@XXX.XX.XX.XX

参考
http://www.unixuser.org/~euske/doc/openssh/book/chap3.html
https://blog-and-destroy.com/20453

Follow me!