次のページ 前のページ 目次へ

6. Linux システムを準備する

できるだけ小さい規模で、Linux システムをインストールします。 私がインストールをするときは、まずサーバの設定を行い、次いで /etc/inetd.conf で不必要なサービスを外します。 更にセキュリティを高めたいなら、不必要なサービスは アンインストールしてしまいましょう。

殆どのディストリビューションは自分の目的に応じたカーネルに なっていませんから、自分の目的にあったカーネルに コンパイルしなければいけません。 ファイアウォール以外のコンピュータでコンパイルができるなら、 それが一番良い方法です。 C コンパイラなどのユーティリティをファイアウォールに インストールしてしまった場合は、カーネルの設定が完了した後で 削除しましょう。

6.1 カーネルのコンパイル

お使いになる予定の Linux ディストリビューションの最小限度のインストールから 始めてください。 ソフトウェアを減らせば、お使いのサーバでのセキュリティ問題の原因になる セキュリティホールやバックドア (不正な手段での侵入) 、或はバグなどが より少なくなります。

安定版のカーネルを入手してください。 私のシステムではカーネル 2.2.13 を使っています。 この文書はその環境での設定を基本にしました。

適切なオプションで Linux のカーネルをコンパイルしなければいけません。 カーネルの再構築をした経験がないなら、実行する前に Kernel HOWTO, Ethernet HOWTO, NET-2 HOWTO を読みましょう。

次にネットワーク関連の設定を示します。これが動作することは確認してあります。 いくつかの項目には ? という印をつけています。 このような設定を使うつもりなら、チェックをいれて選択してください。

カーネルの設定の為に、私は "make menuconfig" を使っています。

【訳注: 個々の項目については、Configure.help の日本語版も参考にしてください。 http://www.linux.or.jp/JF/JFdocs/Configure.help/

    <*> Packet socket
    [ ] Kernel/User netlink socket
    [*] Network firewalls
    [ ] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking
    [ ] IP: multicasting
    [*] IP: advanced router
    [ ] IP: kernel level autoconfiguration
    [*] IP: firewalling
    [?] IP: always defragment (required for masquerading)
    [?] IP: transparent proxy support
    [?] IP: masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [?] IP: ICMP masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [ ] IP: masquerading special modules support
    [*] IP: optimize as router not host
    < > IP: tunneling
    < > IP: GRE tunnels over IP
    [?] IP: aliasing support
    [*] IP: TCP syncookie support (not enabled per default)
    --- (it is safe to leave these untouched)
    < > IP: Reverse ARP
    [*] IP: Allow large windows (not recommended if <16Mb of memory)
    < > The IPv6 protocol (EXPERIMENTAL)
    ---
    < > The IPX protocol
    < > Appletalk DDP
    < > CCITT X.25 Packet Layer (EXPERIMENTAL)
    < > LAPB Data Link Driver (EXPERIMENTAL)
    [ ] Bridging (EXPERIMENTAL)
    [ ] 802.2 LLC (EXPERIMENTAL)
    < > Acorn Econet/AUN protocols (EXPERIMENTAL)
    < > WAN router
    [ ] Fast switching (read help!)
    [ ] Forwarding between high speed interfaces
    [ ] PU is too slow to handle full bandwidth
    QoS and/or fair queueing  ---> 

全ての設定をしてから、再コンパイルし、カーネルを再インストールし、 再起動します。

次のようなコマンドで行います -

1行のコマンドで全部を行うには、次のようにします。 make dep;make clean;make bzlilo;make modules;make modules_install;init 6

6.2 二枚のネットワークカードを設定する

コンピュータに二枚のネットワークカードを挿しているなら、IRQ と二枚の カードのアドレスを /etc/lilo.conf ファイルに append を使って明示的に 加えなければならない場合があります。 私の lilo の append 行は次のようになっています -

 
append="ether=12,0x300,eth0 ether=15,0x340,eth1" 

【訳注: ネットワークカードの設定は、次のような文書も参考にしてください。 http://www.linux.or.jp/JF/JFdocs/Ethernet-HOWTO.html

