連載
» 2001年08月18日 00時00分 公開

ゼロから始めるLinuxセキュリティ(1):インストール直後に絶対やるべき作業と設定 (2/3)

[大貫大輔,株式会社ラック/不正アクセス対策事業本部]

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
telnetを停止する場合
  • 設定の変更を反映する。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
実行例。kill -HUPするPIDは環境によって異なる

 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より優れているといえます。

注:xinetdでもTCP_Wrapperはサポートされているので利用することはできます。

 ほかにも、inetd経由でデーモンを起動するユーザーはrootである必要があったのですが、xinetdではその必要がありません。xinetdではアプリケーション専用のアカウントを作成し、そのアカウントの権限でデーモンを起動できます。これにより、バッファオーバーフロー攻撃でシェルを実行されてしまっても、そのアカウントの権限のみであるのためroot権限の必要なファイルの書き換えなどはできません。

 inetdやxinetd経由で起動されるサービスはすべて停止しても問題はありません。telnetであれば、sshなど代わりになるプログラムがあります。よって、必要がなければinetdおよびxinetd経由で起動される全サービスを停止し、inetdあるいはxinetd自体も停止してしまうことをお勧めします

編注:inetd+TCP_Wrapperおよび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
} 
Red Hat Linux 7.1Jのxinetdの設定(/etc/xinetd.d/telnet)
service telnet
{
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = telnetd
        group           = telnetd
        server          = /usr/sbin/in.telnetd
} 
Debian/GNU Linuxでinetd.confからxinetd.confにコンバートした設定(/etc/xinetd.conf)

 両者の設定内容は違いますが、フォーマットに変わりはありません。また、inetd.confとは明らかにフォーマットが違うことが分かります。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。