ちょっとした UNIXセキュリティーの設定

サーバーを構築する際に、幾つかセキュリティーに関する設定をしなければなりません。その中でも、最もポピュラーな方法について記述します。

* inetd を利用して TCP Wrappers でアクセス制御する

UNIXシステムへのネットワーク経由でのアクセスには、named, sendmail, nfsdのような常駐型のサーバープログラム (daemon) へのアクセスと、常駐はせずにアクセス要求があった時に起動されるものがあります。常駐せずに、アクセス要求があった時に起動されるサーバープログラム (daemon) は inetdによって管理されています。
inetdの設定は、/etc/inetd.conf ファイルに記述します。このファイルには、リモートホストへのログインやファイル転送などを行うサーバープログラム(daemon)の起動に必要な情報が記述されています。フォーマットは、

  Service名   Socketタイプ   プロトコル   wait-status   UserID   ServerProgram名   ServerProgramの引数

となっています。サービス名は /etc/services ファイルに記述されているサービスを記述します。Solaris での ftp の場合以下のようになります。

  ftp  stream  tcp  nowait  root   /usr/sbin/in.ftpd    in.ftpd -l
行の先頭が # で始まっているものはコメント行となり、サービスを無効にしたい場合などに利用することもあります。

TCP Wrappers (tcpd) は、この inetd 経由のネットワークアクセスを監視してアクセス制御を行ないます。TCP Wrappers を利用するには、サーバープログラムに tcpd を利用するように /etc/inetd.conf ファイルを変更する必要があります。TCP Wrappers は、まずはじめに /etc/hosts.allow ファイルをチェックし、次に /etc/hosts.deny ファイルをチェックします。これらのファイルに書かれた情報をもとにアクセス制御を行います。

● inetd.confファイルの変更

TCP Wrappers は、本来 inetdが起動するサーバープログラムが起動される前に一連のチェックを行い、許可された相手からのアクセスである場合サーバープログラムを起動します。そのため、/etc/inetd.conf ファイルを以下の様に /usr/sbin/tcpd (tcpd を /usr/sbin にインストールした場合)を起動するように書き換える必要があります。

# Ftp and telnet are standard Internet services.
ftp     stream  tcp     nowait  root    /usr/sbin/tcpd    in.ftpd -l
telnet  stream  tcp     nowait  root    /usr/sbin/tcpd    in.telnetd
 
# Shell, login, exec, comsat and talk are BSD protocols.
shell   stream  tcp     nowait  root    /usr/sbin/tcpd    in.rshd
login   stream  tcp     nowait  root    /usr/sbin/tcpd    in.rlogind
#exec   stream  tcp     nowait  root    /usr/sbin/in.rexecd    in.rexecd 
#comsat dgram   udp     wait    root    /usr/sbin/in.comsat    in.comsat
#talk   dgram   udp     wait    root    /usr/sbin/in.talkd     in.talkd
 
# Local services
pop3    stream  tcp     nowait  root    /usr/sbin/tcpd    ipop3d
imap    stream  tcp     nowait  root    /usr/sbin/tcpd    imapd

/etc/inetd.conf を書き換えた場合、inetd デーモンを再起動(HUPシグナルを送る) して書き換えた情報を有効にする必要があります。

● hosts.allow, hosts.deny ファイルの作成

TCP Wrapperは、/etc/hosts.allow, /etc/hosts.deny ファイルの情報をもとにサーバープログラムへのアクセス制御を行います。

/etc/hosts.allow の記述方法は以下のようになります。

   サーバープログラム名 (daemon) : クライアントリスト : オプション
# comments
in.ftpd : 192.168.0.0/255.255.255.0 : allow
in.telnetd : 192.168.0.10, 192.168.0.11 : allow
in.rshd : .foobar.co.jp : allow
in.rlogind : 192.168.0.0/24 : allow
ipop3d : ALL EXCEPT 192.168.1.0/255.255.255.0 : allow 

/etc/hosts.deny の記述は

# comments                                            
ALL : ALL

として、/etc/hosts.allow ファイルに記述した条件以外は拒否する設定にしておく。hosts.allow ファイルに、正確にdeny (拒否)の記述をするならば hosts.deny は記述しなくてもかまいません。

● テスト