http://www.linux.or.jp/JF/JFdocs/Multiple-Ethernet.html

6.3 ネットワークアドレスの設定

さて、構築作業も面白いところにきています。 この文書では LAN を設定する方法について深くは説明しません。 この件についてのあなたの問題を解決するには、 Networking-HOWTO を 読んでください。

【訳注: Networking-HOWTO の日本語訳は、次のところにあります。 http://www.linux.or.jp/JF/JFdocs/NET3-4-HOWTO.html

あなたの目的は、フィルタリングファイアウォールを通して、二つの ネットワーク接続を提供することです。 インターネット上に一つ(安全でない側)と LAN (閉じた側) に一つということに なります。

とにかく、いくつかのことを決定しなければなりません。

  1. 本物の IP 番号を使いますか、それとも LAN には適当な番号を指定しますか。
  2. あなたの ISP から割り当てられる番号を使いますか、 それとも、静的な IP 番号を使いますか。

プライベートなネットワークにインターネットからのアクセスを 許可したくないわけですから、 "本物のアドレス" を使う必要は ありません。 プライベート LAN に対して適当なアドレスを振ることはできますが、 これはお勧めできません。 データが LAN からある経路を通って漏れてしまったら、どこかのシステムの ポートまで届いてしまいます。

プライベートネットワーク用に取りわけられている幾つかの インターネットアドレスの範囲があります。 192.168.1.xxx もこの中に入っていて、この文書ではこれを例に使います。

この数値を使う為には IP マスカレードを使う必要があります。 この方法で ファイアウォールはパケットをフォワードして、 インターネット上で "本物の" アドレスに変換します。

このようなルーティングできない IP アドレスを使えば、あなたのネットワークは より安全になります。 インターネットルータは、このようなプライベートアドレスのついたパケットを 通しません。

この件に関しては、次の文書を読んだほうがよいでしょう。 IP Masquerading HOWTO

【訳注: IP Masquerade HOWTO の日本語訳は、次のところにあります。 http://www.linux.or.jp/JF/JFdocs/IP-Masquerade.html

            24.94.1.123  __________    192.168.1.1
      _/\__/\_        \ | ファイア | /           _______________
     |インター|        \| ウォール |/           |     ワーク    |
    /  ネット  \--------| システム |------------|  ステーション |
    \_  _  _  _/        |__________|            |_______________|
      \/ \/ \/ 

お使いのインターネット用ネットワークカードに割り当てるための "本物の" IP アドレスを持っていなければいけません。 このアドレスは、あなたに永続的に割り当てられたもの (静的な IP アドレス) でもいいですし、 PPP プロセスによるネットワークへの接続時に 割り当てられたものでもかまいません。

内側の IP 番号を割り当てます。 たとえば LAN カードに対して 192.168.1.1 のようにします。 これはゲートウェイアドレスになります。 保護されたネットワーク (LAN) にいる他の全てのマシンには、 192.168.1.xxx の範囲 (192.168.1.2 から 192.168.1.254 まで) の番号を 割り当てることができます。

私は RedHat Linux を使用しています。 起動時にネットワークを設定するため、私は /etc/sysconfig/network-scripts というディレクトリにある ifcfg-eth1 ファイルに記述を追加しています。 このディレクトリに ifcfg-ppp0 や ifcfg-tr0 というファイルもあるはずです。'ifcfg-' というファイルは、 RedHat で、起動時にネットワークデバイスを 設定し、使用可能にする為に使われています。 接続のタイプによって名前がつけられています。

これが ifcfg-eth1(二つ目のイーサネットカード)の例です -

    DEVICE=eth1
    IPADDR=192.168.1.1
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    BROADCAST=192.168.1.255
    GATEWAY=24.94.1.123
    ONBOOT=yes

ダイアルアップ接続をするつもりなら、ifcfg-ppp0 と chat-ppp0 を見なければ なりません。 これらは PPP 接続を制御します。

