原文 は、2015 年 8 月 5 日に掲載されました。
著者は、家にファイル サーバーを 1 台と、サイト、メール サーバー、およびクラウド ストレージ サーバーとして 3 台の Live サーバーを持っています。
ホーム サーバーのセキュリティについては、外部と接続していないため、それほど心配していません。しかし、他の 3 台については、適宜保守をしています。サーバーを構築したいと考えている Linux 初心者が注意すべき点について、本文献で説明します。
必要なものをインストールする
サーバーを構築する時、だいたいの人は、「40GB の SSD だから、欲しいサービスをなんでもインストールできる」と考えがちです。間違いではありません。しかし、そう簡単ではありません。どんなに強固なサーバーでもどこかに弱点があり、パッチが当たっていない部分があるため、乗っ取られる危険があります。
ですから、まずはサーバーをとにかく頑丈にすることです。本当に必要なパッケージだけをインストールします。不要なパッケージは、すべてパージします。パッケージ数が少ないほど、危険性のある (パッチされていない) コードが減ります。ソフトウェアと依存パッケージ (例: ownCloud) をインストールする前に、ownCloud のドキュメントを読み、本当に必要なパッケージだけをインストールします。
必要なものだけを実行する
2 つめに大事なことは、必要なサービスだけを実行することです。
たくさんのディストロやパッケージを使ってサービスを実行すると、複数のポートを使用します。それは、セキュリティの危険性があります。ターミナルを開いて、次のコマンドを実行します。
netstat -npl
どのサービスがどのポートを利用しているかを表示してくれます。
実行していないはずのサービスを見つけたら、停止させます。システム開始時に実行されるサービスにも注意します。次のコマンドで、確認します。
systemctl list-unit-files --type=service | grep enabled
皆さんが利用されているシステムにもよりますが、図 1 のように表示されるでしょう。不要なサービスがあれば、systemctl コマンドで無効にできます。
systemctl disable service_name
サーバーへのアクセスを制限する
家の鍵を他人に渡さないように、サーバーへのアクセス権を他人に渡してはなりません。それを理解したら、サーバーへのアクセス権を制限します。それでも、あなたのサーバーをダウンさせようとしている誰かを完全に阻止することはできません。できることは、サーバーの防御壁を増やして、攻撃を緩和することです。
ルートでログインしない
サーバーにルートとして ssh ログインしてはなりません。ssh を使ったルートでのログインを禁止します。まず、sudo 権限を持つユーザーを作成します。
そのユーザーでサーバーに ssh で入り、管理者権限を用いた仕事をします。サーバーにログインできれば、いつでもルートになれます。すでにユーザーを登録していれば、このステップを省略してください。
ディストリビューションごとに、ユーザー作成方法が異なります。Red Hat / CentOS では useradd コマンド、Ubuntu / Debian では user adduser を使用します。
Fedora/CentOSでのユーザー作成。
useradd swapnil
パスワードを作成します。
passwd swapnil
パスワードを作成したら、sudoができるようにします。
EDITOR=nano visudo
以下の行を探します (図 2)。
# %wheel ALL=(ALL) ALL
コメント (#)を外します。つまり、以下のようにします。
%wheel ALL=(ALL) ALL
ALL ファイルを格納します。ユーザーがwheelグループに属していないときは、以下のようにして、追加します。
# usermod -aG wheel swapnil
Ubuntuでは、以下のようにします。
adduser swapnil
パスワードを含むいくつかの質問に回答したら、次のように、sudo 権限を付与します。
gpasswd -a swapnil sudo
別端末を開いて、新しいユーザーでログインし、sudo を使って、管理者権限で作業をしてみましょう。問題なければ、次に進みます。
ルートログインを禁止する
ルート ユーザーがログインできないようにします。sshd の構成ファイルを開きます。
nano /etc/ssh/sshd_conf
コメントになっている以下の行を探し、コメントを外します。
#PermitRootLogin no
ファイルを保存し、サービスを再開します。
service ssh restart
または、
systemctl restart sshd
まだサーバーからログアウトしないでください。先に作成したユーザーで、サーバーに ssh できることを確認してください。他の端末を開いて、サーバーに ssh で接続します。サーバーからロック アウトされないようにします。すべてが問題なければ、ログアウトします。
ポートを変更する
次に、sshd 構成ファイルを編集して、ポート番号を標準から変更します。サーバーにセキュリティの道具を追加することなく、防御壁を増やすことになります。重要人物を護衛する時に、複数台の同種類の車を使うわけです。攻撃者は、どの車に標的が乗っているか、わかりません。
sshd_config ファイルを開きます (今回は sudo を利用します)。
sudo nano /etc/ssh/sshd_config
以下の行を探します。
#Port 22
# を外し、ポート番号を書き換えます。他のサービスで使用していない番号を選択します。Wikipedia(日本語ページ)を参照すると、通常使われているポートがわかります。ここでは 1977 を使用しました (訳注: Wikipedia を見るとわかりますが、49152 から 65535 を使うのが推奨されています)。
Port 1977
ファイルを格納し、sshd サービスを再開します。ログアウトする前に、新しい端末で、以下のようにしてログインします。
ssh -p{ポート番号}@サーバーIPアドレス
例:
ssh -p1977
このメールアドレスは、スパムロボットから保護されています。アドレスを確認するにはJavaScriptを有効にしてください
ログインできたら、問題ありません。
パスワードなしでログインする
パスワードなしで ssh できるようにすると、セキュリティの壁がもっと厚くなります。ssh キーを生成したマシンからのみ、サーバーにログインできるようになります。
まず、ssh キーを生成します (図 3)。
ssh-keygen - t rsa
いくつかの質問 (キーを配置する場所、パスフレーズについて) に答えます。次に、これらのキーをサーバーにコピーします。これで、2 つのマシンがキーを利用して接続できるようになります。
cat ~/.ssh/id_rsa.pub | ssh -p 1977 swapnil@remote-server ";mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
別の端末から、ssh をしてみます。パスワード入力を求められないようであれば、問題ありません。
これは、他のセキュリティの道具よりも有用です。サーバーのパスワード認証を禁止できます。sshd_config ファイルを開き、次の行を探します。
#PasswordAuthentication yes
# を外し、yes を no に変更します。sshd サービスを再開します。端末を閉じる前に、他の端末からサーバーにログインします (パスワードを求められない筈です)。
これで、サーバーにログインできるのは、ssh キーを生成したマシンからだけです。他のマシンからもログインするのであれば、この方法はお勧めしません。
最後に
サーバーを構築しようとしている初心者が考慮すべき基本点を説明しました。クラッカーは、常に先を行こうとしています。サーバーの問題点を常に探しています。ですから、バックアップを取ることも大事です。サイトを変更する前、した後にバックアップを取ることが大事です。もし、サーバーが破壊されても、バックアップから復活することができます。