■ 主の PC環境一覧
OS:Windows11
CPU:Intel® Core™ i9 13900KF
Memory:64GB
GPU:NVIDIA® GeForce RTX™ 3070 8GB
■ 初めに
公開鍵認証は、情報セキュリティを向上させるための強力な手段です。
この記事では、OpenSSHを使用して公開鍵認証を設定する方法に焦点を当てます。
パスワード認証よりも堅牢で、セキュリティを強化するために欠かせないテクニックとして、公開鍵認証はシステム管理者やユーザーにとって不可欠なスキルです。
手順を追いながら、安全で効果的な公開鍵認証の導入方法を解説し、デジタルセキュリティを向上させましょう。
■ 鍵について
公開鍵認証の基盤となる鍵の仕組みを理解することは重要です。
鍵は 2つの主要な部分で構成されます
□ 公開鍵
他のユーザーに公開され、暗号化されたデータを解読するための鍵です。
セキュアな通信を確保する際に使用され、外部に安全に公開できます。
公開鍵は、サーバーPCに配置します。
皆んなに見せてOKな鍵。
データを送る相手に渡すイメージ。
暗号化のために利用され、安全に共有できます。
□ 秘密鍵
所有者だけが知っている秘密の鍵で、データの署名や暗号化を解読するのに必要です。
絶対に他者に漏らさないように厳重に管理されるべきです。
秘密鍵は、クライアントPCに配置します。
持ち主だけが知っている鍵。
受け取ったデータを解読するのに必要。
これは厳重に秘匿されなければなりません。
ユーザーは「公開鍵」と「秘密鍵」と呼ばれる 2つの鍵を生成します。
公開鍵はサーバーに登録され、秘密鍵はユーザーのコンピュータに保存されます。
ログイン時には、ユーザーは秘密鍵を使用して署名を生成し、それをサーバーに送信します。
サーバーは受け取った署名を対応する公開鍵で検証し、成功した場合にのみログインを許可します。
これにより、秘密鍵そのものはネットワーク上に送信されず、通信の盗聴に対して強固なセキュリティが提供されます。
公開鍵認証の利点は、パスワード認証とは異なり、認証に必要な秘密情報がネットワーク上に明示的に送信されないことです。
また、署名は一時的で再利用不可能なため、盗まれても問題ありません。
この方式は通信の盗聴に対して堅牢であり、また秘密鍵を推測して偽造するのが非常に難しいため、セキュリティの観点からはパスワード認証よりも優れています。
さらに、秘密鍵を保護するために「パスフレーズ」を設定することも可能です。
パスフレーズは複数の単語から成るパスワードで、正しいパスフレーズを入力しない限り、秘密鍵はロックされて使用できません。
これにより、公開鍵認証はさらにセキュアに運用できます。
「公開鍵」の作成は、クライアントPCで作成し、サーバーPCへ転送することで登録(配置)します。
■ 鍵ペアを生成(公開鍵・秘密鍵)
□ オプション(頻繁に使用されるオプションのみを抜粋)
オプション | 説明 | おすすめ |
---|---|---|
-t | 【 暗号化形式 (暗号アルゴリズム) 】 rsa, dsa, ecdsa, ed25519 デフォルトは、rsa形式です。 | rsa |
-b | 【 鍵のビット長 】 生成する鍵の bit数を指定します。 rsaのデフォルトは 2048bitです。 | 4096 |
-C | 【 コメント付与 】 生成される公開鍵の末尾に追加されます。 指定しない場合は「<username>@<hostname>」が追加されます。 | 鍵管理のため付与するもしくは、他人と共有しなければならない場合には余計な情報となるので「-C ” “」と空白にしておくのも吉です。 |
下記「ssh-keygen」コマンド実行後、対話形式で鍵の生成を進めます。
秘密鍵のファイル名に任意の名前を付ける場合の注意事項
上記で説明したように、秘密鍵を生成する際には任意のファイル名を付けることができます。
しかし、環境にもよります(私は他を知らない)が、公開鍵認証接続の設定完了後に「秘密鍵が見つかりません」とエラーが出ることがあります。
理由
(鍵種別にもよりますが)デフォルトで付けられる「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」コマンドを使用する場合
$ 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)内の設定値を確認し、必要に応じて変更する。
公開鍵認証ができない(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 yes
# 修正後
PasswordAuthentication no
< ---省略--- >
■ SSH接続(簡単接続)
早速、SSH接続を行う前に「config」ファイルを作成します。(しておいた方が良いです)
configファイルは、SSH接続の情報を管理するファイルです。
使用用途は、本来、SSH接続を行う時には「username」や「hostname」を入力しなければなりませんが、
configファイルに予め接続情報を記載しておくことで記載した情報に基づいて接続することができるため入力の手間を省くことができます。
「~/.ssh」フォルダ内に「config」ファイルを作成し、下記に従って設定をしてください。
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 📝