[Exp2009]最低限セキュリティ対策

◎不要なサービスの停止

ネットワーク上の通信は「ポート」を通して行なわれます. ポートは様々なネットワークサービスを提供するための窓口にあたり, それぞれのネットワークサービスには固有のポート番号が割り付けられています.

UNIX(Linux) の場合, ポートを監視し, ネットワーク上にサービスを提供するプログラムを「デーモン」と呼びます. ポートは TCP/IP における TCP 層で規定されるものですが, デーモンは UNIX(Linux) 上のある特定の役割を持ったプログラムの名称です.

UNIX(Linux) はサーバとして様々なネットワークサービス を行なえるようになっています (例えばメール配送を行なう smtpd, Web を公開するための httpd, 遠隔ログインを可能にするための sshd 等). セキュリティを高めるためには, 必要なネットワークサービス以外行なわないようにするのが良いでしょう.

必要のないネットワークサービスを提供しないようにするには, そのネットワークサービスを提供するデーモンを停止する, またはポートをふさぐことが必要となります.

ポート/デーモンの状況を調べる

現在稼働しているデーモンを調べるには, システムで動いているプロセスの中から, デーモンプロセスを探します (デーモンプロセス名は一般に最後に d が付くものが多いです). ps コマンドを使うことでプロセスを一覧できます.

$ ps aux        

また, 現在のネットワーク状況を確認し, パケットを待機しているポートを探すには netstat コマンドを使用すると良いでしょう.

$ netstat -an

tcp/udp 通信において, 状態が LISTEN になっているポートが外部に対して 開いているポートになります. 予期しないポートが LISTEN 状態になっていたら, そのポートを監視しているプロセスを止めましょう.

inetd 経由で呼び出されるデーモンの設定

デーモンは担当のポートを常時監視し, 要求が来たときにサービスを提供するプログラムを起動します. しかし多くのデーモンが常に存在していると それだけメモリ等の計算機リソースを消費します. そこで計算機リソースの節約のためにポート監視専用のデーモン inetd を用意し, 基本的なネットワークサービス(ftp, telnet 等)は inetd から呼び出される仕組みになっています.

inetd から呼び出されるサービスは /etc/inetd.conf や /etc/services に記述されており, 不必要な個所をコメントアウトすることでサービスの提供を止めることが可能です. /etc/inetd.conf でコメントアウトしたサービス (デーモン) は inetd から呼び出されなくなります. また, /etc/services でコメントアウトしたポートはふさがり, (デーモンが起動していても) 外部/内部からの要求を受け入れなくなります.

# vi /etc/inetd.conf        < ident 以外をコメントアウトする. 
                              telnet や ftp もコメントアウトする.  

/etc/inetd.conf を編集し終ったら, inetd を再起動します.

# /etc/init.d/openbsd-inetd restart        
["実習その3 情報実験機の現在の状況を確認して下さい. 設定自体は, 既に前回の実習において行なっているはずです."]

参考: 「不要なネットワークサービスを止める

不要なソフトウェア(デーモン)のアンインストール

inetd から呼び出されるプログラム以外は,をそれぞれ独自の設定によってアク セス制限を行ないます. 不要なソフトウェア(デーモン)はアンインストールし ておくのが最も安全でしょう.

この節の作業は実際には行なわないこと!

Debian の場合, 例えば portmap というソフトウェアをアンインストールする際は, 先ず portmap を提供する Debian パッケージを検索します.

$ dpkg -S portmap
portmap: /etc/init.d/portmap      <-- コロンの左がパッケージ名.
                                      コロンの右がパッケージの提供する
                                      ファイル名

検索に引っかかったパッケージをアンインストールします.

$ dpkg -r portmap                 <-- 設定ファイルは残したまま, remove
       もしくは
$ dpkg --purge portmap            <-- パッケージが提供する
                                      全てのファイルを削除

主要なネットワークデーモン/ネットワークサービス一覧(参考)

ポート番号とサービス名の対応は, /etc/services で見ることができます.

$ less /etc/services        

主なポートとサービスは以下の通りです.

