サーバー作成直後に設定しておくべき初期セキュリティ設定

本マニュアルは、さくらのVPSで Linux ディストリビューションを利用する方を対象とし、管理者として注意したいセキュリティ設定をご紹介します。 具体的には、一般ユーザー及び sudo を用いた操作、 ファイアウォール及びパケットフィルター機能、SSH サーバー設定などです。

Note

さくらのVPSで提供されている標準OS AlmaLinux 9 もしくは標準OS Rocky Linux 9 を前提に記載します。 他のディストリビューションやサービスを利用する場合は、必要に応じて読み替えてください。

警告

本ページでは、多くのサーバー構築で共通するセキュリティ設定のみを扱います。 利用されるソフトウェアや用途によって、適切なセキュリティ設定を選択したり、追加で実施する必要があります。 加えてVPSは、管理者権限をお渡ししているサービスの為、記載内容についてはお客様にてご確認のうえご利用いただくと共に、弊社にてサポート及び保証は致しかねる事にご留意ください。

事前情報

さくらのVPSで提供している「標準OS」について

さくらのVPSでは、標準OSという名称で複数のディストリビューションをご提供しています。 標準OSでは、ディストリビューションをインストールしいくつかの設定を実施したうえで、コントロールパネルから入力したパスワードやSSH公開鍵を設定した状態で提供しています。 主に、シリアルコンソールの設定、クラッシュダンプの無効化、ネットワーク設定、NTPクライアントの設定が行われています。 標準OS AlmaLinux 9, 標準OS Rocky Linux 9 の提供仕様については、下記の情報をご確認ください。

AlmaLinux 9 - 標準OS AlmaLinux 9 のセットアップ情報
Rocky Linux 9 - 標準OS Rocky Linux 9 のセットアップ情報

Note

標準OSでは、多くの利用者が利用しやすいようにご提供している為、いくつかのセキュリティ強化設定が無効の状態で提供している物もあります。これらについては、本項で扱います。

標準OSにおける一般ユーザーの提供

Linux には、管理者権限を持つスーパーユーザーと、持たない一般ユーザーがあります。

スーパーユーザーは、ユーザー識別子(UID) 0 のユーザーであり、多くの Linux ディストリビューションでは root と呼ばれ、システムにおける全権利を持ちます。 ちょっとしたタイプミスでもシステムを容易に破壊する為、サーバーの管理目的であっても、 root を常用する事は非常に危険です。 一般ユーザーを用い、必要な時のみ sudo もしくは su コマンドを用いて、 root としての管理者権限を得る事を強く推奨します。

さくらのVPS 標準OS では、一般ユーザーを設定しておらず、root ユーザーとしてログインする標準OSもございます。 その場合は、 root としてログインした後、一般ユーザーを作成してください。 新しくリリースされた標準OSでは、セキュリティ対策として、管理目的の一般ユーザーを提供し、 root としてログインできない方式での提供を実施しています。

例として用いる標準OS AlmaLinux 9 では alma 、 標準OS Rocky Linux 9 では rocky が、管理目的に用意されているユーザー名です。 その他の標準OSにおけるユーザー名については 管理ユーザーログイン をご確認ください。

標準OSにおける強制アクセス制御について

Linux には、強制アクセス制御(MAC)を付加する機能があり、 AlmaLinux 9, Rocky Linux 9 では SELinux が用いられています。 インストーラーを用いた通常のインストールでは、有効かつ強制(Enforce)がデフォルト値ですが、さくらのVPS 標準OS では無効(Disabled)の状態で提供しています。 有効にする場合は、設定を変更するか、スタートアップスクリプト Setup and update を用いてください。 ただし、今後、変更され、SELinux 有効の状態での提供となる可能性があります。

インターネット上で見かける情報の中には SELinux の無効化が散見されますが、セキュリティの観点から推奨するものではありませんので、サーバー運用に慣れたら有効化をぜひご検討ください。 また、 Ubuntu などでは AppArmor が用いられますが、原則として有効の状態で提供しています。

強制アクセス制御の状態については、getenforce コマンド(SELinux)や aa-enabled/apparmor_status コマンド(AppArmor)を用いる事で確認ができます。

標準OSにおけるパスワード認証及び公開鍵認証

SSH接続では、パスワード認証及び公開鍵認証が利用できますが、セキュリティ上、公開鍵認証のみを利用する事が望ましいです。 コントロールパネルで標準OSをインストールする場合、公開鍵を設定すると、公開鍵認証が可能となります。 コントロールパネルで公開鍵認証を選択した場合でも、パスワードを利用したログインを許可するように設定することも可能ですが、パスワード認証は無効の状態で利用することを推奨します。 パスワード認証を用いる場合は、ファイアウォールやパケットフィルター機能によって、接続元IPアドレスの制限などを検討してください。

