inetdとTCPWrapper
inetd
inetdは、クライアントからのリクエストに応じてプログラム(サーバー)を起動します。
inetdの利点としては、httpdやsendmailのようにサーバープログラムそれぞれが常駐しないためメモリーの使用量を少なくすることが出来ます。
inetdは常駐しており、クライアントからの要求があると要求先のポートに応じてプログラムを起動します。どのポート番号がどのプログラムに対応するかは、/etc/servicesファイルに定義されています。
ftp 21/tcp # File Transfer [Control]
ftp 21/udp # File Transfer [Control]
ssh 22/tcp # Secure Shell Login
ssh 22/udp # Secure Shell Login
telnet 23/tcp
telnet 23/udp
# 24 - private
smtp 25/tcp mail
定義は、サービス名、ポートとプロトコル、エイリアス(別名)の順に定義します。
ポートからサービスは、/etc/servicesファイルでわかるので次にどのプログラムを実行するかになります。どのプログラムを実行するかは、/etc/inetd.confに定義します。
ftp stream tcp nowait root /usr/sbin/tcpd in.proftpd
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
svn stream tcp nowait svnuser /usr/sbin/tcpd /usr/local/bin/svnserve -i -r /var/svn
定義の意味は、順に次のようになります。
- サービス名
- /etc/servicesで定義されているサービス名
- ソケットタイプ
- dgram又はstreamから選択。通信方式を表し、一般的にUDPではdgram、TCPではstreamが利用される
- プロトコル
- udpやtcpなどのプロトコル名
- waitステータス
- wait又はnowaitから選択。プログラムを起動するタイミング
- ユーザー(グループ)
- プログラムを実行するユーザー又はグループ
- プログラム
- 実行するプログラムのパス
- プログラムの引数
- プログラムへ渡す引数
上記例では、実行されるプログラムが全て/usr/sbin/tcpdになっています。これは、TCPWrapperと呼ばれtcpdがプログラムとの間に入りログの記録やアクセス制限等をおこなってくれます。
TCP Wrapper
TCPWrapperは、inetdから起動されるプログラムに対してログの記録やアクセス制限といった基本的なセキュリティーを確保してくれます。
inetd.confの設定は、実行するプログラムにtcpdを指定し引数として実際に実行されるプログラムのパス及び引数を指定します。実行するプログラムが、/usr/sbin/に配置されている場合、in.proftpdのように指定できます。(/usr/sbin/ = REAL_DAEMON_DIR)
上記例のsvn(Subversion)は、引数にプログラムのパスを指定しています。
TCP Wrapperによるアクセス制限
TCP Wrapperによるアクセス制限は、/etc/hosts.allow及び/etc/hosts.denyで設定します。
allowには、接続を許可するホストを指定しdenyには、拒否するホストを指定します。
書式は、次のようになります
サービス : ホスト [ : オプション ]
TCP Wrapperに含まれる?もの
- tcpd
- TCP Wrapperの本体
- tcpdchk
- TCP Wrapperの設定ファイルが正しいことをチェックするプログラム
- tcpdmatch
- 設定を実験するために、サービス名とアクセス元ホスト名を指定してアクセスの可否を表示宇するプログラム
- try-from
- リモートホストから(rshを使って)呼び出し、ホスト情報を表示するプログラム
- safe_finger
- fingerにアクセスしてきた攻撃者の情報を収集するために使用するプログラム