[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
参考: 「不要なネットワークサービスを止める」
不要なソフトウェア(デーモン)のアンインストール
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
主なポートとサービスは以下の通りです.
ポート番号 | サービス名 | 解説 |
9 | discard | 過去の遺物 |
13 | daytime | 過去の遺物 |
21 | ftp | ftp サーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば ftp は不要です(scp を使う). もしくは OTP(使い捨てパスワード)を導入すべき. |
22 | ssh | ssh 接続を受けつけるサーバ. |
23 | telnet | telnet 接続を受け付けるサーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば telnet は不要. もしくは OTP(使い捨てパスワード)を導入すべき. |
25 | smtp | メール配信(転送)を行なう. メールを送信するだけならば smtp ポートを開く必要はない. |
37 | time | 過去の遺物 |
53 | domain | ホスト名を返す(いわゆる DNS サーバ). |
70 | gopher | 旧式の文献検索サーバ. |
79 | finger | ホストにログインしているユーザの情報を返す.ネットワーク攻撃を行う指針となるので絶対にこのサービスを提供してはいけない. 試しに "$ finger @(ホスト名)" もしくは "$ finger (ユーザ名)@(ホスト名)" してみよ. |
80 | http | www サーバ. |
98 | linuxconf | ネットワーク経由でシステムを設定するためのサーバ. GUIベースや Web ベースの設定インターフェースを提供する. |
110 | pop-3 | メール受信サービス. パスワードを要求するがそのパスワードは平文のままなので危険. |
111 | sunrpc | UNIX のポート間通信メカニズム |
113 | auth | 接続相手の情報を得るために使われるサーバ(ident). anonymous ftp 等で用いられる. |
119 | nntp | NetNews の相互配送につかわれるサーバ. |
139 | netbios-ssn | samba(window と UNIX でのファイル共有)に使われる. |
143 | imap2 | メールサーバからクライアントにメールを渡すために用いられる. これはパスワードを暗号化する. |
512 | exec | 過去の遺物 |
513 | login | 過去の遺物 |
514 | shell | 過去の遺物 |
515 | printer | 印刷サーバ(lpr) |
613 | cups | 印刷サーバ(cups) |
1178 | skkserv | 漢字変換プログラム skk の辞書サーバ |
2401 | cvspserver | cvs サーバ. cvs のリポジトリを公開する場合に使用する. |
5680 | canna | 漢字変換プログラム canna のサーバ |
6000 | X11 | X サーバ |
22273 | wnn6 | 漢字変換プログラム wnn サーバ |
○アクセス制限(フィルタリング)
セキュリティ対策として, アクセスできるホストを制限してみましょう. ここでは設定が比較的簡単な tcp_wrapper を用いてアクセス制限を行ないます.
tcp_wrapper は inetd 経由で呼び出されるサービスについて アクセス制限を行なうためのプログラムです. 例えば /etc/inetd.conf に
skkserv stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/dbskkd-cdb
と記述されている時に inetd が skk サービス呼び出す場合は,
- skk サービス要求があると, inetd は tcpd を起動する.
- tcpd は接続要求元が接続許可されているか判断する.
- 許可されているならば, /usr/sbin/dbskkd-cdb を起動する
- 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接続実習 ]
Keyword(s):
References:[[Exp2009]スケジュール表・各回資料] [[Exp2009]公開鍵認証を使ったssh接続実習] [[Exp2009]文字コードあれこれ] [[Exp2009]最低限リモートアクセス] [[Exp2009]06/26実習事前準備]