接続元となる WSL2 及び macOS 等で、 ssh-keygen コマンドを用いて公開鍵を生成できます。

SSH 接続でサーバーにログイン

標準OS のインストールが終われば、サーバーに SSH でログインできます。 しかし、初回ログインでは、中間者攻撃(MITM攻撃)を避ける為、サーバーごとに固有であるホスト鍵の finger print を確認する必要があります。 VNCコンソールもしくはシリアルコンソールを用いて、次の通り確認できます。

Rocky Linux 9 でシリアルコンソールを用いた場合
hostname login: rocky
Password:

SAKURA internet [Virtual Private Server SERVICE]

[rocky@hostname ~]$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:lBp1+KuVq341sSd5mbyhL3xFRrCBrRaqZsRhXJ3ztBM no comment (ECDSA)
[rocky@hostname ~]$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:8Y+NzsC25Je+TPuqwVaulkrF3x6YiRbv05r5O6K1Gu0 no comment (ED25519)
[rocky@hostname ~]$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
3072 SHA256:Qf6dsZFmixHT+UW6+YRTSCu2pBMdRcVqU1Ge0VE9lp0 no comment (RSA)

WSL2 及び macOS 等で、 ssh コマンドを用いて VPS に接続する際、下記の通り finger print が表示されます。 必ず、 finger print が一致している事を確認してから、 yes として接続してください。 GUI のSSHターミナルソフトウェアでも、同様に、 finger print が表示されますので、確認してから接続してください。

WSL2 (Ubuntu 22.04) から接続する場合
$ ssh -l rocky YOUR-SAKURA-VPS-HOSTNAME
The authenticity of host 'YOUR-SAKURA-VPS-HOSTNAME (YOUR-SAKURA-VPS-IPADDRESS)' can't be established.
ECDSA key fingerprint is SHA256:lBp1+KuVq341sSd5mbyhL3xFRrCBrRaqZsRhXJ3ztBM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

finger print は、接続元に保管され、次回以降の接続の再にも自動的にチェックされます。 過去にSSH接続した事があり、その後にOS再インストールを実施した場合、finger print が変更となりますので finger print が一致しない旨のメッセージが表示されます。 その場合は、 WSL2 及び macOS 等で、下記のコマンドを用いて finger print を消去してから再実行してください。

WSL2 (Ubuntu 22.04) から接続する場合
$ ssh-keygen -R YOUR-SAKURA-VPS-HOSTNAME

セキュリティアップデート

まず実施すべき事は、セキュリティアップデートです。 標準OSは、さくらインターネットで作成した時点でのパッケージバージョンで提供しています。 その為、セキュリティアップデートが存在する可能性を鑑み、下記のコマンドを用いアップデートを実施してください。 セキュリティアップデートの他に、バグ修正や、新機能の追加も、アップデートとして提供されます。

AlmaLinux, Rocky Linux, CentOS Stream の場合
$ sudo dnf update
CentOS 7 の場合
# yum update
Ubuntu の場合
$ sudo apt update
$ sudo apt upgrade

最後に、アップデートを適用する為に再起動してください。 全てのケースで再起動が必須ではありませんが、判断ができない場合は、システム再起動を推奨します。 ディストリビューションによっては、再起動後に改めて適用できるアップデートがありますのでご注意ください。

$ sudo reboot

セキュリティアップデートは、初回のみならず、継続して実施する必要があります。 常にセキュリティ情報を収集し実施する事が望ましいですが、難しい場合は、定期的にアップデートが無いか確認する事を検討してください。

Note

systemd-timer や cron により、自動的にアップデートを実施する方法として、 dnf-automatic などがあります。

ユーザーのセキュリティ設定

一般ユーザーを作成し sudo を利用する

管理ユーザーログイン で管理ユーザー名が root となっている標準OSでは、新たに一般ユーザーを作成する必要があります。 標準OS CentOS 7 で centos ユーザーを作成し、パスワードを設定するには、次のコマンドを実行します。

標準OS CentOS 7 で一般ユーザー centos を作成する場合
# adduser centos
# passwd centos

Note

Ubuntu などの Debian 系では、 adduser コマンドの動作が異なります。

一般ユーザーを作成した後、 sudo を利用できるように設定します。 下記の例では、 wheel ユーザーグループに sudo 権限が提供されます。

