【OPenSSH】公開鍵認証の設定方法(Windows & Linux)

Other

■ PC環境一覧

OS:Windows11
CPU:Intel® Core™ i9 13900KF

■ 初めに

公開鍵認証は、情報セキュリティを向上させるための強力な手段です。
この記事では、OpenSSHを使用して公開鍵認証を設定する方法に焦点を当てます。

パスワード認証よりも堅牢で、セキュリティを強化するために欠かせないテクニックとして、公開鍵認証はシステム管理者やユーザーにとって不可欠なスキルです。
手順を追いながら、安全で効果的な公開鍵認証の導入方法を解説し、デジタルセキュリティを向上させましょう。

■ 鍵について

公開鍵認証の基盤となる鍵の仕組みを理解することは重要です。
鍵は 2つの主要な部分で構成されます

□ 公開鍵

他のユーザーに公開され、暗号化されたデータを解読するための鍵です。
セキュアな通信を確保する際に使用され、外部に安全に公開できます。
公開鍵は、サーバーPCに配置します。

皆んなに見せてOKな鍵。
データを送る相手に渡すイメージ。
暗号化のために利用され、安全に共有できます。

□ 秘密鍵

所有者だけが知っている秘密の鍵で、データの署名や暗号化を解読するのに必要です。
絶対に他者に漏らさないように厳重に管理されるべきです。
秘密鍵は、クライアントPCに配置します。

持ち主だけが知っている鍵。
受け取ったデータを解読するのに必要。
これは厳重に秘匿されなければなりません。

ユーザーは「公開鍵」と「秘密鍵」と呼ばれる 2つの鍵を生成します。

公開鍵はサーバーに登録され、秘密鍵はユーザーのコンピュータに保存されます。
ログイン時には、ユーザーは秘密鍵を使用して署名を生成し、それをサーバーに送信します。

サーバーは受け取った署名を対応する公開鍵で検証し、成功した場合にのみログインを許可します。
これにより、秘密鍵そのものはネットワーク上に送信されず、通信の盗聴に対して強固なセキュリティが提供されます。

公開鍵認証の利点は、パスワード認証とは異なり、認証に必要な秘密情報がネットワーク上に明示的に送信されないことです。
また、署名は一時的で再利用不可能なため、盗まれても問題ありません。
この方式は通信の盗聴に対して堅牢であり、また秘密鍵を推測して偽造するのが非常に難しいため、セキュリティの観点からはパスワード認証よりも優れています。

さらに、秘密鍵を保護するために「パスフレーズ」を設定することも可能です。
パスフレーズは複数の単語から成るパスワードで、正しいパスフレーズを入力しない限り、秘密鍵はロックされて使用できません。
これにより、公開鍵認証はさらにセキュアに運用できます。

公開鍵」の作成は、クライアントPCで作成し、サーバーPCへ転送することで登録(配置)します。

[1]鍵ペアを生成(公開鍵・秘密鍵)

以下で使用されるコマンド(「$ ssh-keygen」等)は、Windowsや Linuxでも変わらず使用することができます。
各OSによって異なる点で言えば、生成される鍵や設定ファイルの保存場所(パス)だけなので適宜読み替えて進めてください。

基本的に sshは、グローバル領域ではなくユーザーごとの設定になるので、ユーザーフォルダ配下に保存されます。

