ネットワーク構築(動的IPアドレスの利用)

 本ウェブサイトでは、当初開設したこのチャプターへの訪問者が割合とありました。せっかく見ていただくにしては、現時点では内容が古すぎます。2001年頃の内容です。変わっていない部分も、大きく変わった部分もあります。ここに時点修正版をアップします。(2016年10月)
それに伴って、当初開設の部分は削除しました。
(2017年11月 加筆)


(前提条件・約束ごと)


目  次

SEC-1.ネットワーク構成(複数の案)
SEC-2.複数の案に対する評価
SEC-3.IPアドレスとドメインの割り振り
SEC-4.ルータを選ぶ、使う
SEC-5.IPアドレスを所定のウェブサイトに届ける。ネームサーバをやってもらう
SEC-6.公開サーバのインストールと設定 (postfix apache)
SEC-7.要塞ホスト化
SEC-8.その他

SEC-1.ネットワーク構成(複数の案)

(ここは2001年当時の記述のままです)

IP層に着目すれば

「ネットワークとは、各ネットワークセグメントをルータもしくはゲートウェイでつないだもの」

ということになります。
どのようにルータ(ゲートウェイ)を配置し、どのようにネットワークセグメントを繋ぐか? によって、ネットワークが決まります。
ネットワークが決まると、次は

各サーバソフトウェア(apache、smtp等)をどこで運用するか?
どこにファイアウォールを置くか?

を考えることになります。
以下では、上記2つの観点からネットワークの形態を分類してみます。


(案1)
一台のルータを介して外部ネットワークと内部ネットワークを繋ぐ形態。
ルータの外がインターネットで、中がLANという極めて簡単な構成。
サーバの位置によってこの案をさらに分類すると、以下の2通りの考え方があります。

(案1a)
ルータはルータ専用機として、内部ネットワークに公開サーバをおく。図1を見てください。

network-fig1

すなわち、ルータにNAT機能を持たせ、サーバへは静的変換で外部からのアクセスを許します。
この場合、ルータにファイアウォール機能を持たせ、さらに公開サーバにホストセキュリティを持たせることになります。


(案1b)
ルータ自身にサーバ機能を持たせる。

network-fig2

すなわち、UNIXマシンにゲートウェイと公開サーバを兼用させて、これをルータとします。
この場合は、ルータにファイアウォール機能を持たせます。


(案2)
1台のルータにEthernetを3つ繋ぐ形態。
一つは外部ネットワーク、もう1つは非武装地帯(いわゆるDMZ)、残るもう一つは内部ネットワークとします。

network-fig3

この案の場合は、明確に非武装地帯が構成されているので、当然、公開サーバを非武装地帯に配置します。
勿論この場合は、ルータ部がファイアウォール機能を持ち、さらに公開サーバにはホストセキュリティを持たせます。


(案3)
ルータを2段に配置する形態。
第1段のネットワークセグメントは非武装地帯とし、第2段のネットワークセグメントを内部ネットワークとする。
ここでいう非武装地帯が、いわゆる de-militalized zone 、通称 DMZ です。

network-fig4

この案の場合には、公開サーバは非武装地帯に配置します。第2段ルータを公開サーバ兼務とはしません。
第2段ルータ兼務の公開サーバを乗っ取られたら、直ちに内部ネットワークが危機に瀕します。
それでは非武装地帯を作る意味がありません。
大抵のネットワークセキュリティ解説書(例えば、オライリー本)には、この形態がもっとも望ましい案となっています。



SEC-2.複数の案に対する評価

(ここも、2001年当時の記述のままです)

 上記1.で分類したネットワーク構成各案の中から、ネットワークセキュリティを評価して、一つの案に絞り込みます。

(案1a)について
 最も危険な案
「仮に公開サーバが侵入されても内部ネットワークを守れるか?」
といった問いに対して、まったく答えらません。
公開サーバに侵入された場合、これを踏み台にして外部ネットワークへの攻撃も内部ネットワークへの攻撃もやりたい放題になります。
文献等でも「ダメな案」と評価されています。

(案1b)について
 これも(案1a)と大差はありません。
仮に公開サーバをのっとられると、内部ネットワークへの攻撃も外部ネットワークへの攻撃もやりたい放題になります。

(案2)について
 非武装地帯と内部ネットワークを完全に切り離していて、良好な形態です。
ただし、この形態の場合ルータの設定が大変です。
1台のルータ(ファイアウォール)で3通りのパケットの流れ、すなわち

について、パケットフィルタ等を設定するため、どうしても複雑な設定が必要となります。

(案3)について
 最も教科書的かつ一般的な構成です。
第1段と第2段のルータが、ファイアウォール機能を分離しています。

従って(案2)に比較してファイアウォールの設定がシンプルです。シンプルであると言うことは、全体の見通しが良く、設定ミスも生じにくいため、より安全度の高い構成といえます。
また、公開サーバはルータとは完全に分離されていますので、仮に標的マシンが乗っ取られた場合でも内部ネットワークへの攻撃を第2段ルータで完全に防げます。また第一段ルータが高機能なものであれば、乗っ取られた公開サーバから外部ネットワークへの攻撃を、第1段ルータである程度防ぐこともできます。