ポート番号サービス名解説
9discard過去の遺物
13daytime過去の遺物
21ftpftp サーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば ftp は不要です(scp を使う). もしくは OTP(使い捨てパスワード)を導入すべき.
22sshssh 接続を受けつけるサーバ.
23telnettelnet 接続を受け付けるサーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば telnet は不要. もしくは OTP(使い捨てパスワード)を導入すべき.
25smtpメール配信(転送)を行なう. メールを送信するだけならば smtp ポートを開く必要はない.
37time過去の遺物
53domainホスト名を返す(いわゆる DNS サーバ).
70gopher旧式の文献検索サーバ.
79fingerホストにログインしているユーザの情報を返す.ネットワーク攻撃を行う指針となるので絶対にこのサービスを提供してはいけない. 試しに "$ finger @(ホスト名)" もしくは "$ finger (ユーザ名)@(ホスト名)" してみよ.
80httpwww サーバ.
98linuxconfネットワーク経由でシステムを設定するためのサーバ. GUIベースや Web ベースの設定インターフェースを提供する.
110pop-3メール受信サービス. パスワードを要求するがそのパスワードは平文のままなので危険.
111sunrpcUNIX のポート間通信メカニズム
113auth接続相手の情報を得るために使われるサーバ(ident). anonymous ftp 等で用いられる.
119nntpNetNews の相互配送につかわれるサーバ.
139netbios-ssnsamba(window と UNIX でのファイル共有)に使われる.
143imap2メールサーバからクライアントにメールを渡すために用いられる. これはパスワードを暗号化する.
512exec過去の遺物
513login過去の遺物
514shell過去の遺物
515printer印刷サーバ(lpr)
613cups印刷サーバ(cups)
1178skkserv漢字変換プログラム skk の辞書サーバ
2401cvspservercvs サーバ. cvs のリポジトリを公開する場合に使用する.
5680canna漢字変換プログラム canna のサーバ
6000X11X サーバ
22273wnn6漢字変換プログラム wnn サーバ

○アクセス制限(フィルタリング)

セキュリティ対策として, アクセスできるホストを制限してみましょう. ここでは設定が比較的簡単な tcp_wrapper を用いてアクセス制限を行ないます.

tcp_wrapper は inetd 経由で呼び出されるサービスについて アクセス制限を行なうためのプログラムです. 例えば /etc/inetd.conf に

skkserv  stream  tcp  nowait  nobody  /usr/sbin/tcpd  /usr/sbin/dbskkd-cdb

と記述されている時に inetd が skk サービス呼び出す場合は,

  1. skk サービス要求があると, inetd は tcpd を起動する.
  2. tcpd は接続要求元が接続許可されているか判断する.
  3. 許可されているならば, /usr/sbin/dbskkd-cdb を起動する
  4. dbskkd-cdb が接続要求元に対して skk サービスを提供する

という手続きを踏んでいます. この時に「tcpd を起動」し「接続の許可・不許可を判断する」プログラムが tcp_wrapper です.

tcp_wrapper の設定

tcp_wrapper によるアクセス制限は /etc/hosts.allow もしくは /etc/hosts.deny によって設定します. どちらも書き方は以下の通りです.

デーモン名: アクセスを許可(もしくは禁止する)ホスト名(もしくは IP アドレス).

例えば, /etc/hosts.allow(許可する内容を記述) において,

# vi /etc/hosts.allow
ALL: 127.0.0.1               <- [localhost からは全てのアクセスを許可]
sshd: 192.168.16.x           <- [192.168.16.XX からの ssh 接続を許可]

つぎに /etc/hosts.deny(許可しない内容記述) において

# vi /etc/hosts.deny
ALL: ALL                     <- [全てアクセスを禁止]

と設定することで,

  • localhost からは全てアクセス許可
  • 192.168.16.x からの sshd へのアクセスは許可
  • それ以外のアクセスは全て拒否

となります.

さらに進んだ情報: xinetd, iptables(Linux), ipfw(FreeBSD)

ここでは inetd 経由で呼び出されるデーモンについてのアクセス制限を行ないました. ですが, inetd を介さないデーモンについては, 各々のデーモン毎にアクセス制限を行う必要があり, tcp_wrapper によるアクセス制限を行なう事ができません. inetd から呼びだされないデーモンについても tcp_wrapper によるアクセス制限を行ないたい場合には, inetd の発展版である xinetd を用います. xinetd については<URL:http://www.xinetd.org/>を参照して下さい. xinetd FAQ の日本語訳 も参考になるでしょう.

また, inetd や xinetd といったプログラムレベルでのアクセス制限ではなく, カーネルレベルでアクセス制限を行なう(パケットをフィルタリングする)仕組みとして, Linux では iptables, FreeBSD では ipfw などがあります. iptables や ipfw は大変高機能ですが, ここでは詳しくは触れません. 詳細については netfilter/iptables project homepage 等を参照して下さい.

次項:[ 公開鍵認証を使ったssh接続実習 ]

[ 2009 スケジュール表・各回資料(06/26) ]