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

ssh-pubkey-mac-top

Photo by Richard Brutyo on Unsplash

こんにちは、ITエンジニアの小村(@system_kom)です。

エンジニアのみなさん「SSH」使ってますか。聞かれるまでもなくバリバリ使ってますよね。
僕も大げさではなく、毎日使っています。リモートでLinuxやルーターに接続してメンテナンスや設定作業を行うには欠かせないSSH。

そのSSHをより安全に利用するための設定として「公開鍵認証」を設定する手順を以下の記事で紹介しました。

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

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

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

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

この記事ではクライアントとして「Windows」と「Linux」を前提としている内容でした。
IT系のエンジニアにはMacユーザーも多いはず。そこで今回はmacOSから公開鍵認証によるSSH接続の設定手順を紹介したいと思います。
macOSの場合、ベースがUNIXのためLinuxでの設定手順と近い形で公開鍵認証を利用できます。

1. SSHの公開鍵認証とは

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

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

公開鍵認証は事前に公開鍵と秘密鍵のキーペアを作成して、サーバー側に公開鍵を配置、クライアント側は秘密鍵ファイルを利用して認証を行います。

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

AWSなどのクラウドサービスではSSHは公開鍵認証でログインすることが推奨されており、デフォルトで公開鍵認証が設定されています。

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

公開鍵認証の設定を始める前に、設定する環境について説明します。
Linux側ではSSHサーバーが動作していますが、CentOSではインストール後にデフォルトで起動するようになっています。
MacOSにはSSHクライアントがインストールされていますので、追加でソフトウェアのインストールなどは不要です。
その他、ネットワークの構成などは以下のようになっています。

SSH公開鍵認証を設定する環境

  • 接続先のOSはCentOSでバージョンは7.6です。
  • CentOSではOpenSSH Serverが稼働しています。(デフォルトで動作しています)
  • 接続先サーバーのIPアドレス:ホスト名は192.168.241.215:server01を設定しています。
  • 接続クライアントのIPアドレス:ホスト名は192.168.241.9:mac01を設定しています。
  • SSHで接続するクライアントOSはMacOS 10.14.4 Mojave になります。
  • SSHクライアントはMacOSデフォルトのOpenSSHクライアントです。
  • 公開鍵認証のキーペアはMacのコンソールから利用できるssh-keygenコマンドで作成します。

macOSでSSHの公開鍵認証を利用するための大まかな作業手順としては以下になります。

macOSでSSH公開鍵認証を利用する手順

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

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

3. キーペアの作成

SSHの公開鍵認証を利用するためには秘密鍵と公開鍵がペアになったキーペアを作成する必要があります。

OSがMacの場合にはssh-keygenコマンドから作成ができます。ssh-keygenコマンドはMacではデフォルト利用できる環境になっていますので、導入については不要です。

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

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

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

3-1. 秘密鍵と公開鍵のキーペア作成 - Mac

SSH接続を行うユーザーでMacにログインします。ログイン後にユーザーのホームディレクトリ(本記事ではremユーザー)にキーペアを作成します。キーペアの暗号技術としてRSA鍵より強度の強いECDSA方式を521bitで指定しています。
ターミナルを起動してssh-keygenコマンドを以下のように実行します

 command
$ ssh-keygen -t ecdsa -b 521 -C "centos7-key-20190514"

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

 log
Generating public/private ecdsa key pair.
Enter file in which to save the key (/Users/rem/.ssh/id_ecdsa): キーペアファイルの保存先
Created directory '/Users/rem/.ssh'.
Enter passphrase (empty for no passphrase): キーにパスフレーズをつける場合に指定(無指定の場合には空白)
Enter same passphrase again: パスフレーズの確認
Your identification has been saved in /Users/rem/.ssh/id_ecdsa.
Your public key has been saved in /Users/rem/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:UEIC6XIU9GLG9hHxoF+Wa8Rj+Yutd5RkXRBPrxTwHBQ centos7-key-20190514
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"コマンドでファイルを確認します。

 command
