概要
いつもログインに使ってるPCが故障した,誤ってクライアント側の鍵ファイルを削除してしまったなどして,サーバーから締め出されてしまった...といった際に使用できる対処法を紹介します.
環境
- サーバー(ホスト) : Ubuntu 20.04 LTS (ConoHa VPS)
留意事項
- これからお読みいただくと分かる通り,ConoHa VPSではSSHを使用しなくてもブラウザ上でコンソールが使えます.つまり,ConoHaのパスワードとサーバーのsudoを持ったユーザーのIDとパスワードが割れると乗っ取られます.ConoHaアカウントには二段階認証を設定しておくことをお勧めします.
- 【事前準備】の作業は,サーバーから締め出された後でも,ConoHaのコントロールパネルからVPS管理画面に進み,ブラウザコンソールを使うことで実施することができます.
事前準備: 非常用ユーザーの作成とパスワード認証の例外的許可
公開鍵認証でログインできなくなった際に使うための非常用のユーザーを作成します.
- sudo権限は持たせない
- このユーザーのみ例外的にパスワード認証を許可
- SFTP専用で,自分のホームディレクトリにのみ接続できるようにする.
- 通常時はこのユーザーを使ったSSH接続を拒否するようにする.
sudo権限を持ったユーザーでサーバーにログインし,非常用のユーザーを作成します.<username>
は使いたいユーザー名に置き換えてください.
sudo adduser <username>
パスワードを二回聞かれますので,使いたいパスワードを入力し次へ進んでください.
その後,ユーザーのプロフィールに関する質問(フルネームや電話番号など)を聞いてくる場合がありますが,空欄のまま全部スキップしてください.最後に Is the information correct?
と聞かれたら,Yes
と入力して完了です.
次に,サーバー側のSSH設定を変更します.ターミナル上で使えるテキストエディタを,サーバーに用意しておいてください.(ここではVimを使っています)
sudo vim /etc/ssh/sshd_config
configファイルの末尾に以下を追加してください.DenyUsersは既に指定している場合は,既存の行に,<username>
を付け加えてください.DenyUsersを設定することで通常時はログインができないようにします.そうしないと,パスワードが破られた際に,SFTPで大量のファイルをアップロードされサーバーを破壊される可能性があるためです.また,SFTP限定にしているのもsudoを与えてないとはいえ何かしらのコマンドを実行されるのを防ぐためです.
Match User <username>
PasswordAuthentication yes
ForceCommand internal-sftp
DenyUsers <username>
サービスを再起動すると設定が反映されます.
sudo systemctl restart sshd
[1] クライアント側で鍵ペアを生成
こちらは省略します.
[2] 非常用ユーザーのログインを許可
ConoHa コントロールパネルからVPSの管理画面に進み,「コンソール」をクリックしてください.
コンソールに入ると以下のような表示になると思います.
※ブラウザコンソールは,ブラウザのウインドウを最大化するか全画面表示にして利用することをおすすめします.
<VPSのIPアドレス> Login:
ここで,sudo権限を持ったユーザー名(いつもログインに使用してるユーザー名)を入力し改行します.パスワードを聞かれるのでログインします.
テキストエディタ(Vim等)で /etc/ssh/sshd_config
を開き,DenyUsersをコメントアウトします.(もしくはDenyUsersから非常用ユーザーを除外します)
#DenyUsers <username>
サービスを再起動すると設定が反映されます.
sudo systemctl restart sshd
ConoHaのコンソールはいったん切断します.exit
でログアウトしたらウインドウを閉じてください.
[3] 公開鍵ファイルをアップロード
SFTPに対応したFTPクライアントで,先ほどの非常用ユーザーでログインし,/home/<username>
に公開鍵ファイルをアップロードします.
[4] 公開鍵を既存のユーザーに追加
再びConoHaのブラウザコンソールを開き,普段サーバー管理に使っているユーザーでログインします.次に,以下のようなコマンドを実行してください.
sudo mv /home/<username>/<公開鍵ファイル> ~/.
cat <公開鍵ファイル> >> .ssh/authorized_keys
rm <公開鍵ファイル>
sudo systemctl restart sshd
SSHクライアントから,公開鍵認証でログインできることを確認してください.
後始末: 非常用ユーザーのログインを拒否
全ての作業が終了したら,sshd_configファイルを開き,DenyUsersを再度有効化してください.