SSH公開鍵認証で安全性の高い接続を行う。公開鍵認証の設定 Linuxクライアントの場合

2019/05/15 CentOS, Linux, ssh, オープンソース

ssh-pubkey-linux-top
SSH接続設定として公開鍵認証を設定する手順を紹介した前回の記事
>「CentOSで安全性の高いSSH公開鍵認証を設定する。その1 Windowsクライアントの場合」
では接続用クライアントとしてWindowsを利用している環境を前提としている内容でした。今回はLinuxのクライアントから公開鍵認証によるSSH接続の設定手順を紹介したいと思います。
Linux系のサーバーOSへリモートログインするためにSSHを利用している環境は多いと思います。最近ではtelnetのように平文で通信するプロトコルでリモートログインする環境はセキュリティ面から全く見なくなりました。現状では暗号化された通信を利用するSSHプロトコルでサーバーへリモートログインすることが殆どです。
現在リモートログイン用プロトコルのスタンダードとなったSSHですが、セキュリティと運用面を考えると一般的によく利用されているユーザー名とパスワードを使ったパスワード認証より公開鍵と秘密鍵(キーペアと呼ばれます)による公開鍵認証を利用することがお勧めです。

スポンサーリンク

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

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コマンドを実行します。

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

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

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

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

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

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

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

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

2-3.秘密鍵の内容

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

秘密鍵ファイルはサーバーに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/”ディレクトリに移動して、ファイルを確認します。

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

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

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

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

設定ファイルのバックアップが完了しましたのでsshd_configを編集していきます。鍵認証に対応するための設定変更になりますが、セキュリティを考えると他にも設定変更を行ったほうが良い点があります。本ブログの記事
>「CentOS7の基本設定 Linuxのインストール後に設定する9つのポイント」
の中で設定について、少し紹介していますので、興味がある場合にはそちらを参照して下さい。
テキストエディタで、sshd_configを開きます。

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

行頭の”#”を削除して

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

スポンサーリンク

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

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

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

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

4.公開鍵の配置 -server01

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

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

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

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

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

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

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

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

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

4-3.公開鍵のアップロード -client01

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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/”ディレクトリに移動して、ファイルを確認します。

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

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

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

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

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

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

のyesを以下のように

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

6-3.sshdの再起動 -server01

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

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

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

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

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

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

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

7.まとめ

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

関連する記事


Facebookでのご購読が便利です。

Twitter・Feedlyでもご購読できます。

Twitterでフォローする Feedlyでフォローする

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク