概要

VPSサービスなどで、最初にrootアカウントとWebコンソールのみが提供される環境を想定し、安全な運用を行うための初期設定手順を解説します。

この手順のゴール

  • rootアカウントでの直接ログインを禁止する。
  • 日常的な管理作業は、sudo権限を持つ一般ユーザーで行うようにする。
  • パスワード認証を無効化し、より安全な「公開鍵認証」でのみSSHログインできるようにする。

最大の注意点:サーバーからの締め出し

この設定作業は、手順を一つでも誤ると、二度とサーバーにログインできなくなる危険性を伴います。特に、SSH接続を唯一のアクセス手段としている場合は、細心の注意が必要です。この記事では、Webコンソールを「ライフライン」として使い、安全に設定を完了させる手順を示します。

スタート地点(前提)

今回のケースは、XServer VPSで、Ubuntu 24.04を立ち上げたばかりの設定です。

※Webのシリアルコンソールは最初しか使わないため、この時のサーバではsshd秘密鍵は作成しません。(後で作成します)

DNS設定を行い、名前解決ができるようにしておくと便利です。

ややさっくりとしない手順

  1. 【root】 メンテナンス用ユーザーを作成する。
  2. 【Webコンソール】 作成したユーザーでパスワードログインできることを確認する。(←安全の確保)
  3. 【root】 作成したユーザーにsudo権限を付与する。
  4. 【メンテナンス用ユーザ】 sudo権限が有効になったことを確認し、rootアカウントをロックする。
  5. 【メンテナンス用ユーザ】 SSHをインストールし、公開鍵認証の設定を行う。
  6. 【自分のPC】 SSHで鍵認証ログインできることを確認する。
  7. 【メンテナンス用ユーザ】 最後に、SSHのパスワード認証を無効化する。

メンテナンス用のユーザ作成(root)

  • ユーザ作成
adduser [メンテナンス用ユーザ]

[メンテナンス用ユーザ]は英数字です。その後、パスワード設定などを対話式で求められるので、指示に従って入力します。

  • ログイン確認
exit

Webシリアルコンソールから抜けます。

メンテナンス用のユーザ作成確認(メンテナンス用のユーザ)

  • 作成したユーザでログイン確認

Webコンソールで、作成したユーザ名とパスワードでログインできることを確認。

whoami

で、設定したアカウントであることを確認します。

  • rootに昇格できないことを確認
sudo su -

としても、rootに昇格することはできません。なので、一度

exit

でコンソールを抜け、rootでログインし直します。

メンテナンス用のユーザのroot昇格設定(root)

  • メンテナンス用のユーザにsudoを追加

rootでログイン後、

usermod -aG sudo [メンテナンス用ユーザ]

で、sudoグループにこのユーザを加えます。

  • sudo追加確認
id -a [メンテナンス用ユーザ]

で、以下のように表示されることを確認します。

uid=1000(hoge) gid=1000(hoge) groups=1000(hoge),27(sudo),100(users)

修正したユーザのグループに、27(sudo)と表示されることがポイントです。

確認後、

exit

で更にrootを抜け、今度はメンテナンス用のユーザでログインします。

rootのロック (メンテナンス用のユーザ)

  • root昇格

メンテナンス用のユーザでログイン後、

sudo su -

で、rootに昇格できることを確認します。(※できない場合は前段の作業をやり直してください)

whoami

root表示されることも確認します。

  • rootロック
passwd -l root

として、rootそのものをロックします。

  • rootのロック確認
exit

を2回行い、Webコンソールから抜けます。

rootロック確認

  • メンテナンス用のユーザ→Webコンソールでログイン可能
  • root→Webコンソールでログイン不可能を確認します。

これ以降はメンテナンス用のユーザで作業を行います。

SSH設定

Ubuntu Desktop系と違い、Ubuntu Serverではsshdがデフォルトでインストールされていない場合があります。

sudo apt install ssh

で、sshdをインストールします。

インストール後、

ssh -V

でバージョンが表示されることを確認し、

systemctl status ssh.service

で、runningenabledを確認します。

SSH鍵ペア作成

鍵認証でログインできるようにします。

