【非エンジニアが挑む】VPSの初期セキュリティ設定|7つのステップで「狙われる側」から抜け出す

【非エンジニアが挑む】VPSの初期セキュリティ設定 7つのステップで「狙われる側」から抜け出す
Tomoya

VPSについて調べていると、契約したばかりのデフォルトの状態が一番狙われやすい、という話が繰り返し出てきました。

これがとても気になったので、最低限のセキュリティ対策を調べ、「なぜそれをやるのか」を理解した上で、今回もAIにサポートしてもらいながら作業を進めていきました。

VPSを契約すると、みな一律で同じ初期状態からスタートします。デフォルトのポート(22番)や、rootという決まったユーザー名での認証方法——これは便利な反面、「みんな同じ」だからこそ、そこを狙ってスパムボットや乗っ取りボットが常に巡回し、パスワードの総当たりを試みてくる、というのが今回知った怖さでした。

そこで今回は、デフォルトの状態から抜け出し、自分だけのサーバーにしていくという方針でセキュリティ対策を進めていきます。

進めていく中で他にも知るべきリスクは色々あると思いますが、今回はまず必要最低限のところまでを実践しました。全体的には割とスムーズに進みましたが、新しいコマンドへの戸惑いや、SSHのポート変更まわりで大きくつまずいた場面があったので、そこも正直に共有していきます。


目次

今回のロードマップ

今回行うのは、以下の7ステップです。

  1. OSを最新の状態にする
  2. 作業用の一般ユーザーを作る
  3. そのユーザーで接続できることを確認する
  4. rootでの直接ログインを禁止する
  5. パスワード認証を無効化し、鍵認証のみにする
  6. SSHのポート番号を変更する
  7. ファイアウォールで不要なポートを閉じる
注意点を先にお伝えします

ターミナルでエラーが出ても、焦らずどっしり構えてください

焦っていろいろ消してしまうと、自分自身がサーバーから締め出されてしまうリスクがあります。

この記事の通りに進める場合、時間制限は特にないので、安心してゆっくり進めてください。コマンドの打ち間違えや、ご自身のサーバー環境に応じた読み替えは適宜行ってください。

※操作・設定は自己責任で行ってください。


STEP

OSを最新の状態にする

ここはコマンドを打つだけで、スムーズに進みました。

apt update
apt upgrade -y

upgradeの方は5分程度時間がかかりましたが、僕は特にやることはなく、進んでいく様子をただ眺めているだけでした。拍子抜けするくらい、あっさり完了しました。

STEP

一般ユーザーを作り、そのユーザーで接続を確認する

ここでは、root以外に自分専用の一般ユーザーを新たに作り、それをメインの接続先にしていく、ということを学びました。

rootはどのVPSにも存在する【デフォルトの入口】なので一番狙われやすく、自分でカスタマイズしたアカウントを作って管理者として使うことで、そのセキュリティの穴を塞ぐことができました。

adduser tomoya<自身のカスタマイズした名前を利用してください> ※新しい一般ユーザーの追加
usermod -aG sudo tomoya ※追加したユーザーに管理者権限の付与
groups tomoya ※確認。sudoという文字が結果に含まれていればOK
adduser補足:
  • New password: → 新しいパスワードを入力(rootとは別の、新しいパスワードにしてください。画面には何も表示されませんが、ちゃんと入力されています)
  • Retype new password: → 確認のため同じものをもう一度
  • その後、フルネームや電話番号などを聞かれますが、すべて空欄のままEnterでスキップして問題ありません
  • 最後に「Is the information correct? [Y/n]」と聞かれるので Yを入力してEnter

ここで学んだ、今回の【鉄則】とも言える考え方があります。

1つのターミナルだけで作業を進めず、2つ目のターミナルを新しく開いて確認するということです。

2つ目で万が一うまくいかなくても、1つ目が生きていればそこから元に戻せます。

この「保険を残しながら進める」という感覚は、この後のすべてのステップで貫きました。

rsync --archive --chown=tomoya:tomoya ~/.ssh /home/tomoya ※rootの鍵を新しいユーザーにも使えるようにする
ssh -i 鍵ファイルのパス tomoya@サーバーのIPアドレス ※別ターミナルで接続確認 
sudo whoami ※管理者権限(sudo)がちゃんと使えるか確認
Tomoya

多少の緊張感はありつつも、ここまではスムーズに接続を確認できました。

rsync補足:「rootが持っているSSHの鍵情報(.sshフォルダ)を、そのままtomoyaのフォルダにコピーして、持ち主をtomoyaに変更する」というコマンドです。これで、今使っている同じ秘密鍵ファイルで、tomoyaとしてもログインできるようになります。