アクセスの制御がきちんとできているかどうかを確認するのには、tcpdchk, tcpdmatchといったコマンドを使用します。tcpdchkコマンドを実行すると、/etc/hosts.{allow,deny}の書式などがチェックされます。 問題がなければ何もメッセージを表示せず、書式に問題がある場合には警告が出ます。tcpdmatchコマンドを利用して、アクセス制限がきちんと行われているか確認することができます。

  tcpdmatch  サービス名  アクセス元ホスト
例えば、ftpアクセスがきちんと設定されているか調べるために、次のような結果が表示される事を確認します。

* xinetd を利用してアクセス制御する

xinetd は、inetd の代替となるインターネットサービスデーモンで、TCP Wrappersのようなアクセス制御機能を持っています。つまり、inetd + TCP Wrappers = xinetd と考えるとよいでしょう。

inetdでは、/etc/inetd.conf ファイルで設定を行っていたが、xinetdでは /etc/xinetd.conf ファイルで設定を行います。inetdの設定ファイルである /etc/inetd.conf とxinetdの設定ファイルである /etc/xinetd.conf は書式が全く異なります。すべてを手動で変更してもかまわないが、itox という変換プログラムで /etc/xinetd.conf を作成し、細かい変更を加えることもできます。変換の方法は以下のように簡単です。

    itox < /etc/inetd.conf > /etc/xinetd.conf

それでは、/etc/xinetd.conf を詳しく見てみましょう。その前に、xinetd.conf ファイルの記述の特徴は、inetd.conf ファイルのように一つのファイルですべてのサービスを記述するのではなく、基本的な設定やデフォルトの設定を xinetd.conf ファイルに記述し、サービス特有の設定をサービスごとに別ファイルで管理するようにしています。

● /etc/xinetd.conf ファイル

 defaults {
     # そのサービスが扱うことができる最大要求数。UNLIMITED なら無制限。
     instances = 60
 
     # ログの種類。下記のいずれかを指定する。
     log_type  = SYSLOG  authpriv
     #log_type  = SYSLOG  syslog_facility
     #log_type  = SYSLOG  syslog_level
 
     # セッション成功時に、リモートホストのIPアドレスとサーバのPIDをログに出力
     log_on_success  = HOST PID
 
     # セッション失敗時に、リモートホストのIPアドレスと失敗したときの状態をログに出力 
     log_on_failure  = HOST RECORD
 }
              
 # 各サービスの設定を、どのディレクトリにあるファイルから読み込むかを指定
 includedir /etc/xinetd.d

● サービスごとの設定

サービスごとの設定は、xinetd.conf ファイルに記述した includedir ディレクティブで指定したディレクトリーにサービスごとにユニークなファイル名で作成します。上記のように xinetd.conf ファイルを記述した場合、/etc/xinetd.d/service-name というファイルになります。この service-name は任意につけることができるが、分かりやすくするために /etc/services ファイルに記載されているサービス名やアプリケーション名にします。サーバープログラムが、複数のサービス(ポート)を利用しないならサービス名をファイル名とし、複数のサービスを利用するならアプリケーション名でまとめて記述すると管理しやすいのではないでしょうか。
ここでは、良く使われる wu-ftp を例に設定ファイルの内容を説明します。

 # /etc/services ファイルで定義されているサービス名を指定
 service ftp
 {
     # ソケットの種類を指定
     # stream/dgramraw/seqpacket/tli
     socket_type  = stream
 
     # プロトコルの指定
     # TCP/UDP
     protocol     = tcp
 
     # waitステータス:プログラム終了前に同一ポートへのコネクション要求を受け付けるかどうか 
     # nowait/wait = no/yes
     wait         = no
 
     # サーバプログラムを実行するユーザ名を指定
     user         = root
 
     # サーバプログラムを絶対パスで指定
     server       = /usr/sbin/in.ftpd
 
     # サーバプログラムの引数を指定
     server_args  = -l -a
 
     # 成功時の log に記述する内容   DURATION は接続期間
     log_on_success += DURATION USERID
 
     # 失敗時の log に記録する内容
     log_on_failure += USERID
 
     # サーバプログラムの実行優先順位を指定   値が大きいほど優先順位が高い
     nice         = 10
 
     # このサービスを有効/無効を設定   no/yes
     disable      = no
 }

ここで、= ではなく += としている部分は、デフォルト(/etc/xinetd.conf)の設定やすでに設定済みの情報に追加することを意味します。

