IT pass HikiWiki - [Exp2009]最低限セキュリティ対策 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

[
((<"2009 スケジュール表・各回資料(06/26)"|[Exp2009]スケジュール表・各回資料#06-2F26>))
]

実習:
[
((<"実習事前準備"|"[Exp2009]06/26実習事前準備">))
|
((<"最低限リモートアクセス"|[Exp2009]最低限リモートアクセス>))
|
最低限セキュリティ対策
|
((<"公開鍵認証を使ったssh接続実習"|[Exp2009]公開鍵認証を使ったssh接続実習>))
|
((<"文字コードあれこれ"|[Exp2009]文字コードあれこれ>))
]

<目次>

{{toc_here}}


= ◎不要なサービスの停止

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

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 でコメントアウトしたポートはふさがり,
(デーモンが起動していても) 外部/内部からの要求を受け入れなくなります.

# vi /etc/inetd.conf        < ident 以外をコメントアウトする.
                               telnet や ftp もコメントアウトする.  

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

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

:実習その3 情報実験機の現在の状況を確認して下さい. 設定自体は, 既に前回の実習において行なっているはずです.

参考: 「((<"不要なネットワークサービスを止める"|URL:https://epa.scitec.kobe-u.ac.jp/~itpass/exp/fy2008/080613/practice/debian-config/index.htm#label-9>))」

== 不要なソフトウェア(デーモン)のアンインストール

inetd から呼び出されるプログラム以外は,をそれぞれ独自の設定によってアク
セス制限を行ないます.  不要なソフトウェア(デーモン)はアンインストールし
ておくのが最も安全でしょう.

((*この節の作業は実際には行なわないこと!*))

Debian の場合,
例えば portmap というソフトウェアをアンインストールする際は,
先ず portmap を提供する Debian パッケージを検索します.

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

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

  $ dpkg -r portmap                 <-- 設定ファイルは残したまま, remove
         もしくは
  $ dpkg --purge portmap            <-- パッケージが提供する
                                        全てのファイルを削除


== 主要なネットワークデーモン/ネットワークサービス一覧(参考)

ポート番号とサービス名の対応は, /etc/services で見ることができます.

  $ less /etc/services        

主なポートとサービスは以下の通りです.

  # RT
  ポート番号,  サービス名, 解説
           9,     discard, 過去の遺物
          13,     daytime, 過去の遺物
          21,         ftp, ftp サーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば ftp は不要です(scp を使う). もしくは OTP(使い捨てパスワード)を導入すべき.
          22,         ssh, ssh 接続を受けつけるサーバ.
          23,      telnet, telnet 接続を受け付けるサーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば telnet は不要. もしくは OTP(使い捨てパスワード)を導入すべき.
          25,        smtp, メール配信(転送)を行なう. メールを送信するだけならば smtp ポートを開く必要はない.
          37,        time, 過去の遺物
          53,      domain, ホスト名を返す(いわゆる DNS サーバ).
          70,      gopher, 旧式の文献検索サーバ.
          79,      finger, ホストにログインしているユーザの情報を返す.ネットワーク攻撃を行う指針となるので絶対にこのサービスを提供してはいけない. 試しに "$ finger @(ホスト名)" もしくは "$ finger (ユーザ名)@(ホスト名)" してみよ.
          80,        http, www サーバ.
          98,   linuxconf, ネットワーク経由でシステムを設定するためのサーバ. GUIベースや Web ベースの設定インターフェースを提供する.
         110,       pop-3, メール受信サービス. パスワードを要求するがそのパスワードは平文のままなので危険.
         111,      sunrpc, UNIX のポート間通信メカニズム
         113,        auth, 接続相手の情報を得るために使われるサーバ(ident). anonymous ftp 等で用いられる.
         119,        nntp, NetNews の相互配送につかわれるサーバ.
         139, netbios-ssn, samba(window と UNIX でのファイル共有)に使われる.
         143,       imap2, メールサーバからクライアントにメールを渡すために用いられる. これはパスワードを暗号化する.
         512,        exec, 過去の遺物
         513,       login, 過去の遺物
         514,       shell, 過去の遺物
         515,     printer, 印刷サーバ(lpr)
         613,        cups, 印刷サーバ(cups)
        1178,     skkserv, 漢字変換プログラム skk の辞書サーバ
        2401,  cvspserver, cvs サーバ. cvs のリポジトリを公開する場合に使用する.
        5680,       canna, 漢字変換プログラム canna のサーバ
        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 サービス呼び出す場合は,

  (1) skk サービス要求があると, inetd は tcpd を起動する.
  (2) tcpd は接続要求元が接続許可されているか判断する.
  (3) 許可されているならば, /usr/sbin/dbskkd-cdb を起動する
  (4) 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: 192.168.16.x           <- [192.168.16.XX からの ssh 接続を許可]

つぎに /etc/hosts.deny(許可しない内容記述) において

  # vi /etc/hosts.deny
  ALL: ALL                     <- [全てアクセスを禁止]

と設定することで,

  * localhost からは全てアクセス許可
  * 192.168.16.x からの sshd へのアクセスは許可
  * それ以外のアクセスは全て拒否

となります.

# :実習その2 同じ班の情報実験機からの ssh でのアクセスを制限してみて下さい.

# 実習その2 では, 以下の手順で実習を行ないます.

# (1) ssh で同じ班の情報実験機からログインを試みてもらう. 成功したらログアウトしてもらう.
# (2) いま使っている情報実験機において, sshd に対してアクセス制限を設定する.
# (3) 同じ班の情報実験機からのログインが禁止されていることを確認する

# 実習が終了した後には, sshd のアクセス制限を解除しておいて下さい.


== さらに進んだ情報: xinetd, iptables(Linux), ipfw(FreeBSD)

ここでは inetd 経由で呼び出されるデーモンについてのアクセス制限を行ないました.
ですが, inetd を介さないデーモンについては,
各々のデーモン毎にアクセス制限を行う必要があり,
tcp_wrapper によるアクセス制限を行なう事ができません.
inetd から呼びだされないデーモンについても
tcp_wrapper によるアクセス制限を行ないたい場合には,
inetd の発展版である xinetd を用います.
xinetd については((<URL:http://www.xinetd.org/>))を参照して下さい.
((<"xinetd FAQ の日本語訳"|URL:http://www.yamdas.org/column/technique/xinetd_faqj.html>)) も参考になるでしょう.

また, inetd や xinetd といったプログラムレベルでのアクセス制限ではなく,
カーネルレベルでアクセス制限を行なう(パケットをフィルタリングする)仕組みとして,
Linux では iptables, FreeBSD では ipfw などがあります.
iptables や ipfw は大変高機能ですが, ここでは詳しくは触れません.
詳細については
((<"netfilter/iptables project homepage"|URL:http://www.netfilter.org/>))
等を参照して下さい.


次項:[
((<"公開鍵認証を使ったssh接続実習"|[Exp2009]公開鍵認証を使ったssh接続実習>))
]

[
((<"2009 スケジュール表・各回資料(06/26)"|[Exp2009]スケジュール表・各回資料#06-2F26>))
]