Windows10からLinuxへのSSHに安全性の高いSSH公開鍵認証を設定

win10-sshd-pubkey

Photo by Philipp Katzenberger on Unsplash

Linux系のサーバーOSへリモートログインするためにSSHを利用している環境は多いと思います。最近ではtelnetのように平文で通信するプロトコルでリモートログインする環境はセキュリティ面から全く見なくなりました。現状では暗号化された通信を利用するSSHプロトコルでサーバーへリモートログインすることが殆どです。
現在リモートログイン用プロトコルのスタンダードどなったSSHですが、セキュリティと運用面を考えるとよく利用されているパスワード認証より公開鍵と秘密鍵(キーペアと呼ばれます)による公開鍵認証を利用することがお勧めです。

公開鍵認証はサーバー側に公開鍵を配置、クライアント側は秘密鍵ファイルを利用して認証を行います。この方式では秘密鍵ファイルを持つクライアントのみが接続を許可されるため、従来のパスワード認証と比較して辞書攻撃(プルートフォース攻撃)などにも強くなります。
AWSなどのクラウドサービスではSSHは公開鍵認証でログインすることが推奨されており、デフォルトで公開鍵認証が設定されています。
本記事では日常的に利用しているSSHの認証方式について、もう一度、見直してみる意味も含めて、SSHの公開鍵認証を設定する手順を紹介していきます。
SSHでの接続先はLinuxが多いと思いますが、接続元であるするクライアント環境はLinux、MacOS、Windowsと複数のプラットフォームがあるので、まずは一番多く利用されていると思われるWindowsクライアントからの設定から紹介していきます。
参考 macOSとLinuxクライアントでの公開鍵認証設定手順は記事

Linux
ssh-pubkey-linux-top2
Linux CentOS 7から安全性の高いSSHの公開鍵認証を設定して接続を行う

SSH接続設定として公開鍵認証を設定する手順を紹介した前回の記事 では接続用クライアントとしてWindows10を利用している環境を前提としている内容でした。今回はLinuxのクライアントから公開鍵認証によるSSH接続の設定手順を紹介したい ...

macOS
ssh-pubkey-mac-top
macOSを使っているエンジニア向け ターミナルで安全性の高いSSH公開鍵認証を設定する

こんにちは、ITエンジニアの小村(@system_kom)です。 エンジニアのみなさん「SSH」使ってますか。聞かれるまでもなくバリバリ使ってますよね。 僕も大げさではなく、毎日使っています。リモートでLinuxやルーターに接続してメンテナ ...

で紹介しています。環境に併せて参考にしていただければ幸いです。

1. 公開鍵認証を設定する環境について

  • 接続先であるOSはLinuxを想定しています。ディストリビューションはCentOSにしました。バージョンは7.6です。
  • CentOSではOpenSSH Serverが稼働しています。(デフォルトで動作しています)
  • CentOSのIPアドレス/ホスト名は192.168.241.215:centos7を設定しています。
  • SSHで接続するクライアントOSはWindows10になります。
  • SSH接続で利用するソフトウェアはTera Term (TTSSH2)です。
  • 公開鍵認証のキーペアはTera Termの[SSH鍵生成]機能で作成します。

WindowsクライアントでSSH公開鍵認証を設定する、大まかな作業手順としては

  1. Tera TermのSSH鍵生成でキーペア(秘密鍵と公開鍵の組み合わせ)を作成します。
  2. 作成した公開鍵を接続先サーバーのホームディレクトリに配置します。
  3. sshdの設定を変更して公開鍵認証を利用するように設定します。
  4. 公開鍵認証を利用してSSH接続テストを行います。
  5. SSH接続ができた場合にはパスワード認証を拒否する設定します。

上記の設定手順について次章以降から詳細に説明していきます。

2. キーペアの作成

SSHの公開鍵認証を利用するためには秘密鍵と公開鍵がペアになったキーペアを作成する必要があります。OSがLinuxの場合にはコマンドから作成ができますが、Windowsではデフォルトで作成する方法が無いので別途、アプリケーションを導入します。
本記事ではSSH接続用クライアントであるTera Termをインストールして、実装されている機能「SSH鍵生成」でキーペアを作成します。Tera Termのバージョンは2019年5月時点で最新バージョンである4.102を利用しています。

Tera Termは以下のウェブサイトからダウンロードして下さい。(セキュリティ面から最新バージョンを利用をお勧めします。)

Tera Termプロジェクト日本語トップページ OSDN

exeかzipファイルをダウンロードしてWindowsマシンにインストールすることで特別な設定なく利用できますので、導入方法については割愛してTera Termが利用できる環境になっていることを前提に進めていきます。