wheel ユーザーグループに sudo 権限が与えられているか確認する場合
# grep '^%wheel' /etc/sudoers
%wheel  ALL=(ALL)       ALL

この場合、作成した一般ユーザーを wheel ユーザーグループに追加することで sudo が利用できます。

centos ユーザーを wheel ユーザーグループに追加する場合
# usermod -aG wheel centos

その後、作成した一般ユーザーで SSH ログインし、 sudo コマンドを用いて管理コマンドが実行できるか確認します。 確認できたら、SSHによる root アカウントでのログインを禁止する 及び、 公開鍵認証に限定する を設定する事を強く推奨します。

一般ユーザー名を変更する

標準OS で提供している管理目的の一般ユーザー名を alma, rocky から変更したい場合、 OS 再インストール時にスタートアップスクリプト Setup and update を用いるか、下記のマニュアルをご確認ください。

SSH サーバーのセキュリティ設定

Note

セキュリティ対策として SSH ポート番号の変更を紹介されている事がありますが、万全ではありません。 10022/TCP, 1022/TCP, 2222/TCP など広く知られているポート番号も有る他、ポートスキャンによっても明らかになります。

また、 well-known ポート以外は、一般ユーザー権限で LISTEN できます。 シェルアクセスできる一般ユーザーや、脆弱性を持った CGI 経由などで、偽の SSH サーバープロセスを構築し LISTEN できる事を意味します。

受けるアタックを減らす効果は見込めますが、ポート番号の隠ぺいや秘匿性に依存せず、まずは、公開鍵認証やファイアウォールなどを設定することを強く推奨します。 変更される場合は、前述の well-known ポート以外は一般ユーザーで LISTEN できること、 SELinux などの強制アクセス制御が有効な場合は、ポート番号リソースが制限されている事にもご留意くさい。

また、ポートノッキングも1つの隠ぺい策として有名です。 SSHポート番号の変更と同様に、隠ぺいによるセキュリティである為、あくまで基本は公開鍵認証およびファイアウォールである事に留意する必要があります。

Note

必要な場合、 IP ブラックリストソフトウェア( Fail2ban, SSHguard 等)を用いる事もできます。 これらのソフトウェアの多くはログ解析によって動作する為、ソフトウェアによってはログ解析脆弱性や、ログ溢れによる Disk full を狙われる事が有るので、適切な運用が必要です。 攻撃者があなたの IP アドレスを知っている場合、偽装したパケットによりロックアウトを狙う可能性も有るため、必要に応じて除外 IP アドレスなどを設定してください。

root アカウントでのログインを禁止する

root アカウントは、最も狙われるユーザーアカウントの1つです。 また、 root アカウントで不正ログインされた場合、それだけでシステムにおける全権利を奪われることにも留意する必要があります。 標準OS AlmaLinux 9, 標準OS Rocky Linux 9 についても、 root アカウントでの SSH ログインを明確に禁じておらず、公開鍵を設定する事で SSH ログインが可能となる状態で提供していますので、明確に禁じることができます。

CentOS 7 で SSH を用いた root ログインを禁じる場合
# vi /etc/ssh/sshd_config
PermitRootLogin no
# systemctl restart sshd
Rocky Linux 9 で SSH を用いた root ログインを禁じる場合
$ sudoedit /etc/ssh/sshd_config
PermitRootLogin no
$ sudo systemctl restart sshd

上記の通り、 /etc/ssh/sshd_config の PermitRootLogin を no に変更し、設定を適用する為に sshd を restart することで設定できます。

公開鍵認証に限定する

SSH ログインを公開鍵認証に限定し、適切に秘密鍵を管理する事で、不正ログインのリスクを大幅に減らすことができます。 標準OSのインストール時に、公開鍵を選択している場合は、パスワード認証を明示的に許可しない限り、既に公開鍵認証に限定した状態で提供しております。

パスワード認証をご利用中で、公開鍵認証に限定する為には、公開鍵を作成および設置し、 sshd の設定を変更する必要があります。 標準OS Rocky Linux 9 及び WSL2 (Ubuntu 22.04) を用いた例を記載します。

まずは、手元のコンピュータで ssh-keygen コマンドを用いて秘密鍵と公開鍵のペアを作成します。 保存場所および、秘密鍵に設定するパスワードが問われます。 保存場所はデフォルトで問題ありません。

WSL2 (Ubuntu 22.04) で秘密鍵と公開鍵のペアを作成する方法
$ ssh-keygen

