インストール直後に絶対やるべき作業と設定:ゼロから始めるLinuxセキュリティ(1)(2/3 ページ)
正しく管理されていないLinuxにセキュリティなどないに等しい。しかし、どこから手をつければよいかすら分からない人も多いだろう。本連載ではLinuxのセキュリティ対策をインストール時点からファイアウォールやIDSの構築、ログ管理まで解説していく。
OSインストール時の注意点
セキュリティ対策は、OSをインストールするところから始まっています。のちのちの運用を考えるならば、インストールにも十分注意しておきましょう。
ここでは、OSにRed Hat Linux 7.1Jを使用すると仮定して話を進めていきます。しかし、ほかのディストリビューションでも考え方は同じです。
インストールは必要最小限の構成で
OSは、できる限り必要最小限の構成でインストールしましょう。何でもインストールしてしまうと、それだけ不具合のあるパッケージをインストールしてしまう可能性が高くなってしまいます。「使わないものはインストールしない」ことが重要です。
主要なLinuxディストリビューションは、インストールするパッケージを細かく選択することができます。Red Hat Linux 7.1Jの場合は、インストール方法で[カスタムシステム]を選択すれば、パッケージを細かく選択できます。しかし、この方法でインストールするには多少知識を必要とするので、今回は[サーバシステム]を選択したいと思います。また、インストール過程で「シャドウパスワード」「MD5暗号化アルゴリズム」を有効にすることを忘れないでください。
パッケージを最新版にアップデート
Red Hat Linux 7.1Jでもすでに不具合が発見され、修正版が公開されているパッケージもあります。OSのインストール後、以下のサイトを参考にしてパッケージを必ず最新版にアップデートします。また、運用を開始した後も常に最新の状態を保つ必要があります。
では、実際の管理方法を紹介します。まず、修正版が出ているパッケージが自分のホストにインストールされているかどうかを確認します。
# rpm -qv パッケージ名
不具合のあるパッケージがインストールされているようであれば、必ずアップデートしましょう。
# rpm -Fvh パッケージ名
原則的には、この-Fvhオプションを使用します。これは、古いバージョンがインストールされていたときのみアップデートします。
# rpm -Uvh パッケージ名
上記の-Fvhオプションではアップデートできないものもあります。そのときは-Uvhオプションを使います。このオプションは、古いバージョンがインストールされているとアップデートし、入っていない場合は新規インストールを行ってしまいます。従って、不要なパッケージをインストールしてしまう可能性があるので気を付けましょう。
パッケージに含まれないアプリケーションのインストール
公開するサービスによって使用するアプリケーションは変わります。これらのアプリケーションについては、OS付属のものをインストールしないことを勧めます。理由は、常に最新バージョンをインストールしていただきたいからです。面倒かもしれませんが、最新のソースファイルをダウンロードして、これをコンパイルしてインストールしてください。
不要なサービスの停止
システム要件に関係のないサービスは停止しましょう。サービスによっては、起動しているだけで危険なものもあります。ここでいう「危険なサービス」とは、脆弱性を持ったアプリケーションだけを指しているわけではありません。第三者に対し、不用意に情報を提示してしまうようなサービスも含まれます。万一、アプリケーションに不具合があっても、サービスを停止していればリモートからのバッファオーバーフロー攻撃などのえじきにならずに済みますし、情報の漏えいなども回避できます。
停止すべき「不要なサービス」
Red Hat Linux 7.1Jには、/usr/sbin/setupコマンドがあります。このコマンドを用いて、不要なサービスがOS起動時にサービスを開始しないように設定を変更します。
[サーバシステム]でインストールした直後のRed Hat Linux 7.1Jでは、以下のものが不要なサービスと考えられます。
- apmd
APMを監視するデーモンです。電源をON/OFFしたときにsyslogに残したり、管理者へ警告を通知することができます。必要ないので停止しましょう。 - atd
atによってキューに入れられたジョブを実行します。必要ないので停止しましょう。 - canna
かな漢字変換サーバです。日本語入力を行わないのであれば起動する必要はないので停止しましょう。 - lpd
ラインプリンタデーモンです。プリンタサーバでなければ起動する必要はないので停止しましょう。 - netfs
NFSマウントポイントのマウント、アンマウントを有効にするものです。NFSを使用しているわけではないので停止しましょう。 - portmap
NFSやNISなど、RPCを使用したプログラムを有効にする場合には起動しておく必要がありますが、NFSを提供していないので停止しましょう。 - sendmail
電子メール配送用デーモンです。起動する必要はないと思います。もしサービスとして起動するのであれば、最新のものにアップデートしましょう。
設定が終了したらOSを再起動します。OS起動後、netstatコマンドを用いて不要なサービスが起動していないか確認しましょう。
$ netstat -an
デーモンの起動について
デーモンには、単独で起動するものと、「スーパーデーモン」と呼ばれるinetdを介して起動するものがあります。
Red Hat Linux 7.1Jではsetupコマンドで簡単に設定できますが、すべてのディストリビューションで使えるわけではありません。そこで、OS起動時に提供されるサービスについて簡単ではありますが説明しておきます。ほかのディストリビューションを使用している方はこちらを参考にしてください。
単独で起動するデーモンの起動と停止
単独で起動するデーモンは、プロセスとして常駐し、自分自身でポートを監視します。これをデーモンモード(standaloneモード)といいます。
Linuxは、起動時に/etc/rc.d/rc1.d〜rc6.d内にある起動スクリプトを読み込みます。rc1.d〜rc6.dのどのディレクトリを使うかは、そのシステムのデフォルトのランレベルによって変わってきます。デフォルトランレベルの情報は、/etc/inittabファイルにあり、以下の方法で確認できます。
# more /etc/inittab id:3:initdefault:
moreコマンドなどで/etc/inittabを表示させると、このような記述があると思います。この「3」の部分がrc1.d〜rc6.dの数字部分に当たり、ランレベル3ということになります。つまり、この場合は/etc/rc.d/rc3.dにある起動スクリプトで、ファイル名が「S」で始まるものが起動されます。
この中にも不要なサービスがありますので、inetd経由で起動される不要なサービスと同様、OS起動時に起動されないようにしましょう。以下のように、ファイル名を変えるだけでも起動されなくなります。
# mv /etc/rc.d/rc3.d/S20pcmcia /etc/rc.d/rc3.d/.S20pcmcia
ここまで終わったら、一度OSを再起動してみましょう。起動後、まだ不要なサービスが動いているのであれば、再度確認して起動しないように設定を変更しましょう。
inetd経由で起動されるデーモン
inetdは、1つのプロセスで複数のポートを監視しています。inetdで監視しているサービスに対してアクセスがあったとき、それに対応するデーモンを起動します(inetd自体は単独で起動します)。FTPデーモン(ftpd)をinetd経由で起動している場合、接続要求があるまでプロセスは上がっていません。これはpsコマンドで確認できます。
# ps -aux | grep ftpd root 689 0.0 1.0 1664 508 pts/0 S 01:37 0:00 grep ftpd
FTP接続した後でpsコマンドを実行してみましょう。
# ps -aux | grep ftpd admin 692 0.9 2.6 2008 1264 ? S 01:41 0:00 ftpd: 192.168.0.1
inetd経由で起動されるデーモンの停止方法
inetd経由で開始されるサービスの多くは停止してしまっても問題ありません。しかしながら、どのサービスを停止していいのか理解せずに行うと、システムが思いどおりに稼働しなくなってしまうことがあるかもしれません。そこで、inetd経由で開始される代表的なサービスの内容とその停止方法について簡単に説明します。
inetdの設定はxinetdと違い、/etc/inetd.confという1つのファイルに記述されています(xinetdではサービスごとにファイルが存在します)。サービスの停止方法は以下の手順で行います。
- /etc/inetd.confファイルのバックアップを取る
# cp /etc/inetd.conf /etc/inetd.conf.bak
- エディタを用いて、停止したいサービスの行頭に「#」を付けることで無効化する
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
↓
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
- 設定の変更を反映する。inetdのPIDを調べ、「kill -HUP」する
# ps -aux | grep inetd root 529 0.0 0.2 1160 224 ? S Apr14 0:00 inetd hogehoge 27663 0.1 0.6 1456 632 pts/0 T 16:11 0:00 less /etc/inetd.conf hogehoge 27666 8.0 0.5 1664 508 pts/0 S 16:14 0:00 grep inetd # kill -HUP 529
inetd経由で以下のサービスが起動されますが、これらは停止してもよいものです。ディストリビューションによって違いがあると思いますが、参考にしてください。
- finger
ホスト内にあるユーザーの情報を提示します。不必要に情報を提供してしまう恐れがあるため停止しましょう。 - daytime
日付と時刻を応答するものです。必要ではないので停止しましょう。 - chargen
文字列に対し応答します。必要ではないので停止しましょう。 - time
日付と時刻を応答するものです。必要ではないので停止しましょう。 - shell
起動しているだけでセキュリティホールとなり得るため停止しましょう。 - login
起動しているだけでセキュリティホールとなり得るため停止しましょう。 - talk
talkコマンドのサーバです。停止しましょう。
xinetdについて
inetdの後継として、「xinetd」が注目されています。Red Hat Linuxでは、バージョン7.0からinetdではなくxinetdが採用されています。セキュリティの面から考えてみても、今後はxinetdに移行していくものと思います。inetdとxinetdの違いについて簡単ではありますが説明させていただきます。
inetdとxinetdでは設定ファイルのフォーマットがまったく違うため、そのままでは使えません。inetdでは、TCP_Wrapperを用いなければアクセスコントロールをかけることができません。これに対し、xinetdは設定ファイルの記述でアクセスコントロールをかけることが可能です(注)。つまり、機能的には、
inetd + TCP_Wrapper = xinetd
と考えていただいても構いません。さらに、xinetdはアクセスコントロールだけでなく、もっと多くの実装を備えています。TCPだけでなく、UDPのアクセスコントロールもできます。このように、xinetdはinetd + TCP_Wrapperより優れているといえます。
ほかにも、inetd経由でデーモンを起動するユーザーはrootである必要があったのですが、xinetdではその必要がありません。xinetdではアプリケーション専用のアカウントを作成し、そのアカウントの権限でデーモンを起動できます。これにより、バッファオーバーフロー攻撃でシェルを実行されてしまっても、そのアカウントの権限のみであるのためroot権限の必要なファイルの書き換えなどはできません。
inetdやxinetd経由で起動されるサービスはすべて停止しても問題はありません。telnetであれば、sshなど代わりになるプログラムがあります。よって、必要がなければinetdおよびxinetd経由で起動される全サービスを停止し、inetdあるいはxinetd自体も停止してしまうことをお勧めします。
コラム:xinetdの設定フィル
inetd.confをxinetd.confファイルにコンバートする「xconv.pl」というツールがすでに出ています。Debian/GNU Linuxでは、aptコマンドを用いてxinetdをインストールすると、inetd.confをxinetd.confへコンバートしてくれます。
xconv.plでコンバートした場合、Red Hat Linux 7.1Jのデフォルトのxinetdの設定とは形式がやや異なります。Red Hat Linux 7.1Jでは、/etc/xinetd.d以下にサービスごとにファイルが作成されます。xconv.plが作成するxinetd.confは、inetd.confと同じように1つのファイルに各サービスの設定が記述されます。
service telnet { disable = yes flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID }
service telnet { socket_type = stream protocol = tcp wait = no user = telnetd group = telnetd server = /usr/sbin/in.telnetd }
両者の設定内容は違いますが、フォーマットに変わりはありません。また、inetd.confとは明らかにフォーマットが違うことが分かります。
Copyright © ITmedia, Inc. All Rights Reserved.