$ cd .ssh
$ ls
id_ecdsa  id_ecdsa.pub

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

 directory
/Users
`-- rem
    `-- .ssh
        |-- id_ecdsa
        |-- id_ecdsa.pub

これで公開鍵認証用キーペアの作成と確認は完了です。

3-2. 秘密鍵の内容

「項目3-1」で作成された秘密鍵ファイルの内容は以下のようになります。(内容を一部、伏せてあります)

 log
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABCFOtdh31
GoGtcmZnQEMAbhAAAAEAAAAAEAAACsAAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlz
dHA1MjEAAACFBABA6kLJO/FUFWBFDY7sXt7PeN4wb6ci+JaqCXzw4Fg9ZxNU3cxCmbpq+t
xZB8t/25vmBs6O1u**************************3NTVNTAWReH2ryt+O6mjDAeyGpzt
J5dQD5vfPFvOgioWeHLXAbMhhmN3q5rXINXBxMB27QdEYtnkkgAAASAN1/fl+HBbkP13VR
8Qm3g+SbZcZKg5BCbWG897RoWm6c7GHULJCobYK5eXqxIfoo4Ae6ejVG+AKIikoeAi5NvY
l6PpHbwSUSl8tiDztMNfoDR+D8NvZEHf89suFck/zK1BmTq/HFyGYwufoccDHcfM4BadQ1
XUrETzziajeNR8*******************************pSQxe6b9iK2ywBv8fbbVv7lwj
B3/YT2v4T5xJoofBm6BuUudCxrDwK/9eumCDyxjTn86h8VnZl3wJegw7XoOmbzp20XHYHJ
Qay8pHogW3YPZ25zSG05xvAlKBY2ZTWRT7wS06FGlNJcdCpPs0kSE591w0RmaXxiJWjqjz
AasCTWhlTFvj93SwQ3g=
-----END OPENSSH PRIVATE KEY-----

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

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

「項目3」の手順でキーペアの作成が完了しましたので、ここからは接続先のCentOSであるserver側の設定変更について進めていきます。

CentOSにインストールされているSSHサービスのOpenSSH Serverはデフォルトでは公開鍵認証が有効になっていないため、先ずは公開鍵認証を有効にします。

server01にはパスワード認証によるSSHでログインしている前提で進めていきます。

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

OpenSSHの設定ファイルは"/etc/ssh/sshd_config"になります。(ssh_configとsshd_configがありますが変更するのはsshd_configです。)

設定変更を行う前にsshd_configをバックアップします。"/etc/ssh/"ディレクトリに移動して、ファイルを確認します。

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

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

 command
# cp -p sshd_config sshd_config.org

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

 command
$ ls | grep sshd
sshd_config
sshd_config.org

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

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

設定ファイルのバックアップが完了しましたのでsshd_configを編集していきます。

鍵認証に対応するための設定変更になりますが、セキュリティを考えると他にも設定変更を行ったほうが良い点があります。

別の記事でSSHのセキュリティについて紹介しています。参考にして下さい。

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

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

テキストエディタで「sshd_config」を開きます。

 command
# vi sshd_config

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

 code
#PubkeyAuthentication yes

行頭の"#"を削除して

 code
PubkeyAuthentication yes

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

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

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

 command
# systemctl restart sshd

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

 command
$ 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の設定反映は完了です。

5. 公開鍵の配置 -server01

SSHサーバー側であるserver01の設定まで完了しましたので、本章では公開鍵認証でログインするユーザーtest01のホームディレクトリに公開鍵を配置していきます。

公開鍵はユーザーのホームディレクトリに".ssh"というディレクトリを作成して、その中に「authorized_key」というファイル名で配置します。ここではserver01側にtest01ユーザーを作成して、test01用に公開鍵を設定します。

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

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

 command
