一、なぜ公開鍵と秘密鍵でログインするのか#
- より高い安全性
- パスワードの複雑性の問題:パスワードログインは通常、ユーザーが複雑なパスワードを覚える必要がありますが、多くの人は便利さのために簡単なパスワードを選ぶため、ブルートフォース攻撃に対して脆弱です。一方、公開鍵と秘密鍵のログインは非対称暗号技術を使用しており、秘密鍵の長さは通常長く(例えば 4096 ビット)、解読が非常に困難です。(インターネット上で 22 番ポートを公開している SSH サービスは、毎日大量のパスワード破りのログインリクエストを受けており、ログを確認すると毎日千回以上あります)
- 中間者攻撃の防止:公開鍵と秘密鍵の認証メカニズムは、暗号化プロセス中に中間者攻撃を効果的に防ぎます。攻撃者が通信内容を傍受しても、秘密鍵やデータを解読することはできません。
- パスワード漏洩のリスクなし:公開鍵と秘密鍵のログインプロセスでは、秘密鍵は常にローカルに保存され、パスワードログインのようにネットワークを通じて送信されないため、送信中にパスワードが傍受されるリスクはありません。
- より便利なログイン
- パスワードの手動入力が不要:公開鍵と秘密鍵のログインが設定されると、ユーザーは手動でパスワードを入力することなく迅速にサーバーにログインでき、作業効率が大幅に向上します。特に頻繁にサーバーにログインするシーンに適しています。
- 複数のサーバーをサポート:同じ公開鍵を複数のサーバーに追加でき、同じ鍵のペアを使用して複数のサーバーにログインできるため、ログインプロセスが簡素化されます。(ただし、秘密鍵ファイルが失われたり漏洩したりすると、連鎖反応が起こる可能性があります)
- 自動化操作:公開鍵と秘密鍵のログインはパスワードなしでのログインをサポートし、自動化スクリプト操作(Python の Fabric ライブラリを使用した自動デプロイなど)を実現しやすくなります。例えば、SSH を介してリモートコマンドを実行したり、ファイルを転送したりすることができます。
- 拡張性が高い
- 管理が容易:公開鍵は複数のサーバーに簡単に配布でき、秘密鍵はローカルで適切に保管するだけで済みます。鍵を変更する必要がある場合は、鍵ペアを再生成し、新しい公開鍵をサーバーにアップロードするだけです。
二、鍵ペアの生成#
公開鍵と秘密鍵でサーバーにログインするには、まず鍵ペアを生成する必要があります。ローカルコンピュータで ssh-keygen
コマンドを使用して鍵ペアを生成できます。
ssh-keygen
コマンドには OpenSSH クライアントのインストールが必要です。
Windows 11 を例にすると、設定 > システム > オプション機能で OpenSSH クライアントを検索してインストールし、powershell
を使用してインストールされているか確認します。
> gcm ssh-keygen
CommandType Name Version Source
----------- ---- ------- ------
Application ssh-keygen.exe 9.5.3.1 C:\Windows\System32\OpenSSH\ssh-keygen.exe
- 鍵ペア生成コマンド、
ssh-keygen -t rsa -b 4096
-t rsa
:鍵のタイプを RSA に指定します。-b 4096
:鍵の長さを 4096 ビットに指定します。より高い鍵の長さは、より強い安全性を意味します。
Enter を押すと、鍵を保存するファイルのパスとオプションのパスワードを入力するように求められます。パスワードが不要な場合は、Enter を押してスキップできます。
デフォルトでは、鍵は ~/.ssh/id_rsa
(秘密鍵)と ~/.ssh/id_rsa.pub
(公開鍵)に保存され、Windows では一般的に C:\Users\<ユーザー名>\.ssh
にあります。
例えば、私の場合は
24123@lolik ~\.ssh
> ls
ディレクトリ: C:\Users\24123\.ssh
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/2/19 10:03 210 config
-a---- 2024/6/7 14:43 3381 id_rsa
-a---- 2024/6/7 14:43 738 id_rsa.pub
-a---- 2025/2/19 9:57 5828 known_hosts
-a---- 2025/2/19 9:52 5080 known_hosts.old
known_hosts には接続したサーバーの公開鍵が保存されている可能性があります。私の config は VS Code が保存したリモート接続情報を基に作成されており、エイリアスやホスト名などが含まれています。
- 接続操作の簡素化
上記の config ファイルに(存在しない場合は自分で作成)例えば:
# SSH configファイルについての詳細: https://linux.die.net/man/5/ssh_config
Host winserverA
HostName 1.1.1.1
User administrator
IdentityFile ~/.ssh/id_rsa
Host serverB
HostName 1.1.1.1
User root
IdentityFile ~/.ssh/id_rsa
-
Host
:サーバーにエイリアスを設定し、記憶しやすくします。 -
HostName
:サーバーの IP アドレス。 -
User
:サーバーのユーザー名。 -
IdentityFile
:秘密鍵ファイルのパス。IdentityFile
はデフォルトで~/.ssh/id_rsa
のようです。私は
ssh エイリアス
またはssh username@ip
コマンドを使用して直接ログインでき、-i ~/.ssh/id_rsa
を指定していません。
三、公開鍵をサーバーにアップロードする#
- 公開鍵の内容をクリップボードにコピー
cat ~/.ssh/id_rsa.pub
出力内容を選択してコピーします。
-
サーバーにログインし、パスワードまたは他の方法を使用します。
サーバー上で、ホームディレクトリ~に
.ssh
ディレクトリを作成します(存在しない場合)、そして権限を変更します。mkdir -p ~/.ssh chmod 700 ~/.ssh
vi または vim を使用して~/.ssh/authorized_keys を作成します。
vim ~/.ssh/authorized_keys
公開鍵を貼り付けて保存します。
-
サーバーの SSH 設定を変更
/etc/ssh/sshd_config
ファイルを編集します。vim /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
公開鍵認証を許可し、公開鍵ファイルを指定します。
PermitRootLogin
をprohibit-password
またはwithout-password
に設定し、root ユーザーのパスワードログインを無効にし、公開鍵ログインのみを許可します。
-
設定を有効にするために sshd サービスを再起動します(古いコマンド
service
を使用することもできます)。sudo systemctl sshd restart
-
ログインテスト
例えば、ローカルコンピュータのターミナルで、server_ip はサーバーの IP です(上記の config でエイリアスを設定した場合は、エイリアスを使用してログインできます)。
ssh root@server_ip
ローカルが初めてログインする場合は警告が表示され、yes を入力すればよいです。
問題がなければ、直接サーバーにログインでき、非常に便利です。