VPSをレンタルする際にOSを選択できるケースがありますが、本記事ではUbuntuを選択してサーバー構築された直後に行う最低限の作業をまとめています。
セキュリティに関わる作業を一気に行うため、少々長い内容となりますがご了承ください。
なお、説明の都合でsshdの設定ファイルを毎回編集する文章構成にしていますが、一読して内容を理解した状態であれば、複数の設定をまとめて行ってしまって問題ありません。
レンタルしたVPSに接続する
サーバー作業を行うための基本操作となります。
ローカルPC付属のターミナルソフトやVSCodeやTeraTerm、PuTTYなどお好みのソフトを開いてください。
レンタルしたVPSに接続するために次のコマンドを実行します。
「xxx.xxx.xxx.xxx」にはサーバー会社管理画面から確認できるVPSのグローバルIPを指定してください。
ローカルPCssh root@xxx.xxx.xxx.xxx -p 22
パスワードの入力を求められるので、VPSレンタル時に設定したパスワードを入力してください。
ログインに成功するとCLIの階層表示がVPSのものに切り替わります。
インストールされているパッケージを更新する
まず最初に行いたいのがパッケージの更新です。
VPS構築直後の場合、インストール済みのパッケージが古い状態であることが多々あります。
古いままだとセキュリティに脆弱性が残っている可能性があるため、早々に対応を行います。
次のコマンドを順に実行することで、インストール済みのパッケージが最新化されます。
VPS (root)apt update -y
apt upgrade -y
root以外のユーザーを作成してsudo権限を付与する
現在rootユーザーでログインしている状態ですが、root以外のユーザーを新規作成します。
rootのまま作業することも可能ではありますが、誤操作による事故などを避けるため絶対にやめましょう。
ユーザーを新規作成する
次のコマンドでユーザーを作成します。
「USER_NAME」の名称は自由ですが、Webサーバー統括ユーザーと分かるような名前にしておくと管理が楽です。ここで作成したユーザーは後にApacheの実行ユーザーとして使用します。
VPS (root)adduser USER_NAME
もしユーザー名を誤って作成してしまった場合、次のコマンドでユーザー削除が可能です。
VPS (root)userdel -r USER_NAME
また、次のコマンドで指定したユーザーが存在するか確認可能です。
VPS (root)cat /etc/passwd | grep USER_NAME
sudo権限の付与する
作成したユーザーをsudoグループに追加します。
VPS (root)gpasswd -a USER_NAME sudo
また、次のコマンドで指定したユーザーの所属グループを確認可能です。
VPS (root)id USER_NAME
sudoのタイムアウト時間を変更する (任意)
sudoコマンドは初回のパスワード入力からデフォルトで5分間、パスワードの再入力が必要なくなります。
ただし、サーバー作業を行っている際はタイムアウト時間が短いと感じる場面が多々あるため、自身に合った時間に設定を変更します。
次のコマンドを実行することで、sudoの設定ファイルを安全に編集することが可能です。
VPS (root)visudo
「Defaults timestamp_timeout」の記述がない場合、Defaults群の最後に設定を追加しましょう。
/etc/sudoers・・・
Defaults use_pty
Defaults timestamp_timeout=5
Defaults timestamp_timeout=30
・・・
ちなみに、パスワード入力そのものを省く設定も可能ですが、セキュリティホールとなるため、ここでは解説しません。
rootでのSSHログインを禁止する
rootユーザーでの作業が一段落したら一度ログアウトします。
VPS (root)exit
次に先程作成した新規ユーザーでVPSに接続します。
ローカルPCssh USER_NAME@xxx.xxx.xxx.xxx -p 22
パスワードの入力を求められるので、新規ユーザー作成時に設定したパスワードを入力します。
ログイン成功後、sshdの設定ファイルを編集します。
sudoコマンド実行時に確認されるパスワードですが、新規ユーザー作成時に設定したパスワードを入力します。
なお、コマンド例ではエディタに「vi」を指定していますが、「nano」や「vim」などを使っても問題ありません。
以降、ファイル編集時のコマンド記載は省略します。
VPSsudo vi /etc/ssh/sshd_config
「PermitRootLogin」の値を「yes」から「no」に変更します。
/etc/ssh/sshd_config・・・
#LoginGraceTime 2m
PermitRootLogin yes
PermitRootLogin no
#StrictModes yes
・・・
編集完了後、次のコマンドでsshdを再起動して設定を反映します。
VPSsudo systemctl restart sshd
現在使用しているCLIは閉じずそのままにし、別のCLIを新規に開きます。
次のコマンドでrootへログインできないことを確認します。
ローカルPCssh root@xxx.xxx.xxx.xxx -p 22
rootのパスワードを入力し、ログイン失敗したら成功です。
もしログインできてしまった場合、作業手順に漏れがないか確認しましょう。
VPSにSSH公開鍵認証の設定を行う
パスワードのみでログイン可能な状態はセキュリティ面に問題があります。
そこでSSH公開鍵を用いた認証に切り替える設定を行います。
SSH公開鍵・秘密鍵のペアを生成する
ローカルPCのCLIを開き、SSH鍵ディレクトリーに移動します。
ローカルPCcd ~/.ssh
移動後、次のコマンドで公開鍵・秘密鍵のキーペアを生成します。
ローカルPCssh-keygen -t ed25519 -C " " -f KEY_NAME
コマンドの「-C " "」の部分は管理用に任意のコメント文字列を入力しても構いません。
省略すると実行環境のユーザー名とホスト名が記載されてしまい、設定次第では個人名が含まれることになり少々厄介です。
また、半角スペースを入れない「-C ""」の状態だと未入力扱いと判断され、鍵の生成が行われません。
なお、「-f KEY_NAME」にて既に存在する鍵ファイル名を指定すると読み出しモードとしてコマンドが処理されます。今回は新規ファイルを作成するので参考までに。
SSH公開鍵をVPSに配置する
SSH公開鍵・秘密鍵のペアが生成されたらSSH公開鍵(KEY_NAME.pub)をVPSに配置します。
ssh-copy-idコマンドが使える環境の場合、次のコマンドで配置可能です。
ローカルPCssh-copy-id -i ~/.ssh/KEY_NAME.pub USER_NAME@xxx.xxx.xxx.xxx
Windows環境の場合はssh-copy-idコマンドが使えないので、次のコマンドでSSH公開鍵をVPSへ転送します。
ローカルPCscp KEY_NAME.pub USER_NAME@xxx.xxx.xxx.xxx:authorized_keys
SSH公開鍵の転送が完了したらVPSにログインし、次のコマンドを順に実行して公開鍵の配置と権限変更を行います。
VPSmkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/authorized_keys ~/.ssh/
chmod 600 ~/.ssh/authorized_keys
VPSのSSH公開鍵認証を有効にする
sshdの設定ファイルを編集します。
「PubkeyAuthentication」のコメントアウトを外して、設定を有効にします。
/etc/ssh/sshd_config・・・
#MaxSessions 10
#PubkeyAuthentication yes
PubkeyAuthentication yes
・・・
編集完了後、次のコマンドでsshdを再起動して設定を反映します。
VPSsudo systemctl restart sshd
現在使用しているCLIはそのまま閉じず、別のCLIを新規に開きます。 次のコマンドでログイン出来ることを確認します。
ローカルPCssh -i KEY_NAME USER_NAME@xxx.xxx.xxx.xxx -p 22
もしログインできない場合、作業手順に漏れがないか確認しましょう。
ローカルPCのSSH接続先登録する (任意)
SSHログイン時に長めのコマンドを毎回入力するのは面倒です。
そこでSSH設定ファイルに接続先情報を追加します。
SSH鍵ディレクトリー内のconfigファイル(無ければ新規作成)に次の設定を追加します。
~/.ssh/configHost UNIQ_NAME
User USER_NAME
HostName xxx.xxx.xxx.xxx
Port 22
IdentityFile KEY_NAME
上記設定を行うことにより、次のコマンドでもアクセス可能になります。
ローカルPCssh UNIQ_NAME
なお、「Port 22」の箇所については後の項で設定を変更することになります。
変更後はこちらの設定ファイルも忘れずに修正してください。
SSHのパスワード認証を無効化する
sshdの設定ファイルを編集します。
「PasswordAuthentication」の設定値を「yes」から「no」に変更します。
/etc/ssh/sshd_config・・・
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
PasswordAuthentication no
#PermitEmptyPasswords no
・・・
編集完了後、次のコマンドでsshdを再起動して設定を反映します。
VPSsudo systemctl restart sshd
現在使用しているCLIはそのまま閉じず、別のCLIを新規に開きます。
次のコマンドでパスワード認証が無効化されたことを確認します。
ローカルPCssh USER_NAME@xxx.xxx.xxx.xxx -p 22
もしログインできてしまった場合、作業手順に漏れがないか確認しましょう。
SSH接続ポートを22番以外に変更する
この作業を行う前にレンタルサーバーで接続許可ポートの制限が行われていないか、管理画面から確認してください。
例えばConoHaレンタルサーバーの場合、管理画面コントロールパネルのサーバー項目から「接続許可ポート」を確認することができます。
「全て許可」に設定していない場合、ssh接続のポート番号が22に固定されてしまうため、作業後の動作確認が正常に行えません。
ポート番号の値は他の通信と被らないよう49151~65535の値で設定するのが無難です。
余談となりますが、SSH接続不要な時期は管理画面コントロールパネルから接続許可ポートを切っておけばよりセキュアになります。
sshdの設定ファイルを編集します。
「Port」の設定をアンコメントし、値を「22」から「任意の番号」へ変更します。
/etc/ssh/sshd_config・・・
Include /etc/ssh/sshd_config.d/*.conf
#Port 22
Port XXXXX
#AddressFamily any
・・・
続いてファイアウォールの設定を行います。
また、不要になる22番ポートも閉じてしまい、SSH接続ポートにLIMITルールを設けます。これによりブルートフォース攻撃に対しても強固になります。
次のコマンドを順に実行し、設定を変更します。
VPSsudo ufw default deny
sudo ufw delete allow 'OpenSSH'
sudo ufw limit XXXXX/tcp comment 'for SSH'
もしSSH接続元を固定IPとする場合、次のコマンドで設定可能です。この場合はLIMITルールは設定しなくてもよいでしょう。
VPSsudo ufw allow from xxx.xxx.xxx.xxx to any port XXXXX proto tcp
設定を変更したら、次のコマンドで現在の状態が確認可能です。
VPSsudo ufw status verbose
接続許可ポートが指定した任意の番号のみになっていればOKです。
次のコマンドでファイアーウォールの設定変更を反映します。
VPSsudo ufw reload
現在使用しているCLIはそのまま閉じず、別のCLIを新規に開きます。
新しいターミナルでパスワード認証の無効化および公開鍵認証でのポート番号変更を確認し、最終的に公開鍵での接続に成功したら作業完了です。
ローカルPCssh -i KEY_NAME USER_NAME@xxx.xxx.xxx.xxx -p XXXXX
もしログインできない場合は作業手順に漏れがないか確認しましょう。
またローカルPCのSSH接続先登録を行っている場合、ポート番号の設定も忘れず変更しましょう。
次回はnginx1.24とApache2.4+PHP8.2のセットアップを行っていきます。