# useradd test01

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

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

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

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

「項目5-1.」で作成したユーザーtest01でclient01へログインします。

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

 command
$ mkdir .ssh

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

 command
$ chmod 700 .ssh

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

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

5-3. 公開鍵のアップロード -Mac

server01側に公開鍵を配置するための.sshディレクトリが作成できましたので、公開鍵ファイルをアップロードします。
公開鍵ファイルである"id_ecdsa.pub"ファイルを"authorized_keys"というファイル名でサーバーへアップします。アップロードにはMacに用意されているコマンド"scp"(セキュアコピー)を利用します。

この作業はクライアント側のMacから行います。クライアント側Macへキーペアを作成したユーザーでログインしてターミナルを起動し.sshディレクトリに移動します。

 command
$ cd .ssh

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

 command
$ chmod 600 id_ecdsa.pub

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

 command
$ scp (Mac側のパス) (ユーザ名)@(アドレス):(パス)

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

 command
$ 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%になったら公開鍵ファイルのアップロードは完了です。

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

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

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

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

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

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

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

6-1. OpenSSHクライアントでの接続 -Mac

MacではSSHクライアントとしてOpenSSHクライアントが利用できます。ターミナルを起動してsshコマンドを以下のように実行します。

パスフレーズの入力を求められますので、秘密鍵に設定したパスフレーズを入力します。

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

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

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

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

 log
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接続テストは完了です。

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

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

 command
$ cd .ssh
$ rm id_ecdsa.pub

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

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

公開鍵認証を有効にしてSSHの接続テストまで完了しましたが、このままではパスワード認証も有効になっています。

この状態では通常のパスワードを利用したSSHログインも出来てしまうため、公開鍵認証を設定した意味がありません。本章ではパスワード認証を無効にするための設定を紹介していきます。

※注記 公開鍵認証による接続テストが完了するまで本章の設定は行わないで下さい。パスワード認証が無効化されてリモートログインができなくなります。

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

パスワード認証の無効化はSSHサーバーであるOpenSSH側の設定変更で行います。OpenSSHの設定ファイルは"/etc/ssh/sshd_config"になります。

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

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

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

 command
# cp -p sshd_config sshd_config.org2

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

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

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

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

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

 command
# vi sshd_config

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

 code
PasswordAuthentication yes

のyesを以下のように

 code
PasswordAuthentication no

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

7-3. sshdの再起動 -server01

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

 command
# systemctl restart sshd

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

 command
$ 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の設定反映は完了です。

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

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

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

このようにsshd_configの設定でパスワード認証を無効化していると、パスワード認証による接続ができません。認証時のログを見てみます。

 log
May 14 11:45:18 centos7 sshd[8443]: Connection closed by 192.168.241.9 port 33350 [preauth]

ログにアクセスを拒否した「Connection closed」が表示されており、サーバー側から接続拒否されていることが確認できます。これでパスワード認証の無効化は完了です。

8. まとめ

これで通常のパスワードによる認証より強固な秘密鍵による認証が実装できました。
異なるユーザーでログインする場合は、ログインするユーザー毎にキーペアを作成するか、最初に作成したキーペアを他のユーザーでも利用するという形で運用ができます。どちらの運用が良いのかは環境によりますので、運用に合わせたキーペア作成を行って下さい。

キーペアによるSSHの認証はパスワードとユーザー名による認証より強固です。SSHの接続についてセキュアに運用したい場合は必須の設定だと思います。

注意点として秘密鍵の管理には十分に気を付ける必要があります。紛失や流出が無いように運用ルールをしっかりと検討して下さい。

前回と今回の記事でWindows・Linux・Macクライアントからの接続を紹介しましたが、MacOSの場合はUNIXベースということもあり、公開鍵認証の設定が簡単にできます。接続環境のセキュリティを強化できますので、是非、設定してみて下さい。

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

レムシステム

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

-Mac, SSH