Linuxサーバは現代のインターネットのバックボーンである。今日、あなたがウェブブラウザを通してアクセスできるほとんどすべてのウェブサイトとサービスは、Linuxディストリビューション上で実行されています。ここでは、どのようにしてLinuxサーバーを安全にすることができるかを紹介します。

:このチュートリアルはUbuntuサーバーを使用して作成されましたが、ローカルのWebサーバーを含む他のLinuxディストリビューションにも適用できるはずです。

1. Root SSH アクセスを削除する

Ubuntuサーバーを安全にする最も手っ取り早い方法の一つは、Root SSHアクセスを無効にして、SSHデーモンを安全にすることです。デフォルトでは、OpenSSHサーバーは、すべての着信接続がrootユーザーとしてログインすることを許可します。

例えば、安全でないサーバーで以下のコマンドを実行すると、ログインプロンプトが表示されます。

ssh [email protected]

これは、サーバーがオープンな状態になり、パスワードのブルートフォース攻撃に対して脆弱になるため、問題になることがあります。この問題を解決するには、Linuxサーバーにログインして、SSHデーモンの設定ファイルを更新します。

Linux サーバーにログインしたら、SSH 設定ファイルを編集してください。

sudo nano /etc/ssh/sshd_config

GNU Nano で Ctrl + W を押し、PermitRootLogin と入力して PermitRootLogin 変数を検索します。

PermitRootLogin の値を “yes” から “no” に変更し、Ctrl + oCtrl + x の順にキーを押してファイルを保存してください。

新しい設定を適用するには、systemctl を使ってサーバの SSH デーモンを再ロードします。

sudo systemctl restart ssh

2. SSH アクセスに公開鍵ペアを使用する

Linuxサーバーを安全にするもう一つの簡単な方法は、ローカルとSSHのユーザーアカウント間で公開鍵ペアを作成することです。この方法は、パスワードによるログインを省略し、リモートサーバーへの認証を自動的に行います。

公開鍵ペアを作成するには、まずローカルマシンで以下のコマンドを実行する必要があります。

ssh-keygen

鍵生成プログラムは、作成したい鍵に関するいくつかの詳細について尋ねてきます。これらのオプションは Enter を3回押してデフォルトのままにしておくと安全です。

新しい公開鍵ペアをリモートサーバーにエクスポートするには、ssh-copy-id プログラムを使用します。これは、ローカルとリモートの両方のマシンで SSH 経由の公開鍵認証の準備をするためのシンプルなユーティリティです。

ssh-copy-id [email protected]

以下のコマンドを実行し、リモートマシンにログインします。

ssh [email protected]

SSHのログインプロンプトを削除することによって、Linuxサーバーをさらに安全にすることも可能です。以下のコマンドでデーモンの設定ファイルを開きます。

sudo nano /etc/ssh/sshd_config

変数 PasswordAuthentication を見つけ、その値を “yes” から “no” に変更します。

を参照してください。 以下のコマンドを実行して、SSHデーモンを再読み込みします。

sudo systemctl restart sshd

3. Linux サーバーのファイアウォールを強化する

SSHアクセスを制限する以外に、ファイアウォールを設定することでもLinuxサーバーのセキュリティを向上させることができます。デフォルトでは、新しいLinuxマシンはどのポートからの接続もすべて受け入れるようになっています。

これは、サーバーがポートスキャン攻撃に対して脆弱になるため、問題になることがあります。例えば、悪者はあなたのマシンの安全でないポートをスキャンし、それを使って適切なエクスプロイトを見つけることができる。

これを解決する1つの方法は、外部から利用可能なポートやアドレスを制御できるシンプルなファイアウォールクライアントであるufwをインストールすることです。

Ubuntuにufwをインストールするには、以下のコマンドを実行します。

sudo apt install ufw

ufwのデフォルトルールを設定します。これらは、カスタマイズしないポートに対して、ファイアウォールが従うポリシーです。すべての着信接続をブロックしていることを確認するのは良い習慣です。

sudo ufw default deny incoming
sudo ufw default allow outgoing

マシンで実行したいサービスに合わせてファイアウォールを設定します。例えば、以下のコマンドを実行すると、SSHでログインし、Webサーバーをホストすることができます。

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443

最後に、sudo ufw enable を実行して、新しいファイアウォール設定を有効にする必要があります。さらに、以下のコマンドを実行することで、ファイアウォールがオンラインになっているかどうかを確認することができます。

sudo ufw status

4. サービスごとに新規ユーザーを作成する

デフォルトでは、Linuxシステム内のすべてのファイルやプログラムは、特定のユーザーとグループに属しています。システムを変更するには、適切なフォルダの適切なパーミッションが必要です。

Linuxサーバーのセキュリティを向上させる1つの方法は、新しいサービスごとに新しいユーザー・アカウントを作成することです。この方法では、各サービスの権限をそれぞれのユーザー・アカウントに封じ込めることができます。

これを行うには、以下のコマンドを実行します。