補足:#はroot=管理者、$は一般ユーザーの印

STEP

rootでの直接ログインを禁止する

一般ユーザーでの接続を確認した後、いよいよrootの直接ログインを禁止するステップに進みます。

Tomoya

ここで初めて、nanoという設定ファイルを編集するためのエディタを使いました。

sudo nano /etc/ssh/sshd_config ※nanoエディタ設定ファイルを開く

Ctrl + Wで検索モードになるので、PermitRootLoginを検索し該当項目をnoに書き換え、保存。その後、必ず文法チェックと反映を挟みます。

保存して閉じる
  • Ctrl + O(保存)→ そのままEnter
  • Ctrl + X(nanoを閉じる)
sudo sshd -t ※文法チェック
sudo systemctl restart ssh ※反映
sshd_configファイルを編集し、PermitRootLogin no に変更してrootログインを禁止する設定
Tomoya

見慣れないエディタで多少の不安はありましたが、提案された手順通りに進めることで、初めてでも無事に完了させることができました。

ここで一つ強く感じたことがあります。

AIにサポートしてもらうことで、新しい領域の体験をこんなにもスムーズに行えるのか、という感動です。

本来であれば、必要に迫られなければ避けてしまうようなことですし、行うにしても根気や責任が求められます。それでもエラーが起きると戸惑いや諦めに陥りやすく、修正するのも一苦労です。

しかしAIにサポートしてもらうことで、初心者でも成功体験を積みやすいと感じました。VPSに限らず、様々なことへの参入障壁が今、大幅に下がっているのだと実感します。

普通なら最初の段階で挫折してしまうくらい難しいことでも、サポートを受けながら進められる——大きな時代の変化を感じた瞬間でした。

STEP

パスワード認証を無効化し、鍵認証のみにする

ここではパスワードによる総当たり攻撃そのものを無効化するために、SSHキーのみでの認証方式に切り替えます。自分が保管している鍵ファイルでしかログインできなくなる、今回で一番効果の大きい一手のようです。

sudo nano /etc/ssh/sshd_config

PasswordAuthenticationnoに書き換え。

続いて鍵認証が有効になっているかも確認。PubkeyAuthentication yesとなっていればOKです

先程と同じように保存し文法チェックと反映、そして別ターミナルでの動作確認、という流れで行いました。

sudo sshd -t
sudo systemctl restart ssh

このステップを終えた頃には、VPSでの作業の【基本の型】が見えてきました。

何かを変更したら、保存→文法チェック→反映→別ターミナルでの動作確認、を徹底する。

Tomoya

これを守ることで、確実に変更を完了させられるのだと感じます。
とても丁寧なフローで、安心して進められました。

STEP

SSHのポート番号を変更する(今回一番のつまずき)

今回のつまずきポイント

次に、デフォルトのポート(22番)から変更するステップです。ここで大きくつまずきました。

前のステップと同様にnanoから設定を行いましたが、今回は書き換えではなく、新しい行としてポートを追加し、保険を残しながら進めました。

Port 22
Port XXXXX ※自身の任意の番号(1024〜65535の範囲)

保存してチェック、反映。

ポートの変更にあたっては、以前Connection timed outの原因になっていたXserver側のパケットフィルターも設定し直しました。今回は「SSH」ではなく「カスタム・単一・自分の指定したポート番号」で追加しています。

Xserver VPSの管理画面でパケットフィルター設定を開き、新しい接続ポートを追加する手順
Xserver VPSのサーバー管理パネルにて、パケットフィルター設定の一覧から新しい接続許可ポートを手動追加する操作画面です。

その後、別ターミナルで動作確認をしたところ、今度はConnection refusedというエラーになりました。

少しパニックになりましたが、原因をAIに教えてもらったところ、「Ubuntuには、SSHをsystemdのソケット機能で管理する仕組みがあり、これが有効になっていると、設定ファイルを書き換えただけでは反映されない」ということがわかりました。これも、デフォルトの仕組みだからこそ起きうるエラーでした。

sudo ss -tlnp | grep ssh ※待ち受けポートの確認
systemctl status ssh.socket ※ソケット機能の状態を確認
Tomoya

待ち受けポートとソケットの状態を確認し、ソケットがactiveになっていることを確認したことで、原因はほぼ確信に変わりました。

sudo systemctl disable --now ssh.socket ※socketの停止
sudo systemctl enable --now ssh.service ※serviceの有効化
sudo systemctl restart ssh.service ※再読み込み