この場合の ifcfg ファイルは次のようになります -

    DEVICE="ppp0"           
    ONBOOT="yes"
    USERCTL="no"
    MODEMPORT="/dev/modem"      
    LINESPEED="115200"          
    PERSIST="yes"   
    DEFABORT="yes"  
    DEBUG="yes"     
    INITSTRING="ATZ"
    DEFROUTE="yes"  
    HARDFLOWCTL="yes"           
    ESCAPECHARS="no"
    PPPOPTIONS=""   
    PAPNAME="LoginID"           
    REMIP=""        
    NETMASK=""      
    IPADDR=""       
    MRU=""          
    MTU=""          
    DISCONNECTTIMEOUT=""        
    RETRYTIMEOUT="5"
    BOOTPROTO="none"

6.4 ネットワークを試してみる

ifconfig と route コマンドを使ってみましょう。 二枚のネットワークカードを使っているなら、次のように表示されます。

  #ifconfig
  lo        Link encap:Local Loopback
            inet addr:127.0.0.1  Mask:255.0.0.0
            UP LOOPBACK RUNNING  MTU:3924  Metric:1
            RX packets:1620 errors:0 dropped:0 overruns:0
            TX packets:1620 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0

  eth0      Link encap:10Mbps Ethernet  HWaddr 00:00:09:85:AC:55
            inet addr:24.94.1.123 Bcast:24.94.1.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:1000 errors:0 dropped:0 overruns:0
            TX packets:1100 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0
            Interrupt:12 Base address:0x310

  eth1      Link encap:10Mbps Ethernet  HWaddr 00:00:09:80:1E:D7
            inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:1110 errors:0 dropped:0 overruns:0
            TX packets:1111 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0
            Interrupt:15 Base address:0x350

更に経路テーブルは次のようになります -

  #route -n
  Kernel routing table
  Destination     Gateway         Genmask         Flags MSS    Window Use Iface
  24.94.1.0       *               255.255.255.0   U     1500   0       15 eth0
  192.168.1.0     *               255.255.255.0   U     1500   0        0 eth1
  127.0.0.0       *               255.0.0.0       U     3584   0        2 lo
  default         24.94.1.123     *               UG    1500   0       72 eth0

注意 - 24.94.1.0 は、このファイアウォールのインターネット側で、 192.168.1.0 はプライベート( LAN )側になります。

LAN 上にある全てのコンピュータが、ファイアウォールシステムの内側の アドレスに ping できるかどうかを調べましょう (ここでは 192.168.1.1 を例にしています)。 うまくできないなら、再度 NET-2 HOWTO を見てください。 そして、もう少しネットワークについて調べてください。

次に、ファイアウォールからインターネットシステムに ping を試してみます。 私はテストポイントとしてwww.internic.net を使っています。 もしこれがうまく動かなければ、お使いの ISP でのサーバを試してみます。 これがうまく動かなければ、あなたのインターネット接続のどこかがきちんと 設定されていません。 ファイアウォールからは、インターネットのあらゆる場所に接続できなければ なりません。 デフォルトのゲートウェイの設定を見直してください。 ダイアルアップ接続を使っているなら、ユーザ ID とパスワードを 見直してください。 Net-2 HOWTO をもう一度読んでから再度試してください。


あなたの LAN 上にあるコンピュータから、ファイアウォール(24.94.1.123) の
外側のアドレスに ping を試してみます。
これは動かないはずです。
もし ping できるなら、あなたはマスカレードを行っているか、
IP フォワーディングを使っているか、あなたは既に何らかの
パケットフィルタリングを設定しているのです。
それらを無効にして再度試してください。
フィルタリングが正しい状態にあることを確認しなければなりません。

2.1.102 より新しいカーネルに対しては、以下のコマンドが使えます -

    echo "0" > /proc/sys/net/ipv4/ip_forward

(何故かは分かりませんが) 古いカーネルを使っているなら、フォワードを 無効にしてカーネルを再コンパイルしなければいけないでしょう (カーネルのアップグレードをするのにちょうどいい機会です)。

再度ファイアウォール (24.94.1.123) のアドレスの外側に向けて ping を 試します。 動いてはいけないのです。