作成するキーペアのパラメーターは以下を前提としています。
暗号化方式についてはRSAより強固な暗号化技術であるECDSAを利用して、SSH2用ECDSA(521bit)鍵を生成します。

  • 暗号化方式はECDSA
  • 秘密鍵ファイルの名前 id_ecdsa (デフォルト)
  • 公開鍵ファイルの名前 id_ecdsa.pub (デフォルト)
  • パスフレーズ 任意のものを設定

このパラメーターを基にキーペアを作成します。

2-1. Tera Termの起動

キーペアを作成するためにTera Termを起動します。起動すると以下のような画面が表示されます。

ssh-pubauth-2-1

一旦、[キャンセル]をクリックします。

2-2. 秘密鍵と公開鍵のキーペア作成

Tera Term上部のメニューから[設定]-[SSH鍵生成]を選択します。

ssh-pubauth-2-2-1

TTSSHの鍵生成画面が表示されます。
鍵の種類を選択します。RSAは古い暗号化技術になりますので、本記事ではより強固なキーペアを作成できる暗号化技術であるECDSAを選択します。ビット数は521bitで作成しますので、[ECDSA-521]をチェックします。

ssh-pubauth-2-2-2

[生成]ボタンをクリックすると、キーペアが作成されます。
画面中央に[鍵を生成しました。]と表示されればキーペアは作成されています。

ssh-pubauth-2-2-3

続いて鍵のパスフレーズとコメントを設定します。

2-3. コメントの設定

公開鍵には区別を付ける為に任意でコメントを含めることができます。本記事ではコメントについて
接続先マシンのホスト名-key-日付
という命名規則で付けます。本環境の場合は "centos7-key-20190513" を指定しています。

2-4. 秘密鍵へのパスフレーズ設定

コメントの設定後、必要に応じてパスフレーズを入力します。
パスフレーズは秘密鍵に設定するパスワードになります。秘密鍵が流出した場合などに、悪用されないように設定します。
パスフレーズの設定は任意で、秘密鍵の管理が出来ていれば不要です。
パスフレーズを設定すると、秘密鍵を利用する際にパスフレーズの入力が必要になりますので、利便性とのトレードオフになります。本記事では秘密鍵が流出する可能性も考えて、パスフレーズを設定します。
[鍵のパスフレーズ] と [パスフレーズの確認]に同じものを入力します。

ssh-pubauth-2-4-1

両方を入力して[秘密鍵の保存]をクリックすると、秘密鍵の保存先を選択する画面になります。任意の保存先を選択して秘密鍵のファイル名を入力、[保存]をクリックすると、作成した秘密鍵ファイルが保存されます。

ssh-pubauth-2-4-2

本記事ではデフォルトの"id_ecdsa"ファイル名で秘密鍵を保存しました。

ssh-pubauth-2-4-3

2-3. 秘密鍵の内容

項目.2-2で作成された秘密鍵ファイルの内容は以下のようになります。(内容を変えてありますので、利用できません)

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABBOaaGUmB
cTYjOL6dV6k+KXAAAAEAAAAAEAAACsAAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlz
dHA1MjEAAACFBADiK7PGoky0xqYd7QDIpr40nhuaPCb2gEEHsCVSszIy9+KoF+YUKcNjGX
uW8RYtVCO0HQUY755OT*************Db+5bCGU2FRAMfN9cGYZrUixg0CCeDa3PsXytH
7iHF+jSIDJv1nPJlEU68TOd3mHprMSuwtcCCAWd1SsM+5VHEVgAAARB8zxIORDSpKxWASZ
QS0E9C+3ahppQkLu3MmuAvykYrWaIV7MRaNY2LDA/XP9ZjicV7buytRaOY9f1sRFdCngBH
Jdo/AJzGVws3veiTkP2Z8UHLn**************VlPe6BCo0IOhkoZ4AMZMTfHmUqU8D0d
wf06Kahi7bYBrsT/pHI9NnvdZKicCJCkGURqArO7+3l2IOzuD0Z9LU02Yt+Ec97LasdBNa
U6cWUHip/WjFELlVCsEAw9FjhHNHX**********mFGifIoEEwCt3BlV7l8FnKti/oGD87z
7+yUVgDsw+YzEPAH6nQY3KVFas0t3NQKK0Nzojz9Va/DCmAiEn6/qwrQUcq3gc0X53Nw==

-----END OPENSSH PRIVATE KEY-----

保存した秘密鍵ファイルは公開鍵認証でSSH接続を行う際に必要になりますので、大切に保管して下さい。

