遠隔アクセス/ネットワークセキュリティ入門

  1. 実習の前準備
  2. 遠隔アクセス
  3. ネットワークセキュリティ

3. ネットワークセキュリティ

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

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

[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]デーモンを停止するコマンド

デーモンを停止させるには, /etc/init.d ディレクトリにある該当デーモンの呼び出しスクリプトを停止します. 例として remote 側の ssh 用デーモンを停止させ, local側から ssh ログインができなくなることを確かめましょう.

# /etc/init.d/ssh stop        
< ssh 用デーモン(22番ポートのデーモン)を停止する.

この状態でこのホストに対して ssh ログインを試みましょう. 先ほどと同じく, 隣の計算機同士で互いにログインしてみてください.

$ ssh hoge@192.168.16.1**        
< joho** に ssh プロトコルを用いて遠隔ログインを試みる.

先ほどまではアカウントのパスワードが聞かれ正しく答えればログインできましたが, 今はリモートホスト側の ssh デーモンが停止しているため, 接続できないというエラーが出るはずです.
では再び ssh デーモンを起動してログインを試しましょう.

# /etc/init.d/ssh start        
< ssh デーモンを起動する.

これでもう一度ログインを試みると, 無事アカウントのパスワードが聞かれ正しく答えればログインできるはずです.
ただし, この方法でデーモンを停止しても計算機を再起動すると設定は初期化されてしまいます. 恒常的にデーモンを停止するにはデーモンを含むソフトウェアのアンインストールが必要です.

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

不要なデーモンを消すには, そのデーモンを使っているソフトウェアを アンインストールしてしまうのが最も安全かつ確実です.

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

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

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

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

# dpkg --purge portmap        

[3.1.4]付録 : inetd デーモンから起動されるデーモンを制限する

デーモンは担当のポートを常時監視し, 要求が来たときにサービスを 提供するプログラムを起動します. しかし多くのデーモンが常に 存在しているとそれだけメモリ等の計算機リソースを消費します. そこで計算機リソースの節約のためにポート監視専用のデーモン inetd を用意し, 基本的なネットワークサービス(ftp, telnet 等)は inetd から起動する ような仕組みになっています.
しかし近年は計算機の発達により, デーモンによるリソース消費がほとんど問題にならなくなったことから, デフォルトでは inetd を用いないシステムも増えています. squeeze についても同様で, デフォルトの 状態では inetd は導入されていません. よって今回は省略します.

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

ポート番号とサービス名の対応は, /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

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

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

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


< vi を用いて /etc/hosts.allow を編集
< 全てのデーモンに対して, 192.168.16.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 squeeze/updates main contrib non-free" 
>> /etc/apt/sources.list       

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

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

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



[3.4] アクセスログを確認する

多くの場合, 計算機は自身の動作に関する記録を一定期間分(期間は設定次第)保持しています. 不正アクセスを事前に防ぐ有効な手段として, そのような試みを事前にログから発見し, 当該ホストからの アクセスを禁止するという方法があります.
今回は, 実際にログインに関するログを確認してみましょう.

Debian の場合, 各種のログは基本的に /var/log 以下に保存されています. 今回チェックするのはここにある auth.log です. このログにはログインに関する記録が保存されています.

# less /var/log/auth.log         
< auth.log を閲覧

詳細なログの読み方は省略しますが, 最下行付近には先ほどまでの作業に関する記録があるはずですので, どんな内容が記録されているか読みといてみましょう.

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


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

[A.2] ディクショナリアタックから 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.3] DOS 攻撃

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

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

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

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

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

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

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




本日のスケジュールへ戻る

最終更新: 2011/07/08 高橋康人 Copyright © 2011 inex