ここまでを確認したところで、IP フォワーディング及び/又は IP マスカレードを 有効にします。 あなたの LAN 上のどんなシステムからインターネット上のどのような場所にも ping が可能になるはずです。

    echo "1" > /proc/sys/net/ipv4/ip_forward

重要な注意 - もし、あなたが LAN 上で、 (192.168.1.* ではない) "本物の" IP アドレスを使っていて、 インターネットへ ping できないが、あなたのファイアウォールの インターネット側には ping できる場合は、接続先の ISP が あなたのプライベートネットワークのアドレスからのパケットを ルーティングしているかどうか確認してください。

【訳注: ここではユーザのマシン全てにグローバル IP を割り当てている 場合を説明しています。】

この問題をテストするには、インターネット上の誰か (例えばローカルのプロバイダを使っている友人に頼んで) に、あなたの ネットワークに traceroute してもらうことです。 traceroute による経路探索が、あなたが使っているプロバイダのルータで 停止するなら、プロバイダはあなたのトラフィックを転送していないのです。

動きましたか? 素晴らしい。難しい場所は終わりました。:-)

6.5 ファイアウォールを安全にする

ファイアウォールは、それが動作しているシステムそのものが、攻撃に対して 広く開けっ放しになったままだと、なんら意味をなしません。 "悪い奴ら" は ファイアウォール以外のサービスを通して アクセスしてしまいますし、好き勝手に変更してしまいます。 不要なサービスはどれも無効にしなければなりません。

/etc/inetd.conf ファイルを見てください。 これは "super server" として知られる inetd を設定する ファイルです。 inetd は沢山のサーバデーモンを制御し、"well known" ポート への要求パケットが到着すると、それらをスタートさせます。

【訳注: well known port は、 TCP/UDP ポート番号 1024 番以下のポートを 指します。】

echo, discard, daytime, chargen, ftp, gopher, shell, login, exec, talk, ntalk, pop-2, pop-3, netstat, systat, tftp, bootp, finger, cfinger, time, swat そして linuxconfig 等は全て無効にしましょう。

サービスを変更するには、サービス行の最初の文字に # を置きます。 これが済んだら "kill -HUP <pid>" を送ります。 <pid> には、inetd のプロセス番号を書きます。 こうするとその設定ファイルを再読させ、システムを停止させないで 再スタートします。

【訳注: killall というコマンドがあります。 man killall も調べてください。 killall -HUP inetd が使えます。】

ファイアウォールの port 15 (netstat) に対して telnet してみてください。 何か出力するようなら、サービスは無効になっていません。

telnet localhost 19

/etc/nologin というファイルを作成することもできます。 BUZZ OFF (繋がないの意味) のように、このファイルにちょっとしたテキストを 書きます。 このファイルが存在すると、 login はユーザのログオンを許可しません。 ユーザはこのファイルの内容を見ることになり、ログインは拒否されます。 root だけがログインできます。

/etc/securetty というファイルも編集できます。 ユーザが root なら、 /etc/securetty に列挙された tty からしか ログインできません。 失敗すると、 syslog 機能で記録されます。 これらの両方のコントロールを有効にすれば、ファイアウォールへのログオンは、 root としてコンソール経由でしか行えなくなります。

絶対に telnet で root としてログインしてはいけません。 リモート root を必要とするなら、SSH (Secure Shell) でアクセスします。 telnet は無効にすべきでしょう。

心配性な人は、lids (Linux Intrusion Detect System 割り込み検知システム) を使う必要があるかもしれません。 これは Linux カーネルに対する侵入禁止システムのパッチです。 重要なファイルを改竄から守ります。 この仕組みを使うと、 防御対象のファイルやディレクトリ、更にその配下の サブディレクトリは (root を含めて) 誰も変更できなくなります。 このような安全化されたファイルを変更するには、 LILO の設定で security=1 を指定してシステムをリブートさせなければなりません (私ならシングルユーザモードで起動させるでしょう)。


次のページ 前のページ 目次へ