2-4. 公開鍵の保存

公開鍵については[公開鍵の保存]をクリックすることで保存ができます。
[公開鍵の保存]をクリックすると保存先を選択する画面が表示されますので、任意のフォルダを指定して保存します。ファイル名はデフォルトの"id_ecdsa.pub"にしています。[保存]をクリックするとファイルが保存されます。

ssh-pubauth-2-4-1

作成された公開鍵の内容は以下のようになります。

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzd***********bmlzdHA1MjEAAACFBADiK7PGoky0xqYd7QDIpr40nhuaPCb2gEEHsCVSszIy9+KoF+YUKcNjGXuW8RYtVCO0HQUY755OTDb+5bCGpXNpk***************9cGYZrUixg0CCeDa3PsXytH7iHF+jSIDJv1nPJlEU68TOd3mHprMSuwtcCCAWd1SsM+5VHEVg== centos7-key-20190513

これで公開鍵の作成は完了です。ここまでの手順で秘密鍵と公開鍵のキーペアが作成されました。

3. SSHサーバーの設定変更 -server01

2章まででキーペアの作成が完了しましたので、ここからは接続先のCentOSであるserver側の設定変更について進めていきます。CentOSにインストールされているSSHサービスのOpenSSHはデフォルトでは公開鍵認証が有効になっていないため、先ずは公開鍵認証を有効にします。server01にSSHでログインします。

3-1. sshd_configファイルのバックアップ -server01

OpenSSHの設定ファイルは"/etc/ssh/sshd_config"になります。(ssh_configとsshd_configがありますが変更するのはsshd_configです。)設定変更を行う前にsshd_configをバックアップします。
"/etc/ssh/"ディレクトリに移動して、ファイルを確認します。

$ cd /etc/ssh
$ ls | grep sshd
sshd_config

sshd_configが確認できました。このsshd_configをcpコマンドでコピーをします。

# cp -p sshd_config sshd_config.org

コピーされたファイルが存在することを確認します。

$ ls | grep sshd
sshd_config
sshd_config.org

コピーしたsshd_config.orgがあることが確認できました。これでファイルのバックアップは完了です。

3-2. sshd_config設定ファイルの編集 -server01

設定ファイルのバックアップが完了しましたのでsshd_configを編集していきます。鍵認証に対応するための設定変更になりますが、セキュリティを考えると他にも設定変更を行ったほうが良い点があります。本ブログの記事

CentOS
CentOS 7のインストール後におこなうLinuxの基本設定 13ポイント

CentOS 7(バージョン7.0~7.6)のインストール完了後に、設定する最低限のポイントを13点纏めてみました。(2019年6月に追加)本記事で紹介した手順は一例で、これ以外にもサーバーを構築するためには複数の手順が必要になります。まず ...

の中で設定について、少し紹介していますので、興味がある場合にはそちらを参照して下さい。
テキストエディタで、sshd_configを開きます。

# vi sshd_config

公開鍵認証を有効する"PubkeyAuthentication"パラメーターがデフォルトではコメントアウトされています。このコメントを外します。具体的には43行目辺りにある

#PubkeyAuthentication yes

行頭の"#"を削除して

PubkeyAuthentication yes

に変更します。
変更が完了したらファイルを保存します。これでsshd_configの設定変更は完了です。

3-3. SSHサーバーの再起動 -server01

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

# systemctl restart sshd

エラーが出力されなければ、sshdは正常に再起動しています。再起動後にstatusを確認します。

$ systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 木 2019-05-09 15:48:11 JST; 1h 9min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 7183 (sshd)
CGroup: /system.slice/sshd.service
└─7183 /usr/sbin/sshd -D

上記の出力結果から、sshdは正常に起動していることが確認できます。これでsshdの設定反映は完了です。

4. 公開鍵の配置 -server01

SSHサーバー側であるserver01の設定まで完了しましたので、本章では公開鍵認証でログインするユーザーtest01のホームディレクトリに公開鍵を配置していきます。公開鍵はユーザーのホームディレクトリに.sshというディレクトリを作成して、その中にauthorized_keyというファイル名で配置します。ここではserver01側にtest01ユーザーを作成して、test01用に公開鍵を設定します。

4-1. テストユーザーの作成 -server01

公開鍵認証をテストするため接続先のserver01にユーザーを作成します。ユーザー名はtest01です。
Tera Termでサーバーへ接続します。ユーザー追加はrootユーザーでuseraddコマンドを実行します。

# useradd test01

続いて、作成したユーザーにパスワードの設定を行います。

