2021.06.05
Windows から Linux へssh接続時に公開鍵認証を実装できたので備忘録として。
TeraTermもしくはPowerShellを使うのが一般的らしいが、ひねくれているのですべてコマンドプロンプトで実行してみた。
【参考】
■Windows10で公開鍵認証の鍵ペアを生成してサーバーにSSH接続する
https://onoredekaiketsu.com/generate-key-pair-for-public-key-authentication-in-windows10-and-connect-to-server-with-ssh/
■manページ — SSHD_CONFIG
https://nxmnpg.lemoda.net/ja/5/sshd_config
■SCPコマンドでローカルのファイルをサーバにアップ&サーバ上のファイルをDL
https://qiita.com/ritukiii/items/c724f09fe66fedf2618b
■openssh-serverが入っているのにsshでログインできない
https://killingout-n-bita.hateblo.jp/entry/2018/07/08/162520
1.Windows 側で公開鍵・秘密鍵を作成。
まずは鍵を入れておくためのフォルダを作成する。
コマンドプロンプトを起動し、以下のコマンドを実行。
(ついでにcdコマンドでカレントディレクトリを作成したフォルダにしておく)
C:¥Users¥hemuwan> mkdir .ssh
C:¥Users¥hemuwan> cd .ssh
C:¥Users¥hemuwan> .ssh
C:¥Users¥hemuwan¥.ssh>
次に公開鍵と秘密鍵のペアを作成する。
C:¥Users¥hemuwan¥.ssh> ssh-keygen
ssh-keygen
コマンドを実行すると、パスフレーズの入力を求められる。
任意のパスフレーズを2回入力。(忘れたらまた作り直しになるよ)
-t
オプションで鍵の方式を指定できるけど、今回はお試しでデフォルトのRSAを使ってみる。
パスフレーズを入力したら、dir
コマンドなどでC:\Users\hemuwan\.ssh
配下に
- id_rsa
- id_rsa.pub
が生成されたことを確認する。
「id_rsa」が秘密鍵、「id_rsa.pub」が公開鍵となる。
ユーザー認証で公開鍵認証を用いるために、「公開鍵」の方をSSHサーバーとなるLinuxへ送り付ける。
「秘密鍵」はログイン時に使う。
2.Linux側のユーザに「公開鍵」を送付
.ssh
フォルダで、以下コマンドを実行。
C:¥Users¥hemuwan¥.ssh> scp -P <ポート番号> id_rsa.pub <ユーザ名>@<IPアドレス>:ClientPubKey
scp
コマンドを使い、「id_rsa」を<ユーザ名>のホームディレクトリに「ClientPubkey」と名前をつけて送付している。
(最近ではプロトコルが古くなり、scpコマンドの使用は推奨されていないらしい。OpenSSH開発プロジェクトではsftpやrsyncの利用が増えているとか)
3.Linux 側で、もらった公開鍵を.sshに配置
もらった公開鍵を.ssh 配下に、authorized_keys という名前で配置する。
(これの名前間違えててハマった。必ずauthorized_keysにするかconfig変えるかをする)
以下のコマンドはホームディレクトリに移動した後、cat
コマンドで表示するものを>>
でリダイレクトし、.ssh/
配下にauthorized_keys
という名前のファイルにして保存するというコマンド。
$ cd ~
$ cat ClientPubKey >> ./.ssh/authorized_keys
4./etc/ssh/sshd_config を編集。
最終的にこうした、というのだけ書く。
Port <任意のポート番号>
デフォルトは22。セキュリティ的にデフォルトの番号から変えた方がよいとのこと。
(今回の公開鍵認証の実装に関しては変えても変えなくてもどっちでも)
HostKey /etc/ssh/ssh_host_rsa_key
これないとホスト認証ができない。
ないときはsudo dpkg-reconfigure openssh-server
とかすると、再作成してくれるはず。
(参考:https://killingout-n-bita.hateblo.jp/entry/2018/07/08/162520 より)
PubkeyAuthentication yes
公開鍵認証を許可するかどうか。デフォはno。
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
ユーザ認証のさいに使われる公開鍵を格納しているファイル名を指定。
(設定はそのまま。コメントアウトの#消しただけ)
PasswordAuthentication no
パスワード認証を許可するか。デフォはyes
(なぜかnoにしても公開鍵認証の設定終わるまでパスで入れていた。どうして、、)
PermitEmptyPasswords no
パスワード認証が許可されているとき、パス文字が空のアカウントに対し、 サーバがログインを許可するかどうかを指定。デフォはno。
PermitRootLogin no
ssh を使って、rootがログインできるかどうかを指定。デフォはno。
AllowUsers <任意のユーザ名>
ssh接続を許可するユーザ。
デフォルトでは書かれていないので必要に応じて末尾に書く。
Protocol 2
サポートするプロトコルのバージョンを指定。引数は1,2のみ。
デフォルトでは書かれていないので必要に応じて末尾に書く。
以上の設定が終わったら、読みこみなおす。
$ sudo systemctl restart sshd
5.Windows側から接続を試みる。
コマンドプロンプトから以下のコマンド実行。
ssh <IPアドレス> -l <ユーザ名> -p <ポート番号> -i C:¥Users¥henuwan¥.ssh¥id_rsa
ログイン時、鍵を作った時のパスフレーズ求められる。
(テラタームでも成功した。)
二回目以降は、-i
オプション以降なくてもパスフレーズを求められ、入力するとログインできた。
おわりに
ようやく公開鍵認証を実装できた。
(なんやかんや行き詰ったりして1日つぶれた)
今の状態だと、パスワード同様にパスフレーズを忘れてしまうと、
ログインできなくなる。ssh-agent などを使って、自動ログインできるようにしたいところ。