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

ssh-pubkey-linux-top2

SSH接続設定として公開鍵認証を設定する手順を紹介した前回の記事

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

Linux系のサーバーOSへリモートログインするためにSSHを利用している環境は多いと思います。最近ではtelnetのように平文で通信するプロトコルでリモートログインする環境はセキュリティ面から全く見なくなりました。現状では暗号化された通信 ...

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

Linux系のサーバーOSへリモートログインするためにSSHを利用している環境は多いと思います。最近ではtelnetのように平文で通信するプロトコルでリモートログインする環境はセキュリティ面から全く見なくなりました。現状では暗号化された通信を利用するSSHプロトコルでサーバーへリモートログインすることが殆どです。

現在リモートログイン用プロトコルのスタンダードとなったSSHですが、セキュリティと運用面を考えると一般的によく利用されているユーザー名とパスワードを使ったパスワード認証より公開鍵と秘密鍵(キーペアと呼ばれます)による公開鍵認証を利用することがお勧めです。

公開鍵認証はサーバー側に公開鍵を配置、クライアント側は秘密鍵ファイルを利用して認証を行います。この方式では秘密鍵ファイルを持つクライアントのみが接続を許可されるため、従来のパスワード認証と比較して辞書攻撃(プルートフォース攻撃)などにも強くなります。

AWSなどのクラウドサービスではSSHは公開鍵認証でログインすることが推奨されており、デフォルトで公開鍵認証が設定されています。
本記事では日常的に利用しているSSHの認証方式について、もう一度、見直してみる意味も含めて、SSHの公開鍵認証を設定する手順を紹介していきます。SSHでの接続先はLinuxが多いと思いますが、接続元であるクライアント環境についてもLinuxである環境の設定を紹介していきます。
参考 WindowsとmacOS環境での公開鍵認証の設定手順は

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

Linux系のサーバーOSへリモートログインするためにSSHを利用している環境は多いと思います。最近ではtelnetのように平文で通信するプロトコルでリモートログインする環境はセキュリティ面から全く見なくなりました。現状では暗号化された通信 ...

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

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

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

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

本章では設定を始める前に、公開鍵認証を設定する環境について説明します。接続先と接続元が同じOSになりますので、間違ないように分かりやすいホスト名を設定しています。

  • 接続先であるサーバーOSはLinuxを想定しています。ディストリビューションはCentOSにしました。バージョンは7.6です。
  • CentOSではOpenSSH Serverが稼働しています。(デフォルトで動作しています)
  • 接続先サーバーのIPアドレス:ホスト名は192.168.241.215:server01を設定しています。
  • 接続クライアントのIPアドレス:ホスト名は192.168.241.240:client01を設定しています。
  • SSHで接続するクライアントOSはLinuxになります。ディストリビューションはCentOS7.6でサーバと同じになります。
  • SSH接続で利用するソフトウェアはデフォルトでインストールされているOpenSSHクライアントです。
  • 公開鍵認証のキーペアはssh-keygenコマンドで作成します。

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

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

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

2. キーペアの作成

SSHの公開鍵認証を利用するためには秘密鍵と公開鍵がペアになったキーペアを作成する必要があります。OSがLinuxの場合にはssh-keygenコマンドから作成ができます。ssh-keygenコマンドはCentOSではデフォルト利用できる環境になっていますので、導入については不要です。
キーペアの作成パラメーターは以下を前提としています。
暗号化方式についてはRSAより強固な暗号化技術であるECDSAを利用して、SSH2用ECDSA(521bit)鍵を生成します。

  • 暗号化方式はECDSA
  • 秘密鍵の保存パス /home/test01/.ssh (.sshディレクトリはデフォルトで作成されます。)
  • 秘密鍵ファイルの名前 id_ecdsa (デフォルト)
  • 公開鍵ファイルの名前 id_ecdsa.pub (デフォルト)
  • パスフレーズ 任意のものを設定

この条件を元にキーペアを作成していきます。

2-1. テストユーザーの作成 - client01

公開鍵認証をテストするためclient01にユーザーを作成します。ユーザー名はtest01としています。
ユーザー追加はrootユーザーuseraddコマンドを実行します。

# useradd test01

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

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

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

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

