【Linux基本】VPSを借りたら最初にやるべき「ユーザー追加」「SSH堅牢化」「VS Code接続」の完全ガイド

こんにちは。

新しいLinuxサーバー(VPSなど)を立ち上げた直後、最初にログインするのは通常 root(最高管理者)ユーザーです。しかし、この状態のままサーバーの運用を続けるのは、セキュリティ上非常に危険です。

今回は、実戦的なWebサーバーやコンテナ環境を安全に構築するための第一歩として、「一般ユーザーの作成」「SSHの要塞化」、そして手元のPCや「VS Codeから1クリックで安全に爆速ログインする設定」までを、論理的かつ実践的に解説します。

なぜ root で直接作業してはいけないのか?

root ユーザーは、システムの全権限を持つ最強の存在です。何でもできる反面、以下のリスクが常に付きまといます。

  1. 誤操作の致命傷: コマンド一つでシステム全体を破壊できる(例:rm -rf /)。
  2. サイバー攻撃の標的: 全世界の攻撃者は、常にあなたのIPアドレスに対して「ユーザー名:root」でログインを試行(総当たり攻撃)しています。

そのため、インフラ構築の鉄則は「普段は権限のない一般ユーザーでログインし、必要な時だけ一時的に管理者権限(sudo)を借りる」、そして「外部からの root ログインを完全に遮断する」ことです。

3ステップで進める初期要塞化

ステップ①:一般ユーザーの追加と権限付与

まずは、自分の分身となる一般ユーザーを作成し、管理者権限を使えるようにグループに追加します。(例として、ここでは新ユーザー名を xxxx とします)

Bash

# 1. ユーザーの作成(-m でホームディレクトリを自動作成)
useradd -m xxxx

# 2. パスワードの設定(推測されにくい強力なものを設定)
passwd xxxx

# 3. ユーザーを「sudo(管理者権限を使える)グループ」に追加
# Ubuntu/Debian系の場合:
usermod -aG sudo xxxx

# CentOS/RHEL/Rocky Linux系の場合:
usermod -aG wheel xxxx

これで、新ユーザー xxxx はコマンドの頭に sudo をつけることで、安全に管理者タスクを実行できるようになります。

ステップ②:公開鍵認証(SSHキー)の設定

パスワードによるログインは、どれだけ長くしても「総当たり攻撃で推測されるリスク」が残ります。より強固な「公開鍵認証」へと切り替えます。手元のローカルPC(普段使っている端末)で鍵ペアを作成し、サーバーへ登録します。

1. ローカルPC側で鍵ペアを作成(未作成の場合)

Bash

# 安全性の高いED25519アルゴリズムで鍵を生成
ssh-keygen -t ed25519 -f ~/.ssh/server_key

これにより、手元に 「秘密鍵(server_key)」「公開鍵(server_key.pub)」 が生成されます。

2. 公開鍵をサーバーに登録

作成した新ユーザー xxxx のディレクトリ内に、上記で生成した「公開鍵(.pubの方)」を設置します。

Bash

# サーバー側の新ユーザーのホーム配下にディレクトリを作成
mkdir -p /home/xxxx/.ssh
chmod 700 /home/xxxx/.ssh

# 公開鍵(server_key.pubの中身)を「authorized_keys」というファイルに書き込む
echo "【ここにローカルで生成した server_key.pub の中身を貼り付け】" > /home/xxxx/.ssh/authorized_keys
chmod 600 /home/xxxx/.ssh/authorized_keys

# 所有者をrootから新ユーザーに一括変更
chown -R xxxx:xxxx /home/xxxx/.ssh

⚠️【超重要チェック点】 ここで一度、現在のターミナルは絶対に閉じずに残したまま、ローカルPC側で新しいターミナルをもう一つ立ち上げて、新ユーザー+鍵でログインできるか必ずテストしてください。

Bash

ssh -i ~/.ssh/server_key xxxx@サーバーのIPアドレス

無事にパスワードなし(または鍵のパスフレーズのみ)でログインでき、sudo su - で管理者になれれば成功です。

ステップ③:SSH設定ファイルの編集(防衛線の確立)

鍵で問題なく入れることが確認できたら、いよいよ本丸です。サーバーのSSH設定ファイルを書き換えて、攻撃者の侵入経路を完全に塞ぎます。

Bash

# 設定ファイルをバックアップしてから編集
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