総合して評価すると………
(案1a)、(案1b)は低い評価しかできません。ここでは不採用とします。
残る案は(案2)と(案3)です。いずれも実績のある構成ですが、よりシンプルで全体が把握しやすく、設定の容易な(案3)を選定することにします。



SEC-3.IPアドレスとドメインの割り振り

 SEC-2.の案3に従って、以下のサンプルのネットワークを考えます。サンプルとしてのIPアドレスもふってあります。

sample-net

 次にドメインを決めて、割り振ります。割り振るというのは、つまり一つのドメインで全部やるか、プライベートネットワークには別のドメイン(勝手な、任意のもので可)をふるか?です。例えば、プライベートネットワークと正規にもらったドメインを以下のように割り付ける案もあります。
自分でPCを管理していて、正規のドメインで動いている部分と、プライベート部分が理解しやすいです。前に勤務したことのある会社ではプライベートには独自の(まさにプライベートな)ドメインをふっていました。

sample-net-domain1

 一方で全部まとめて、取得した正規のドメインをふるのも、ありです。正規のドメインの中に、グローバルIPアドレスとプライベートIPアドレスが混在する案です。
そっちの方が、まあ、、、面倒が無いといえば無いです。(^^)

sample-net-domain2

 うちは、当初上の方でやっていましたが、そのうち面倒になってきて、今は下の方でやっています。アハハです。(^^)

 どっちでも構いません。




SEC-4.ルータを選ぶ・使う 

SEC-4-1.ルータの選定

 この辺は、最初にウェブサイトを開設した2001年頃と2016年では大きく様相が変わりました。まあ、ハード全般、変わりましたね。
2001年頃の普通の状況は

 2016年10月現在だと

 実に良い時代になったものですが、実はルータも激変したと思います。(きっと激変したと、信じたいです)

 今では信じられないことですが、2000年頃には「P社のルータはファイアウォールがすかすかのザルだ」とか「M社のルータはパケットがちゃんと流れない」とか、そんなこと、普通にありました。いや、普通にあっちゃ困るんですけど・・・・
今だと商品とは認識できないようなものが、当時は本当に販売されていました。また、そのことがUNIX Magazine 誌上を賑わせて?いたりしました。懐かしい雑誌名です。
私も、2000年頃に一度だけ、誌上を賑わせているようなのを買っちゃって参ったことがあります。嘘みたいな話だけど、パケットがちゃんと流れませんでした。
もう、さすがにそんなのは売られていないだろう・・・・と信じています??
でも当時の事があるので、いまだにルータは信頼第一にメーカを選んでいます。ここはやっぱり、YAMAHAとかCISCOとか、優秀であると評判のメーカが良いですね。

「ネットワークとはルータが繋がったもの」と言っても良いくらい、ルータはネットワークの根幹です。そこは、それなりの物を選定しましょう。

 ちなみに、うちの実際のネットワーク図です。

my-net

 R1、R2 とも上記のような、(世間一般に言われている)信頼できるメーカ製です。(^^)
