ネットワークコンピューティング入門

  1. 実習の前準備
  2. リモートアクセス
  3. セキュリティ対策

3. セキュリティ対策

今回は「悪意のある第 3 者からの攻撃を未然に防ぐ」ことを念頭におき, 以下の 3 点を行なう.

  1. ポートをふさぐ / デーモンを殺す
  2. 知っているホストからのみアクセスできるようにする
  3. ソフトウェアを最新版に保つ

[3.1] ポートをふさぐ / デーモンを殺す

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

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

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

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

この作業をマニュアルとして一元的にまとめるのは厳しいです. 各計算機によって用途も違いますし, 提供したいサービスも異なるからです. 最後に代表的なネットワークサービスをまとめましたので, それを参照しながら TA と相談し, 何を残して何を殺すか考えて下さい.

[3.1.1]現在稼働しているデーモンを調べる方法

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

情報実験のマニュアルを見てインストールしたばかりならば, 不必要なデーモンは存在しないと思いますが....

$ ps aux        
< プロセスが一覧される.

[3.1.2]inetd デーモンから起動されるデーモンを制限する

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

inetd から起動されるプログラムは, /etc/inetd.conf や /etc/services で不必要な個所を コメントアウトすることでネットワークサービスを行わなくすることが可能です. /etc/inetd.conf でコメントアウトしたサービス (デーモン) は起動しなくなります. /etc/services でコメントアウトしたポートはふさがり, (デーモンが起動していても) 外部/内部からの要求を受け入れなくなります.

# vi /etc/inetd.conf        

< ident 以外をコメントアウトする. 
  telnet や ftp もコメントアウトする.  

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

# /etc/init.d/openbsd-inetd restart        

[3.1.3]不要なソフトウェアのアンインストール

inetd から起動されるプログラム以外のプログラムでは, サービス提供の設定はそれぞれの設定ファイルにて行いますが, 不要なソフトウェアはアンインストールしてしまうのが最も安全でしょう.

注意: この節(3.1.3)の作業は実際に行なわないで下さい.

例えば portmap という ソフトウェアをアンインストールしたいとします. まず始めに portmap というプログラムを提供する Debian パッケージ名を 検索します.

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

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

# dpkg --purge portmap        

[3.1.4]主要なネットワークデーモン/ネットワークサービス一覧

ポート番号とサービス名の対応は, /etc/services で見ることができます.
$ less /etc/services        
ネットワークサービス名とその役割
ポート番号 サービス名 意味 必要か否か
9 discard 過去の遺物. ×
13 daytime 過去の遺物. ×
21 ftp ftp(ファイル転送プロトコル) 接続を受け付ける. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば ftp は不要です(scp を使う). もしくは OTP(使い捨てパスワード)を導入して下さい. × (OTP 化しているなら○)
22 ssh ssh 接続を受け付ける.
23 telnet telnet 接続を受け付ける. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば telnet は不要. もしくは OTP(使い捨てパスワード)を導入して下さい. × (OTP 化しているなら○)
25 smtp メール配信を行う. メールサーバ以外では必要無い (送信するだけならば smtp ポートを開く必要は無い). × (メールサーバなら◎)
37 time 過去の遺物. ×
53 domain ホスト名を返す(いわゆる DNS サーバ). ×(DNS サーバならば ◎)
70 gopher Internet gopher. ×?
79 finger ホストにログインしているユーザの情報を返す. ネットワーク攻撃を行う指針となるので, 絶対に このサービスを提供してはいけない. 試しに "$ finger @(ホスト名)" もしくは "$ finger (ユーザ名)@(ホスト名)" してみよ. ×
80 http www サーバ. × (www サーバならば ◎)
98 linuxconf linuxconf パッケージで提供される. GUI, txt, web ベースで設定ができるようだ. linuxconf を使うなら ○. ただし, ネットワーク的な安全性は定かではない.
110 pop-3 メールサーバからクライアントに, メールを渡すのに 用いられる. これはパスワードを要求するが, そのパスワードは平文のままなので危険. × (メールサーバならば ○)
111 sunrpc /etc/portmap, UNIX のポート間通信メカニズム. ×
113 auth ident. 接続相手の情報を得るために使われる. anonymous ftp 等で用いられているらしい.
119 nntp news の相互配送に用いられる. × (ニュースサーバならば ◎)
139 netbios-ssn samba(window と UNIX でのファイル共有)に使われる. × (samba を使うならば ○)
143 imap2 メールサーバからクライアントに, メールを渡すのに 用いられる. これはパスワードを暗号化する. × (メールサーバならば ○)
512 exec 過去の遺物. ×
513 login 過去の遺物. ×
514 shell 過去の遺物. ×
515 printer lpr コマンドを使ってプリントするのに必要. ネットワークに開いている必要はないけど. ?
1178 skkserv 漢字変換プログラム skk の辞書サーバ 辞書検索に辞書サーバを使用する場合は○
2401 cvspserver cvs サーバ. cvsroot 以下を公開している場合に必要. × (cvsroot を公開しているならば○)
5680 canna canna (日本語変換プログラム)サーバ. inet 経由の canna クライアントを使用する場合は○
6000 X11 X サーバ. 窓を飛ばしたいならば ○
22273 wnn6 漢字変換プログラム wnn サーバ. 愛していないので関知しません. 必要なら○