ssh-keygen -t ed25519
  • 鍵の格納場所は空Enter。(/home/hoge/.ssh/
  • パスワードを設定します。

SSH鍵ペア作成確認

  • 鍵格納ディレクトリに移動
cd .ssh
  • ファイルの内容確認
ls -l

以下のファイルを確認します。

  1. id_ed25519
  2. id_ed25519.pub ※これらのファイルはscp等で自分のクライアントにコピーします。

鍵の設定変更

公開鍵をauthorized_keysに変更し、パーミッションを厳密にします。

  • ファイル名変更
cat id_ed25519.pub >> authorized_keys
  • パーミッション設定
chmod 600 authorized_keys

秘密鍵の保存

この秘密鍵(id_ed25519)は、サーバー全体のアクセス権を持つ、言葉通りの意味でのマスターキーです。

この秘密鍵を奪われることは、サーバーの全権限を奪われることと同義です。 そのため、管理は厳密に、そして自分だけがアクセスできる安全な手段(パスワードマネージャーや暗号化されたストレージなど)で、必ずバックアップをこの段階で行ってください。

ファイアウォール(パケットフィルタリング)設定

SSHで外部から接続する前に、VPS事業者が提供するファイアウォール機能で、SSHのポート(22/tcp)が開放されていることを確認します。

  • 名称: 「ファイアウォール」「アクセスコントロール」「パケットフィルター」など、事業者によって名称は異なります。(Xserver VPSでは「パケットフィルター」)
  • 設定内容:
  • サービス/ポート: SSH または 22
  • プロトコル: TCP
  • 許可する送信元IP: まずは「全て許可」で設定し、SSH接続できることを確認します。後で、ご自身のIPアドレスに限定すると、さらに安全性が高まります。

ターミナルクライアントでの接続設定確認

任意のターミナルクライアントで接続を行います。(筆者が愛用しているのはRLoginです)

  • 名前解決できるようにしたホスト名
  • ユーザー名
  • 秘密鍵

を指定して、SSHログインできることを確認します。

SSHのパスワード認証を禁止

  • SSH設定ファイルバックアップ
sudo cp -pi /etc/ssh/sshd_config /path/to/backup/directory/sshd_config.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。(筆者の場合は/etc/conf_backup)

  • バックアップ確認
diff -u /path/to/backup/directory/sshd_config.$(date +%Y%m%d) /etc/ssh/sshd_config

エラーがない(差分がない)ことでバックアップを確認します。

  • ファイル書き換え
sudo sed -i -e 's/^#PasswordAuthentication yes/PasswordAuthentication no/' -e 's/^#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config
  • 差分確認
diff -u /path/to/backup/directory/sshd_config.$(date +%Y%m%d) /etc/ssh/sshd_config
  • 差分
-#PasswordAuthentication yes
-#PermitEmptyPasswords no
+PasswordAuthentication no
+PermitEmptyPasswords no
  • SSH再起動
sudo systemctl restart ssh.service 

SSH設定反映確認

  1. 新しくターミナルを起動します。
  2. パスワードでSSHログインできないことを確認します。
  3. 事前に転送しておいた秘密鍵でログインできることを確認します。

最初のアップデートとアップグレード

パッケージ全体のアップグレードを行います。

sudo apt update && sudo apt upgrade

アップグレード後、再起動を行います。

sudo reboot

ホスト名を設定する。

個人的に重要な作業です。「どういうサーバに育てていくか」はその名前にかかっているというのが持論です。

sudo hostnamectl set-hostname hoge.example.com

等として、自分のサーバを命名しましょう。

設定後、

uname -n

で、サーバ名を確認します。

この時、

sudo reboot

後、再起動後も名前が変わらないことを確認します。

プロンプト設定

最初期のプロンプトは

hoge@hoge$

になっているので、好みに沿って設定していきます。

  • 一般ユーザの.bashrc設定
cat << ___EOF___ | tee -a ~/.bashrc
PS1="[\u@\H \W]\\$ "

# 一般ユーザ向けのプロンプト設定
if [ "\$PS1" ]; then
  if [ "\$(id -u)" -eq 0 ]; then # rootユーザの場合
    PS1='\[\e[0;31m\][\u@\H \W]#\[\e[0m\] '
  else # 一般ユーザの場合
    PS1='\[\e[0;32m\][\u@\H \W]\$\[\e[0m\] '
  fi
fi
___EOF___
  • root

Ubuntu系は.bashrcが統一されないので、やむなくこの方法をとります。

sudo su -
cat << ___EOF___ | tee -a ~/.bashrc
PS1="[\u@\H \W]\\$ "

# 一般ユーザ向けのプロンプト設定
if [ "\$PS1" ]; then
  if [ "\$(id -u)" -eq 0 ]; then # rootユーザの場合
    PS1='\[\e[0;31m\][\u@\H \W]#\[\e[0m\] '
  else # 一般ユーザの場合
    PS1='\[\e[0;32m\][\u@\H \W]\$\[\e[0m\] '
  fi
fi
___EOF___

設定後、SSHセッションを開き直します。以下を確認します。

  1. 緑文字で[hoge\@hoge.example.com~]$のように表示される。(一般ユーザー)
  2. 赤文字で[root\@hoge.example.com~]#のように表示される。(root)

aptitudeインストール

これは完全に筆者の好みです。パッケージ管理をaptではなくaptitudeに変えます。

sudo apt install aptitude