ソケットを無効化してSSHサービスに切り替え、反映させたあと、もう一度待ち受けポートを確認し、再度動作確認をしたところ、無事に新しいポートへの接続を確認できました。

その後、nanoで22番の行を削除して反映し、パケットフィルターからも22番のルールを削除して完了です。

SSHサービスの起動状態を確認し、ssh.socketが無効(disabled)でssh.serviceが有効かつ稼働中(active)であることを表示
systemctl statusコマンドでSSH関連サービスを確認し、ssh.serviceがactive (running)になっている様子を示しています。
エラーを経た感想

途中、自分がどこかでコードの記入をミスったのかと少し焦りましたが、原因は自分のミスではなくシステムのデフォルトの仕組みにあった、というのは新しい気づきでした。

自分では思いつかないところに原因が隠れていることもあるのだと痛感します。AIがいなければ、あのままかなり長い間にハマっていただろうと思うと、今でも少し肝が冷えます。

STEP

ファイアウォールで不要なポートを閉じる

最後に、ファイアウォールを有効化し、SSH以外の余計なポートも塞いで、サーバー全体をシンプルに守ります。

Tomoya

ここは地雷を踏む可能性もあったので、慎重に進めました。

sudo ufw allow XXXXX/tcp ※新しいSSHポートを「許可」に登録
sudo ufw show added 設定内容を確認
sudo ufw enable ※ファイアウォールを有効化
sudo ufw status ※状態を確認

自分が使っているSSHポートのみに限定して許可することで、セキュリティを一律に強固にできます。

Tomoya

ステータスと、ポートが確実に設定されているかを何度も確かめながら有効化しました。
ここもスムーズに完了しましたが、失敗すると締め出しを食らうリスクがあったので、緊張しながらの作業でした。

UFWコマンドで指定ポートのTCP接続を許可し、ファイアウォールを有効化(アクティブ)に設定した状態
UFW(Uncomplicated Firewall)で新しいSSH用ポートの受信を許可し、ファイアウォール機能を有効化した実行結果です。

最終確認:再起動しても大丈夫か

最後に、サーバーを再起動して、ここまでの設定がちゃんと引き継がれているかを確認しました。

再起動前の最終チェックリスト

再起動すると、今設定した内容がすべて「本当に有効な状態か」が試されます。念のため、今のウィンドウで以下を確認してから進めます。

sudo ufw status
sudo ss -tlnp | grep ssh
  • ufw statusで新ポートのみ許可されている
  • ss -tlnpで新ポートのみ待ち受けている

この2つが確認できていれば大丈夫

sudo reboot ※再起動
Tomoya

自信はありましたが、もしもの事を考えると原因を見直す必要も出てくるので、無事に新しいポートで繋がった時は、心底ほっとしました。

変更後の設定でSSH接続コマンドを実行し、Ubuntu 24.04.4 LTSへ一般ユーザーで正常にログインした状態
ポート変更やユーザー設定の反映後、コマンドプロンプト等から指定の鍵とポートを使って一般ユーザーでSSHログインが完了した状態です。

これで、今回のセキュリティ対策は完了です。


まとめ

一つひとつの作業は、決して難しいものではありませんでした。

それよりも「順番」と「保険を残しながら進める」という考え方の方が重要だったと感じています。

これは開発全般にも通じる学びでした。何かを変更した後は、構文のエラーチェックや型チェック、セキュリティやバグのチェックといったフローを通過して初めて公開に繋げられる。それらすべてを含めて「開発」と呼ぶのだな、と感じました。

初期設定は狙われやすい、という話はVPSに限らず色々な場面で共通しているように思います。かといって、よくわからないまま色々動かしてしまうのも怖い、と感じる人は多いはずです。ここをAIにサポートしてもらうことで、「何を動かして、何を動かさないか」を自分で選びながら設定していくことができます。フルに活用することで、自分の視野も広がり、できることもどんどん増えていくのだと思います。AIを使うことで、普段はできなかったことができるようになる——これは自分の成長にも繋がっていて、その恩恵をしっかり受けている実感があります。

次回は、Node.js編に進む予定です。お楽しみに。

次回予告Node.js編「非エンジニアが挑む Node.js環境構築・システム実装を目指す」の案内
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

始めまして。このブログを運営するTomoyaです。
未経験個人開発者。AI×個人開発(Vibe Cording)で学習して参入してくれる人が増えて広がっていくと良いなと思って始めました。

実際に作成→デプロイ(公開)→運営を行ってそれについての問題や疑問を記録していきます。
また行っていく上で内容(セキュリティ・制限など)にもこだわっていきたいなと思っています。

コメント

コメントする

目次