各OSのデフォルトで配置されるファイル場所(ユーザーディレクトリ)
  • Windowsの場合
    • ~/.ssh( ← C:\Users\<username>\.ssh\
  • Linuxの場合
    • ~/.ssh( ← home/<username>/.ssh/

□ オプション(頻繁に使用されるオプションを抜粋)

オプション説明おすすめ
-t暗号化形式 (暗号アルゴリズム)
rsa, dsa, ecdsa, ed25519
デフォルトは、rsa形式です。
rsa
-b鍵のビット長
生成する鍵の bit数を指定します。
rsaのデフォルトは 2048bitです。
4096
-Cコメント付与
生成される公開鍵の末尾に追加されます。
指定しない場合は「<username>@<hostname>」が追加されます。
鍵管理のため付与するもしくは、他人と共有しなければならない場合には余計な情報となるので「-C " "」と空白にしておくのも吉です。

下記「$ ssh-keygen」コマンド実行後、対話形式で鍵の生成を進めます。

対話形式の入力内容
  • 秘密鍵のファイル名
    • 秘密鍵のファイル名を任意で決めることができます。
      未入力で進むことも可能であり、その場合はデフォルトのファイル名が付けられます。

      秘密鍵id_rsa
      公開鍵id_rsa.pub
  • パスフレーズ
    • 「秘密鍵」自体へパスフレーズを設定することができます。
      未入力(パスフレーズなし)のまま Enterを押下して進んでも良いです。
      主な使用用途は、「秘密鍵」を使用する度にパスフレーズを入力する必要があるため、セキュリティ向上に繋がります。

      [パスワードとの違い]
      ・一般的なパスワード設定で要求される文字数上限よりも長い文字数を設定可能。
      ・空白(スペース)も文字として利用することができる。

秘密鍵のファイル名に任意の名前を付ける場合の注意事項

上記で説明したように、秘密鍵を生成する際には任意のファイル名を付けることができます。
しかし、環境にもよります(私は他を知らない)が、公開鍵認証接続の設定完了後に「秘密鍵が見つかりません」とエラーが出ることがあります。

理由

(鍵種別にもよりますが)デフォルトで付けられる「id_rsa」や「id_dsa」等を秘密鍵として探すため、任意で付けた秘密鍵の名前を PCが把握していないので見つけることができずエラーとなります。

対処法

「$ ssh-agent」コマンドを利用します。

上記コマンドから ssh-agentへ秘密鍵の場所を登録することで検索対象にします。
懸念点としては、ssh-agentを起動している間のみ有効です。
PCをシャットダウンした場合(や、新規ターミナルを開いた場合)再度、登録する必要があります。
しかし、秘密鍵の使い回すことで手間が省けますが、それにはリスクが伴うのでリスクヘッジを個人で徹底してください。

[1.1]生成

$ ssh-keygen -t rsa -b 4096 -C "comment"


---
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):    ← 秘密鍵の「ファイル名」を入力
Enter passphrase (empty for no passphrase):                           ← 「パスフレーズ」を入力
Enter same passphrase again:                                          ← 「パスフレーズ」を再入力
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
e1:c2:a3:d5:d1:45:13:95:db:d7:17:64:f1:c1:bb:ec comment
The key's randomart image is:
+--[ RSA 4096]----+
|           .=+.  |
|           oo... |
|          .  N.. |
|         . ++.+  |
|        S + o. . |
|       o o o  o  |
|        * .  .   |
|       +      E  |
|      .          |
+-----------------+

[2]公開鍵をサーバーPCへ配置

□「$ ssh-copy-id」コマンドを使用する場合

[2.1]クライアントPCからサーバーPCへコピー配置

下記、適宜ご自身の環境名へ置換してください
  • <username>
    • サーバーPCの「ユーザー名」
  • <hostname>
    • サーバーPCの「ホスト名」または「IPアドレス」
  • クライアントPCで実行してください。
$ ssh-copy-id <username>@<hostname>


---
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
<username>@<hostname>'s password:                       ← サーバーPC(配置するユーザー)のパスワードを入力

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '<username>@<hostname>'"
and check to make sure that only the key(s) you wanted were added.

□ 手動にて公開鍵をサーバーPCへ配置する場合

※ PCが Windowsの場合は、Powershell(管理者権限)にて実行してください。
※ Powershellでも一部コマンドが使用できない場合はありますので、その際は GUI操作にてコメントの内容を対応してください。

  • サーバーPCで実行してください。

[2.1]サーバーPCに公開鍵を配置するフォルダを生成

# ユーザーディレクトリへ移動
$ cd ~

#「.ssh」フォルダを作成
$ mkdir ~/.ssh/

[2.2]クライアントから「$ scp」コマンドを使用して転送

  • クライアントPCで実行してください。
# クライアントPCからサーバーPCへ公開鍵(id_rsa.pub)を転送
$ scp ~/.ssh/id_rsa.pub <username>@<hostname>:~/.ssh/

[2.3]サーバーPCに転送(配置)された公開鍵を修正

  • サーバーPCで実行してください。
# 公開鍵(id_rsa.pub)が転送(配置)されたディレクトリへ移動
$ cd ~/.ssh/


# 公開鍵の名前を「id_rsa.pub」から『authorized_keys』へ変更
$ mv id_rsa.pub authorized_keys


# パーミッションの設定(Linuxユーザーのみ)
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
[2.3.1]既存の公開鍵『authorized_keys』が存在している場合

ここの手順をコマンドで詳細に書くと、かなり面倒なので簡単に説明させてください。

既存の『authorized_keys』をテキストエディタ(Visual Studio Code 等)で開いて、転送された「id_rsa.pub」の中身を全て(1行)を末尾に張り付けてください。

ssh-rsa ASSDLJASFLJljalsdjflasjdf....<省略> key_exist      ← 既存の公開鍵
ssh-rsa ASLKfhlkasdjlfjsadlisdufg....<省略> key_new        ← 末尾に張り付け

□「公開鍵認証ができない」または「SSH接続時にパスワードを聞かれる場合」の対処法

sshd設定ファイルsshd_config)内の設定値を確認し、必要に応じて変更する。