続いて、 ssh-copy-id コマンドを用いることで、公開鍵を VPS に転送できます。 VPS の SSH パスワード認証を用いて転送される為、既に SSH パスワード認証を無効化している場合は、シリアルコンソールなどを用いて公開鍵を設置してください。

WSL2 (Ubuntu 22.04) で、公開鍵をVPS (Rocky Linux 9) に転送する方法
$ ssh-copy-id rocky@YOUR-SAKURA-VPS-HOSTNAME

その後、 sshd の設定ファイルを編集し、パスワード認証を無効化します。 公開鍵の生成方法などに誤りが有るとログインできなくなる為、シリアルコンソールなどを用いて設定し、正しく SSH ログインできると確認してからシリアルコンソールよりログアウトすることを推奨します。

Rocky Linux 9 で SSH パスワード認証を禁じる場合
$ sudoedit /etc/ssh/sshd_config
PasswordAuthentication no
$ sudo systemctl restart sshd

Note

標準OSインストールの際に「パスワードを利用したログイン」で「無効にする」を選択した場合、 /etc/ssh/sshd_config, /etc/sysconfig/sshd, /etc/default/ssh のいずれかにより同様の設定を実施しています。

ファイアウォールを設定する

さくらのVPS で提供している パケットフィルター もしくは OS のファイアウォール機能を用いて、適切にファイアウォールを構築する必要があります。

パケットフィルターを利用する

パケットフィルターは、コントロールパネルから設定することで利用できる簡易的なステートレスファイアウォール機能です。 さくらインターネットが管理するネットワーク設備で、パケットにルールが適用されます。

下記の制限が有るので、要件に満たない場合は、 OS のファイアウォール機能を用いてください。

  • IPv6 は対応しておらず、全ての通信を許可します。

  • ICMP, 123/UDP(ntp), 32768-65535/TCP(エフェメラルポート), 32768-65535/UDP(エフェメラルポート) などのパケットを無条件に許可します。OSによってエフェメラルポートが異なりますので、必要に応じてOSのエフェメラルポートを変更する必要があります。

  • 1番目のネットワークインタフェースにのみ適用されます。

その他、設定方法や仕様については パケットフィルター をご確認ください。

OS のファイアウォール機能を利用する

OS内部のファイアウォール機能を利用すると、 パケットフィルター では実現できないステートフルファイアウォールや、高度なルール設定ができます。 標準OS Rocky Linux 9 を用いて、ファイアウォール設定の例を記載しますので、お客様環境に合わせて読み替えください。

Note

パケットフィルター が有効だと、どちらの設定によってパケットをドロップしているか分かりづらくなる為、無効化することを推奨します。

標準OS Rocky Linux 9 では、OS 内部のファイアウォール機能 firewalld が無効の状態となっているので、有効化する必要があります。 または、OSインストールの時に、スタートアップスクリプト Setup and update を用いて有効化できます。 有効化したら、ステータスと、自動起動が有効となっているか確認します。

ファイアウォールを有効化する場合
$ sudo systemctl enable --now firewalld
$ systemctl status firewalld
$ systemctl is-enabled firewalld

firewalld では、ゾーンという仕組みがあり、ルールはゾーンに設定します。 適用したいネットワークインタフェースをゾーンに所属させる事で、ゾーンに設定されたルールが適用されます。 下記の例では、10個のゾーンがあり、 ens3 インタフェースは public ゾーンに属しています。

ゾーンの一覧と、ネットワークインタフェースに適用されているゾーンを確認する場合
$ firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
$ firewall-cmd --get-active-zones
public
  interfaces: ens3

public ゾーンの設定内容を確認するには、 --list-all オプションと --zone=public オプションを利用します。 下記の結果からも、 ens3 インタフェースが public ゾーンに属している事が分かります。

ゾーンの一覧と、ネットワークインタフェースに適用されているゾーンを確認する場合
$ sudo firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

target は、ルールにマッチしない場合のデフォルト動作を指定します。 default 以外に DROP, ACCEPT, REJECT などがありますが、詳細と違いについては firewalld のマニュアルをご確認ください。 service は、アクセスが許可されているサービスの一覧で、 /usr/lib/firewalld/services ディレクトリ以下にデフォルト定義がいくつか用意されています。

ssh サービスの定義ファイル
$ cat /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

不要なサービスをゾーンから削除するには、 --remove-service=<service> オプションを用います。 一時的な設定となるので、恒久的に設定するためには --permanent オプションを用います。 --zone=<zone> オプションを用いない場合はデフォルトゾーンに設定されます。

Note

