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

# リモートアクセス/ネットワークセキュリティ

実習の前準備
リモートアクセス
ネットワークセキュリティ

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

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

ポートをふさぐ / デーモンを止める
知っているホストからのみアクセスできるようにする
ログを確認する

### [3.1] ポートをふさぐ / デーモンを止める

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

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

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

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

この作業をマニュアルとして一元的にまとめるのは厳しいです.
各計算機によって用途も違いますし, 提供したいサービスも異なるからです.
以下に代表的なネットワークサービスをまとめましたので, 必要に応じて参照してください.

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

現在稼働しているデーモンを調べるには, システムで動いている
プロセスの中から, ***d (デーモン名は一般に最後に d が付くex). sshd )
を探します. ps コマンドを使うことでプロセスを一覧できます.
(* プロセスとは, プログラムの実行単位を指します. 1つのプログラムの実行を 1プロセスと呼びます.)

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

$ ps aux

< プロセスの一覧が表示される.

#### [3.1.2]デーモンを停止するコマンド

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

# systemctl stop sshd.service

< ssh 用デーモン(22番ポートのデーモン)を停止する.

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

$ ssh hoge@192.168.16.1XX

< johoXX に ssh プロトコルを用いてリモートログインを試みる.

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

ssh: Connect to host 192.168.16.1XX port 22: Connection refused

では再び ssh デーモンを起動してログインを試しましょう.

# systemctl start sshd.service

< ssh デーモンを起動する.

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

### [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 192.168.16.1XX
ssh_exchange_identification: read: Connection reset by peer

< /etc/hosts.deny によって全てのアクセスが
切られているため接続できない.

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

# vi /etc/hosts.allow
ALL: localhost
ALL: 192.168.16.1XX

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

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

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

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

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

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

# less /var/log/auth.log

< auth.log を閲覧

詳細なログの読み方は省略しますが, 最下行付近には先ほどまでの作業に関する記録があるはずですので,
どんな内容が記録されているか読みといてみましょう.
ログをチェックする際に便利なのが grep コマンドです.
grep を用いると出力結果の中から特定の文字列を含む行のみを抽出することができます.
例えば error, deny, failure, refused などの語を検索すれば、不正アクセスの痕跡を見つける役に立つでしょう.

# less /var/log/auth.log | grep refused

< auth.log から refused を含む行のみを抽出. |(パイプ) の意味はシェルのオプションを参照してください.

もし, ssh によるリモートログインに失敗した場合, 下記のようなログが抽出されるはずです.

Jun 8 13:35:24 johoXX sshd[16941]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=herohero.net user=hoge

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

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

注意: 付録の作業は実際に行なわないで下さい.行いたい場合は担当VTA に許可をとってください．

### [A.1]不要なソフトウェアのアンインストール

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

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

$ apt-cache search portmap
remotetea - Sun ONC/RPC support for Java
rpcbind - RPC プログラム番号を汎用アドレスに変換

< 左側がパッケージ名.
右側がパッケージの提供するファイル名.

検索に引っかかったパッケージをアンインストールします.--purge は完全に削除する場合に用いる

# apt-get (--purge) remove rpcbind

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

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

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

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

## 付録B セキュリティに関する話題その2

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

今回 ssh を扱ったので, ディクショナリアタックについて触れておきます.
ディクショナリアタックとはパスワードを破る為に辞書にある単語やそれに類するものを片っ端から試して行くという手法のことです.
第二回の授業でも話した通り, ディクショナリアタックから身を守る最良の方法は各ユーザが推測されにくい良いパスワードを設定することです.
とりわけシステム管理者(root) のパスワードは絶対に破られてはならないパスワードであることは言うまでもありません.
実は ssh によるリモートアクセスから root のパスワードを守る良い方法があります.
ssh の設定において, root でログインすることを禁止する項目があります.
これを有効にすると, 少なくとも root パスワードはリモートからのディクショナリアタックの脅威に曝されなくなります.

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

# vi /etc/ssh/sshd_config

PermitRootLogin yes → PermitRootLogin no

# systemctl restart sshd.service

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

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

### [B.2] DoS 攻撃

DoS(Denial of Service) 攻撃とは, データを大量送信するなどにより, 計算機やサーバに対して意図的に負荷をかけてサービスを提供できない状態にする攻撃のことを指します.
主に攻撃対象となるのは, 有名企業や政府機関などのウェブサーバやメールサーバなどですが, ネットワークでつながっている全ての計算機(厳密にはグローバル IP を持つ全ての計算機)は DoS 攻撃を受ける可能性があります.
DoS 攻撃の手法には様々な手法があります. 例えば以下のようなものがあります(詳細は書籍や web 等を参照してください).

TCP 接続のセッションを大量に確立し, 攻撃対象の計算機のメモリを消費し尽くす[SYN フラッド攻撃: SYNchronize flooding Attack)]
攻撃対象の計算機に一度に大量のメールを送信する [メールボム]
複数の計算機を使って, 一斉に攻撃を加える [DDoS (Distributed Denial of Service attack) 攻撃]

ほとんどの場合, DoS 攻撃はソフトウェアのセキュリティホールを狙って行われるそうです.
従って DoS 攻撃から計算機を守るには, セキュリティ情報をこまめに確認し, ソフトウェアの状態を最新に保つことが肝要です.
一方で, サイトを閲覧する際, 更新ボタン (F5 ボタン) を大量に押すことにより, Webサーバに高負荷を与えることになります.
これも一種の DoS 攻撃と見なされてます (いわゆる, F5攻撃) ので, むやみに更新をするのは控えましょう.
また, パスワードが盗まれ, 乗っ取られた計算機は DDoS 攻撃に使用される可能性があります. DoS 攻撃の被害者にも加害者にもならぬよう,
ネットワークセキュリティには万全を期すよう心掛けましょう.

最終更新: 2017/06/20 村橋 究理基
Copyright © 2005-2017 inex