はじめに
この記事では Windows マシンから Ubuntu のサーバーに公開鍵認証を使って SSH の接続をするやり方を説明しています。もうパスワードとはおわかれ!
ちなみに前回の続きです。前回はコチラ ↓
前回、上の記事でおふるのノート PC を Linux サーバー(Ubuntu)に仕立て上げました。ネットワーク設定などいろいろすったもんだありましたが、なんとか SSH でパスワード認証をするとこまでできてましたね。
今回はパスワード認証ではなく、公開鍵認証に切り替えてよりセキュアに通信してみたいと思います。まだローカル内で動かしてるので別にセキュリティレベルは変わらないけど一応ね。いろいろ手を動かすのが目的だから!
環境
SSH クライアント
OS: Windows 11 Home 23H2
SSH サービス: OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
SSH サーバー
OS: Ubuntu 24.04 LTS
IP: 192.168.1.50 (← 前回固定化した)
SSH サービス: OpenSSH_9.6p1 Ubuntu-3ubuntu13.4, OpenSSL 3.0.13 30 Jan 2024
なお、Windows から SSH する場合、Tera Term というコマンドプロントをエミュレーションするアプリケーションを使うのが一般的らしい。なんでも、Windows 10 より前はコマンドプロントで ssh
できなかったからみたい。でも 10 以降はコマンドプロントからもできるようになっているので特にインストールせず進める。
仕組み
まず、SSH の接続の仕組みをざっくり説明する。以下の記事に SSH のしくみについて自分で理解した点をくわしくまとめています。
SSH には 2 つの接続方式があって パスワード認証 と 公開鍵認証 です。
前回までやってたのが「パスワード認証」今回や設定するのが「公開鍵認証」。超ざっくりいうとクライアント側でキーペアを作って、公開鍵だけサーバーに置いておき、接続のたびに署名検証をする認証方式です。ざっくりになってないかも。まあ鍵をつかうんや!
やり方
やり方の手順を説明します!
① 鍵の作成
② 鍵の送付
③ 設定
④ 公開鍵でログイン!
この順序でいきます。最初にまとめとくとこんな感じでコマンドを打ちます。
C:\Users\gj5752> ssh-keygen # 鍵生成
C:\Users\gj5752> scp .\.ssh\id_rsa.pub 192.168.1.50:~/.ssh # 鍵送付
C:\Users\gj5752> ssh 192.168.1.50 # SSH つないでいろいろ設定する
gj5752@gj-server:~$ cat ./.ssh/id_rsa.pub >> ./.ssh/authorized_keys # 鍵を配置
gj5752@gj-server:~$ sudo vi /etc/ssh/sshd_config # config を編集
gj5752@gj-server:~$ sudo systemctl restart sshd # SSH の再起動
gj5752@gj-server:~$ exit # 一旦ログアウト
C:\Users\gj5752> ssh 192.168.1.50 # 公開鍵認証でログインできる
キーペアの作成
まず 公開鍵と秘密鍵をつくります。ssh-keygen
というコマンドを打ちます。
C:\Users\gj5752> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\gj5752/.ssh/id_rsa):
すると「RSA でキーペアつくるよー」と言われます。そのあと「ここ ~\.ssh\id_rsa
に作るけどいい?」と聞かれます。普通はここ(ホームディレクトリ下の .ssh
ディレクトリ)になるのでそのまま Enter を押します。
C:\Users\gj5752> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\gj5752/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
passphrase つまり「パスフレーズ」を聞いてきます。これはこの鍵を使うためのパスワードみたいなもので、自分で設定することができます。設定しなくてもいいです。設定すると公開鍵で SSH 接続しようとするときに入力する必要があります。今回は何も設定せず、何も打たずに Enter を押しました。
C:\Users\gj5752> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\gj5752/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\gj5752/.ssh/id_rsa
Your public key has been saved in C:\Users\gj5752/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:3ENxSNn9FzSEJUxs78x8Qp2Ebpmrd7a2gDIennBrEzQ gj5752@GJ-PC
The key's randomart image is:
+---[RSA 3072]----+
| .o+=+*= |
| oo.*oo.|
| . o =oo|
| . E =.o+|
| S + ..* .|
| . ....=.|
| . =.... ..|
| =o*. ..+ |
| .=. . +oo|
+----[SHA256]-----+
するとこのように鍵が生成されます。なんか絵が書かれていますが、これは作られた公開鍵のハシッシュ値のアスキーアートです。比較するときはこれ見てね!ってことです。かわいいね
さて、作られたキーペアですがホームディレクトリ配下の ~\.ssh
にあります。ここをのぞいてみます。
C:\Users\gj5752> cd .ssh
C:\Users\gj5752\.ssh> ls
Directory: C:\Users\gj5752\.ssh
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2024/07/15 22:14 2602 id_rsa
-a--- 2024/07/15 22:14 567 id_rsa.pub
-a--- 2024/07/15 1:38 1587 known_hosts
id_rsa
と id_rsa.pub
というのがあります。これが鍵です。pub になっているのが公開鍵、ついてないのが秘密鍵です。せっかくなので中身を見てみましょう。
known_hosts
というファイルは既に SSH 接続をしたサーバーのホスト公開鍵とユーザー名が保存されているファイルです。SSH 接続の際のホスト認証ではこのファイルとホスト公開鍵を照合しています。
C:\Users\gj5752\.ssh> cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
秘密鍵はこのようになっています。なお、今は紹介のため載せていますが、これは絶対に誰にも見せていけません。 公開鍵も見てみましょう。
C:\Users\gj5752\.ssh> cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCwmI2/ozlyuwPrivrmaAiR8GqTBSRWrSKtYtPT+ZQK0dk6ucYRB//HMHj/KnzGFQ5GsiAIQJcjEtoMtdjFkS/gsqyh10+L9SlwCqG2pqybDvAr3txQNiNaqGOQykSJoUa91yIG8fF1aH7wcLBfKMDLtaGaeCLkjye9SNhsfq8hgu+tgLSb6m6VrG2ncZOnCIQ60MOxWn/J9dQ9wJDaad0LU5yjMmm3jVIcKsRhHLvcYQQBsOkfPY5g+WeNsIiZD+4yiyVUdVICIbJD9vucIzYhqFVdUO+IbaxwRCopYBDfRz69NAc6KSXlXo88CS+F1ZaAGWuoDFlakwOJZolTyI7IrHGFkd7UojZV76+z9JU9ZD6BBL4BTNMfLzRRlkkzOmGlZ1E4dOvScVCg8MvdALxUAYCk1gw56Hu062lYJ/RObMa6Wf/JCn9tJaNb4ffzU/bji/XxAnUnvffdTohFoY/mPpItYLcNWw2sKP6LispDNZKCjTqLzqbvDJ90c5Q6Y1c= gj5752@GJ-PC
公開鍵は改行がされてないですね。これは別に公開するので自由に載せても OK です。
これで鍵がつくれました!わーい
公開鍵をサーバーにわたす
作った鍵を持ってるだけではどうしようもないので 公開鍵の方を サーバーにわたします。秘密鍵はダメですよ!
ファイルの転送には scp
というコマンドを使いましょう。scp
は scp 送信したいファイル 送信先
と指定します。今回は作った 公開鍵 を送るので ~\.ssh\id_rsa.pub
をサーバーに送ります。どこでもいいですけど、保存先は向こうでも同じ ~/.ssh
なのでここに送りつけましょう。~
とはホームディレクトリのこと。次のコマンドを打ちます
C:\Users\gj5752> cd .ssh
C:\Users\gj5752\.ssh> scp id_rsa.pub 192.168.1.50:~/.ssh
gj5752@192.168.1.50's password:
id_rsa.pub 100% 567 60.1KB/s 00:00
ホームディレクトリから cd .ssh
で鍵がある .ssh
ディレクトリに入り込んで scp id_rsa.pub 192.168.1.50:~/.ssh
を叩きます。パスワードを聞かれるので前回までパスワード認証で入っていたパスワードを入れます。これで id_rsa.pub
をサーバー君の ~/.ssh
に送ることができました。確認してみましょう。サーバーに ssh
をたたいてつなげてみます。
送付先に
.ssh
ディレクトリがない場合もあります。その場合はテキトーなところに送っておいて、ssh つなげたあとにmkdir
などでディレクトリを作りましょう。このときchmod
で権限を700
にしてください
C:\Users\gj5752> ssh 192.168.1.50
gj5752@192.168.1.50's password:
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-38-generic x86_64)
---略---
gj5752@gj-server:~$ cd .ssh
gj5752@gj-server:~/.ssh$ ls
authorized_keys id_rsa.pub
gj5752@gj-server:~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCwmI2/ozlyuwPrivrmaAiR8GqTBSRWrSKtYtPT+ZQK0dk6ucYRB//HMHj/KnzGFQ5GsiAIQJcjEtoMtdjFkS/gsqyh10+L9SlwCqG2pqybDvAr3txQNiNaqGOQykSJoUa91yIG8fF1aH7wcLBfKMDLtaGaeCLkjye9SNhsfq8hgu+tgLSb6m6VrG2ncZOnCIQ60MOxWn/J9dQ9wJDaad0LU5yjMmm3jVIcKsRhHLvcYQQBsOkfPY5g+WeNsIiZD+4yiyVUdVICIbJD9vucIzYhqFVdUO+IbaxwRCopYBDfRz69NAc6KSXlXo88CS+F1ZaAGWuoDFlakwOJZolTyI7IrHGFkd7UojZV76+z9JU9ZD6BBL4BTNMfLzRRlkkzOmGlZ1E4dOvScVCg8MvdALxUAYCk1gw56Hu062lYJ/RObMa6Wf/JCn9tJaNb4ffzU/bji/XxAnUnvffdTohFoY/mPpItYLcNWw2sKP6LispDNZKCjTqLzqbvDJ90c5Q6Y1c= gj5752@GJ-PC
ちゃんとサーバーの ~/.ssh
の中に id_rsa.pub
があります!おんなじものが入っていますね。 .ssh
ディレクトリの中に authorized_keys
というものが見えると思います。ここに公開鍵の情報を保存します。普通に cat
とかでコピーをすればいいです。
authorized_keys
がなければ作りましょう。権限はデフォルトでは600
なので同じようにしておくのが良いと思います。
gj5752@gj-server:~/.ssh$ cat id_rsa.pub >> authorized_keys
これで authorized_keys
に公開鍵の情報が登録されました!ちゃんと開いてみるとコピーされています。なお、もう公開鍵のファイルはいらないので消しておきましょう。
gj5752@gj-server:~/.ssh$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCwmI2/ozlyuwPrivrmaAiR8GqTBSRWrSKtYtPT+ZQK0dk6ucYRB//HMHj/KnzGFQ5GsiAIQJcjEtoMtdjFkS/gsqyh10+L9SlwCqG2pqybDvAr3txQNiNaqGOQykSJoUa91yIG8fF1aH7wcLBfKMDLtaGaeCLkjye9SNhsfq8hgu+tgLSb6m6VrG2ncZOnCIQ60MOxWn/J9dQ9wJDaad0LU5yjMmm3jVIcKsRhHLvcYQQBsOkfPY5g+WeNsIiZD+4yiyVUdVICIbJD9vucIzYhqFVdUO+IbaxwRCopYBDfRz69NAc6KSXlXo88CS+F1ZaAGWuoDFlakwOJZolTyI7IrHGFkd7UojZV76+z9JU9ZD6BBL4BTNMfLzRRlkkzOmGlZ1E4dOvScVCg8MvdALxUAYCk1gw56Hu062lYJ/RObMa6Wf/JCn9tJaNb4ffzU/bji/XxAnUnvffdTohFoY/mPpItYLcNWw2sKP6LispDNZKCjTqLzqbvDJ90c5Q6Y1c= gj5752@GJ-PC
gj5752@gj-server:~/.ssh$ rm id_rsa.pub
gj5752@gj-server:~/.ssh$ ls
authorized_keys
これで公開鍵の送付は終わりです!
公開鍵認証をするように設定
公開鍵をサーバー君に教えることができました。でもこのままではまだパスワードで認証してしまいます。なのでサーバー君に公開鍵で認証するようにして~と言わないといけません。設定を変えましょう!
とおもったけどもうこの時点でなんか普通に公開鍵認証で接続できてました。デフォルトで公開鍵もパスワードもどっちの認証も OK だから優先されるのかな。いずれにしてもパスワードはもう off にしてしまいましょう!
パスワード認証を off にするにはサーバー側の方の設定ファイルを編集します。/etc/ssh
ディレクトリにある sshd_config
をいじります。
gj5752@gj-server:~$ cd /etc/ssh
gj5752@gj-server:/etc/ssh$ ls
moduli ssh_config.d sshd_config.d ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
ssh_config sshd_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key ssh_import_id
ちゃんとありますね。このファイルの PasswordAuthentication
がデフォルトは yes
になっているので no
に編集しましょう。
PasswordAuthentication no
これでパスワード認証が off になります。編集には vi
などを使ってください。sudo
を忘れずに
ちなみにこれだけでは完全には off にならないことがあります。
/etc/ssh/sshd_config.d
というディレクトリにある50-coloud-init.conf
がわるさをしていて、ここにPasswordAuthentication yes
が書かれていることがあります。どうもこれが config の上書きをしてしまうようで、ここもno
にしましょう!!(これがまったくわからなくて、鍵を消してもパスワードで入れてしまう...なんでなんでなんでなんでーーーってずっとなってました。このバカ!ちなみに解決には こちらの記事 が役に立ちました。ありがとう.....
そして次のコマンドで ssh を再起動します。sshd の d はデーモンの d で、サーバーとして起動してる ssh です。
gj5752@gj-server:~$ sudo systemctl restart sshd
実はここでも問題が発生し、
sshd.service not found
と怒られていました。なんなんだよ一体。ちくせう。こちらの記事 を参考に ssh のインストールと有効化を行いました。みんなも気をつけてね!
これで SSH デーモン閣下を再起動し、設定を反映することが出来ました!一回ログアウトしてまた ssh
をたたいてつなげてみると...
C:\Users\gj5752> ssh 192.168.1.50
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-38-generic x86_64)
---略---
gj5752@gj-server:~$
パスワードも何も聞かれずログインができました!!裏で公開鍵認証が行われています。なお、パスフレーズを設定した場合はここで聞かれるので入力すれば入れます。
ちなみに、さっきクライアント側で作った鍵を消してログインし直してみると
C:\Users\gj5752> ssh 192.168.1.50 gj5752@192.168.1.50: Permission denied (publickey).
このように、公開鍵じゃないとダメだよーと言われます!これをやる場合はサーバー側からパスワード認証を on にしないとログインできなくなっちゃうのでちゅうい
これで公開鍵認証による接続ができるようになりました!!やったね
おわりに
公開鍵認証ができるようになって、パスワードいらずでログインできるようになりました。いい感じ。つぎにやりたいのはポートの設定とかかなあ。あとなんかちょっと重い感じがするんだよね、SSH。まあこの辺はおま環なのか変えることができるのかわかんないけどまたいろいろ調べて挑戦したいと思います!
参考
またまた参考になりました記事が大量です。ありがとうございます。特にパスワード認証が一向にオフにならない問題については悩まされました。まったくもう
Windows -> Linux へssh接続で公開鍵認証を実装
SSH公開鍵認証で接続するまで
sshでファイル転送の手順
[Ubuntu]SSHで接続できない
PasswordAuthenticationで躓いたお話