ファイル内の以下の項目を探し、変更(またはコメントアウト # を解除して追記)します。

Plaintext

# 1. ポート番号をデフォルトの「22」から変更(ウェルノウンポートを狙ったスキャン対策)
Port 10022  # (1024〜65535の間で、他のサービスと被らない任意の数字)

# 2. rootユーザーでの直接ログインを禁止
PermitRootLogin no

# 3. パスワード認証を禁止(公開鍵を持たない者を入り口で一切弾く)
PasswordAuthentication no

設定を保存したら、構文チェックをしてからSSHサービスを再起動して反映させます。

Bash

# 設定の構文チェック(何も出力されなければ正常。エラーが出たら編集ミス)
sudo sshd -t

# SSHサービスの再起動
sudo systemctl restart sshd

これで、ssh root@IPアドレス やパスワードのみのログインはすべてサーバーの玄関口で拒否されるようになり、防御力は劇的に向上しました。

発展:手元のPC・VS Codeから「爆速」で繋ぐ快適設定

設定をガチガチに固めたのは良いですが、毎回長いコマンド(ssh -p 10022 -i ...)を打つのは大変です。ローカル側の ~/.ssh/config を少し書き換えるだけで、プロフェッショナルかつ快適な開発環境が手に入ります。

1. ターミナルから一発でログインできるようにする(SSH Config)

手元のPC(ローカル)の設定ファイルを開きます。

Bash

nano ~/.ssh/config

(※Windowsでファイルがない場合は、C:\Users\ユーザー名\.ssh\config というテキストファイルを新規作成)

以下の内容を追記して保存します。

Plaintext

Host abibase
    HostName     【サーバーのIPアドレス】
    User         xxxx  # 作成した一般ユーザー名
    Port         10022 # 変更したSSHポート番号
    IdentityFile ~/.ssh/server_key # 手元にある秘密鍵の絶対パス

これで、次回からはターミナルで以下のコマンドを打つだけで、裏側の複雑なパラメータを自動適用して一発ログインできるようになります。

Bash

ssh abibase

2. VS Code(Remote – SSH)から1クリック接続

VS Codeからサーバーに接続し、コンテナのコードや設定ファイルを直接ローカル感覚で編集できるようにします。

  1. VS Codeの拡張機能(Ctrl+Shift+X)から 「Remote – SSH」(Microsoft公式)をインストールします。
  2. 画面左下の 「青いマーク(Remote接続ボタン)」「ホストに接続する…」「新規 SSH ホストを追加する…」 の順にクリックします。
  3. 入力欄が出現するので、先ほどconfigで設定したホスト名をそのまま入力します。Plaintextssh abibase
  4. 保存先の設定ファイルとして、一番上にある ~/.ssh/config を指定します。
  5. 再び左下の「青いマーク」から 「ホストに接続する…」 を選ぶと、リストに abibase が追加されているので選択します。初回のみOSの選択肢が出るので Linux を選びます。

画面左下の青いマークが 「SSH: abibase」 に変われば接続成功です!「フォルダーを開く」からサーバー内のディレクトリ(/home/xxxx など)を選択すれば、ファイルの直接編集や、Ctrl + @ でサーバー内部のターミナルをVS Code上で直接動かすことが可能になります。

💡 LPIC試験対策としてのワンポイント

LPIC-1(特に102試験)において、今回実践した内容は超頻出の重要テーマです。

  • ユーザー管理: useradd や、所属グループを安全に追加する usermod -aG のオプション。
  • SSH設定: /etc/ssh/sshd_config 内の主要パラメータ(Port, PermitRootLogin, PasswordAuthentication)の設定値。
  • パーミッションの厳格性: Linuxのセキュリティルール上、鍵を格納する .ssh ディレクトリは 700(drwx------)、公開鍵をまとめた authorized_keys ファイルは 600(-rw-------) でなければ、安全性が担保されていないとみなされSSHサービス側から接続を拒否されるという仕様。

ただ教科書を暗記するだけでなく、このように「自分の城をサイバー攻撃から守るために要塞化した実戦の記憶」と紐付けることで、試験問題の本質的な意味が驚くほどスムーズに理解できるようになります。

一歩ずつ、頑強で快適な自前インフラを洗練させていきましょう!

Related Posts

【Linuxネットワーク】netstat/ssコマンドでポート開放と不審な通信を特定するノウハウ

こんにちは。 Linuxサーバーで「ポートがバインドできない…

【Linuxトラブルシューティング】ディスク容量100%エラー!原因特定とログ削除の緊急対処法

こんにちは。 「突然データベースが停止した」「ファイルの保存…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

You Missed

【SSHセキュリティ強化】パスワード認証廃止と公開鍵認証・ポート変更の完全手順

【SSHセキュリティ強化】パスワード認証廃止と公開鍵認証・ポート変更の完全手順

【Linuxトラブルシューティング】ディスク容量100%エラー!原因特定とログ削除の緊急対処法

【Linuxトラブルシューティング】ディスク容量100%エラー!原因特定とログ削除の緊急対処法

【Docker Compose】複数ドメインを1台のVPSで運用するNginxリバースプロキシ設計パターン

【Docker Compose】複数ドメインを1台のVPSで運用するNginxリバースプロキシ設計パターン

【SSL/TLS対応】Certbot(Let’s Encrypt)でDocker上のWebサイトを完全HTTPS化する手順

【SSL/TLS対応】Certbot(Let’s Encrypt)でDocker上のWebサイトを完全HTTPS化する手順

【WordPress高速化】NginxキャッシュとOPcacheでレスポンス速度を爆速にする方法

【WordPress高速化】NginxキャッシュとOPcacheでレスポンス速度を爆速にする方法

【自動化】Bashシェルスクリプトで作る!デイリーDBバックアップ&Discord通知システム

【自動化】Bashシェルスクリプトで作る!デイリーDBバックアップ&Discord通知システム