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

Other

■ 主の PC環境一覧

OS:Windows11
CPU:Intel® Core™ i9 13900KF
Memory:64GB
GPU:NVIDIA® GeForce RTX™ 3070 8GB


■ 初めに

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

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


■ 鍵について

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

□ 公開鍵

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

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

□ 秘密鍵

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

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

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

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

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


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

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

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


■ 鍵ペアを生成(公開鍵・秘密鍵)

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

基本的に 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をシャットダウンした場合(や、新規ターミナルでも?)再度、登録する必要があります。
しかし、秘密鍵の使い回すことで手間が省けますが、それにはリスクが伴うのでリスクヘッジを個人で徹底してください。

$ 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  |
# |      .          |
# +-----------------+

■ 公開鍵をサーバーPCへ配置

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

【 下記、配置する「ユーザー」ごとに置き換え 】
  • <username>
    • サーバーPCの「ユーザー名」
  • <hostname>
    • サーバーPCの「ホスト名」または「IPアドレス」
$ 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には Linuxを採用することが多いので、全てコマンドで記載します。
各コマンドには行っている内容をコメントにて記載しますので、ご安心ください。

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

// ユーザーディレクトリへ移動
// Windowsの場合:"C:\Users\<username>\"
// Lnuxの場合   :"home/<username>/"
$ cd ~


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


// ===================================================================
// クライアントPCで生成した「公開鍵(id_rsa.pub)」を、
// 下記ファイル名に変更して下記場所へ配置してください。
// ※ 既存の「authorized_keys」が存在する場合は、
//   改行して公開鍵の鍵情報のみを末尾に追加してください。
//[ファイル名] authorized_keys
//[場所]      .ssh
// ===================================================================


// パーミッションの設定(Linuxユーザーのみ)
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys

公開鍵認証ができないまたは 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

< ---省略--- >

■ SSH接続(簡単接続)

早速、SSH接続を行う前に「config」ファイルを作成します。(しておいた方が良いです)

configファイルは、SSH接続の情報を管理するファイルです。

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

「~/.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

次に、「config」ファイルがある場合とない場合の接続方法の違いを見比べて終了です。

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

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

$ ssh <username>@<hostname>

□「config」ファイルを生成した後の接続方法

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

$ ssh ssh-server

■ 最後に

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

お疲れ様でした。

comment 📝

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