# passwd test01
ユーザー test01 のパスワードを変更。
新しいパスワード: (パスワードを入力)
新しいパスワードを再入力してください: (パスワードを再入力)
passwd: すべての認証トークンが正しく更新できました。

パスワードは任意になりますが、成るべく複雑なものを設定することをお勧めします。エラーの出力が無ければパスワードの設定は完了です。これでユーザーの作成は完了です。一旦、ログアウトします。

4-2. 公開鍵認証用ディレクトリ作成と公開鍵の配置 -server01

項目4-1. で作成したユーザーtest01を利用してTera Termでサーバーへログインします。
ログインするとtest01ユーザーのホームディレクトリ"/home/test01"になりますので、ここに公開鍵を配置するためのディレクトリを作成します。ディレクトリ名は.sshという名前で決め打ちになっています。
以下のように作成します。

$ mkdir .ssh

.sshファイルはパーミッションが700になっている必要がありますので、chmodコマンドで700に設定します。

$ chmod 700 .ssh

パーミッションを確認します。以下のように700に設定されていればディレクトリの作成は完了です。

$ ls -al | grep .ssh
drwx------. 2 test01 test01 6 5月 9 17:07 .ssh

4-3. 公開鍵ファイルのアップロード

server01側に公開鍵ファイルを配置するための.sshディレクトリが作成できましたので、公開鍵ファイルをserver01へアップロードします。
公開鍵ファイルである"id_ecdsa.pub"ファイルを"authorized_keys"というファイル名でサーバーへアップします。アップロードにはTera Termに用意されているscp(セキュアコピー)を利用します。
接続先サーバーにTera Termでtest01としてログインしていることを確認して下さい。
上部メニューの[ファイル]から[SSH/SCP]を選択します。

ssh-pubauth-4-3-1

TTSSH: Secure File Copy 画面が開きます。

ssh-pubauth-4-3-2

上部の

  • From: にアップロードする公開鍵を選択します。
  • to: にアップロードパスとファイル名(authorized_keys)

を入力して[Send]をクリックすると、公開鍵がアップロードされます。

2019-05-14_15h36_26

4-4. 公開鍵ファイルのパーミッション変更

アップロード後に公開鍵ファイルである"authorized_keys"のパーミッションを変更します。公開鍵ファイルはパーミッションを600に設定する必要があります。chmodコマンドを利用してパーミッションを600に変更します。

$ chmod 600 authorized_keys

コマンドの実行後にファイルのパーミッションを確認します。

$ ls -al
-rw-------. 1 test01 test01 473 5月 10 15:29 authorized_keys

上記のようにauthorized_keysファイルのパーミッションが600に設定されていれば公開鍵の配置は完了です。
ディレクトリツリーは以下のようにになります。

