ちょっとした 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) : クライアントリスト : オプション
サーバープログラム名
起動されるdaemonの名前(in.ftpdや in.telnetdなど)です。サービス名ではありません。ALLと記述すると全てのサーバープログラムを表します。 また、EXCEPT を利用して例外を記述できます。クライアントリスト
コンマで区切られたホスト名/ドメイン名/ネットワーク名です。ホスト名は、ドメイン名の付いたものでも、IPアドレスでの指定でもかまいません。ドメイン名の場合、最初にピリオドをつけます。 ALLと記述すると全てのホストを表します。また、EXCEPT を利用して例外を記述できます。オプション
基本的にここでは、allow/deny を設定します。他に、ログを取ることやコマンドを指定したりすることもできます。
# 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アクセスがきちんと設定されているか調べるために、次のような結果が表示される事を確認します。
許可されているホスト(192.168.0.10) からの ftp アクセス
# tcpdmatch in.ftpd 192.168.0.1 client: address 192.168.0.1 server: process in.ftpd matched: /etc/hosts.allow line 1 access: granted
許可されていないホスト(234.567.0.1) からの ftp アクセス
# tcpdmatch in.ftpd 234.567.0.1 client: address 234.567.0.1 server: process in.ftpd matched: /etc/hosts.deny line 1 access: denied
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" とメッセージを表示する。
full - ホスト名とバージョンを表示
brief - ホスト名を表示
terse - "FTP server ready" と表示
text message - 任意のメッセージ(message)を記述することが可能
greeting text Welcome to Foobar Inc. FTP server
2. anonymous ログインを設定する場合、通常パスワードに e-mailアドレスを入力してもらうように設定します。そこで、passwd-checkを使用して出来るだけ正確な e-mailアドレスを入力してもらうように設定します。アドレスが存在するかどうかまではチェックしません。例は、最も厳しい RFC822 に準拠しないとログインを拒否する。
none - パスワードのチェックを行わない
trivial - パスワードに @ があるかチェック
rfc822 - RFC822 に準拠しているアドレスかチェック
warn - チェックに準拠していない場合、警告を出すがログイン可能
enforce - チェックに準拠していない場合、警告を出してログインを拒否
passwd-check rfc822 enforce
3. 一般ユーザーのログイン許可/拒否の設定方法。通常、ファイル ftpuser (/etc/ftpusers) にアカウントを記述しておくことで FTP によるログインを拒否できます。wu-ftpd では、これらを UID(ユーザーID)と GID(グループID)で許可/拒否の設定が行えます。例は、UID/GID 共に 100 から 65533 までの ID のものを許可する。
allow-uid - 許可するユーザーの UID の範囲を指定
allow-gid - 許可するグループの GID の範囲を指定
deny-uid - 拒否するユーザーの UID の範囲を指定
deny-gid - 拒否するグループの GID の範囲を指定
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 - Home ディレクトリーをトップディレクトリーとするユーザーの UID の範囲を指定
restricted-gid - Home ディレクトリーをトップディレクトリーとするグループの GID の範囲を指定
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など |