sudo useradd -s /bin/bash -d /home/new-service -m -G sudo new-service
sudo passwd new-service
  • s` フラグは、新しいユーザーアカウントに使用するシステムシェルを設定します。私の場合、新しいアカウントではシェルに Bash を使用します。
  • d-m` フラグは、新しいアカウントのデフォルトのユーザディレクトリを設定します。
  • 一方、-Gフラグは、新しいアカウントを、あなたが指定した任意のセカンダリグループに追加します。例えば、新しいアカウントを sudo グループに追加すると、 スーパーユーザコマンドを実行することができるようになります。
  • passwd` コマンドを使用すると、新しいユーザーアカウントに新しいパスワードを設定することができます。

それが終わったら、現在のアカウントからログオフするか、 su new-service を実行することで、新しいユーザーアカウントを使用することができます。

5. サーバーのカーネルを堅牢にする

カーネルは Linux システムの最も重要な部分の一つであり、マシンのハードウェアとソフトウェ アを結びつける接着剤のようなものです。例えば、独自の Linux カーネルをコンパイルすることで、エキゾチックなハードウェアや機能 のサポートを有効にすることができます。

それ以外にも、カーネルはオペレーティングシステムのルートプロセスとしての役割も果たします。カーネルを保護することは、Linuxサーバーを保護する上で最も重要な部分の1つです。

カーネルを保護する最も簡単な方法の一つは sysctl を使うことです。これは、Linuxカーネルのランタイムオプションを調整することができるビルトインユーティリティです。

しかし、sysctlはカーネルのハードニングプロセス全体をカバーしないことに注意することが重要です。カーネルのセキュリティは、あなたが何を必要としているかに大きく依存します。

このことを知った上で、以下のコマンドを実行することで、カーネルが診断情報を報告しないようにすることができます。

sudo sysctl kernel.kptr_restrict=2
sudo sysctl kernel.dmesg_restrict=1
sudo sysctl kernel.kexec_load_disabled=1

また、以下のコマンドを実行することで、サーバーへの偽の接続要求を落とすようにカーネルに指示することができます。

sudo sysctl net.ipv4.tcp_syncookies=1
sudo sysctl net.ipv4.tcp_rfc1337=1

一方、これらのコマンドは、カーネルにマシンへの各入力接続の検証を強制します。

sudo sysctl net.ipv4.conf.all.rp_filter=1
sudo sysctl net.ipv4.conf.default.rp_filter=1

最後に、次の一連のコマンドは、ネットワークトラフィックを別のゲートウェイにリダイレクトするために、すべての着信接続を防止します。こうすることで、あなたのマシンが中間者攻撃にさらされるのを防ぐことができます。

sudo sysctl net.ipv4.conf.all.accept_redirects=0
sudo sysctl net.ipv4.conf.default.accept_redirects=0を指定します。
sudo sysctl net.ipv4.conf.all.secure_redirects=0に変更。
sudo sysctl net.ipv4.conf.default.secure_redirects=0に変更。
sudo sysctl net.ipv6.conf.all.accept_redirects=0に変更。
sudo sysctl net.ipv6.conf.default.accept_redirects=0に変更。
sudo sysctl net.ipv4.conf.all.send_redirects=0に変更。
sudo sysctl net.ipv4.conf.default.send_redirects=0

Tips: 上記のTips以外にも、Linuxサーバーのセキュリティのために、以下のオープンソースツールを利用することができます。

よくある質問

ローカルマシンを失いました。SSHでUbuntuサーバにログインすることは可能ですか?

ほとんどの場合、公開鍵認証のみを使用している場合は、SSHでログインすることはできないはずです。ただし、変数 PasswordAuthentication を無効にしていない場合は、SSHプロンプトにアクセスできる可能性があります。

それはさておき、物理的にマシンにアクセスして “/etc/ssh/sshd_config” を更新するか、VPSプロバイダからルートコンソールにアクセスする方法があります。

私のサーバーにはiptablesとufwの両方があります。ファイアウォールには両方を設定する必要がありますか?

いいえ!iptables と ufw の両方は、同じアドレス範囲とポートを制御するファイアウォールソフトウェアです。どちらか一方を設定するだけで、Linuxサーバでファイアウォールを動作させることができます。

Linuxサーバーのファイアウォールは、どちらか一方を設定すれば動作します。

はい!既存のユーザーをグループから削除することは可能です。usermod ユーティリティを使用してください。例えば、usermod -G video new-service` を実行すると、“new-service” ユーザーを “sudo” グループから削除して、“video” グループに追加します。

画像引用元:Unsplash。すべての改変とスクリーンショットはRamces Redによるものです。

Akira
Akiraは情熱的なゲーマーであり、製品レビュアーです。ゲームをしていないときは、最新のゲーミングアクセサリーを試したり、製品のレビューをしていることが多い。彼の分かりやすいスタイルは、ゲーマーが自分のニーズに最も適した製品を簡単に判断できるようにするものです。また、技術的な問題にも精通しており、その解決方法も知っている。