● アクセス制御に関する設定

ここで説明している設定は、defauts, service どちらでも記述できます。すべてのサービスに対して設定したければ defaults へ、各サービスごとに設定したければ service へ記述します。もちろん += を利用してデフォルトの設定へ情報を追加することもできます。

 # 要求を許可するホストを指定
 # ホストの指定方法
 #   192.168.0.10
 #   192.168.0.0/255.255.255.0
 #   192.168.0.0/24
 #   svr1.foobar.co.jp
 #   .foobar.co.jp
 # only_from   = ホスト [ホスト]
 only_from     = 192.168.0.0/255.255.255.0 192.168.1.10
 only_from    += .foobar.co.jp
 
 # 要求を拒否するホストを指定
 no_access     = ホスト [ホスト]
 
 # アクセス許可される時間帯を設定
 # 時間帯は、開始時間(時:分)― 終了時間(時:分)という形式で指定
 #   access_times  = 時間帯
 #
 # 時間は 24 時間制で指定し、日付をまたぐ設定はできない
 # 日付をまたぐ場合、下記のようにスペースで 2つに分けて記載する必要がある
 access_time   = 20:00-24:00 0:00-7:00
 
 # 指定された IP/ポートにサービス要求を送出
 redirect      = ip ( port )
 
 # サーバプログラムの接続数の制限
 # 無制限は UNLIMITED を指定
 instances     = 制限数

* FTP サーバーとして wu-ftpd を使用している場合に必要なこと

wu-ftpd の設定ファイル ftpaccess を編集します。

1. ログインした際に表示されるメッセージを greetingを使用してシンプルにします。特に、バージョンなどを表示させないようにします。例は、"Welcome to Foobar Inc. FTP Server" とメッセージを表示する。

    greeting text Welcome to Foobar Inc. FTP server

2. anonymous ログインを設定する場合、通常パスワードに e-mailアドレスを入力してもらうように設定します。そこで、passwd-checkを使用して出来るだけ正確な e-mailアドレスを入力してもらうように設定します。アドレスが存在するかどうかまではチェックしません。例は、最も厳しい RFC822 に準拠しないとログインを拒否する。

    passwd-check rfc822 enforce

3. 一般ユーザーのログイン許可/拒否の設定方法。通常、ファイル ftpuser (/etc/ftpusers) にアカウントを記述しておくことで FTP によるログインを拒否できます。wu-ftpd では、これらを UID(ユーザーID)と GID(グループID)で許可/拒否の設定が行えます。例は、UID/GID 共に 100 から 65533 までの ID のものを許可する。

    allow-uid %100-65533
    allow-gid %100-65533
    deny-uid %-99 %65534-
    deny-gid %-99 %65534-

4. 一般ユーザーがログインした時に、Home ディレクトリーをトップディレクトリーとする(chroot した状態にする)。通常、一般ユーザーが ftpで接続するとシステムのほとんど全てのディレクトリを見に行くことが出来てしまいます。wu-ftpdでは、一般ユーザーの Home ディレクトリーをトップディレクトリーとして、他のディレクトリーを隠すことが出来ます。例は、UID/GID 共に 1000 から 65533 までの ID のものを chroot する。

    restricted-uid %1000-65533
    restricted-gid %1000-65533

* FTPサーバーとして ProFTPD を使用している場合に必要なこと

ProFTPD の設定ファイル proftpd.conf を編集します。

ユーザーのホームディレクトリをルートディレクトリーにする
DefaultRoot    ~
特定のディレクトリ(例:/disk/ftpusers)をルートディレクトリーにする
DefaultRoot    /disk/ftpusers
サーバーにアクセスした際に表示されるバージョン等のメッセージを無効にする
ServerIdent on ""

* FTPサーバーとして vsftpd を使用している場合に必要なこと

vsftpd の設定ファイル vsftpd.conf を編集します。

ユーザーのホームディレクトリをルートディレクトリーにする
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
chroot_local_user=YES
ここで指定したファイル(vsftpd.chroot_list)を作成しておいてください。このファイルに記述されたユーザーは chroot の対象外となります。
特定のユーザーの FTP を無効にする
userlist_enable=YES
userlist_file=/etc/vsftpd.ftpusers
ここで指定したファイル(vsftpd.ftpusers)に、FTP を許可しないユーザーを登録する。root, bin,daemonなど