[3.2] 知っているホストからのみアクセスできるようにする

セキュリティ対策として知っているホストからのみアクセスできるようにする という方法もあります. この方法は強力です. しかし出張の時のように 普段全く使わない計算機を使わざるをえない場合に, 自分の計算機にアクセスできなくなるという欠点もあります.

この方法を取る場合には, /etc/hosts.deny, /etc/hosts.allow の 2 つの ファイルを編集する必要があります.

設定ファイル
名前 意味
/etc/hosts.deny アクセス不可条件を設定するファイル
書き方: デーモン名 : アクセスを禁止するホスト名(もしくはドメイン名)
"ALL" と書くと全てのデーモン, 全てのホストを意味する.
/etc/hosts.allow アクセス許可条件を設定するファイル
書き方: デーモン名 : アクセスを許可するホスト名(もしくはドメイン名)
"ALL" と書くと全てのデーモン, 全てのホストを意味する.

全てのホストからのアクセスを禁止しましょう. /etc/hosts.deny を以下のようにします.

# vi /etc/hosts.deny
ALL: ALL

< 全てのデーモンに対して, 全てのホストからアクセス禁止
< vi を用いて右のように入力. 他の行は全てコメントアウト
    (行の先頭に "#" を付ける)

全てのホストから sshd へのアクセスを禁止するならば /etc/hosts.deny を以下のようにします. (実際にやる必要はありません。)

# vi /etc/hosts.deny
sshd: ALL

< ssh デーモンに対して, 全てのホストからアクセス禁止
< vi を用いて右のように入力. 他の行は全てコメントアウト
    (行の先頭に "#" を付ける)

隣の情報実験機が /etc/hosts.deny を編集し終えたら ssh で遠隔ログインを試みてください. アクセス禁止になっている 場合には以下のようなメッセージが出てログインできないはずです.

$ ssh ***
ssh_exchange_identification: Connection closed by remote host

< *** には隣の情報実験機のホスト名を入力. 
< /etc/hosts.deny によって全てのアクセスが
    切られているため接続できない.

次にアクセスを許可するホスト情報を /etc/hosts.allow に書きます. ここでは隣の計算機からのアクセスのみを許可しましょう.

# vi /etc/hosts.allow
ALL: 192.168.16.1**


< vi を用いて /etc/hosts.allow を編集
< 全てのデーモンに対して, 192.168.0.1** からのアクセスのみを許可
  (** には隣の情報実験時の実験機番号を入力)
  他の行は全てコメントアウト  (行の先頭に "#" を付ける)

隣の情報実験機が /etc/hosts.allow を編集し終えたら ssh で遠隔ログインを 試みてください. ログインできましたか?

実はこれらの設定ファイルは TCP Wrapper というソフトウェアの 設定ファイルになっています. TCP Wrapper を介する起動されるデーモン (例えば sshd, 及び inetd から起動されるデーモン)はこの 設定ファイルを書くことでアクセス制御ができます. しかし TCP Wrapper を介さないデーモン(例えば httpd)に関しては, これらのファイルを修正してもアクセス制限はできません.


[3.3] ソフトウェアを最新版に保つ方法 (Debian GNU/Linux の場合)

Debian の場合, Debian のホームページに ソフトウェアのバグ情報が出ます. そこを読むと最新ソフトウェアがどこに存在 するのかわかります.

最新ソフトウェア置場は実は決まっているので, わざわざ手動でソフトウェアを ダウンロードしてインストールする必要はありません. apt というネットワーク経由でソフトウェアを用いると自動で行なえます.

apt の設定ファイルに最新ソフトウェア置場の情報を付加します. すでにこの情報が /etc/apt/sources.list に書かれている場合は必要ありません.


# echo "deb http://dennou-h.gfd-dennou.org/library/Linux/debian-security etch/updates main contrib non-free" >> /etc/apt/sources.list       

次に実際のソフトウェアのアップグレード作業です. これは実に簡単です.

# aptitude update       
< 最新のソフトウェアの情報を取得
# aptitude upgrade       
< 最新のソフトウェアをインストール

インストール時にエラーが出た場合は, メッセージに したがってください.

apt はソフトウェアを非常に便利なコマンドです. より詳細な使い方は情報実験第九回資料, Debian GNU/Linux における ソフトウェアインストールを参考にして下さい





最終更新: 2008/06/27 岩堀 智子 Copyright © 2008 inex