注:このチュートリアルはUbuntuサーバーを使用して作成されましたが、ローカルのWebサーバーを含む他のLinuxディストリビューションにも適用できるはずです。
1. Root SSH アクセスを削除する
Ubuntuサーバーを安全にする最も手っ取り早い方法の一つは、Root SSHアクセスを無効にして、SSHデーモンを安全にすることです。デフォルトでは、OpenSSHサーバーは、すべての着信接続がrootユーザーとしてログインすることを許可します。
例えば、安全でないサーバーで以下のコマンドを実行すると、ログインプロンプトが表示されます。ssh root@insecure.server.ip.address
これは、サーバーがオープンな状態になり、パスワードのブルートフォース攻撃に対して脆弱になるため、問題になることがあります。この問題を解決するには、Linuxサーバーにログインして、SSHデーモンの設定ファイルを更新します。
Linux サーバーにログインしたら、SSH 設定ファイルを編集してください。sudo nano /etc/ssh/sshd_config
GNU Nano で Ctrl
+ W
を押し、PermitRootLogin
と入力して PermitRootLogin 変数を検索します。
PermitRootLogin の値を “yes” から “no” に変更し、Ctrl
+ o
、Ctrl
+ x
の順にキーを押してファイルを保存してください。
新しい設定を適用するには、systemctl
を使ってサーバの SSH デーモンを再ロードします。
sudo systemctl restart ssh
2. SSH アクセスに公開鍵ペアを使用する
Linuxサーバーを安全にするもう一つの簡単な方法は、ローカルとSSHのユーザーアカウント間で公開鍵ペアを作成することです。この方法は、パスワードによるログインを省略し、リモートサーバーへの認証を自動的に行います。
公開鍵ペアを作成するには、まずローカルマシンで以下のコマンドを実行する必要があります。ssh-keygen
鍵生成プログラムは、作成したい鍵に関するいくつかの詳細について尋ねてきます。これらのオプションは Enter
を3回押してデフォルトのままにしておくと安全です。
新しい公開鍵ペアをリモートサーバーにエクスポートするには、ssh-copy-id
プログラムを使用します。これは、ローカルとリモートの両方のマシンで SSH 経由の公開鍵認証の準備をするためのシンプルなユーティリティです。
ssh-copy-id ramces@my.server.ip.address
以下のコマンドを実行し、リモートマシンにログインします。
ssh ramces@my.server.ip.address
SSHのログインプロンプトを削除することによって、Linuxサーバーをさらに安全にすることも可能です。以下のコマンドでデーモンの設定ファイルを開きます。
sudo nano /etc/ssh/sshd_config
変数 PasswordAuthentication
を見つけ、その値を “yes” から “no” に変更します。
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プロンプトにアクセスできる可能性があります。
私のサーバーにはiptablesとufwの両方があります。ファイアウォールには両方を設定する必要がありますか?
いいえ!iptables と ufw の両方は、同じアドレス範囲とポートを制御するファイアウォールソフトウェアです。どちらか一方を設定するだけで、Linuxサーバでファイアウォールを動作させることができます。
Linuxサーバーのファイアウォールは、どちらか一方を設定すれば動作します。
はい!既存のユーザーをグループから削除することは可能です。usermod ユーティリティを使用してください。例えば、
usermod -G video new-service` を実行すると、“new-service” ユーザーを “sudo” グループから削除して、“video” グループに追加します。