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

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

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

## 3. セキュリティ対策

今回は「悪意のある第 3 者からの攻撃を未然に防ぐ」ことを念頭におき,
以下の 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 もコメントアウトする.
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

< 最新のソフトウェアをインストール

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

時間が余った人は下の付録を眺めていて下さい.

## 付録A セキュリティに関する話題

### [A.1] ディクショナリアタックから root パスワードを保護する方法

今回 ssh を扱ったので, ディクショナリアタックについて触れておきます.

ディクショナリアタックとはパスワードを破る為に辞書にある単語やそれに類するものを片っ端から試して行くという手法のことです.

第二回の授業でも話した通り, ディクショナリアタックから身を守る最良の方法は各ユーザが推測されにくい良いパスワードを設定することです.

とりわけシステム管理者(root) のパスワードは絶対に破られてはならないパスワードであることは言うまでもありません.

実は ssh による遠隔アクセスから root のパスワードを守る良い方法があります.

ssh の設定において, root でログインすることを禁止する項目があります.

これを有効にすると, 少なくとも root パスワードはリモートからのディクショナリアタックの脅威に曝されなくなります.

先程編集した /etc/ssh/sshd_config において, 以下のように編集・再起動すれば OK です.

# vi /etc/ssh/sshd_config

PermitRootLogin yes → PermitRootLogin no

# /etc/init.d/ssh restart

勿論, これで万全と言うわけではありません(直接ローカルにディクショナリアタックを仕掛けてくる人が居ないとは限りません).

計算機管理者は各ユーザにパスワードの定期的な更新を呼び掛けるとともに, 自身のパスワードも破られないよう注意する必要があることを忘れないで下さい.

### [A.2] DOS 攻撃

DOS(Denial of Service) 攻撃とは, データを大量送信するなどにより, 計算機やサーバに対して意図的に負荷をかけてサービスを提供できない状態にする攻撃のことを指します.

主に攻撃対象となるのは, 有名企業や政府機関などのウェブサーバやメールサーバなどですが, ネットワークでつながっている全ての計算機(厳密にはグローバル IP を持つ全ての計算機)は DOS 攻撃を受ける可能性があります.

DOS 攻撃の手法には様々な手法があります. 例えば以下のようなものがあります(詳細は書籍や web 等を参照してください).

TCP 接続のセッションを大量に確立し, 攻撃対象の計算機のメモリを消費し尽くす(SYN 攻撃)
攻撃対象の計算機に一度に大量のメールを送信する(メールボム)
複数の計算機を使って, 一斉に攻撃を加える(DDOS 攻撃)

ほとんどの場合, DOS 攻撃はソフトウェアのセキュリティホールを狙って行われるそうです.

従って DOS 攻撃から計算機を守るには, セキュリティ情報をこまめに確認し, ソフトウェアの状態を最新に保つことが肝要です.

またパスワードを盗まれて一度乗っ取られた計算機は DDOS 攻撃の「加害者」と成り得ます.

DOS 攻撃の被害者にも加害者にもならぬよう, ネットワークセキュリティには万全を期すよう心掛けましょう.

最終更新: 2009/07/03 山下 達也
Copyright © 2009 inex