項目.2-1で作成したtest01ユーザーでclient01にログインします。ログイン後にtest01ユーザーのホームディレクトリにキーペアを作成します。
本記事ではキーペアの暗号技術としてRSA鍵より強度の強いECDSA方式を指定しています。ssh-keygenを以下のように実行します。

$ ssh-keygen -t ecdsa -b 521

実行すると以下のようにキーペアの作成が開始されます。幾つかのパラメーターを指定する必要がありますので環境に応じたパラメーターを入力します。

Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/test01/.ssh/id_ecdsa): エンターキー
Created directory '/home/test01/.ssh'.
Enter passphrase (empty for no passphrase): パスフレーズの入力
Enter same passphrase again: パスフレーズの再入力
Your identification has been saved in /home/test01/.ssh/id_ecdsa.
Your public key has been saved in /home/test01/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:UEIC6XIU9GLG9hHxoF+Wa8Rj+Yutd5RkXRBPrxTwHBQ test01@client01
The key's randomart image is:
+---[ECDSA 521]---+
| .++=oo . +=E. |
| .oo * = =.+ |
| oB o % . .= .|
|.+o+ * = o .. . |
| o o o So . . |
| . o .o |
| . o. |
| .. . |
| .. . |
+----[SHA256]-----+

上記のように表示されれば、キーペアは作成されています。実際のファイルを確認してみます。ファイルは.sshディレクトリに作成されているため、先ずは.sshディレクトリに移動します。移動後にlsコマンドでファイルを確認します。

$ cd .ssh
$ ls
id_ecdsa id_ecdsa.pub

公開鍵ファイル"id_ecdsa.pub"と秘密鍵ファイル"id_ecdsa"の二つが作成されていることが確認できました。
ディレクトリツリーは以下のようになります。

/home
`-- test01
`-- .ssh
|-- id_ecdsa
|-- id_ecdsa.pub

これでキーペアの作成と確認は完了です。

2-3. 秘密鍵の内容

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

-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,B64DA463E6863FA23061F7F4772D3B1A

BmWyaBswNA6p7M9cuRSUomqMtjb3ZMshC2ZR0EvZge5IoS3fk8sDCuW44jJ+LuyT
PUiNHZaM5iQff1v+YUXiB+uiZ2haTWSe21QKkzyEIxzuKu6r3eG44kIjwCQnzXJO
06I7Hd/cYFbiRO/JmiZLqFeN2t1234567899k2qiWSq6VPB4tyOjlhBK688eKMp+
/nZ2lnAe8fEsNxoLiHQhXHVDEqsiefG613r54fadeRPlJrAnmfLSwth3cvBeF4mU
MwtrINirejf5396ouBsk3bYncZA7LI4Am8ssssVJMdk=
-----END EC PRIVATE KEY-----

秘密鍵ファイルはサーバーにSSH接続を行う際に必要になりますので、大切に保管して下さい。

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

2章まででキーペアの作成が完了しましたので、ここからは接続先のCentOSであるserver側の設定変更について進めていきます。CentOSにインストールされているSSHサービスのOpenSSHはデフォルトでは公開鍵認証が有効になっていないため、先ずは公開鍵認証を有効にします。serverにはパスワード認証による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です。
ユーザー追加はrootユーザーでuseraddコマンドを実行します。

# useradd test01

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

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

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

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

項目4-1. で作成したユーザーtest01でclient01へログインします。
ログインすると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. 公開鍵のアップロード -client01

server01側に公開鍵を配置するための.sshディレクトリが作成できましたので、公開鍵ファイルをアップロードします。
公開鍵ファイルである"id_ecdsa.pub"ファイルを"authorized_keys"というファイル名でサーバーへアップします。アップロードにはLinuxのコマンドであるscp(セキュアコピー)を利用します。
この作業はクライアント側のLinuxから行います。クライアント側Linuxへtest01ユーザーでログインして.sshディレクトリに移動します。

$ cd .ssh

.sshディレクトリの移動後に公開鍵ファイルである"id_ecdsa.pub"のパーミッションを変更します。公開鍵ファイルはパーミッションが600である必要がありますので、scpの実行前にパーミッションを変更しておきます。

$ chmod 600 id_ecdsa.pub

id_ecdsa.pubファイルのパーミッション変更が終わったら公開鍵ファイルをserverにコピーします。
scpコマンドを以下のように実行します。ローカル側(client)からリモート側(server)へコピーする場合は以下のような書式になります。