ちなみに、YAMAHAだとRTA50, 52, 56, 57, NVR500と使って来ました。CISCOだと1605R、861と使って来ました。いずれも、速度も早いし安定・セキュリティー堅牢なルータだと思います。でも、CISCOは、チョイ高くつきます。個人的に、おすすめはYAMAHAです。今(2016年10月)ならNVR510でしょうね。

 他にAllied Telesis社、Century systems社、Micro Research社でも、同価格帯で似たような製品が出ています。評判は、良さそうですが、使ったことが無いので、分かりません。(^^;;;




SEC-4-2.ルータの基本的な設定

(IPアドレス)
ネットワークの IPアドレス図を上に示していますので、あんな感じで WAN側、LAN側、それぞれ IPアドレスとネットマスクをインプットします。R1の WAN側だけは、PPPoE とか DHCPクライアントなど、ネットワーク接続会社の指定接続方法によってIPアドレスが割り振られます。

(DHCP)
ルータに内部向けの DHCP サーバ機能をやらせるか、については、
UNIXの PCは固定 IPアドレスが良いでしょうが、その他機器(ネットワークラジオとか IPカメラとか、ノートパソコンを都合があって別のネットワークセグメントに一時的に移動する場合とか、、、)は DHCP クライアントにしておいた方が使いやすいかもしれません。その場合は、ルータに DHCP サーバをやらせて、「割り振る IPアドレスを例えば 100から 200までにする」などとすれば良いでしょう。

(Gateway)
デフォルトゲートウェイは、R1は接続会社から与えられます。R2は R1がゲートウェイです。

(NAT)
セキュリティも兼ねて、NATを有効活用しましょう。R1も R2もNAT有効にします。

(port forward)
SMTPサーバと HTTPサーバを公開する前提で考えると、R1は TCP25と TCP80を公開サーバに対してポートフォワードします。

(security)
今時の大抵のルータには「セキュリティ機能」なんて項目があるでしょう。これはもちろん有効にしておきます。
R1については、外部からプライベートアドレスを偽造して入ってこないように、発アドレスがプライベートアドレス等、の偽造アクセスをフィルターで弾いておきます。

注:セキュリティ上、R1ルータは DMZ側からログイン出来ないように、sshd、telnetd、httpdを落としておき、LAN側からシリアス回線でログインするのが無難です。ただ、動的 IPアドレスを使っていて、ルータから IPアドレスを抜き出さなくてはならないケースだと、httpdを落とすことが出来ません。
YAMAHA のルータを使っていると、これが(シリアル回線のみ有効にする)可能なんです。詳しくはChap-2. 参照してください。(^^)


それぞれのルータのイメージは下の図のような感じです。こんな感じにしましょう。

security

 もし可能なら(なるべく、出来るだけ、可能な限り、是非とも、、)、外側からそれぞれのルータに対してnmap等を使ってポートスキャンしてみましょう。開いているポートが分かります。今時のルータなら、ポートフォワードしたところ以外には、開きはないだろうと思います。
もしもあったら、それは粗悪品、すなわちザル・ルータです(^^;;;





SEC-4-3.シリアル回線でルータを操作する 

 ここで、ルータをシリアル回線経由で使う方法を示しておきます。示すってほどでも無いですが・・・・

 普通、UNIXにはcuってコマンドがあります。call unix の略です。昔はみんなRS-232Cでつないでいたらしいです。随分昔。私が生まれる前・・・ってのは嘘です。
LAN全盛になって、シリアル回線は普通あまり使いませんが、今でも便利です。特にルータの操作。
LANからルータに入って操作していて、たまたまIPアドレスを打ち変えると、すぐにルータから弾き出されちゃったりします。(^^;;;
でも、シリアル回線から入ると、IPアドレスを打ち変えても、フィルターの設定ミスをやっても、ルータから弾かれることは無いです。

 RS-232Cケーブルを間違えなければ、大抵すぐにルータとつながります。PCはDTEで、普通は、ルータもDTEなのでクロスケーブルです。モデムとPCはDCEとDTEなのでストレート・・・・だったっけ???怪しいです。アハ。
80年代後半くらいのパソコン通信全盛の頃だと、みんなDCEとかDTEとか、分かってた。今どきはLANなんて自動認識でクロスケーブルすら無くなってしまった。
クロスケーブルなんて必要になるのはシリアル回線くらいですね。

普通にRS-232Cがあるパソコンなら、Linuxの場合デバイスファイルは/dev/ttyS0から、です。
USB-RS232C変換ケーブル(下の写真みたいなの)を使うなら、Linuxの場合、デバイスファイルは/dev/ttyUSB0です。

メルコの

melco

elecomの

elecom

USB-RS232C変換ケーブルはストレート仕様なので、もう一本クロスケーブルをかませる必要があります。

 Linuxの場合、デバイスファイルの属性を見るとdialout ってグループに属していれば読み書きできる設定です。なので、/etc/group を編集して、自分をdialout グループに入れておきます。
また、cu コマンドは uucp グループに入っている者に実行許可があります。なので、やはり自分を /etc/group の uucp に入れておきます。
もう一つ、準備。あらかじめ、ルータの表示をASCIIにしておきます。うちでは、日本語モードはうまくいかなかった。私のターミナルの設定が間違っているか、それともcuが8ビットスルーになってないか・・・調べていません。(^^;;;
まあ、とにかくUS-ASCIIにしておくと、いろいろ考えなくても良いので無難です。
これで準備完了。
準備が済んだら、以下のようにコマンド入力します。

$ cu -l /dev/ttyS0 (or /dev/ttyUSB0)

 ケーブルを間違えてなければ(ストレートとクロス)、大抵Connected とかって表示が出ます。シリアル回線につながりました。あれ?パスワード入力は?って思ったら、userと入れてリターンを押す。エコーバックはありません。
すると、ルータにつながってパスワード入力画面がでます。以下はYAMAHAの場合です。


Connected.

 パスワード入力が出ないので、userと入れてリターン。すると・・・・・・・


Password

 パスワード入力が出ます。以下、パスワードを入れて後は普通にルータの設定です。
全て操作が済んで終わるとき、exit exit と押すと・・・

# exit
> exit
(無反応)

 となります。ルータとの通信は切れたけど、まだcuコマンドが残ってRS-232Cにつながっています。そこで、チルド+ピリオドを入れてリターン。チルド+ピリオドはcu コマンドを終わらせるためです。

~.

Disconnected.
(一瞬、また無反応。1~2秒後にUNIXプロンプトが出る)  

 一瞬反応が無くなり、さらに1~2秒すると、UNIXプロンプトに戻ります。無事終了(^^)
通信のログをとるときは

$ cu -l /dev/ttyS0 | tee hoge.log

 とかすれば、ログがとれます。YAMAHAルータは、改行が0d、0aです。emacsとかで見ると0dがうっとおしいので、適当に0dを削除するフィルターソフトを作っておくと良いです。


2018.11 補足
ここでのシリアル回線利用は、Slackware でやっていますが、2018.11 に Ubuntu でもやってみました。その様子は Chap-13. に書いてあります。




SEC-4-4.ルータにもっと働いてもらう

 今時のルータは高性能かつ高機能です。特にYAMAHAもしくは同等価格帯の製品は概して機能豊富です。せっかく買ったなら有効活用しましょう。

DNSについて

 一般論として、自宅にPC-UNIXを中心に複数台のPCを置いて、ネットワークを張って、さらに自前のドメインを取得して、動的IPアドレスで外部にサーバを公開して・・・・こんな時、DNSをどうするか?です。
つまり、DNSサーバをPC-UNIXを利用して立てるのか?ってことです。どうしましょう?
これ、「立てる必要が有るか無いか?」って質問されると「無いです」って答えです。立てる必要はありません。
外部の人たちが、ドメインのDNSを問い合わせるのは、自分以外のサイト、例えばうちだと、value-domain です。そこがDNSをやってくれます。
一方で、内部のPCのためのDNSサーバについては、ルータで大丈夫です。今時の大抵のルータはリカーシブにDNSサーバをやってくれます。
ですからBINDのnamedデーモンを起動させる必要は、外部のためにも、内部のためにも、ありません。

 でも、その一方で「立てた方が良いかどうか?」だと・・・・・やったことが一度も無い人なら、ぜひ文献1や2を熟読の上、立ててみるべきです。
仕組みを読んで、自分でゾーンファイルを書いて、デーモンを起動させてみるべきだと思います。
自宅でサーバを公開するなら、それなりに勉強していないと、いざというときに途方に暮れてしまいます。どうしても、一定の知識と経験が必要だと思います。(と、私ごときが言うのは、おこがましいですが・・・汗)
一般に、ネットの話って、各方面が関係していて、一ヶ所だけでは物事の理解が進みません。大抵は(a)TCP/IPの理解。(b)ルーティングの理解、(c)ドメインネームシステムの理解、(d)ファイアウォールの理解、・・・以上がセットで関連すると思います。なので、DNSサーバを立てたことが無いなら、ぜひやってみてください。ただし、運用を続ける必要は無いです。慣れてきたらnamedは止めちゃってかまいません。

 余談が長くなりました。例として、以下の赤字のようにDNSの名前を付けてみます。ご存知のように、DNSのノードネームはマシンネームとは違います。(文献1や2参照)

node-name

YAMAHA NVR500をサンプルにDNSの設定です。R2ルータにNVR500を使っている前提です。以下のような感じ。

dns service recursive
dns server 192.168.100.1
dns domain quinos.net
dns private address spoof on

dns private name pochi.quinos.net

ip host tama.quinos.net 192.168.100.1
ip host taro.quinos.net 192.168.100.2
ip host pochi.quinos.net 192.168.200.254
ip host jiro.quinos.net 192.168.200.1
ip host hanako.quinos.net 192.168.200.2
ip host prn.quinos.net 192.168.200.10
ip host localhost 127.0.0.1
ip host localhost.quinos.net 127.0.0.1

 基本的にLANの中から問い合わせるので、pochiは中側、すなわち192.168.200.254だけ分かれば良いです。pochiのDMZ側にもアクセスしたい時はIPアドレス直打ちでアクセスします。
BINDのゾーンファイルだとAレコードとPTRレコードの両方のゾーンファイルが必要です。しかしYAMAHAルータはAスタイルの記述だけしておけば、PTRレコードもここから割り出してくれます。便利です。

 これでLAN内のPC-UNIX機の/etc/resolv.conf にDNSサーバが192.168.200.254であると記しておけばDNSが使えます。
同様に、taroは192.168.100.1(うちの場合はISPから貸与されているNECのルータBL900HW)にDNSの問い合わせをします。
実際には、pochiはtamaにさらに問い合わせしています。tamaはISPからもらったDNSサーバに問い合わせしています。現実にtamaとpochiのどっちがリカーシブに問い合わせするかですが、LAN側からはpochiが、DMZのtaroからは tamaがリカーシブな問い合わせをしているはずです。


NTP サーバもルータに頼みます

 時刻合わせは結構大事です。ログも時刻が不正確だと何がなんだかわかりません。メールサーバも時刻が不正確だと送信時刻がいい加減になり、マズいです。各PC機の時間を正確に合わせましょう。
そのためにはNTPの活用です。ネットワークを通じて、+ー1秒以内に時刻があいます。今時は電波時計が安くなっているので、マザーボードに電波時計くらいが付いていると便利ですが、まだ無いですね。(^^;;
そのうち、USBに挿してPC機の時間を合わせる電波時計くらい出てきそうですね。でも、これもまだありません。(^^;;

 今は一般に各ディストリビューションが用意しているNTPサーバに時間を合わせます。最初にインストールしたときはマザーボードの時計に合わせる設定ですが、当然、不正確。
次に、ntp.confを見て、サーバのところのコメントアウトしてる#マークを外すと、外部のNTPサーバに時刻を合わせ始めるので、とっても正確な時間になります。ただ、うちのネットだと最大で6台のPC-UNIX機が動きます。これ(外部への問い合わせ)を全部のマシンでやるのはやめたい。それって、いたずらに外にアクセスを増やすやり方。あんまりスマートなやり方ではないです。
ずっと以前は、PC-UNIX機の一台を外部のNTPサーバに同期させ、後はそのPC-UNIX機から、他の内部のマシンに時刻を配っていました。が、今ではセキュリティが厳しくなって、内部的にNTPサーバをやらせるだけでも、結構設定が大変です。
それくらいなら、ルータにNTPサーバをやってもらえば、設定は簡単。時間も、まあまあ、十分実用的で正確です。以下のがそのやり方。
もちろんNVR500の例です。

schedule at 1 */* *:00:07 * ntpdate ntp.nict.jp
sntpd service on

 ちょっとだけ説明。NVR500 はNTPクライアント機能はありません。代わりにスケジュール機能があり、さらにNTPを使って時刻合わせをするコマンドntpdateがあります。なので、一行目は、そのコマンドを使って、毎時00分07秒にntp.nict.jpに時間合わせをしに行きます。
二行目はNTPサーバ機能をやらせるコマンドです。
時刻配信に際して、いわゆるセキュリティー配慮は何もやっていません。所詮、LANの内部で時刻を配るだけなので、(SOHO規模なら)セキュリティーは考えなくても良いです。どうせ、ユーザは私一人だけだから。(^^;;;

 これでLAN内の各PCのntp.conf に、192.168.200.254がNTPサーバであることを書いておけば、各PCの時刻が正確に合います。以下はPC機で、ntpq -p とやって時刻のあい具合をみたものです。

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*pochi           .LOCL.           1 u   12   64   77    0.404   -1.966 171.152

 delayがサーバとの時間距離、どれくらい遠くにいるか?ですが、反応が「1000分の0.4秒」で帰ってくるので、すぐ近く。タイムサーバが猛烈に近くにいる。NVR500のタイムサーバとPC機の時刻の差は「1000分の1.966秒、進んでいるだけ」。十分に正確です(^^)




SEC-5.IPアドレスを所定のウェブサイトに届ける・ネームサーバをやってもらう 

 いわゆる Dynamic DNS です。トップページの 「Chap-2.Dynamic DNS について」で説明しています。すみませんが、そちらをご覧ください。




SEC-6.公開サーバのインストールと設定(Postfix, Apache) 

Postfix Apache のコンパイル

 外部にサービスを提供するサーバソフト、例えばSMTPのPostfixとか、HTTPのApacheとかは、なるべく最新のものにしておきたいです。最近では大きなセキュリティーホールは珍しくなりましたが、時たまセキュリティーアップデートがあります。各ディストリビューションからコンパイル済みのパッケージが出るまで若干のタイムラグが出ます。それを待つよりも、ソースを元からダウンロードしてコンパイルすれば早期対応が出来ます。
そんなわけで、サーバ公開当時から、これらのソフトは自分でコンパイルしインストールしてきました。SlackwareやFreeBSDなら、難しく無いです。詳しくはトップページのChap-7を見てください。

Postfix の設定

 Postfixについては、一にも二にも、SPAMの踏み台にされないよう、つまり不正にメールリレーされないように設定に注意します。大抵は

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

 の設定だけで大丈夫でしょう。
他に、UCE配送プログラムの一部を拒否するために

smtpd_helo_required = yes

としておくと、効果がある・・・場合もあります。(^^;;;
一部のUCE配送プログラム(あやしげなプログラム、悪いことする連中が使うプログラム)は、smtpの正規の会話をしないからです。

 続いて、port forwardでサーバ公開する時のpostfix 設定の注意点です。Postfix が動いているのは、サンプルだとtaroというマシンです。
しかしport forwardしている関係上、外部に対しては、postfix がR1ルータの位置にいるように見せかけなくてはなりません。なので、postfix のmain.cf上は、myhostname が tama.quinos.netです。
注:所定のウェブサイト(ネームサーバをやってくれるウェブサイト)には、「うちのdomain の mx は tama.quinos.net」と登録しておきます。

Apache の設定

 こちらも、実際にはtaroの位置でApacheが動いていても、外部に対してはtamaの位置にいるようにします。SMTPと違って、そんなにたくさんの会話(自分のサーバ名)はしませんが、一応、サーバ名を書き込む欄がhttpd.confの中にあります。そこには、tama.quinos.netまたは www.quinos.net としておきます。
注:所定のウェブサイト(ネームサーバをやってくれるウェブサイト)には、「tama.quinos.net の cname として www」と登録しておきます。

 その他には、セキュリティー上の対応として、不要ならCGIは動かさずに、止めておきます。うちのようなウェブサイトを開設するくらいなら、CGIは不要です。概して、CGIもセキュリティーの問題となりやすい部分です。

 「Apache、セキュリティ」等でネット検索すると、他にもセキュリティー上の対策として「やった方が好ましい設定」が出てくると思います。例えば、Apacheのバージョンを名乗らないようにする、とか・・・・。
後は、それぞれ個人の好みで設定します。


 ルータの位置にサーバがあるイメージです。実際は左です。外部に対しては、あたかも右のように振る舞う。

portforward-server

くどいですが・・・

 なるべくPostfixもApacheも、常に最新バージョン(運用版の)にしておきましょう。




SEC-7.公開サーバを要塞ホスト化する 

 ここまでたどり着けば、サーバ公開までもう一歩です。(^^)
後は、セキュリティーを考慮して、公開サーバを重武装させます。いわゆる要塞ホスト化です。

 この記述は、2001年頃の記述とほとんど変わりません。これまでの説明で、「ルータのセキュリティー対策+とネットワークの張り方」でかなり安全を確保しました。残る「詰め」はサーバそのもののセキュリティー対策。基本的に以下のようにします。

a.について
 a.の不要なサービスはしないというのは、案外とできていなかったりするようです。私のサイトはSMTPサーバにメールを託すのは、内部LANからのみと割りきっています。これだと設定が実に簡単です。
しかし、やりだすと、外からメールを託せるようにしたくなります。そんな衝動にかられます。私も一時期、やっていました。(^^;;
でも、その一歩を踏み出すと、急にセキュリティー対策が大変になります。まずPostfixをSASLとか含めてコンパイルしなくてはならない。それをちゃんとやったとしても、世界に向けてパスワード入力を促す画面を開けなくてはなりません。なんだか、危なっかしい・・・
それでも敢えて、これをやりたい人はやるのだと思います。私はやりません。いずれにするか、やる人の考え方次第です。

 同様に、メールをPOPするのも、うちではLANの中からのみです。私は外出した時はメールPOPできません。これも設定が実に簡単です。どうしても外でメールPOPしなくてはならない理由が私にはないから、これで困らないです。外出先からメールPOPするかどうかも、よく考えて、それぞれの考え方でやってください。

 たまに、外からSSHでサーバにアクセス出来るようにしている例があります。これもサーバを持つとやりたくなるものです。でも、よく考えましょう。業務でも無いのに、本当に外部からわざわざSSHしなくてはならないのかどうか?
業務用でVPNやるならともかく、SSHだけでこれをやると、世界に向けてSSHのパスワード待ちの状態を公開するわけです。(^^;;;
私は、それは恐ろしいのでやっていません。

 私のセキュリティーの基本は「単純明解で堅固なやり方」です。複雑な事をやると、ちょっと間違えただけでセキュリティーホール作っちゃう。それに、しばらく時間がたつと「あれ、俺、何やってたかな?」って自分がやったことを忘れちゃう。ヤバいです。
まあ、このあたりも、それぞれの人の考え方次第です。

 後、あえて書くほどの事は無いと思いますが、スタートアップスクリプトやinetd.confをしっかり見て、不要なサービスは全部落としておきます。もちろん、X11は動かしません。サーバなんて、動き出したらディスプレィもキーボードも外して構わないです。管理はLAN内部からSSHで入れば良いです。(^^)

b.c.について
 おおむね、SEC-6で解説しましたので、省略。

d.について
 パケットフィルターって、良く聞く言葉だと思います。パケットの性質がわかれば、設定はそんなに難しく有りません。文献12がとても優れた書物です。(今でも売ってる・・・と思います)
なので、至極簡単に基本的なことだけ説明します。

--- TCP ---
 コネクション指向とか言われていて、ようするに電話みたいに「繋がる」イメージです。3way hand shake なんて言われています。これはTCPのフラッグのたち具合で、説明。下の図のとおりです。

tcp-3way

 最初に、クライアントからサーバに対して「コネクション張ろう!」ってアクセスします。これがsynフラッグで、TCPのフラッグの一種です。次に、サーバ側が「良いよ~。で、俺もコネクション張りたいが、良いかい?」って、クライアントに返します。最初の「良いよ~」がackフラッグで、合わせてsynフラッグも立ててますが、これが「俺もコネクション張りたいが、良いかい?」って奴です。3番目にクライアントが「オッケー~」って返します。これがまたackフラッグ。で、合計3回やって相互に意思疎通が図れたので無事にコネクションが張れました。で、3回やったので、3 way hand shake ってわけです。これ以降は、イメージは電話回線が引けた状態のイメージです。

 フィルターの説明等で、NEWとかって話はこの最初のsynフラッグだけが立ったTCPのアクセスを言います。また、ESTABLISHED って言葉も良く見ますが、ackビットが立ったTCPアクセスです。接続確立後のパケットのことです。

 TCPのフィルターは、このことと各サービスがどのTCPポートを使っているか理解できれば、後はそのOS(あるいはルータ)のフィルタールールによる記述をするだけです。
使うポートは、例えばtelnet だとTCP23だし、SMTP だとTCP25です。HTTPはTCP80です。これは受ける側のポートです。
発信側(クライアント側)は、1024以上のポートから発信します。1024以下はシステム予約とか言って、OS側が利用するポート。一般ユーザのクライアントは普通使いません。
なので、例えばtelnet だと

で発信します。戻りは、それぞれ同じポートを使いますので

てな感じになります。
文献12には、各サービスがどのポートを使うか、どんな具合にハンドシェイクするか、詳しく説明してあります。ftpだけ、ちょこっと特殊なコネクションですが、後は普通に理解できると思います。説明抜きでよければ、大抵のUNIXは /etc/services にサービス番号の一覧表があります。


--- UDP ---
 コネクションは張りません。「超超超高速に手紙をやりとりする」と思えば良いです。受け手が手紙を受けているか、それとも届いていないのか、直接の確認は出来ません。なんせ、コネクションが無いから・・・・
ですが、UDPパケットを送ったクライアント側は、サーバからの返事を待ちますから、結局返事が来たら「あ、そっか~~、あの手紙、ちゃんと届いてたのか~」ってな具合です。

 例としてDNSの問い合わせ。ネームサーバへの問い合わせだと

で発信します。戻りはTCP同様に同じポートを使いますから

となります。コネクションを張らないという点をのぞくと、TCPに似ています。

他に良く使うのだと、NTPはUDP123です。それとDNSは、自分のネットの外にセカンダリーネームサーバを立てて、そこと自分のプライマリーとゾーン転送することがあります。(動的IPアドレスではなく、固定IPアドレスでDNSの委任を受けている場合、かつセカンダリーに外部を使う場合)DNSのゾーン転送はUDPではなくTCP53を使います。


--- ICMP ---
 TCPやUDPほど込み入っていないし、文献12とRFCを読めば簡単に理解出来ると思います。RFCは参考になります。
destnation-unreachable を返した方が良いのか、返さない方が無難なのか、なんて話題も、確か、文献12に書いてあったと思います。


--- 実際のフィルタールールの書き方 ---
 Linuxで実際にフィルタールールを書くとすると、大抵は以下のような流れです。

 多分、こんな感じだろうと思います。このうち(3)の記述は最初のうち、自分で考えながら書くのは難しいので、ネット検索して参考に(真似て書く)します。hashlimit なんかを使ったやり方で込み入っていたり、ソースルートオプション付きパケットを弾くために、とある常数を入力したり、ややこしいです。(^^;;;

 幸い、ネット検索するとiptables の書き方について、多くのサイトがあります。参考になります。


e.について
 まめにログを見ましょう。おかしな事があると、ログに出てきます。(^^;;;


f.について
 改ざん検知のソフトを走らせたりします。Tripwire が有名です。Tripwire に限らず、似たような改ざん検知ソフトもあります。
ただし、私は、ウェブサイト開設当初に Tripwire やっただけです。そのうち、面倒になって、今はやっていません(汗)
本当は、やったほうが良いと思います。




SEC-8.その他 

 どっちかというと、セキュリティ対策を中心に「ネットワーク構築」を書いてきました。でも、ここまでの記述だけだと、セキュリティ対策としてきっと不十分です。
ここまでで立てたセキュリティ対策って、下の図のイメージです。こういう攻撃から守るための対策でした。

パターン1.直接攻撃

direct

 でも、今時、こんな直接的な攻撃、ちゃんと設定されていれば安物のルータでもちゃんとしたルータなら(注*:)弾くでしょう。SMTPもHTTPも、コンフィグファイルをきちんと設定し、最新のバージョンにしていれば、こんなやり方で安易に侵入はできませんよね。少なくとも、PC-UNIXで自宅サーバを構築しようとする人(多分、セキュリティ意識の高い人)が、こんな稚拙なやり方でクラックされるとは、思えません。
注*:2016年11月現在、話題となっているIoTの攻撃で、とうとう安物の Wifi ルータがやられちゃったらしいです。やっぱり、ちゃんとしたルータを使いましょう(^^;;;

 一方で、今日よく世間を騒がせているのは、下の図みたいなイメージ。ようするに、怪しげなウェブサイトで、よからぬボタンをクリックしちゃって、自分で(自ら)マルウェアなんかをLAN内に呼び込んでしまう。あるいは、同様にメールに添付されている怪しげなファイルをクリックしちゃって、自らLAN内にマルウェアを呼び込んでしまう。つまり、相手が侵入してくるのではなくて、「自分でマルウェアを引っ張り込んでくる」って奴。
最近話題になってるのは、ほぼこのパターンでしょう。


パターン2.自ら呼び込み

click

 このパターンも、PC-UNIXを複数台持って、ドメインを取得して、自ら公開サーバを立てようとするような人なら、まずひっかからないでしょう。
普通、そういう人はセキュリティ意識が高い。だから、危なそうなものを、安易にクリックしたりしない。
でも、さらに下の図みたいなイメージだとどうなるでしょう?


パターン3.スマホ、FB、ツイッター等を経由

smapho

 これは、悪い奴がスマホやフェイスブック、ツイッター等をまず乗っ取って、それからそこを経由してマルウェアをばらまくイメージ。
単なる私の思いつきですが、私が思いつくくらいなら、悪い奴らはとっくに考えてる、きっと!
今時、フェイスブックやツイッタのアカウント乗っ取りは、結構話題になってます。さらに、フリーなソフトを安易にインストールして、スマホを乗っ取るって話も結構聞きます。実際に乗っ取って、何が出来るか私は知りません。しかし、そのうち、乗っ取られたスマホがWifiでLANに繋がった瞬間、スマホ経由でLAN内にマルウェアが流れ込んでくる日は、そう遠くないと思います。
自分のスマホならまだ注意するでしょうが、家族のスマホになると管理しきれない。安易に「あ、フリーのソフト、面白そう!! ゲームだ!!」とかってインストールした瞬間、バンバンとマルウェア感染する・・・・なんとなく、これ、ありそうですよね(^^;;;;
この最後のパターンは防御が難しそうです。セキュリティの甘いデバイスを安易にWifiでLANに接続させないことが肝心・・・・かなあ・・・・
同じイメージを持つと、fire-TV とか、今はやりのネット動画を見るためのデバイスって、使用することに躊躇します。あれだってネットに繋がったコンピュータだろうし・・・セキュリティって、大丈夫なんだろうか? 個人的には、安易にLAN内に持ち込みたくないデバイスです。(^^;;;

 ちなみに、私はFBもツイッタもインスグラムもやらず、スマホもアイフォンも持っていない、生粋のシーラカンスです。(^^)




その他.IoTについて

 ネットワーク構築の話題から、多少はずれます。今(2016年11月時点)さかんに話題になっている IoT と Mirai について。
ネットで検索してみました。いま、世界で IoT って言われているデバイスがどれくらい存在しているか?
もちろん、正確な数字など、誰も知りませんが、いろいろなサイトで推定値を出しているようです。それを見ると、概ね世界で数十億~100億くらい? などという数字になりそうです。いやはや、大変な数字です。
この膨大な数字(仮に100億台とします)のうち、さらに仮に、千分の一の確率で「セキュリティの設定がいい加減なデバイスまたはバグがありセキュリティに抜け穴があるデバイス」が存在すると仮定します。すると scheme の記述で表現すると

   > (* 10000000000 0.001)
   $1 = 1.0e7

なんて数字になります。要するに一千万台!
多分、推定値の100億も、確率の千分の一も、大げさな数字じゃないでしょう。いやはや・・・大変なことです。こんな数のデバイスが Mirai とやらに乗っ取られて botnet になって悪さを始めたら、収集がつかないです。(汗)
数字を見ると、始めて事の深刻さが分かります。
幸い、我が家では外からアクセス自由のネットワークデバイスは基本的にありません。が! 今後、各種家電類がIoTになって、家電屋さん達はネットワークセキュリティの専門家ではなくて、会社から言われるままに家電をIoT化していくと、多分千分の一では済まなくなりそうです。ちなみに、先ほどの推定値の行き着く先は「2020年頃には1兆台前後」とかって、話です。その頃は、家電はもちろんの事、下着も、眼鏡も、靴も、カバンも、自転車も、何もかもIoTの時代なんだそうです。いや、これは驚愕。恐怖です。

 このチャプタに書いたことを真面目にやっていけば、上記パターン1から3に示す緑色のサークルの中だけは守れるでしょう。が、買ってきた家電、例えば冷蔵庫が知らないうちに家電メーカと無線LANで繋がっていて、セキュリティがいい加減なためにしらないうちに Mirai に冷蔵庫が乗っ取られちゃって、その結果我が家の冷蔵庫がわけの分からない挙動を始めるとか・・・・・・・・もう想像しただけでエラい騒ぎです。
買ってきた家電類だとか台所用品等が自分の知らないうちに外部と無線LANで繋がっていた、などという事の無いように注意を払っていく必要がありそうです。
「今後は、積極的に IoT に取り組もう」などと考えている各メーカさんにあっては、是非とも、本人の承諾無しに無線LANで勝手に外部とつなぐことをしないように、お願いしたい次第です。今、こんなこと書いてると笑い話ですが、将来は笑っていられなくなります・・・・・(汗)


注:我が家では外からアクセス自由のネットワークデバイスは基本的にありません---------と書きましたが、電力会社のメーターボックスは外部からアクセスがあります。プロトコルは、知りません。TCP/IP でないことを願っています。
電力会社とか通信会社はネットの専門家もたくさんいるし、大丈夫だろうなあ、と思っていますが・・・
ただし、以前にネットで見た情報では、ロシアかヨーロッパか忘れたけど、電力のメーターボックスがクラックされて乗っ取られたって話があるようです。(汗)