fjordbootcampmのsshのプラクティス、リモートサーバーに自分のパソコンからsshによって公開鍵を設定して、公開鍵を使ってログインするというものでした。
そこに、私は15時間以上費やしてしまいました💦 そんなに苦戦した理由とは何か・・・ それは
コメントアウトをしていなかったことです
何に苦戦していたのか
具体的に言うと、リモートサーバー側のポート番号を変更できなかったということです。結果的に、sshd_configファイルを編集するときに#を消すのを忘れて、#をつけたままポート番号を書き換えていたため、反映されなかったということでした(#はコメントを表すので設定には反映されない)💦
クライアント(ローカルPC)でリモートサーバーに公開鍵を使ってログインするまでの流れ
私のような失敗をするような人は少ないと思いますが、自分の学んだことを整理するために、公開鍵の設定からログインまでの手順を書き残しておきたいと思います。
1.まずは、リモートサーバー側にsshをインストールして、設定します。
参考までに私はリモートサーバーは「さくらVPS」で、「Debian」をインストールしています。
apt install ssh
により、sshをインストールします。 そしたら、/etc/ssh/sshd_configというファイルが自動で作成されると思います。これが、sshの設定内容が書かれたファイルであり、これを編集することで設定変更ができます。
これから設定を変更するため、バックアップをとっておきましょう。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
そして、viで編集しちゃいましょう。以下のコマンドでviでの編集が可能です。
sudo vi /etc/ssh/sshd_config
そうすると、以下のような画面が出てきます。
私はもうポート番号を設定し終わった後ですが、ポート番号はデフォルトでは22になっています。 22では、セキュリティ的に不安があるので、任意の番号に変えておくと良いそうです。その時は、ウェルノウンポート(詳しくは下記のリンクに)よりも、エフェメラルポート(主に私的目的のためのポート、詳しくは下記)の方が良いでしょう。
そして、PermitRootLogin をyesからnoにしてください。これは、「sshクライアント(ここでいう自分のPC)がリモートサーバーにroot権限でログインすることを許しますか?」という文言です。これがyesのままだと、もし他の誰かがログインできちゃったときにroot権限を行使することができちゃいます。
ここで、重要なことは変更を加える項目の#を消して、番号を書き換えるなり、yes・noを記述することです。#
はコメント扱いなので、設定には反映されないからです。
変更を加える項目は#を外しましょう(懇願)🙇♂️
後、設定を書き換えたら以下のコマンドでsshを再起動させなければ、設定は反映されません。ここも気をつけましょう。
sudo /etc/init.d/ssh restart
sshとは?
Secure Shell の略。主にUnixコンピュータで使われます。ネットワークを介して、他のコンピュータにログインして、操作することができるソフトウェアです。このとき、ネットワーク上の通信は暗号化されるので、安全に通信することが可能です。
ポートとは?
IPアドレスが住所とした時の扉にあたります。ポート番号は、扉の番号で、個々のIPアドレスにたどり着くためにはこの扉を通らなけらばいけません。その扉をどの扉にするのか自分たちで設定が可能ということです。
2.クライエント側で公開鍵を作成しましょう
設定が終わったら、クライエント側で公開鍵を作成します。
まずは、sshに関するファイルを作ります。
sudo mkdir ~/.ssh
そして、そのファイルに移動します。
cd ~/.ssh
そしたら、以下のコマンドを入力します。
sudo ssh-keygen -t rsa
ssh-keygen
は、sshで利用する鍵を作成するコマンドです。-t
は作成する鍵の種類を指定するオプションです。今回は、rsaという種類を指定します。- おそらく、上記のコマンドを入力するとパスフレーズの設定を求めてきますが、いらないと思ったらそのままenterを押してください。
鍵ができているか見てみましょう。.sshに移動して、
ls
コマンドでみれます。
おそらく、
id_rsa id_rsa.pub
の2つのファイルがファイルができていると思います。この、.pubの方が公開鍵となりますので、こちらを以下のコマンドで、クライアントに登録します(Macのキーチェーンを使った方法になります)。
ssh-add -K ~/.ssh/id_rsa
3. クライアント側で公開鍵をリモートサーバーに登録しましょう
まずは、リモートサーバー側に送られてきた公開鍵を受け取るためのディレクトリを作成します。今回は、.ssh
というディレクトリを作成します。
mkdir ~/.ssh
次は、リモートサーバーに公開鍵を送りましょう。送る方法はいくつかありますが、今回は、scpコマンドを使います。
scp -P <設定したポート番号> ~/.ssh/id_rsa.pub <リモートサーバーのユーザー名>@<リモートサーバーのIPアドレス>:~/.ssh
- scpはSSHによってリモート-クライアント間でファイルをコピーするときに使うコマンドです。今回は、作成した公開鍵をリモートのサーバーに送っています。
- おそらく、初回はリモートサーバーのパスワードを要求してくると思うので、パスワードを入力しましょう。
- ここの<>は分かりやすいように便宜上書いているので、実際にコマンドを打つ時は、<>は不要です。
私は、ユーザー名を変に入力してしまって3時間以上悩んでいました💦
公開鍵を送っただけでは、まだSSH接続をすることができません。リモートサーバー側に送った公開鍵を登録してやる必要があります。 まず、さっき送った公開鍵がリモート側に存在するか確認しましょう。
ls ~/.ssh
上記のコマンドで、さっき送ったid_rsa.pub
というファイルが存在すればOKです。
リモート側に公開鍵を登録するためには、鍵の名前をauthorized_keys
に変更してやる必要があります。
ですので、~/.ssh
ディレクトリ で以下のコマンドを実行します。
mv id_rsa.pub authorized_keys
これで、id_rsa.pub
の名前がauthorized_keys
に変わるはずです。
ここまでできたら、リモートサーバーへの鍵の登録が完了です😆 ここで、一応リスタートしましょう。
4. sshコマンドでリモートサーバーにアクセスしてみましょう。
登録が終わったら
sudo ssh {リモートサーバーのユーザー名}@{リモートサーバーのIPアドレス}
でリモートサーバーにログインすることができます。
クライアント側のユーザー名がリモートサーバーのユーザー名になっていればログイン成功です!!!
sudo ssh -p <ポート番号> <リモートサーバーのユーザー名>@<リモートサーバーのIPアドレス>
でポート番号を指定して、ログインすることもできます。
-p
はポート番号を指定するオプションです。小文字にすることを気をつけてください。
また、公開鍵でログインができたら、パスワード認証をできなくしましょう。具体的には、リモートサーバーのsshd_configファイルのPasswordAuthentication
をnoに書き換えます。
ここまでで、ログインすることができたでしょうか?
それでもできないときは?
「できないよー💦」って人は、スペルミスやエラーコードが表示されていないかみましょう。 それでも何が原因かわからないという場合には、sshd/_configの書き間違えの可能性もあります。その原因を探るために、構文チェックを行いましょう!!クライアント側で以下のコマンドを実行してみてください。
/usr/sbin/sshd -t
これで、構文のチェックが行えます。何も出てこなかったら正常です。これを使って、エラーをググると解決するかもしれません。
どうでしょうか、リモートサーバーにログインすることはできたでしょうか?ポート番号を変えることはできたでしょうか。 私から皆さんに伝えたいことは、変更する項目は、sshd_configファイルの#を消して変更を加えることです!!!
参考サイト
追記
[2020.04.30] 一部内容が分かりにくい部分があったため、修正しました🙇♂️
[2020.06.07] OpenSSH公式ではscp
コマンドが非推奨のようなので、sftp
などを使った方が良いみたいです。
参考サイト