定期的にこういう内容を書いて公開している気がする。昔の記事もあるのでそちらを読めばいいのだが、また書く必要性が生じてきたのであらためて書きます。

現代では AWS のようなクラウドや VPS など格安で手軽にインターネット上にサーバーを持てるようになった。しかしインターネットで誰でもアクセスできる環境でサーバーを稼働させるということは、常に人間やロボットの攻撃に晒されるということを同時に意味している。したがって初心者だからだとか、会社の中ではこうやって仕事をしているからといった言い訳は一切通用しない。セキュリティ設定をきちんとしなければ内部への侵入をたやすく許し、思わぬデータの漏洩につながるのである。とはいえセキュリティというのはトレードオフを考慮しなければいくらでも強化できるものでありキリがない。ここでは最低限これだけはやっておこうという現実的な落とし所を提示し、人々への啓蒙をはかるものである。

root ログインを避け sudo を利用する

最近の Linux ディストリビューションでは標準で sudo が入っていることが多い。 /etc/sudoers で以下のように sudo 利用可能なグループを定義するか、これをテンプレートとして参照する。なお sudo を利用するときに入力するパスワードは自分自身のパスワードである。

Defaults env_reset
Defaults !lecture,tty_tickets,!fqdn

# 30 分間はパスワードの再入力を免除
Defaults timestamp_timeout = 30

# 誰のパスワードを入力しているのかわかりやすく
Defaults passprompt = "[sudo] <%U@%h> Enter %u's password: "

# sudo グループに入っている者は sudo を利用可能
root ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL

パスワード認証は避け ssh 公開鍵認証のみを利用する

sudo を利用可能にしたら公開鍵認証を設定した上で /etc/ssh/sshd_config で以下のようにパスワード認証を利用禁止にし sshd を再起動する。また ssh のポート番号を 22 以外に変更するのが望ましい (ここでは仮にポート番号を 11111 とするがこの例のまま適用しないようにする) 。

PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
PermitRootLogin no # または without-password 等
Port 11111

iptables でポートを閉じ、不正なパケットを破棄する

RHEL 互換ディストリビューションの場合 /etc/sysconfig/iptables に設定を記述すれば反映される。このファイルは root しか参照できないようにパーミッションを設定するべきである。設定後 iptables を再起動することで反映される。

iptable の基本的なテンプレートとしてはこれを参照すれば良い。それぞれの意味はコメント付きのこれがわかりやすいのであわせて参照のこと。 iptables は単にポートを閉じるだけでなく、短時間に過剰なパケットを送信する攻撃を防いだり不正なパケットを破棄したり、過度な認証要求をシャットアウトするなどの機能も備わっている。

注意点としては ssh のポート番号を変更しているはずなのでそれにあわせて iptables の ssh のポート番号も変更しておくことである。

パッケージを自動更新する

Linux カーネルが古いまま運用していると既知の脆弱性がそのまま放置されてしまう。そこでおすすめなのは Linux カーネルをはじめとするシステムのパッケージを自動更新することである。これは Linux ディストリビューションごとにやり方が異なるので、それぞれのやり方を調べて欲しい。パッケージを自動更新しないのはいわば Windows Update を怠っているのと似たようなものである。

パッケージの自動更新については RHEL や CentOS の場合は yum-cron を、 Debian や Ubuntu の場合は cron-apt を使うのが基本である。またパッケージの自動更新で安定版が壊れてしまうようなディストリビューションなら最初から使うべきではないし、アプリケーションが動作しなくなるならそういったアプリケーションの設計に欠陥がある。

ちなみに拙作の deferred-sync の system_upgrade プラグインにも同様の機能がある。また ubuntu_kernel_upgrade プラグインは少々難しい Ubuntu のカーネルの自動更新もうまくやってくれる。

どのみちカーネルを更新したらシステムの再起動が必要なのでそれは忘れないでおこう。またカーネルを更新してしまうとシステムが起動しなくなるような恐れのあるしょぼい仮想ホストはそもそも利用を避けたほうが賢明である。

セキュア OS を利用する

なぜセキュア OS を利用するのか。理由は色々あるが、大きな目的として未知の脆弱性があってプロセス経由でサーバーに侵入をされたときに被害を最小限に留めるためというのがある。ただし SELinux をはじめとするセキュア OS を利用するための設定の難しさや、利用することによる制限というのはかなり大きい。そのためか初心者向けの Linux サーバーの説明記事などではまず SELinux を無効にしろ等と平気で書かれている有り様である。

セキュア OS の利用可否はトレードオフの問題であり、むやみに導入すれば良いというものではない。セキュア OS を正しく利用するためにはポリシーに対する理解も必要である。ただし RHEL や CentOS では標準で SELinux が有効である。これらは利用するアプリケーションの挙動に悪影響を与えない限りむやみやたらに無効にするべきではないだろう。

参考資料

特定非営利活動法人エルピーアイジャパン
「Linuxセキュリティ標準教科書」
http://www.lpi.or.jp/linuxtext/security.shtml

誰でも自由に閲覧することができる Linux セキュリティ教科書。
基本的な知識を再確認するためにも技術者ならぜひ一読すべし。

投稿日: 作成者: 774