$ scp <ローカル側のパス> <ユーザ名>@<アドレス>:<パス>

上記の書式にscpのコマンドを当てはめて実行します。本記事ではid_ecdsa.pub公開鍵ファイルをauthorized_keysとしてコピーするためパスの後にコピー後のファイル名を指定しています。

$ scp id_ecdsa.pub test01@192.168.241.215:~/.ssh/authorized_keys
test01@192.168.241.215's password: パスワードを入力
id_ecdsa.pub 100% 266 110.8KB/s 00:00

表示される進捗が100%になったら公開鍵ファイルのアップロードは完了です。

4-4. アップロードした公開鍵ファイルの確認 -server01

アップロードした公開鍵ファイルを確認します。アップロード先であるserver01側へtest01ユーザーでログインして、.sshフォルダへ移動します。

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

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

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

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

4章までで公開鍵認証を利用してssh接続を行う環境ができました。本章では実際にOpenSSHクライアントを利用して公開鍵認証でのssh接続テストを行ってみます。

5-1. OpenSSHクライアントでの接続 -client01

CentOS 7ではSSHクライアントとしてOpenSSHクライアントが利用できます。sshコマンドを以下のように実行します。パスフレーズの入力を求められますので、設定したパスフレーズを入力します。

$ ssh test01@192.168.241.215
Enter passphrase for key '/home/test01/.ssh/id_ecdsa': パスフレーズを入力

公開鍵認証の設定が正しく完了しており、秘密鍵のパスフレーズが合致していれば、以下のようにサーバーへ接続できます。

Last login: Tue May 14 10:23:21 2019
[test01@cent7 ~]$

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

May 14 10:24:33 cent7 sshd[7744]: Connection closed by 192.168.241.240 port 33332 [preauth]
May 14 10:25:20 cent7 sshd[7750]: Accepted publickey for test01 from 192.168.241.240 port 33334 ssh2: ECDSA SHA256:UEIC6XIU9GLG9hHxoF+Wa8Rj+Yutd5RkXRBPrxTwHBQ

これでOpenSSHクライアントを利用しての公開鍵認証によるSSH接続テストは完了です。

5-2. クライアントから公開鍵ファイルの削除 -client01

server01へ公開鍵認証でSSH接続ができた場合には、セキュリティ対策として公開鍵ファイルをclient01から削除しておきます。(必要に応じてバックアップを取得して下さい。)
rmコマンドをclient01で実行します。

$ cd .ssh
$ rm id_ecdsa.pub

lsコマンドでファイルが表示されなければ、削除は完了です。

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

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

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

パスワード認証の無効化は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設定ファイルの編集 -server01

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

# vi sshd_config

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

PasswordAuthentication yes

のyesを以下のように

PasswordAuthentication no

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

6-3. sshdの再起動 -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の設定反映は完了です。

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

これでパスワード認証での接続は出来なくなっています。項目.と同じくsshコマンドで接続テストをしてみます。そのまま実行すると公開鍵認証を利用してしまうため、明示的にパスワード認証を行う"-o PreferredAuthentications=password" を指定してsshコマンドを実行します。

$ ssh test01@192.168.241.215 -o PreferredAuthentications=password
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

このようにパスワード認証による接続ができません。
認証ログを見てみます。

May 14 11:45:18 cent7 sshd[8443]: Connection closed by 192.168.241.240 port 33350 [preauth]

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

7. まとめ

これで通常のパスワードによる認証より強固な秘密鍵による認証が実装できました。
異なるユーザーでログインする場合は、ログインするユーザー毎にキーペアを作成するか、最初に作成したキーペアを他のユーザーでも利用するという形で運用ができます。どちらの運用が良いのかは環境によりますので、運用に合わせたキーペア作成を行って下さい。
キーペアによるSSHの認証はパスワードとユーザー名による認証より強固です。SSHの接続についてセキュアに運用したい場合は必須の設定だと思います。
注意点として秘密鍵の管理には十分に気を付ける必要があります。紛失や流出が無いように運用ルールをしっかりと検討して下さい。
公開鍵認証は比較的簡単にセキュリティを強化できますので、是非、設定してみて下さい。

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

レムシステム

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

-CentOS, SSH