~/.ssh/sshd_config」ファイルの場所
  • Windowsの場合
    • %programdata%\ssh\sshd_config
  • Linuxの場合
    • etc/ssh/sshd_config

公開鍵認証ができない(Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

PubkeyAuthentication」の値が「yesになっていることを確認(43行目付近)

< ---省略--- >

# 修正前
PubkeyAuthentication no

# 修正後
PubkeyAuthentication yes

< ---省略--- >

Match Group administrators」をコメントアウト(末尾付近)
~/.ssh/authorized_keysではなく 管理者の administrators_authorized_keysを参照していることが問題

< ---省略--- >

# 修正前
Match Group administrators
    AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

# 修正後
# Match Group administrators
#     AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

SSH接続時にサーバーPCのパスワードを聞かれる場合

PasswordAuthentication」の値が「noになっていることを確認(65行目付近)

PasswordAuthentication」を「no」に変更する場合、公開鍵認証でのみを接続可能とするため、公開鍵認証の設定が済んでいない状態で変更をするとリモート接続ができなくなるので注意が必要である。

< ---省略--- >

# 修正前
PasswordAuthentication yes

# 修正後
PasswordAuthentication no

< ---省略--- >

[3] SSH接続

□ configファイルを使用して接続(簡単接続)

[3.1]configファイル作成

config」ファイルを作成します。(SSH接続の情報を管理するファイル

使用用途は、本来、SSH接続を行う時には「username」や「hostname」を入力しなければなりませんが、
configファイルに予め接続情報を記載しておくことで記載した情報に基づいて接続することができるため入力の手間を省くことができます。

下記コマンドを実行して~/.ssh」フォルダ内に「config」ファイルを作成し、以下の内容を参考にパラメータを設定してください。

# configファイル作成
$ touch ~/.ssh/config
~/.ssh/config」ファイルの設定パラメータ
  • Host
    • 接続サーバーPC)のエイリアス名(任意の名前を付けることが可能)
  • Hostname
    • 接続サーバーPC)の「ホスト名」または 「IPアドレス」
  • User
    • 接続サーバーPC)の「ユーザー名」
  • Port
    • 接続サーバーPC)で設定した SSH接続の「ポート番号」
  • IdentityFile
    • 接続クライアントPC)に配置している「秘密鍵の場所」
Host ssh-server
    Hostname 127.0.0.1
    User username
    Port 22
    IdentityFile ~/.ssh/id_rsa

[3.2]SSH接続確認

config」ファイルに設定した「Host」の名前を使用して接続することができます。

$ ssh ssh-server

□「config」ファイルがない場合の接続方法

[3.1]SSH接続確認

接続先(サーバーPC)の詳細な情報を入力して接続しなければなりません。

$ ssh <username>@<hostname>

■ 最後に

SSHの構築が、まだ済んでいない方は以下記事を参考ください。

お疲れ様でした。

comment 📝

タイトルとURLをコピーしました