概要
VPSサービスなどで、最初にroot
アカウントとWebコンソールのみが提供される環境を想定し、安全な運用を行うための初期設定手順を解説します。
この手順のゴール
root
アカウントでの直接ログインを禁止する。- 日常的な管理作業は、
sudo
権限を持つ一般ユーザーで行うようにする。 - パスワード認証を無効化し、より安全な「公開鍵認証」でのみSSHログインできるようにする。
最大の注意点:サーバーからの締め出し
この設定作業は、手順を一つでも誤ると、二度とサーバーにログインできなくなる危険性を伴います。特に、SSH接続を唯一のアクセス手段としている場合は、細心の注意が必要です。この記事では、Webコンソールを「ライフライン」として使い、安全に設定を完了させる手順を示します。
スタート地点(前提)
今回のケースは、XServer VPSで、Ubuntu 24.04を立ち上げたばかりの設定です。
※Webのシリアルコンソールは最初しか使わないため、この時のサーバではsshd秘密鍵は作成しません。(後で作成します)
DNS設定を行い、名前解決ができるようにしておくと便利です。
ややさっくりとしない手順
- 【root】 メンテナンス用ユーザーを作成する。
- 【Webコンソール】 作成したユーザーでパスワードログインできることを確認する。(←安全の確保)
- 【root】 作成したユーザーに
sudo
権限を付与する。 - 【メンテナンス用ユーザ】
sudo
権限が有効になったことを確認し、root
アカウントをロックする。 - 【メンテナンス用ユーザ】 SSHをインストールし、公開鍵認証の設定を行う。
- 【自分のPC】 SSHで鍵認証ログインできることを確認する。
- 【メンテナンス用ユーザ】 最後に、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
で、running
とenabled
を確認します。
SSH鍵ペア作成
鍵認証でログインできるようにします。
ssh-keygen -t ed25519
- 鍵の格納場所は空Enter。(/home/hoge/.ssh/
- パスワードを設定します。
SSH鍵ペア作成確認
- 鍵格納ディレクトリに移動
cd .ssh
- ファイルの内容確認
ls -l
以下のファイルを確認します。
- id_ed25519
- 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設定反映確認
- 新しくターミナルを起動します。
- パスワードでSSHログインできないことを確認します。
- 事前に転送しておいた秘密鍵でログインできることを確認します。
最初のアップデートとアップグレード
パッケージ全体のアップグレードを行います。
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セッションを開き直します。以下を確認します。
- 緑文字で[hoge\@hoge.example.com~]$のように表示される。(一般ユーザー)
- 赤文字で[root\@hoge.example.com~]#のように表示される。(root)
aptitudeインストール
これは完全に筆者の好みです。パッケージ管理をaptではなくaptitudeに変えます。
sudo apt install aptitude
コメントを残す