/home
`-- test01
|-- .ssh
| |-- authorized_keys

5. 公開鍵を利用した接続テスト

項目4.までで公開鍵認証を利用してssh接続を行う環境ができました。本章では実際にTera Termを利用して公開鍵認証でのSSH接続テストを行ってみます。

5-1. Tera Termでの接続

Tera Termを起動して、以下の情報を指定します。

  • ユーザー名:test01
  • パスフレーズ:秘密鍵作成時に設定したもの
  • RSA/DSA/ECDSA/ED25519鍵を使う:秘密鍵ファイル"id_ecdsa"を選択

ssh-pubauth-5-1-1

[OK]をクリックします。

公開鍵認証の設定が正しく出来ていれば、画面のようにサーバーへ接続できます。

ssh-pubauth-5-1-2

認証ログである"/var/log/secure"を見てみます。以下のように"Accepted publickey for test01"と記録されており、公開鍵認証を利用して接続が受付されたことが確認できます。

May 14 15:33:10 centos7 sshd[8847]: Accepted publickey for test01 from 192.168.241.10 port 54879 ssh2: ECDSA SHA256:Ly3Jav4k3ASgtf+mNN8hOnpr4mD831wYCelFBS7tSig
May 14 15:33:10 centos7 sshd[8847]: pam_unix(sshd:session): session opened for user test01 by (uid=0)

これでTera Termを利用しての公開鍵認証によるSSH接続テストは完了です。

6. パスワード認証の無効化

公開鍵認証を有効にしてSSHの接続テストまで完了しましたが、このままではパスワード認証も有効になっています。
この状態では通常のパスワードを利用したSSHログインも出来てしまうため、公開鍵認証を設定した意味がありません。本章ではパスワード認証を無効にするための設定を紹介していきます。
※注記 公開鍵認証による接続テストが完了するまで本章の設定は行わないで下さい。パスワード認証が無効化されてリモートログインができなくなります。

6-1. sshd_configファイルのバックアップ

パスワード認証の無効化はSSHサーバーであるOpenSSH側の設定変更で行います。OpenSSHの設定ファイルは"/etc/ssh/sshd_config"になります。(ssh_configとsshd_configがありますが変更するのはsshd_configです。)設定変更を行う前にsshd_configをバックアップします。項目3. でバックアップを作成していますので、本章でのバックアップは.org2として行います。
"/etc/ssh/"ディレクトリに移動して、ファイルを確認します。

# cd /etc/ssh
]$ ls | grep sshd
sshd_config

sshd_configが確認できました。このsshd_configをcpコマンドでコピーをします。

# cp -p sshd_config sshd_config.org2

コピーされたファイルが存在することを確認します。

$ ls | grep sshd
sshd_config
sshd_config.org
sshd_config.org2

コピーしたsshd_config.org2があることが確認できました。バックアップが取れましたのでこれで基のファイルを変更しても、簡単にもとに戻すことができます。これでバックアップは完了です。

6-2. sshd_config設定ファイルの編集

設定ファイルのバックアップが完了しましたのでsshd_configを編集していきます。テキストエディタで、sshd_configを開きます。

# vi sshd_config

公開鍵認証を有効する"PasswordAuthentication"パラメーターがデフォルトではyesになっています。具体的には65行目辺りにある

PasswordAuthentication yes

のyesを以下のように

PasswordAuthentication no

に変更します。
変更が完了したらファイルを保存します。これでsshd_configの設定変更は完了です。

6-3. sshdの再起動

変更した設定(パスワード認証の無効化)を反映するためにsshdを再起動します。

# systemctl restart sshd

エラーが出力されなければ、sshdは正常に再起動しています。
再起動後にstatusを確認します。

$ systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 木 2019-05-09 15:48:11 JST; 1h 9min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 7183 (sshd)
CGroup: /system.slice/sshd.service
└─7183 /usr/sbin/sshd -D

上記の出力結果から、sshdは正常に起動していることが確認できます。
これでsshdの設定反映は完了です。

6-4. パスワード認証の接続テスト

これでパスワード認証での接続は出来なくなっています。同じくteratermで接続テストをしてみます。

ssh-pubauth-6-4

このように接続ができません。
認証ログを見てみます。

May 10 16:02:29 centos7 sshd[7980]: Received disconnect from 192.168.241.10 port 52774:11: disconnected by server request
May 10 16:02:29 centos7 sshd[7980]: Disconnected from 192.168.241.10 port 52774
May 10 16:02:29 centos7 sshd[7976]: pam_unix(sshd:session): session closed for user test01

"disconnected by server request"を表示されており、サーバー側から接続拒否されていることが確認できます。これでパスワード認証の無効化は完了です。

7. まとめ

これで通常のパスワードによる認証より強固な秘密鍵による認証が実装できました。
異なるユーザーでログインする場合は、ログインするユーザー毎にキーペアを作成するか、最初に作成したキーペアを他のユーザーでも利用するという形で運用ができます。どちらの運用が良いのかは環境によりますので、運用に合わせたキーペア作成を行って下さい。
キーペアによるSSHの認証はパスワードとユーザー名による認証より強固です。SSHの接続についてセキュアに運用したい場合は必須の設定だと思います。
注意点として秘密鍵の管理には十分に気を付ける必要があります。紛失や流出が無いように運用ルールをしっかりと検討して下さい。
参考 今回はWindowsクライアントからの接続を紹介しましたが、LinuxとMacをクライアントとして利用している場合の設定手順は別の記事

Linux
ssh-pubkey-linux-top2
Linux CentOS 7から安全性の高いSSHの公開鍵認証を設定して接続を行う

SSH接続設定として公開鍵認証を設定する手順を紹介した前回の記事 では接続用クライアントとしてWindows10を利用している環境を前提としている内容でした。今回はLinuxのクライアントから公開鍵認証によるSSH接続の設定手順を紹介したい ...

macOS
ssh-pubkey-mac-top
macOSを使っているエンジニア向け ターミナルで安全性の高いSSH公開鍵認証を設定する

こんにちは、ITエンジニアの小村(@system_kom)です。 エンジニアのみなさん「SSH」使ってますか。聞かれるまでもなくバリバリ使ってますよね。 僕も大げさではなく、毎日使っています。リモートでLinuxやルーターに接続してメンテナ ...

で紹介しています。本記事と併せて参考にしていただければ幸いです。

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-CentOS, SSH, Windows