[Exp2017]最低限セキュリティ対策
◎不要なサービスの停止
ネットワーク上の通信は「ポート」を通して行なわれます. ポートは様々なネットワークサービスを提供するための窓口にあたり, それぞれのネットワークサービスには固有のポート番号が割り付けられています.
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 でコメントアウトしたポートはふさがり, (デーモンが起動していても) 外部/内部からの要求を受け入れなくなります.
inetd 経由で呼び出されるデーモンの設定については, ここでは行いませんが参考までに「不要なネットワークサービスを止める」を見ておいて下さい.
不要なソフトウェア(デーモン)のアンインストール
inetd から呼び出されるプログラム以外は,をそれぞれ独自の設定によってアク セス制限を行ないます. 不要なソフトウェア(デーモン)はアンインストールし ておくのが最も安全でしょう.
主要なネットワークデーモン/ネットワークサービス一覧(参考)
ポート番号とサービス名の対応は, /etc/services で見ることができます.
$ less /etc/services
主なポートとサービスは以下の通りです.
ポート番号 | サービス名 | 解説 |
21 | ftp | ftp サーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば ftp は不要です(scp を使う). もしくは OTP(使い捨てパスワード)を導入すべき. |
22 | ssh | ssh 接続を受けつけるサーバ. |
23 | telnet | telnet 接続を受け付けるサーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば telnet は不要. もしくは OTP(使い捨てパスワード)を導入すべき. |
25 | smtp | メール配信(転送)を行なう. メールを送信するだけならば smtp ポートを開く必要はない. |
53 | domain | ホスト名を返す(いわゆる DNS サーバ). |
70 | gopher | 旧式の文献検索サーバ. |
79 | finger | ホストにログインしているユーザの情報を返す.ネットワーク攻撃を行う指針となるので絶対にこのサービスを提供してはいけない. 試しに "$ finger @(ホスト名)" もしくは "$ finger (ユーザ名)@(ホスト名)" してみよ. |
80 | http | www サーバ. |
110 | pop-3 | メール受信サービス. パスワードを要求するがそのパスワードは平文のままなので危険. |
111 | sunrpc | UNIX のポート間通信メカニズム |
113 | auth | 接続相手の情報を得るために使われるサーバ(ident). anonymous ftp 等で用いられる. |
119 | nntp | NetNews の相互配送につかわれるサーバ. |
123 | ntp | コンピュータの内部時計をネットワークを介して正しく調整するのに用いられる. |
139 | netbios-ssn | samba(window と UNIX でのファイル共有)に使われる. |
143 | imap | メールサーバからクライアントにメールを渡すために用いられる. これはパスワードを暗号化する. |
515 | printer | 印刷サーバ(lpr) |
1178 | skkserv | 漢字変換プログラム skk の辞書サーバ |
2401 | cvspserver | cvs サーバ. cvs のリポジトリを公開する場合に使用する. |
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: 133.30.109.x <- [133.30.109.x からの ssh 接続を許可]
つぎに /etc/hosts.deny(許可しない内容記述) において
# vi /etc/hosts.deny ALL: ALL <- [全てアクセスを禁止]
と設定することで,
- localhost からは全てアクセス許可
- 133.30.109.x からの sshd へのアクセスは許可
- それ以外のアクセスは全て拒否
となります. hosts.allow と hosts.deny で重複する内容がある場合は, hosts.allow が優先されます. また, hosts.allow と hosts.deny の両方に記述がないホストは, 接続が許可されます.
実習その4 では, 以下の手順で実習を行ないます.
- ssh で同じ班の情報実験機からログインを試みてもらう. 成功したらログアウトしてもらう.
- いま使っている情報実験機において, sshd に対してアクセス制限を設定する.
- 同じ班の情報実験機からのログインが禁止されていることを確認する
実習が終了した後には, sshd のアクセス制限を解除しておいて下さい.
△さらに進んだ情報: xinetd, iptables(Linux), ipfw(FreeBSD)
ここでは inetd 経由で呼び出されるデーモンについてのアクセス制限を行ないました. ですが, inetd を介さないデーモンについては, 各々のデーモン毎にアクセス制限を行う必要があり, tcp_wrapper によるアクセス制限を行なう事ができません. inetd から呼びだされないデーモンについても tcp_wrapper によるアクセス制限を行ないたい場合には, inetd の発展版である xinetd を用います. xinetd FAQ の日本語訳 などを参考にしてください.
また, inetd や xinetd といったプログラムレベルでのアクセス制限ではなく, カーネルレベルでアクセス制限を行なう(パケットをフィルタリングする)仕組みとして, Linux では iptables, FreeBSD では ipfw などがあります. iptables や ipfw は大変高機能ですが, ここでは詳しくは触れません. 詳細については netfilter/iptables project homepage 等を参照して下さい.
次項:[公開鍵認証を使ったssh接続実習]
Keyword(s):
References:[[Exp2017]スケジュール表・各回資料] [[Exp2017]リモートアクセス・セキュリティ対策実習事前準備] [[Exp2017]公開鍵認証を使ったssh接続実習] [[Exp2017]最低限リモートアクセス]