2022/11/30 現在、標準OS Rocky Linux 9 ではデフォルトゾーン public として提供していますので、 --zone=<zone> オプションを用いない場合でも同様となります。デフォルトゾーンは、 --get-default-zone オプションで確認できます。

public ゾーンから cockpit と dhcpv6-client を削除する場合
$ sudo firewall-cmd --remove-service=cockpit --zone=public --permanent
success
$ sudo firewall-cmd --remove-service=dhcpv6-client --zone=public --permanent
success

最後に、設定を適用するには、 --reload コマンドを実施する必要があります。

設定を適用する場合
$ sudo firewall-cmd --reload
success

設定を確認する為には、 nmap を用いる事で確認できます。

WSL2 (Ubuntu 22.04) の nmap を用いて cockpit サービス(9090/tcp) や ssh サービス(22/tcp) を確認する場合
$ nmap -P0 -p 9090 YOUR-SAKURA-VPS-HOSTNAME
$ nmap -P0 -p 22 YOUR-SAKURA-VPS-HOSTNAME

nmap の主な結果の例は次の通りです。 STATE の詳細については、 nmap のマニュアルをご確認ください。

ファイアウォールによって REJECT されているか、 ACCEPT されているが LISTEN しているサービスが無い場合
PORT     STATE  SERVICE
9090/tcp closed zeus-admin
ファイアウォールによって ACCEPT されており、 LISTEN しているサービスが有る場合
PORT   STATE SERVICE
22/tcp open  ssh
ファイアウォールによって DROP されている場合
PORT     STATE    SERVICE
9090/tcp filtered zeus-admin

Note

ご利用のインターネットサービスプロバイダによっては、 OP25B による制限が実施されているケースがございます。 また、ブロードバンドルータによっては、 CIFS などの通信を遮断するものも有るほか、企業ネットワークや公衆無線LANによっては一部のポート宛ての通信のみを許可しているケースがございます。 これらの場合、正常な結果を得ることができないことにご留意ください。

新たに通信を許可する場合は、 --add-service=<service> オプションを用います。

public ゾーンに http と https を追加し、設定を適用する場合
$ sudo firewall-cmd --add-service={http,https} --zone=public --permanent
$ sudo firewall-cmd --reload

--add-service=<service> の代わりに、 --add-port=8080/tcp を用いてポート番号を指定できます。

最後に、 VPS を再起動しても設定が維持されているか sudo firewall-cmd --list-all --zone=public コマンドや nmap などを用いて改めて確認することを推奨します。

Note

もし再起動後に設定が維持されていない場合は、 firewalld の自動起動設定が有効であるか、 --permanent オプションを付け忘れていないか、改めてご確認ください。

チェックリスト

最後にまとめとして、設定を正しく行ったか、改めて動作のご確認をお願いします。 もし、root でログインできたり、パスワード認証でログインできたりする場合は、設定の見直しをお願いいたします。

root ユーザーに SSH ログインできないこと

公開鍵認証/パスワード認証いずれも確認する事をお勧めします。 ssh コマンドでは、 -i /dev/null とする事で、一時的に公開鍵を /dev/null とし、パスワード認証の動作を確認可能です。

WSL2 (Ubuntu 22.04) から接続する場合
$ ssh -l root YOUR-SAKURA-VPS-HOSTNAME
$ ssh -l root -i /dev/null YOUR-SAKURA-VPS-HOSTNAME

一般ユーザーに公開鍵認証を用いないと SSH ログインできないこと

一般ユーザーでパスワード認証を用いて SSH ログインできない事を確認します。 ssh コマンドでは、 -i /dev/null とする事で、一時的に公開鍵を /dev/null とし、パスワード認証の動作を確認可能です。

WSL2 (Ubuntu 22.04) から接続する場合
$ ssh -l rocky -i /dev/null YOUR-SAKURA-VPS-HOSTNAME

sudo コマンドを実行して、 root 権限としてのコマンドが実行できる

一般ユーザーとしてログイン後に sudo を試し、管理目的のコマンドが実行できる事を確認します。

アップデート計画やバックアップ計画を立てたか確認する

アップデートの定期的な確認を計画したか、ディストリビューションのサポート終了日を確認したか、改めて確認します。 また、バックアップの必要有無を確認し、定期的なバックアップ取得や、バックアップからのリストア検証も実施される事を推奨します。 バックアップについては、 Acronis Cyber Protect Cloud 簡易セットアップ および BackupPC などの活用もご検討ください。

ファイアウォールが機能しているか確認する

telnet コマンドや nmap コマンドなどを用いて、ファイアウォールが機能しているか確認します。