カテゴリー

アクセスカウンター


since 1996/06/14

アクセス状況

  • 0
  • 109
  • 332
  • 5,051

12周年

blog-2008-06-14-12th_anniv
 このサイトも開設12周年が経ちました。
思いつきでLinuxの管理をしてみたり、オンラインゲームにはまってみたり、レザークラフトを初めて見たりと、一貫性が無くてすみませんw
 もはや当時のコンテンツはほとんど残ってないですが、これからも思いつきでいろいろやっていきたいので、お付き合いのほどよろしくですm(_"_)m

さいふ/キーケースを作ってみた

blog-2008-06-12-AComp1 しばらくブログの更新をさぼっててすみません。実は思いつきでレザークラフトを始めました。
その内容を書こうと思うんですが、せっかくなので反省点なども含めて記録を残しておこうと思います。

 ちなみにブログを書いてなかった5日間程度(中2日間は仕事が休み)でできあがるので、お手軽ですね。


※工具の説明は別のブログに移しました。

blog-2008-06-12-Zairyo使用した材料はこちら。革1は表面のデザイン用。薄くて弱いので、本当にデザイン用ですが、値段はこの中で一番高価で2500円くらい。
革2は枠と全体の補強用。デザイン用の革が赤系なので、同系色でかつ革1の色を引き立てる為に、若干暗い小豆色にしました。1000円くらい。
革3は実はほとんど使ってません。柔らかい革で内部用に買ったんですが、猛烈に加工しづらいです。小銭入れの両脇に使ってます。1000円くらい。
ホックは固定用。10組170円くらいで買えます。そんなに要らないって。
三連キーホルダーは固定が難しくて一度失敗。結局2つ買いました。
糸は茶色系で。
あと、これ以外に黒くて薄い固めの革を内部で使ってます。

 さて、以下制作フェーズです。

blog-2008-06-12-1CutZairyo_1はじめに型紙を作って切り出したのがこれ。型紙は1mmの方眼紙は細かすぎるので、5mm方眼紙で作成し、ホチキスとかで仮組をしました。

blog-2008-06-12-2Outerこれが始めに手を付けた外側。

blog-2008-06-12-3Guideblog-2008-06-12-4Punchblog-2008-06-12-5Nui
 まずはステッチルレットで縫う場所に穴を開けます。これをやる前にシャープペンで線を引いてます。
 実際には浅い穴しか開かないので、千枚通しで貫通します。複数枚革がある場合は、一緒に貫通します。このときにクリップなどでしっかり固定しないと、すぐにずれて困ります。
ちなみに縫いは10cmで1時間くらい掛かりました。

blog-2008-06-12-6Buttonblog-2008-06-12-7ButtonHoleblog-2008-06-12-8PunchHole
縫い終わったらホックを留める穴を掘ったんですが、全然考えてなかったので、穴あけ場所に困りました。結局糸をほぐして縫い直したりしてます。しかも始めはカッターナイフで穿ってましたが、穴あけ専用のポンチが売ってることに気がついたのはかなり後のことです…

 そんなこんなで完成です。

blog-2008-06-12-BComp2blog-2008-06-12-CComp3blog-2008-06-12-DComp4blog-2008-06-12-EComp5


 複雑な仕組みなので、かなり厚みがあります。表面的には裏表が同じ形ですが、片側はキーケース。もう片側は小銭入れです。両方開いた写真を見ていただければ、構造がわかりやすいかな。

 実際に作って失敗したなーってところは以下。

  • 重ねて縫う時は、始めに形を作るより、縫ってから切った方がいいかも。しっかり寸法通りに切れる革ならいいけど、変形したり折り曲げると厚みの関係で長さが足りなくなることがあったりするから。
  • ハサミ、カッターのたぐいは充実した方がいいかな。後から切ったところがヨレヨレになりました。
  • ホックを打つ台のサイズはしっかりはかった方がいいですね。打ち具もサイズがあわないとしっかり止まりません。あと、打つ時は気合いで打たないと失敗しますね。
  • 厚みを考えて設計しないと危険。

 工具がそろって慣れれば、革1枚1000円程度なので、実際買うよりかなり安く作れます。2つ3つ作ればもっと経済効果が上がりますね(^-^;
 身の回りを見ると、ベルトや携帯ストラップ、手帳ケース、携帯電話入れ、デジカメ入れなどなど作れそうな物はたくさんあるので、想像がふくらみます。
 

複合プリンター



 家のスキャナの動作が遅いので、そろそろ新しいのを買おうかなぁ…と思ってたんですが、スキャナって案外高いんですよね。あと性能がいいと場所もかさばる。
 そこで複合プリンター(プリンター+スキャナ+コピー機+FAX)を探がしたら、実はスキャナと値段がほとんど変わらないwってことで購入しました。
 一応、以下の条件に見合った機器です。
メーカ
CANONが好き。

インク
5色。色数が多いとインク代が高いし、少ないと発色が悪い。特にCANONの5色インクは黒が倍くらい大きいので、効率的でもあります。

スキャナ
スピード重視。まぁ、前のより早ければいいやってくらい。

 後から知ったのでは、スキャンの時に自動で紙を取り込めるのが最近あったこと。複数枚の取り込みもこれで楽ですね。
あとは想定はしていたんですが、想定以上に筐体がでかい!
 ちょっと棚を考え直さないと…

ばんにゃーい動画

http://www.nicovideo.jp/watch/sm3542279
子猫動画ですが、この動画はおもしろすぎる。

ニコニコ動画が見れない方はこちらへ↓
http://www.youtube.com/watch?v=k9sa2xxFxPE

The World of GOLDEN EGGSな話

 今回、動画系カテゴリーでも動画は無いです。
いや、動画サイトとかで「金卵」で検索すればヒットするんですが、著作権的にヤヴァいので、自己責任でどうぞ。
 で、今回は最近にわかに流行っているThe World of GOLDEN EGGSな話。
どの話にどういうサブコンテンツが含まれてるかっていう情報があまりないので、備忘録的に載せておきます。

SEASON1


1,リサとレベッカの放課後&THBCナターリアの部屋(GUSHIケンバンド)
2,ロバート先生は上の空&THBC MORI MORI COOKING
3,ポールは正直者&THBC 突撃!レコードホルダーズ(ジェットコースター)
4,ローラの誘惑&THBC MORI MORI COOKING
5,ケヴィンとポールの大作戦&Trend Hunting
6,ジャッキーとサイモン&THBCナターリアの部屋(ジェイク船越)
7,僕のユニフォーム&THBC 突撃!レコードホルダーズ(ベトナムでもんじゃ焼き)
8,私のポイズン&THBC MORI MORI COOKING
9,ケヴィンとポールのイバラ道&Trend Hunting
10,家庭教師ミシェル&THBCナターリアの部屋(物まねロッキー)
11,ホームパーティー &THBC 突撃!レコードホルダーズ(ヒマラヤでシュウマイ)
12,レンジャーはんぱねぇ
13,ワンモアタイム情事

SEASON2


14,コーチの秘密特訓&THBC 突撃!レコードホルダーズ(ロシアで警察犬)
15,ボディービル部 &THBC MORI MORI COOKING
16,マネージャーの忘れ物 &Turkey’s Hill 警察24時(駐車違反)
17,ポールにカミナリ&世界の珍獣
18,ロバート先生とドライブ&Turkey’s Hill 警察24時(酔っぱらい)
19,ベティとレディースバンド&THBCナターリアの部屋(GUSHIケンオーケストラ)
20,レンジャーのゲリラ撮影&THBC MORI MORI COOKING
21,オレの爺ちゃん&Trend Hunting
22,ゾンビ島&MORI MORI EXERCISE
23,3匹のネコ&THBC 突撃!レコードホルダーズ(オーストラリアでバンジー)
24,レベッカの宿題&Turkey’s Hill 小学生作文コンクール
25,コーチの義母&Trend Hunting
26,愛しのチアリーダー&THBC フットボールダイジェスト
あと、教頭先生の家族構成
妻マリア、長男リチャード、その友達のチャーリ、長女のエレナ(高二)、
4男ロジャー、フランチェスカ、マリオ、ファビオ、マルゲリータ、アレッサンドラ、ミケーレ、ディーノ、ロベルト&ピエトロ(双子)、アントニオ、パウロ、ダミアノ(塾で不在)、次男アルベルト(アルバイトで不在)
ペット:犬2匹、モルモット12匹、ロバ一頭、七面鳥二羽。
これから生まれる子供は男ならジャンルイギ、女ならフランチェスカ

温泉場

 仕事帰りに行けそうな温泉(床屋含む)があればなぁ…と調べました。
相模原南部中心です。
 営業時間、金額などはサービスでかわることがある。
湯楽の里(map)食事・カット有り
http://www.yuranosato.com/index.html
相模原市下九沢-相模原北公園そば
9:00~24:00
入湯:700円(平日)/900円(土日祝日)
カット:1000円
やまとの湯(map)食事・カット有り
http://www.yamatonoyu.co.jp/all/sagamihara/
相模原市鵜野森-南警察署そば
9:00~24:00
入湯:700円(平日)/800円(土日祝日)
カット:1000円
ざぶん(map)カット有り・食事有り?
http://www.zabun.com/
相模原ゴルフクラブそば木漏れ日通り沿い
10:00~25:00
入湯:650円(平日)/750円(土日祝日)
カット:1300円
ここち湯(map)食事・カット有り
http://www.kokochiyu.com/(注意:音が出ます)
相鉄線かしわ台駅そば
10:00~25:00
入湯:650円(平日)/750円(土日祝日)
カット:1000円

セキュリティまわり

 最近ブログもあまり更新してませんが、DeltaWikiのセキュリティ周りをいじってます。せっかく作ったので、ダウンロード可能にして広く使ってもらおうかなぁ…って思いつつあるからです。
 DeltaWikiには、本体モジュール、入出力モジュール、ユーティリティが基本で、その上でページ生成や認証を行うCoreプラグインが動いてます。
 まぁ、とりあえず基本的なモジュールをコネコネいじってます。
 あと、携帯対応も9割方終わってます。ブログプラグインが根深いのでまだですが、それ以外はだいたい対応できたかな。

DeltaWiki

Delta Wikiについて

 FSWikiを参考に作ったWikiクローンです。

バグ・未実装・実装中情報

  • セキュリティチェックがまだ – デルタ(2008/04/29 10:32:21)
  • bbsプラグインがびみょい。 – デルタ(2008/04/29 10:33:00)
  • plugin help機能をまだ作ってない。 – デルタ(2008/04/29 10:33:17)
  • ドキュメントを作ってない。 – デルタ(2008/04/29 10:33:30)
  • フォルダ階層制御のテストが未完了。特に管理権限付与あたり。 – デルタ(2008/04/29 10:33:40)
  • sendmail。 – デルタ(2008/04/29 10:33:49)

    • とりあえず機能付加。 – デルタ(2008/05/06 22:21:39)
  • テンプレート管理。 – デルタ(2008/04/29 10:34:01)
  • ページバックアップ。差分。 – デルタ(2008/04/29 10:34:17)
  • >圧縮ファイルを投稿後展開。 – デルタ(2008/04/29 10:34:29)

    • >完了 – デルタ(2008/06/04 08:36:39)
  • ページを削除すると、空フォルダの残骸が残る。 – デルタ(2008/04/29 10:34:42)
  • commentプラグイン – デルタ(2008/04/29 10:35:38)

    • デフォルトの返信元のチェックが付かない – デルタ(2008/05/26 23:13:06)
    • 携帯対応がまだ。 – デルタ(2008/04/29 10:36:51)

      • 完了 – デルタ(2008/05/26 23:12:03)
    • 名前の記憶、アカウント情報から自動挿入がまだ。 – デルタ(2008/04/29 10:36:19)
  • blog – デルタ(2008/04/29 10:38:36)
  • レイアウトの強調とかが複数入るとおかしくなる。 – デルタ(2008/04/29 18:51:27)
  • ログアウト時のセッションが破棄されすぎ – デルタ(2008/05/26 23:13:53)

ブログに載せたこと

–category_list -h,DeltaWiki–
 

基本機能

  • 高い汎用性

    • プラグインで機能拡張可能。
    • perlで作られているので、いろいろなプロバイダで動かせるかも?DBは使ってません。
    • ヘッダ、フッタ、サイドバー(左右)を表示可能。
    • tDiaryのテーマを使用可能(右サイドバーなど、一部デザインを拡張しているので、そこはデザインテンプレートをいじらないと正しく表示されない)。
    • 番号付きリストや、「・」付きリストなどの階層は無制限。
  • シンプルで、且つ高度なアクセス制限

    • ユーザ認証機能、ユーザグループ管理機能。
    • ページをフォルダ単位で管理(右上の一覧で見るとわかりやすい)。
    • フォルダ単位にアクセス権、デザインテンプレート、サイト名などを設定可能。※ページ単位のアクセス権設定は無い。
    • メニュー、権限、設定を未設定のサブフォルダの情報は、上位フォルダから継承される。
  • ユニバーサルデザイン?

    • 携帯端末対応。
    • UTF-8で表示されるので、多言語対応?(未確認)ただし携帯端末はShiftJISになる。

主なplugin

  • blog…ブログです。カレンダーとか。一日に複数の投稿ができます。
  • comment…一行コメント。ツリー型なので、他の投稿に返信可能。簡単なSPAM対策機能あり(自動投稿はほとんど不可)。
  • ref_image…画像を貼り付け。ImageMagickが使えればサムネイルを自動生成してくれる。
  • bbs…掲示板。2ch風。
  • include…ページ内に他のページを取り込む。途中から省略とか可能。

内部の話

  • 拡張できる機能は以下の通り

    • plugin…ページに追加機能を埋め込むことができる。ブロックプラグイン(複数行に渡るプラグイン)にも標準対応。
    • system_plugin…pluginと同じだが、内部処理でのみ使用可能(通常のページ編集では使えない)。
    • handler…主にフォームからの送信情報を処理する。
    • hook…ページの編集や表示処理に割り込みを行う。
    • layout…ページレイアウトの定義を行う。たとえば「—-」という文字を「<HR>」に変換しなさい、とか。

FSWiki(*wiki)とは違うところ。

  • そもそもpluginとか、設定ファイルの管理など互換性無し。
  • 文法はFSWikiに近い(カスタマイズできるけど)。表とかはPukiWikiを参考にしてたりする。
  • 早い。
  • エラー制御は不親切かも?InternalServerErrorとかの詳細はWebに出ません。
  • ページの自動リンクはしません。URLくらいは自動リンクする。
  • Farmは無い。ただし、フォルダ機能でそれに近いことができる。
  • paragraphとかinlineとか無い。FSWikiにあったadd_menuとか無い(hookで対応化)。
  • ログイン後に、管理画面じゃなくて前に居たページに戻る。
  • OpenSorceで公開していないw

ページ生成速度

 だいたいの平均値から。単位は秒。純粋にサーバがページを作る時間で、転送速度は含まれていない。

対象ページ FSWiki DeltaWiki
FrontPage 0.5~0.6 0.4
qmail 0.7 0.2~0.3

 

自宅建替記

このページについて

自宅を建替えた時の苦労話。実際に建替えのときに役立つようにメモを掲載してます。

注意:この記事は建築に対して素人も同然の私が書いているので、それらに対する意見や考察は事実と異なることも十分あると思います。

業者選定(2001/04/16)

手抜き工事とか怖い話が叫ばれている世の中ですし、業者によって特徴もさまざまなので選定した業者によって結果はまちまちです。もっとも慎重に選ば無ければならないところですね。

(1999/01)おうちの勉強

いざ家を建替えようとはいえ、いったいどんな家があるのか?どんな特徴があるのか?どれがいいのかなど、まったくわからないので情報収集をしました。とりあえず住宅展示場へ行きました。まぁ巨大な商品なので説明が長い長い。一軒話を聞くのに2,3時間はかかります。とりあえず聞いてみた結果は以下のようなかんじ。

木造

 昔からある木の柱に木の壁。壁の中に断熱材とかは入ってるやつ。最近は柱を太くすることにより耐震性を強化しているらしいが、やはりギリギリ3階が建てられるって感じで、鉄骨ほど強度は無いらしいです。実は耐火性能もかなりイイらしい。最近の木造は優れてて阪神大震災にも耐えられる強度と耐火性はあるらしいが、やはり他と比べると劣る。まぁ、うちの木造はダメですなんていうところは無いですけどね。

 気持ち的にいいのと、安いってのがいい。当然、ヒノキの柱とか使えば高いけど。

パネル工法・2×4

 壁を貼り付けつつ家を建てる。柱が無いのか?良くわからんが、この工法の業者はあたらなかったんで(親が聞きに行って私は友人に聞きました)、良く知りません。いずれにしろ構造的に心配なのでイヤ。

鉄骨・鉄筋コンクリート

 鉄の柱に、コンクリートやALCパネルという、気泡の入ったようなコンクリートっぽい素材を壁にする工法。壁が木のヤツもあるらしい。
耐火性、強度がバツグンなのはわかる。良く言われるけど、鉄筋コンクリートは夏暑く、冬寒い。そのため、そのALCパネルが最近採用されている。このパネルは、気泡があるため、コンクリートが空気を含み、また水分も含む。そのため「木」に似た性能を発揮する。耐熱性もなかなかなもので、有りがちな断熱材はそれ自体が燃えなくても、断熱材に接触している木などが燃え出したりすることがあるらしいけど、ALCパネルはそれも無いらしい。ほとんど全ての業者が「床材」にも採用しているため、その強度と防音性もお墨付きだろう。
当然、鉄の柱、そのすばらしいコンクリートが床、壁、天井に使われるため、死ぬほど高価になる。将来を考えるとスゴくイイんですけどね。

ユニット工法

 昔からあるけど、家を四角いパーツに分けて組み立てていく。昔はダサダサな家しかなかったけど、最近はかなりイイデザインの家が多い。ユニットはほとんど工場で作られるため、とりあえず建て始めると形は1日でできてしまう。総工期も約2ヶ月と短い(他の工法は半年近くかかる)。柱はそこそこ頑丈だし(鉄骨ですけどエの字ではなくロの字)、1ユニットの4方の柱以外は自由に間取りを変えられる。ユニットは工場のラインで作られるため、最近話題の手抜き工事とかもされにくい。
弱点としては、ユニットを2つくっつければ当然柱の太さが2倍になる。結果、壁が分厚くなってしまうのを避けられない。


結局、いろんなところを見たが、阪神大震災の後ともあって、耐火性、耐震性は比較の対象にならない(みんな重要視するポイントなのでメーカーも手を抜かない)。つまり、この段階で業者を決めるのは不可能、、、。

(1999/02頃)見積、見積

とりあえず、業者を何社か抽出。A工務店(近所の大工)、R社(某重工業の100%子会社)、H社(鉄骨にパネルコンクリートの工法の会社)、SH社(ユニット工法)、M社(木造)。(社名が知りたければメールをいただければお教えしますよ)。~
各業者に土地の測量図を渡し、勝手に図面を書いてくるように指示。見積もりはタダだからね。さて、その後の反応。

A工務店(近所の大工)

 最近、近所で建て替えが盛んなのだが、ご近所さんはほとんどがこの工務店を利用している。近所だけに手抜き工事なんてしたら、一気に信用を無くし倒産になりかねないので下手なことができない。そういうことを考えるとスゴくイイ(笑)。
さて、見積もりの図面。ありゃ?近所の家とほとんど同じ構造(笑)。
そうそう。ここは、鉄筋と木材を利用した工法。また他の建築業者とは違い、中間マージンが無いので安い安い(お金の話は後ほど書きます)。しかし、法的手続きの代行はほとんど無し。建設の技術的にも業者より一歩出遅れてる。まぁ、これは当然で、業者はみな大きなグループの1つになっており、他のグループ企業の研究成果が反映されている。近所の工務店はそれが無い。また、設計士も少ないらしく、間取りもあまり変えられないどころか、明らかに設計が良くない。
上記の理由もあったが、ファーストコールから業者選定に3ヶ月かかったのと、近所とだけあって、催促がうるさいので早々に切った。
※ちなみにその5年後、そこの工務店は跡取り問題で店じまいしてしまったらしい。ここを選定対象にしないでよかった・・・

R社(某重工業の100%子会社)

 親父の知人の会社の人と紹介を受け、とりあえず聞いてみる。一度見積もりが出てきて、それ以来何の連絡も無し。どんな家を建ててるか見せに行かせてもくれない。
う~ん。やる気が無いのかなぁ。親父の知人の紹介とは言え、一生に一度の巨大な買い物。心を鬼にしてスパッとお断り。

H社(鉄骨にALCパネルの工法の会社)

 結構有名な業者の一つ。さすがに設計はイイ!(頼んだ業者で一番よかったです)。また、キッチンの位置、ドアのノブ、そして構造にいたるまで、生活上の人の行動ラインまで研究尽くされている。すばらしい。やはりこうでなくては。でも、業者は手抜き工事が怖いので気をつけなければと言うことで慎重に、、、。この業者ははっきり言って、家に関しては文句の付け所は無かった。ただ、「1-1,おうちの勉強」の鉄骨の工法の説明を見ていただくとわかるとおり、高い!他に比べ坪単価10万は高い。つまり、総工費2~3千万で押さえたいところなのに、他より約500百万高い。
高けりゃいいもんできるよな、、、。涙を飲んで却下。

M社(木造)

 実は私は始めから木造は却下するつもりだった。確かに他の工法よりいろんな面で劣るが、実用、実害に絶えられない訳ではない。安いのも魅力的。
でもねぇ。やっぱし強度とかも多少余裕があるといいよね。
市内ではこの業者の建物の数がNo、1だし、交渉次第では選んだかも知れないが、ココは営業の対応が最低。早く決めてくれと催促がくるわ、(結局、却下したのだが)却下したとたん「お渡しした全てのカタログ等を返してください」だって(わからんでもないけど、他の業者はそれは無かった)。普通じゃないよって感じ。ろくに説明に来やせずに早く決めろ、決めろ、の調子だったし。家の建て替えの最初から最後まで営業の方とはお付き合いしなければならないのに、しょっぱなからこれじゃぁ安心して頼めない。当然、却下。

SH社(ユニット工法)

 最終的にはここに決定したのだが、理由は単純。
まず、先に説明したとおり、工場での大量生産の工法なので手抜き工事されにくい。また、構造、耐火性も○。
この業者を見て、最初に感じたのは内装がイイこと。内装は子会社らしいが、他に比べかなり力を入れているらしいと見えた。
さらに、比較的安価。と言っても貧乏な我が家ではギリギリのラインですけどね(^^;。
間取りがかなり自由で、言ったとおりの図面が2,3日後にちゃんと繁栄されているというのもイイ。
最後に営業の対応。また、若い営業マンでのんびりしたような感じだったが、商品の知識、技術(見積もりレベルの図面は営業自らが引くらしい)がしっかり身についている。これは、個人の技量の差もあるかもしれないが、それだけではなく、業者の教育や体制もイイというのが明らかにわかった。


そんなこんなでSH社に決定。

注意していただきたいのは、誰でもSH社がイイという訳ではない。土地が腐るほどあるのであればM社(木造)で低層の立派な家を建てればイイ。お金があるなら、H社の頑丈で住みやすい家でもイイ。ホントに金が無いなら、近所の工務店に頼めば、中間マージンが無いので3Fで2000万を切ることもできる。我が家の場合、金が少なく、土地も狭い、そのため3Fのそこそこのと言う観点からSH社に決まったのです(一人で建てるには割高ですが、今回は金融公庫の金利が低かったのと、親父と共同出資というのがあったのでお金の工面は何とかなりました)。

設計とお金の工面

業者が決まり、いよいよ細かい設計に着手。最近は間取りや内装をかなり自由にできるので、思い通りの家ができるのはいいのだが、それまでが大変。また、金の無い我が家でどうやって金を工面するのか!?

(1999/03)間取りとお金

いやぁ。この月は忙しかった。出張で半月ぐらい各地に飛んでたんで。
そんなさなか、大きな問題。そう、お金。貧乏な我が家に即金があるわけ無いので、金を借りなければならないのだが、この時点での狙いは金融公庫の金利2.1%。しかも、期限は3月上旬までで、その後利率が上がるのは目に見えてる。
金融公庫から金を借りる条件。それは、家の設計図。ちなみに借りてから設計が変わっても問題は無い。問題は建てる家の大きさ(坪数)により借りられる金額が変わるんで、大きさ(坪数)は借りるまでに決定しなければならない。
そんなわけで、建築業者の営業さんと家族と日夜会議の連続。

そこで、幸運な事が起こった。国の施策で金融公庫の期限が延びた!期限は3月26日!ラッキ?。って喜んでる暇も無くとにかく設計図の書き直しの連続。多分10枚以上は書いただろう(でも仮の設計書)。

そんなこんなで3月中旬になんとか仮の図面が完成。とりあえず建築業者との契約を済まし(このときしっかり契約金を数百万取られる)、公庫への申し込みを依頼。公庫に図面を出しても却下されるときがあるんで、少し余裕の日数ををもったが、まぁ問題無く通ったらしい。~
この後、予想通り公庫の利率がアップした。ただ、不況脱却のためもありさほどあがらなく、来年のこの時期まで2.4%らしい。まぁ、0.3%の差もかなり大きいので、早くやって正解だったかな?

その後、仮の設計図の間取りの打ち合わせを数回(これも設計図5枚以上書いてもらっただろう)し、完成!さぁ、次は内装だ。

(1999/04上旬)内装

やっとこさ間取りが落ち着いてきたので、次は内装の打ち合わせ。内装はまた専門の人がいて、その人と打ち合わせる。床板の色と種類(これは少ない)と壁紙、天井。コンセントやTVアンテナの位置、蛍光灯の位置など木目細かく決める。とりあえず壁紙の種類が多い。洋間は天井と壁に同じ物を使えるんで、その膨大な壁紙カタログから選出。花柄とか、金色とか合ったけど、1発ギャグねらいで一生の買い物するわけにも行かないので落ち着いたものを選択。
残念なのが、今日のマルチメディア時代に対応すべく、床下配線ができないか聞いていたが、できないとのこと。出来ないってことはねぇだろ。事務所とかはどうするんだ。これはもうちょっと戦ってみよう。
もともと、独自の配線システムとか何とかってるのがあり、INSとかドアホンとか、金を出せばその他も一括管理できるパネルが用意されていたが、これはダメ。所詮初心者用に合わせてているようなもので、DSUとTAを内蔵にもかかわらずモジュラー接続?何、モデムに繋げるの。ってことは64kBPS出ないの?話にならん。それに配線が埋め込みなんで、将来性がまるでない。
ちなみにこれはほかの業者でもあった。ほかのところのスペックは見なかったが、いずれにしろ配線を埋め込んだらダメだろう?この先30年も埋め込んだ線が使われるとは思えない。現にプロバイダと10BASE-Tで接続出来る世の中になりつつあるのに。ってことで却下の予定。
※現に今(2006年)には光インターネットを導入してます。

実はこのへんで既に力尽きており、電気やスイッチの位置は業者にお任せモードになってました。実際建ててみるとやっぱしこの辺が気に入らないところになってしまいました。やっぱりドアを開けると同時に電気がつけられるように、ドアノブと電気のスイッチは近くにある方がいい。あと、その電気も無駄に多かったです。

まるちめでぃあはうす

配線の問題は、結局業者が用意したシステムは使わないということで、配線のみしてもらうことにした。~
私の住むところはタイタスというケーブルテレビ業者(2000/12にJ-COMに吸収)が入り浸っているのだが、ここは電話とインターネットプロバイダも兼用している。メリットは以下のとおり。~

  • ケーブルなので、電波の問題が無い上、多チャンネル。
  • TEL代は同じ業者契約者に対しては無料。
  • プロバイダ契約料はTEL諸経費込みで¥6000の固定。
  • プロバイダとは10BASE?Tと光ケーブル接続で、512kBPSの転送速度(INSは64k)。バックボーンもそこそこいいらしい。

私の家は川沿いで、場所が周りより低く、TVの電波がほとんど来ない。しばらくは近所の人と共同出資でアンテナを立てていたが、高価なので有る時期よりこのケーブルテレビ(テレビだけ)を導入していた。で、今回建替えのついでにTELとプロバイダの契約をしてしまうことに決定した。~
基本的に、配線は外部から2階に入り、そこから各階に分岐する形をとる。そこで、タイタスインターネットの関係も有るんで、2階から3階に10BASE?Tのケーブルを埋め込むことにした(もちろん、電話線も埋め込む)。10BASE?Tケーブルは基本的にノイズの影響を受けないが、電源の線とよったりするとノイズを受けるらしい。そんなわけで、まだ一般的ではないが、シールドされた10BASE-Tの線を使用することに決定。

ちなみに営業の人にこう言う配線とかの難しい話をしても、「どうっすかねぇ?」とか「多分**だと思います。」とか言われる。当然ながらこう言う話は設計士と直接話したほうが手っ取り早い。特にいろいろ経験をつんだ設計士なら、パソコンの話がわからなくても非常に話しやすい。

とうとう、5月の連休は借家へ引越し、そして解体です。

で、どんな家になったの?

d77-blog-JITAKU-outi

上図のような家です。左上が北です。また、左から1F,2F,3Fです。基本的に1Fが親、3Fが私、2Fがその共有スペースという半2世帯のようになっています。ちなみに私は未婚ですが、、、。1Fから解説しましょう。

1F

 1Fは親のスペースです。親はまだまだ元気ですが、年をとって手足が不自由になっても大丈夫なように、考慮しています。居住空間である和室、お湯を沸かしたり、薬を飲んだり程度が可能なキッチン、そして風呂とトイレ。年をとると2Fに上がるのも大変だと思いますので、風呂とかも1Fに配置しました。ちなみに洗面に洗濯機を置く空間も有ります。
ちょっと残念なのがキッチンの部分と廊下の部分が暗いことですね。特にキッチンは家の構造的な問題で窓がつけられませんでした。
d77-blog-JITAKU-kittin

2F

 家族の共有部分、兼客間です。キッチンは対面式ですが、これはコミュニケーションが取れるように、またキッチンのごちゃごちゃしているところが外から見えないようにするための対処です。キッチンはカウンターに流しとコンロがあり、図で言う上側の壁には右の図(壁を正面から見た図です)のようにに大食器棚、食器棚兼机、冷蔵庫があます。また、床下収納もあります(2Fでも床下はOK)。ここにも洗濯機置き場がありますが、こちらがメインになっています。理由は簡単で、洗濯物干し(バルコニー)へ行くのに近いからです。和室は基本的に客間として利用します。

 バルコニーは車庫の上を利用して広めに作ってあり、庭代わりとしても使えます(土地は狭いんで、庭なんてほとんど無い)。また、ユニット工法の家なので、将来大家族になったとしたら、このバルコニーにユニットを追加することにより部屋を増やすことができます。

3F

 部屋だけです。お金がもったいないのでトイレは付けませんでした。12畳の部屋は窓の配置などを工夫し、壁で仕切れば2部屋に改造できます。1F,2Fは収納が少ないので、3Fは収納を多く取りました。全体から言えばこれでも収納は少々少ないです(庭が無いので物置とか作れない)。

(1999/04下旬)借家

とうとう旧家の解体の日が近づいたので、借家に引っ越すことになりました。ちょうどゴールデンウイークがあるのでそれにあわせました。その前に借家探しがあったんですが、うちの条件は下記のとおり。

  • 両親と私の3人なので、2部屋は必要。
  • 犬が飼えること。
  • たかだか3ヶ月なので、敷金、礼金が安いこと。
  • 借家に入らない分の荷物は貸し倉庫。
  • 移動が面倒なので、旧家に近いこと。
  • 風呂付き

結果、見つかりました。結局、敷金、礼金が皆高く、なかなか見つかりませんでしたが、ほとんど無きに等しい金額のが見つかりました。また、貸し倉庫は親の以前の職場でなんと無料。ラッキ?。旧家から歩いて5分ほどの距離で、ちゃんと風呂付き。残念ながら、犬はダメでしたので、近所の人にあずかってもらうことにしました。神経質なのでちょっと心配>犬。
いずれにしろほぼ条件どおりの家でしたが、ボロイボロイ(笑)。ふすまは穴だらけだし、電気はつかないし、風呂にシャワーが無いし、床は今にも抜けそう。とりあえず、旧家のふすまや蛍光灯などを持ってきて補完した(後日談:借家を出た後、取り壊されて立派な家が建ちましたw)。
d77-blog-JITAKU-ie_syakuya
そんなわけで、ゴールデンウイークに入り、引越し開始。事前に荷物はまとめておきましたので、5人ほど知り合いを集め、大荷物だけは1日で借家と倉庫に運びました。
この荷物が結構曲者で、私の部屋の物も半分くらい捨てた物の(捨てたのは古いゲーム機3台、パソコン2台、本約50冊、古いフロッピーほぼ全部、他細かいものの山)、運んだものは1人で持てる程度の箱5,6箱に本約50冊、パソコン2台と周辺機器。その他、家の物全部なので、えらい大変。準備は前もってやっていたものの、連休のうち2日丸々使い、荷物運びと開墾などで3日かかりました。

まぁ、何はともあれ引越し完了。私が占領した4畳半の部屋も半分くらい荷物で埋まりました(笑)。

(1999/04下旬)金銭的トラブル!?

先日、建築業者の営業が謝りに来ました。内容は金融公庫からの借り入れ可能額が予定より500万減ってしまったとのこと。何故かと言うと、この借り入れの限度額は家の建物の坪数によって決まるのですが、この坪数に車庫は含まれません。今回の建築業者はユニット方式で車庫も家の一部(1ユニット)の為、坪数に含まれてました。結局、業者では車庫が坪数に入ったが、公庫の見方では入らないという差異から出た問題でした。
通常なら委託書や見積書、設計の最終打ち合わせ書類等にハンコを押してるので、そんな言い訳は聞く耳持たないが、なってしまったのはしょうがないし、業者に他の最善方法を探してもらうという条件付で大目に見ました。現状でもっとも利率の低いのは公庫より1%高い。トータルで見ると、これだけでも数十万の出費になってしまう。

お金のこといろいろ

家の建て替えは金額が金額なので、いろいろ税金のことが難しい。その為、その類に詳しい人からいろいろ聞き勉強しました。

うちの家族構成は、両親と兄と私の4人構成。息子2人は共に未婚。兄は社宅住まいで出ていっている。そんなんで現状3人で住んでいる。親父は50歳中盤で定年まで後数年。
こういう構成でどのように家の支払いをしていくべきか?選択肢はいろいろある。
1点目は親父任せ。この場合、息子が金を払うと贈与税(漢字あってるかな?)がかかる。親父の退職金で払うという手もあるが、不況でどの程度出るかわからないし、親父の老後も考えると退職金は手を出したくない(何があるかわからないしね)。仮に親が死んで保険が降りればそれで払えるが、それを考慮に入れるわけにいかない。以後、名義を息子に変えるという手もあるが、これもドバッと相続税を取られる。現状ではこの方法はあまり有効ではない。

2点目は名義を分割し、親と息子で払う方法。負担が軽くなる上、将来名義をすべて息子にする際の相続税も軽くなる。問題は何割ずつ払うか?うちの場合、息子が2人なので誰が何%と考えると頭が痛くなる。

3点目。すべて息子にする。これは、親がどうであれ関係無いというメリットはあるが、払っていけるかという問題が起こる。払えなくなって、親が手助けをすると、当然贈与税がかかる。ちなみに、3000万円(実際は違うけど)とすると、20年ローンで月約13万円。ボーナスには40%まで割り当てが出来るのでフルに活用すると、ボーナス1回30万、月8万となる。若いうちからこれだけの借金は抱えきれない。

結局、うちは2番の分割名義にした。ちなみに私と親父とで1:1。税理士に相談したりしたのだが、何割ずつ分割するかはその人の支払能力で決めればいい。また、兄貴が払わないことにより将来的に問題(結婚して帰ってきたとして、長男だし、家族だから少なくてもいいだろうとかいうのとか)がおきないように、すべての支払いと約束事を書面で残せばOKとのこと。つまり、誰がいくら払った。家を出るとき、入るとき、親が死んだときの名義をどうするか。相続をどうするかなど。書面で残ってればそれに従えばいいだけなので、問題は起きない。あと、この位に分割すると、相続時の税はほとんどかからないらしい。

話は変わるが、家を立てる際、家本体以外に、インテリア、エクステリア、解体、地盤強化などの金額がかかる。家の本体はすぐに金額が出るが、その他の見積もりはなかなか出てこない。そうなると資金計画が立てづらいが、おおよそでいえばうちの場合、総額の5/6が家本体の価格になり、残り1/6がその他エクステリア等の金額になった。1/6ってけっこういい金額で、後々になってびっくりするので注意が必要。また、建築会社により手付金が違うが(うちは数百万取られた)、その他に諸経費(ローン委託等)が100万くらいかかる。これは、ローンに組み込むことが出来ない為、事前にとられる。つまり、事前にそのくらいの金を用意しておく必要がある。私の貯金もえらい削られた。トホホ。

建替え

家の解体から、建築、引越しなどです。

(1999/05上旬)解体

d77-blog-JITAKU-ie_sarachi
うちの親にとっては、長い間汗と涙の結晶の解体。息子の私にとっては大したこと無いけど(というより、これからが大変なんで)。

解体は、建築業者にたのめば仲介してくれるが、高い。そんな訳で頼まないで探すことにしました。通常作業は1週間ほどかかりますが、最近の建て替えラッシュで忙しいらしく、一気に3日でぶっ壊してくれました。
業者によっては廃材を埋めていくところもあるらしいく、解体一つ取っても注意が必要。

結局、70万円だったのが、直接業者に頼んだところ40万円で済んだ。後になって解体関係の書類を自分で書かなきゃ行けないので多少面倒だが、そんなに難しくないので問題は無い。

(1999/05上旬~下旬)地鎮祭

d77-blog-JITAKU-ie_jichin
まぁよく見る地鎮祭の風景ですね。これから土地を掘り返しするんで怒らないでね?とか、建ったあと家を護って下さいとかを土地の神様にお願いする儀式。地鎮祭は最近やらないところも多いらしいです。うちは別に宗教かぶれとかそう言うのではないが、一応これから建て始めるぞ!っという意味をこめて。なんとなくというヤツ。
作法とかはみんな地鎮祭中に教えてくれるので、事前に覚えていってあたふたする必要は、まったく無い。

d77-blog-JITAKU-ie_kiso1
基礎は耐震性の面から見てかなり重要。最近はその辺すごくて、右の写真のさらに地下を鉄筋コンクリートで固めてるようです。深さは地盤強度によって変わるらしいです。地盤強度の検査も以前あり、川の近くとか、以前その土地にいろいろあった場合、地盤強化をしなければならないときもあるそうです。うちは基本的に「普通」のレベルをクリアしてました。

ちょうど、このころ借家の近くでも家を建ててるところがありました。基礎を見てみるとうちに比べるとめちゃめちゃ貧弱。家の土台なので一番要チェックなのかもしれない。

ユニット組み立て開始!

マイホーム建て替え記に前から書いてますが、我が家はユニット工法。家をユニットに分けてトラックで持ってきて組み立てるというものです。以下の図の通り、我が家は12ユニットに別れます(あ、3Fベランダのところ間違い。3F-4です^^)。
d77-blog-JITAKU-ie_unitzu
さて、さる1999年6月14日(大安)。梅雨だっつーのに日焼けするほどの大快晴に恵まれたこの日にユニットの組み立てが行われました。基礎しかなかったのが、わずか1日で一気に完成間近のごとく建て上がりました。

まぁ、これから1ヶ月半の間で内装、エクステリア、配線などを仕上げます。

どうやってユニットを組み立てるのか?

d77-blog-JITAKU-ie_unit1_3-1 d77-blog-JITAKU-ie_unit1_3-2 d77-blog-JITAKU-ie_unit1_3-3 d77-blog-JITAKU-ie_unit1_3-4 d77-blog-JITAKU-ie_unit1_3-5

  1. トラックに乗った俺ん家(笑)。左側が玄関、右側が和室の窓がついたユニットです。
  2. クレーンで持ち上げる。
  3. さらに持ち上げる。玄関を真下から見るって、一生に一度だけかも(笑)。
  4. 電線をまたぐ。電線を切る訳に行かないので上をまたぎます。横の光は太陽。まぶしー。
  5. そして、置く。設置場所に到着ー。

1F

d77-blog-JITAKU-ie_unit1-2 d77-blog-JITAKU-ie_unit1-3 d77-blog-JITAKU-ie_unit1-4
左から、ユニット2,3,4.ユニット1は私が行った時には既に置かれてましたんで、写真がないです。

1F ユニット2

セカンドキッチン、納戸、廊下などがあるところ。写真にもちょっと見えるとおり、棚関係はまだ配置されてなく、中途半端な位置に入っています。

1F ユニット3

 玄関と和室のあるところ。
ちなみにユニット運送時、窓ガラスは付けっぱなし。一見歪んで開け閉めできなくなりそうだけど、ユニットの耐久度が高い為、その心配は無い。それだけ耐震性があるとも言える。

1F ユニット4

 車庫です。このユニットはその形状が故、フレームが一本ありません。その為多少歪みの恐れがあるらしく、歪み防止用のパーツが付いてました。これはあとではずされます。
まるでプラモデル。

2F

2階です。
↓ユニットを下から見たところ(2Fユニット1)。床下収納の穴が見える。
d77-blog-JITAKU-ie_unit2-1 d77-blog-JITAKU-ie_unit2-1-2 d77-blog-JITAKU-ie_unit2-3
↑2階のユニット1と3.2は写真撮り忘れっす。

2F ユニット1

 階段、トイレ、キッチン。
左にトイレのドアがあるが見えてるほうは内側。ユニット2にトイレそのものがくる。またキッチンは対面式で、ちょうどその背面がL字に見える。

2F ユニット3

 ダイニングと和室の部分。ユニット4はベランダなので、ここに窓がある。

2F ユニット4

d77-blog-JITAKU-ie_unit2-2-1 d77-blog-JITAKU-ie_unit2-2-2
ベランダ。将来このユニット自体を交換して部屋を増設可能。

3F

d77-blog-JITAKU-ie_unit3-1 d77-blog-JITAKU-ie_unit3-2 d77-blog-JITAKU-ie_unit3-3 d77-blog-JITAKU-ie_unit3-4

↑左から3階ユニット1~4

3F ユニット1

 階段と奥の洋間。遠いんで見づらいですね。写真が。

3F ユニット2

 私の部屋1/2^^。

3F ユニット3

 私の部屋2/2^^;。将来、部屋を2分割出来るように窓が二つついてる。今は1部屋なので謎な産物状態。

3F ユニット4

 ユニットっていうか、ベランダ。奥行き75センチしかない。まぁ落下防止、布団干し、外から部屋丸見えを防ぐなどなど、その意味は濃い。
ちょっと色が違うけど、ユニット3~4の間が2時間あり、これは3時くらいなので、日の角度がかなり違う。

ユニット組み立て完了

d77-blog-JITAKU-ie_unit_all
ユニット組み立て直後。
中は壁紙もない状況なので、これからシコシコ形になっていきます。とりあえず、残りの資材をベランダへ置いている状況。

完成!

d77-blog-JITAKU-ie_kansei
ユニット組み立てから1ヶ月半、1999年7月31日とうとう家が完成し引き渡し。8月上旬には引越しを終えました。引渡し時点ではまだ完成しておらず、ベランダに屋根付けたりとかあとからしましたが、やっと完成しました。

この後もお金や税金、保険の話などなど大変でしたが、業者にお願いしたおかげでかなり楽に済みました(特に金融公庫の金利がこれから上がろうとぎりぎりのところで間に合ったので、業者にお願いしてたぶんの金額はペイできそう)。
また、長い間サポートが受けられるので、私的には大手の建築業者にお任せして大成功だったと思っています。

不具合修正が…

 内部ネタばかりですみません…
 Webツールを新規公開していろいろと企んでいるんですが、不具合がボロボロ出てきてそれどころではありません。
「今日はここまで修正したら寝ようかな」と修正を始めると、次々と問題が出てきます。まぁ、開発ってこんなものですよね。
 とりあえず、備忘録的に今日の修正記録を残しておきます。


  • commentプラグインでコメントSPAM対策用の禁止用語を登録する機能を追加(作るのを忘れてた…)。

  • formsプラグインのバグ発見(発見に時間がかかりすぎて直してない。暫定策でごまかし中)。

  • categoryプラグインのキャッシュ機能に不具合。修正済み。

  • 自宅建替記に画像を添付し忘れてたので貼り付け(←実は今日はこれに一番時間がかかってる)。


 旧掲示板の移植とか、新掲示板の修正とか、まだまだやることが多いな…
ってまぁ内部ネタばかりじゃつまらないので、最近萌えている動画シリーズの最新版を張っておきます。
http://www.nicovideo.jp/watch/sm3222861

このサイトについて

管理者について


 このサイトは「デルタ」が管理しています。
 デルタへの連絡は掲示板かメール等でお願いします。

本サイトの管理者と連絡手段


メアドは「delta<at>d77.jp」(←SPAM防止の為、@を<at>と書いています)。
※「delta0.net」のメアドは廃止しました。
 デルタが何者かは「自己紹介」を見てください。

このサイトは?


 このサイトが1996年に誕生して以来、主に私のプライベートサイトとして成長し続けました。その後、ゲーム関連のネタを扱う「UGB GameZone」、サーバ/ネットワーク関連のネタを扱う「Network Labo」の三つに分かれましたが、XOOPSに対応すると同時に1つに統合化しました。
 その後、XOOPSが使いづらいので、FreeStyleWikiというツールに移行して現在に至ります。

リンクについて


 基本的にリンクフリーです。出来るだけトップページにリンクしてください。

本サイトの著作物


 このサイト内での「デルタ」のハンドル名を管理者である私以外の方が使用することを禁止します。私を装ってどこかしらに書き込みされることも十分あり得るので、閲覧者も注意してください。
 このサイトの文章の著作権は原則としてデルタが持っています。基本的にはそれらを転載することを強く禁止はしませんが、転載物をあたかも転載してないかのように掲載することは禁止します。なお、画像の転載は原則として禁止します。

投稿ルール


 このサイトはインターネットを利用し、コミュニケーションを楽しむことを目的としています。その為、掲示板やブログページ、各コメントなどで以下のよな書き込みがあった場合は、状況に応じて警告/書き込みの削除/本サイトのアクセス拒否/アクセス元プロバイダなどに警告を発します。
※いままで、書き込み削除以外はしたことないですけどね 。

内輪ネタの禁止


 内輪ネタで盛り上がることは禁止です。ちと解釈が難しいと思いますが、特定のコミュニティにおいて、そこの話題から外れたような内容で少人数しかわからないようなネタを書き込むことです。「会社のxxxはむかつくよー」とか。
 当然、ゲーム掲示板でゲーム内のギルドの話をするのは問題ありません。

個人プライバシー情報の発信を禁止


 個人のプライバシ情報を発信することは禁止です。これはハンドル名で投稿している人の本名を明かしてしまうようなことも含まれます。また、個人のパスワードや認証関連のIDの掲示、非公開を前提としたサイトへのリンクも原則として禁止です。

本人を偽ることを禁止


 自分のハンドル名を頻繁に変更したり、自分を偽ることを禁止します。「通りすがり」「名無し」なども原則として禁止です。
 また、他人のハンドル名を故意に利用しての投稿は強く禁止しています。
 なお、偶然同名のハンドル名であった場合、区別をつけるため後から投稿した方が、区別をつけるための指標をハンドル名に付加してください。
例)デルタ@非管理者

投稿された物の著作権


 投稿された文字/画像は作者の著作物となります(当サイトに掲載された物も同様です)。ただし、当サイトに投稿されたものは、原則として著作者がデルタに対し、その文書等を自由に扱ってよいと認めたこととします(転載することはありませんが、コンテンツの構成上、レイアウトをなおしたり、データ変換(圧縮など)をすることがあります)。
 転載物に関しても同様ですので、転載元の著作権に注意してください。

批判、差別、広告、違法な発言、誹謗中傷の禁止


 宗教的発言、政治的発言、人種差別的発言、広告は強く禁止しています。ただ、ゲームの中のネタ等であれば特に禁止はしていません(たとえばネットゲームのネタで「xxxShopオープン!」とかいうネタはOKです。。
 個人または特定のキャラクター等に対する悪口は禁止です。特定企業にたいする批評はかまいませんが、根拠が見えない悪態は禁止です。
 違法な記述は禁止です。他人の著作物を転載しないでください。URLの掲載がベストです。一応世界に公開されてますので、日本国内で許可されてても、海外で違法となるような書き込みがあった場合は削除対象になります(デルタがわかるかどうかが問題ですが、、、 。

その他


 あまりにも無意味な投稿が多く見られたり、デルタがBBSの内容に則さないと判断した場合は削除対象になります。
 掲載された情報に対し、デルタは何の保証もしません。パスワードなどが明らかになり、他のサイトへのアクセスを許したとしても、デルタは保証しません(ただ、十分に注意はします)。
 ポリシーに記載されている事項の対象にならなくとも、それを匂わせるような書き込みも禁止しています。その判断は管理者が行い、それに関する異議、異論は一切認めません。
 その他、デルタの独断で削除等する場合もあります。

その他、注意事項


 本サイト全般のルールに関する注意事項です。

ポリシーの内容の改変


 今後、ここに記載されている内容は変更される場合があり、その内容は変更された時点で有効となります。ただし、デルタ以外の者が改変した場合は有効とはなりません。

管理者の権限


 本サイトの管理者はデルタです(一部、管理権限を委譲するサイトもあり、それに関しては明記します)。
 本ポリシーに記載されている禁止事項等に関して、管理者の許可があればルールにそぐわないことを許可することがありますので、事前に問い合わせてください。
 管理者が一度消去したデータはいかなる理由があろうとも基本的には復旧しません。

このサイトを管理しているツールについて


 Webサイトを作るには、htmlを書いてセコセコFTPでアップロードするのが当たり前でしたが、時代はCGI*による掲示板の時代、日記/記事システムのブログの時代、そして統合的にWebサイトを管理できるCMS*の時代へと移り変わってきました。
 2002年頃まではCGIを使ってWebサイトを作ってましたが、さすがに歳か プログラミングが面倒になったと同時に、私の目指していたCMSがかなり進化してきたので、採用することにしました。
 とりあえず、CMSとしてXOOPSを取り入れましたが、案外管理が面倒なので、FreeStyleWiki(以下、FSWiki)というツールを採用しました。いわゆるWiki*ですが、FSWikiはそれよりCMSに近い仕上がりになっており、モジュールで機能拡張することができます。

このサイトの歴史


HTMLをメモ帳で書いていた時代


1996年


1996/06/14
 Ddashホームページ誕生。
 当時のURL:http://ux02.so-net.or.jp/~d-dash/
 ※Ddash=当時のハンドルネーム

1997年


1997/02/04
 So-netの都合でURLが「http://www02.so-net.or.jp/~d-dash/」になった。

CGIの時代


1997/03/03
 初めてチャットルームを設置してみた(もう無いけど)。
1997/04/04
 5000カウント突破。
1997/06/24
 占いを設置してみる(もう無いけど)。
1997/11/04
 掲示板システム「Comb4」をリリース(当時フリーで公開していた)。
1997/11/27
 サイトの名前を「Ddash Web Site」に変更。

1998年


1998/02/11
 英語版サイト作成(今は無い)。
1998/06/14
 2周年目。サーバをBig-netに移行し始める。

1999年


1999/01/??頃
 3DCGで初めて人体を作ってみたりする。
1999/02/13
 掲示板システム「ComBo6」をリリース。
1999/03/28
 さくらインターネットに移行。
 当時のURL:http://jan.sakura.ne.jp/~d-dash/dws/
1999/03/30
 サイトマップを作ったら、コンテンツ数が100を超えてた。
1999/04/01
 マイホーム建替記書き始める(建て替え完了は同年7月末)。

サイトの分化


1999/04/06
 Linux関係の情報を掲載し始める。
1999/05/20
 UltimaOnlineのことを掲載し始める。
1999/6/23
 UGB UltimaOnline site(後のUGB GameZone)オープン。

2000年


2000/05/21
 UO2の情報を載せ始める(中止になったけど)。
2000/10/17
 「delta0.net」ドメインを取得。
2000/11/20
 サイトの名称をDelta’s Webに変更。

2001年


2001/07/06
 掲示板システム「tboard Ver1(ComBo7)」完成。
2001/04/15
 サイトをCGI化しはじめる。

自作サーバな時代


2001/07/23
 自宅のサーバでWebを公開(OpenBlockS)。
2001/11/01
 「d77.jp」ドメインを取得。

2002年


2002/01/16
 掲示板システム「tboard Ver2(ComBo8)」完成。
2002/10/15
 「delta0.net」ドメインの管理会社を変更。

全コンテンツCGI化な時代


2002/12/21
 サイトを更新(WebViewer ver5というCGIで運用開始)。掲示板を非フレーム化。
2002/12/18
 掲示板システム「tboard Ver3(ComBo9)」完成。

2004年


2004/12/04
 サイトを更新。CMS(Xoops)を利用。

2006年


2006/06/24
 まじめにブログを書き始めてみる。
2006/08/20
 サイトを更新。FreeStyle Wikiを利用。
 掲示板システム「tboard Ver4(ComBo10)」完成。

2008年


2008/05/06
 自作のWebシステム「Delta Wiki」に変更。

DeltaWiki公開

 今までこのサイトを「FSWiki」というツールで構築していましたが、今回Wikiツールを自前で作成しました。名付けてDeltaWikiです。
 まだまだ不具合や表示がおかしいところがありますが、運用しながら少しずつ修正して行きたいと思います。
 OpenSourceとかで公開する予定は無いです。

自作サーバ・Web関連

FSWiki関連

ネットワークセキュリティ・関連ツール

管理者の知り合い

リアル知り合い

プログラミング関連

VisualC++

DirectX関連

ゲーム開発系

その他

ゲーム関連

情報サイト

イラスト・マンガ関連

postfixでメールサーバ

 ここのページはpostfixについて詳しく書こうと思ったけど、面倒になって来たので、他のネタは他のブログを見てください。

postfixとは

 ここはpostfixというMTAの設定の備忘録です。MTAとはつまりメールサーバで、インターネット上でメールの受送信の役割を担います(この辺の詳しい説明は省略)。

  • 紹介している本は私が参考にした本です(既にVerが古いかも・・・汗)。

なぜpostfixか

 メールサーバの代名詞から、セキュリティ問題の代名詞のような扱いにされて早数年のsendmailですが、それだけではなく設定の困難さから、今の世の中でも敬遠されている存在には代わりありません。
 過去にqmailの調査と利用もしましたが、qmailは最新バージョン(1.03)が出てからかれこれ8年経過しており、ユーザグループのサポートで何とか生きながらえていると言う状態になっています。「シンプル且つ安全」と言われたqmailですが、既に1.03から追加機能とセキュリティ問題でパッチだらけになってしまい、もやは素人の手出しができない代物になりつつあります。

 そんな中で注目されているメールサーバの一つとして、postfixがあります。性能・設定の容易さなどが特徴でしょう。注目されていること=セキュリティの問題も発見されやすいというのもありますが、公式サイトを見てもわかるとおり、頻繁にバージョンアップされていることから、信頼できるものに見えます。

ソースコードとrpm

 このサイトは、以前からソースコートからコンパイルしでデーモンの構築を推奨してきました。これは、なるべく最新版を入手し運用すべきと考えたからです。
しかし、昨今はバイナリコードによる提供も良くなってきましたので、ここではソースコードからのコンパイルは解説しません(私ももう実際にコンパイルしてないし)。
 FedoraCoreであれば(っていうかそれ以外は知らない)、「yum update postfix」などのコマンドで気軽にアップデートできるので、管理上それでよいと思います。

 そんな訳で、ここではFedoraCore5のバイナリベースで解説しています。それ以外の方はパスなどを読み替えてください。

postfixとDNS

 postfixに関わらず、インターネット上で稼働するメールサーバは通常DNSを参照しています。何を参照しているかというと、相手先ドメインのメールサーバがどこにあるかというのを参照しています。
 たとえば、yahoo.co.jpドメインであれば、以下のコマンドで調べられます。

# dig yahoo.co.jp mx | grep MX | grep -v '^;'
yahoo.co.jp.            384     IN      MX      10 mx2.mail.yahoo.co.jp.
yahoo.co.jp.            384     IN      MX      10 mx3.mail.yahoo.co.jp.
yahoo.co.jp.            384     IN      MX      10 mx4.mail.yahoo.co.jp.
yahoo.co.jp.            384     IN      MX      100 mx5.mail.yahoo.co.jp.
yahoo.co.jp.            384     IN      MX      10 mx1.mail.yahoo.co.jp.

 DNSのMXレコードに、そのドメインのメールサーバが指定されています。
メールサーバが複数ある場合は、MXの次の数字(上記の例では10)が優先順位になります。優先順位が同じサーバは、それぞれ順番に処理していきます。

通常のメールアドレスの「@」の後ろはドメイン名、もしくはサブドメイン名が指定されているので、メールサーバはそれを元にDNSを調べ、送るべきメール(SMTP)サーバを決めています。
 

qmailでメールサーバ

はじめに




 ここでは、qmailを利用したメールサーバの構築方法を解説します。主な内容はqmailによるSMTPサーバの構築と、各種ツールの使い方、popサーバの構築方法です。
 qmailはsendmailに比べるとシンプルだと言われますが、動くようになるまでは結構大変です(それこそsendmailとあまり変わりません)。
 ちなみに私は「qmail メールサーバの構築」という本で勉強しました。qmailの公式サイトも見づらいので意外と役立つ情報が多いです。

このコンテンツでのソフトのバージョン


 特に表記が無ければ、以下のバージョンに関して解説します。新しいバージョンが出てても設定方法はさほど変わらないと思いますので、なるべく最新のものを利用するように心がけてください。
※一部、インストール中にソースファイルの内容を書き換えているところがありますが、それはバージョンに依存するかも。

qmail:qmail-1.03.tar.gz
checkpassword:checkpassword-0.90.tar.gz
ucspi-tcp:ucspi-tcp-0.88.tar.gz
daemontools:daemontools-0.76.tar.gz
relay-ctrl:relay-ctrl-3.1.1.tar.gz
qpopper:qpopper4.0.4.tar.gz

RedHat9でのエラーについて(2004/02/08)


 RedHat9でqmailを構築する際に、コンパイル中に以下のようなエラーが出ます。

: undefined reference to `errno’
collect2: ld はステータス 1 で終了しました
make: *** auto-str エラー 1

※qmail、checkpassword、ucspi-tcp、qmail-vida、daemontoolsでエラーが出ることを確認しましたが、基本的にdjb製のソフトは同様のエラーが発生するそうです。
 これを解決するにはソースコードの修正が必要ですが、ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/にパッチがありますので、それを適用することにより解決することも可能です。
※以下の操作はすべてそれぞれのコンパイル前のソースが存在していることが前提です。

※qmailの場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/qmail-1.03.errno.patch
$ patch < qmail-1.03.errno.patch


※checkpasswordの場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/checkpassword-0.90.errno.patch
$ patch < checkpassword-0.90.errno.patch


※ucspi-tcp場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
$ patch < ucspi-tcp-0.88.errno.patch


※daemontools場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/daemontools-0.76.errno.patch
$ cd admin/daemontools-0.76/src/
$ patch < daemontools-0.76.errno.patch

※qmail-vidaやその他パッチが無いソースの場合。
 「error.h」というファイルを探し、「extern int errno;」という行を「#include <errno.h>」に書き換える。
※3行目くらいにあるのですぐ見つかると思います。

メールプロトコル


 ここではメールに関わるプロトコルに関して解説します。知っていると動作テストで絶大な力を発揮できますので、覚えて起きましょう。
※テストに関係無いところは解説しません。

SMTP


 SMTPは「Simple Mail Transfer Protocol」の略でその名の通りメール配信に関する通信手順です。RFC(インターネットでのルールとかが書かれて文書)では、RFC821、822に当たり、その後ESMTPとして拡張されたりしてます。
 RFC821等の内容は既にRFC2821としてリニューアルされてますが、テストではRFC821だけで十分ですし、内容も短くて読みやすいので読んでおくといいかもしれません(検索すれば日本語訳もいっぱい出てきます)。
 SMTPでは通常以下の流れでメールを送信します。

  1. tcpのsmtpポート(25番)に接続。

  2. HELO ドメイン名(ドメイン名のところは結構適当でも大丈夫な場合が多い)

  3. MAIL FROM:送信元メールアドレス

  4. RCPT TO:送信先メールアドレス

  5. RCPT TO:送信先メールアドレス、、、

  6. DATAenterメール本文(文末にピリオドだけの行で本文終わり)。

  7. QUIT


 「RCPT TO」が複数あるのは送信先が複数の時です。ここで入力されたメールアドレスはヘッダ情報に記録されないので、ccやbccの区別はありません(ヘッダ情報はDATA以降に書かれる)。
 これらの情報は送信元から送信される情報で、受信側サーバは1行1行コマンドに対する応答をします。応答は「3桁の数字 メッセージ」で、システムは3桁の数字で状況判断し、メッセージは人が見やすいようにするだけのオマケのような物です。3桁の数字は、200番台が成功、300番台が入力待ちのような状態(DATAの後に出ます)、400、500番台がエラーです。
 では、例として「mail.sender.dom」というサーバを用いて、「aaa@sender.dom」から「bbb@receive.dom」へメールを送信する場合の手順を解説します(これらのドメインやアドレスは当然架空のものです)。
※「$」はシェルのプロンプト、「S:」は入力するSMTPコマンド、「R:」はサーバからの応答(例)です。

$ telnet mail.sender.dom 25
R: Trying mail.sender.dom…
R: Connected to mail.sender.dom.
R: Escape character is ‘^]’.
R: 220 mail.sender.dom ESMTP
S: HELO sender.dom
R: 250 ok
S: MAIL FROM: aaa@sender.dom
R: 250 ok
S: RCPT TO: bbb@receive.dom
R: 250 ok
S: DATA
R: 354 go ahead
S: test
S: .
R: 250 ok 1030963107 qp 2027
S: QUIT
R: 221 ok
R: Connection closed by foreign host.

※WindowsのDOS窓からのtelnetはエコーバック(通常のtelnetは入力した文字がサーバに届いた後、クライアントに送信され初めて入力された文字が画面に出る)が無いので、入力した文字が出ません。UNIX系を使うか、脳内補完しましょう。
 これで、bbb@receive.domにメールが送れます。ちゃんと遅れなかった場合はログを見ましょう。セキュリティ上の理由から送れない場合もあります。
 UNIX系OSであればtailコマンドに-fオプション(もしくはtailfコマンド)を活用するといいでしょう。ログが更新されると自動的に画面に表示してくれます。

tail -f /var/log/maillog

受信したメールを見ると気が付くと思いますが、件名どころか、送信元、送信先アドレスが無いメールが届きます。これらの情報は全てDATA以後に書かなければならないので当然です。以下のように書けばちゃんと見れるようになります。

S: DATA
R: 354 go ahead
S: From: aaa@sender.dom
S: To: bbb@receive.dom
S: Subject: test
S:
S: test
S: .

 「From:」〜「Subject:」までが「メールヘッダ」、「test」が「メール本文」です。「メールヘッダ」と「メール本文」を分けるのは空行を一つ入れるだけです。ちなみに通常のメールサーバはSMTPの「MAIL FROM:」/「RCPT TO:」に書かれた内容と、DATA以降に書かれたメールヘッダの情報の整合性を取らないので、メールクライアントで見れる「From:」「To:」はいくらでも詐称できます(これがSPAMやウイルス等で使われるメールアドレスの詐称です)。
 実際のメールヘッダにはこれ以外の情報も加えられますが、これはメールサーバが付加する情報で、主に中継したサーバの情報や時間が記載されます。
 さて、SPAM対策や接続制限されたサーバ等はここまでのようにエラー無しでは終わりません。SPAM対策等に関しては別で解説しますが、主に失敗するパターンは以下のとおりです。
接続時

 tcpwrapper等で制限されたサーバへは接続すらさせてくれません。この時の挙動は2種類あり、「拒否」された(拒否のフラグが設定されたTCPのパケットを丁寧に返送してくれる)場合はすぐに「connection refuse」とかエラーを返します。「無視」された(サーバが何の応答も返さずほったらかし)の場合はタイムアウトまで待たなければなりません。いずれにしろ「220 云々」という応答が無い限りどうにもなりません。



メールアドレスチェック

 これにはいくつかの挙動があります。

一つは自ドメインに存在しないユーザがメール送信する場合で、この場合「MAIL FROM:hogehoge@sender.dom」と入れた直後に「User unkown」とエラーを返します。送信先のユーザの存在は送ってみないとわからないので、後でエラーメールとかが送られてきます。ちなみにqmailではここでのユーザチェックはしないみたいです(つまり存在しないユーザからのメール送信が出来る)。

 また、SPAM対策も送受信のメールアドレスがキーで、主にメールアドレスのドメイン名を元にチェックされます。



メール容量などのチェック

 メールは最後のDATAコマンドで入力した文書が書き終わった段階(ピリオドを送信した後)に送られます。その段階でメール送信容量の上限チェックがかけられている場合はエラーになります。



メールキュー

 送信したメールも受信したメールも、通常はキューに溜まり(通常は特定のディレクトリに保存される一時ファイルのような物)、その後送信されます。一般的にはsmtpでメール送信後(DATAコマンドで入力終了してピリオドを送信した後)に出てくるメッセージ(上記の例では「R: 250 ok 1030963107 qp 2027」)に、キューに関連した番号が表示されるので、それを頼りに検索するとキューがちゃんと処理されたかがわかります。

※これは表示形式は違いますが、qmailもsendmailも同じです。

POP3


 POP3は「Post Office Protocol Version 3」の略で、通常はメールクライアントが、サーバのメールボックスからメールを引き出す為に用いるプロトコルです。
※たまに勘違いされる時があるが、メールクライアントで「送信サーバ(SMTP)/受信サーバ(POP3)」と書かれていることがあるが、これはメールクライアントから見た表現で、通常のインターネット上のメール配信は全てSMTPの仕事です。
 POP3はRFC1939に定義されています(これも過去の文書の改訂版だが、最新版でもかなり短くて読みやすいです)。ここでは最も基本的なコマンドを解説します。

  1. tcpのpop3ポート(110番)に接続。

  2. USER ユーザID

  3. PASS パスワード

  4. STAT

  5. QUIT


 当然メールの中身まで確認できますが、手動テストで底までやる必要は通常ありえないので、解説しません。ここではSTATコマンド(メールボックスにあるメール数と容量の表示)のみ行ってます。
 これらの情報は送信元から送信される情報で、受信側サーバは1行1行コマンドに対する応答をします。応答は「結果 メッセージ」で、結果には「+OK」か「-ERR」しかありません。また、SMTP同様にメッセージは人が見やすいようにするだけのオマケのような物です。
 では、「pop3.mailserver.dom」に接続し、ユーザ名「user」、パスワード「password」で接続した場合の手順を解説します。
※「$」はシェルのプロンプト、「S:」は入力するSMTPコマンド、「R:」はサーバからの応答(例)です。

$ telnet pop3.mailserver.dom 110
R: Trying pop3.mailserver.dom…
R: Connected to pop3.mailserver.dom.
R: Escape character is ‘^]’.
R: +OK ready
S: USER user
R: +OK Password required for user.
S: PASS password
R: +OK user has 0 visible messages (0 hidden) in 0 octets.
R: STAT
R: +OK 0 0
R: QUIT
R: +OK Pop server at pop3.mailserver.dom signing off.
R: Connection closed by foreign host.

 これをやってみるとわかりますが、パスワードはクリアテキストで流されます。パケットキャプチャーとかで、110番ポートへのパケットを傍受して、USER xxxとPASS xxxという文字列を拾えば簡単にパスワードを入手することができたりします。
 POP3でのテストで重要なのは、「USER xxx」と「PASS xxx」の部分で、この認証まで成功すればPOP3のテストはOKだと思ってよいでしょう。
 ちなみに蛇足ですが、「USER xxx」で存在しないユーザを指定して、「User unknown」とか返すPOP3デーモンは使うのをやめましょう。不正侵入される場合は、パスワードだけではなく、可能な限りユーザIDも守るべきです。適当なパスワードを入力したとして、存在するユーザと存在しないユーザでエラーの表示が変わると、それだけでも侵入できる可能性が高まります。
 さて、メールのセキュリティを高める手法として、POP3関連には「POP before SMTP」と「APOP」というのがあります。
 「POP before SMTP」は、POP3認証(USER〜PASSまで)が「+OK」になった時点で、その接続元IPをサーバ側で数分間蓄積しておき、そのIPのユーザだけsmtpによるメール転送を許可するものです。その為、POP3でのプロトコルには何の代わりもありません(つまり、telnet before SMTPでも「http basic auth before SMTP」でもイイってこと)。
 APOPはPOP3のプロトコルに組み込まれたコマンドを利用するので、ちゃんとメールクライアントで設定しなければなりません。具体的には、POP3ポートへ接続された時の文字列「+OK ready 」の「」の部分(になる)を用い、「パスワード文字列」をMD5で暗号化してダイジェスト文字列を発行します。そして、サーバへ「USER〜PASS」ではなく、「APOP ユーザID ダイジェスト文字列」を送ることで認証します。まぁ、盗聴されればメールの中身が見られることにはかわり無いが、パスワードが守られるってことで幾分セキュアになります。

qmailのインストール


 ここではまずqmailのインストール手順(qmail本体とsmtpデーモン起動まで)に関して解説します。この手順ではpop3デーモンは起動しません。pop3に関しては、後半の「POP3デーモン・・・総合解説」で解説します。
 本文内でも書きますが、機能によってはソースにパッチを当ててからコンパイルの必要があるものもありますので、コンパイル後もソースは保存しておくことをお勧めします。
 qmailをインストールする場合、インストール前に決めなければ鳴らないことがいくつかあります。インストール先とかの検討も必要なことがあるかもしれませんが、特に重要なポイントは以下の2点です。
MailBoxを使うか、Maildirを使うか。

 「13、ローカル配信先の考慮」で詳しく解説していますが、sendmail等で使用されているメールボックスとの互換を重視するか、qmail独自の信頼性の高いMaildirを選ぶかの選択です。



pop3(もしくはimap)をどうするか。

 インターネットメールはサーバ間のメール交換はSMTPという決められたルールでやり取りされますが、受信したメールを見る方法、さらにそれに付随する機能にさまざまのな方法が存在します。




  1. MaildirかMailboxか・・・上記「1」に関連することですが、メールの蓄積方法によって使用できるプログラムが変わってきます。

  2. POP3・・・受信したメールをサーバからダウンロードしてクライアントでメールを管理する最もポピュラーな方式。

  3. APOP・・・基本的にはPOP3と同じ。認証の時にパスワードが暗号化される。

  4. imap・・・POP3とは逆でメールをクライアントに落とさず、サーバで管理します。基本的にqmailのMaildirと相性が悪い場合が多い?

  5. pop before smtp・・・メールを送るのにpopの認証を活用し、不正中継を抑制します。

  6. 仮想メールボックス・・・基本的には「メールユーザ=サーバアカウント」ですが、ユーザ数が増えると管理が手間なので、仮想メールボックスを活用した方がいい場合があります。


 この辺の詳細は「POP3デーモン・・・総合解説」で解説しています。

1、ダウンロード


 まず、qmailの本体をダウンロードします。本体はhttp://www.qmail.org/からたどれますが、qmailの製作者のD. J. Bernsteinのサイトから落とした方がわかりやすいかも知れません。
 とりあえず、ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gzから落とせるかも。

2、ダウンロードしたソースを展開


 tarで解凍します。qmailは基本的にroot権限でインストール作業をするので、始めからrootで作業した方がいいかもしれません。
 まぁ、解凍は変なところを指定してファイルを上書きしちゃうと怖いのでroot以外の方がいいかもしれませんが、、、。

# tar zxvf qmail-1.03.tar.gz -C /usr/local/src
# cd /usr/local/src/qmail-1.03

3、「conf-」ファイル


 qmailはインストール前の設定を「conf-xxxx」と言うファイルの内容を変更することによって行うことが出来ます。
※でも、ほとんどそのままでも問題は無いし、ここの解説も特に設定変更してません。
 気にすべきところは、インストール先を示す「conf-qmail」、qmailが使用するユーザとグループを示す「conf-groups」と「conf-users」。
 また、メールの流通量が多いサーバでは、「conf-spawn」、「conf-split」を気にした方がいいかもしれません。
conf-break
 代替メールアドレスを作成する為の区切り文字。デフォルトは「-」。

conf-cc
 コンパイラとそのオプションスイッチの指定。デフォルトは「cc -O2」。

conf-groups
 qmailプログラムを実行するユーザが格納されるグループを指定する。デフォルトは「qmail」と「nofiles」。

conf-ld
 make中のリンカーとリンクオプションの指定。デフォルトは「cc -s」。

conf-patrn
 パーミッションのマスクの指定?デフォルトで「002」なので、「776」というパーミッションになるということかな?要検証。

conf-qmail
 qmailのインストール先。デフォルトは「/var/qmail」。

conf-spawn

 qmail-localとqmail-remote(ローカル/リモート送信用サービス)の最大セッション数。デフォルトは「120」。最大は「255」。

 これは別記の「制御ファイル」で解説する「concurrencylocal」と「concurrencyremote」で指定できる値の「最大値」なので、大量のメールを処理するなら増やす必要がある。セッション数が増えるとサーバリソースを消耗するが、それは「concurrencylocal」と「concurrencyremote」の設定次第なので、「conf-spawn」を減らしてもさほど意味は無い(リソースを気にするとしてもデフォルトのままでよいってこと)。



conf-split

 スプールディレクトリに作成するサブディレクトリの最大値(ディレクトリ参照の負荷軽減に用いられる)。デフォルトは「23」。

 qmailではメールキューが膨大になった時に、スプールディレクトリを分割してキューを蓄えることにより、ディレクトリ参照の負荷を軽減できます。

 メールスプールが1000以上になるような大規模なメールサーバを構築する場合はこの値を大きくすると(500とか)いいらしいです。



conf-users
 qmailのシステムが使用するユーザ名。デフォルトは以下のとおり。

alias/qmaild/qmaill/root/qmailp/qmailq/qmailr/qmails

4、ディレクトリの作成


 qmailがインストールされるディレクトリを作成します。
場所は「/var/qmail」がデフォルトです。場所を変えたいのであれば、後に出てくる「conf-qmail」の設定をコンパイル前に設定する必要があります。

# mkdir /var/qmail

5、ユーザ、グループの作成


 インストール前に各ユーザとグループを作成しなければなりません。以下の手順で追加することが出来ます。
※ユーザに関する設定は「conf-users」、グループは「conf-groups」に定義されているので、変更したならそれにあわせる。
※Linux以外の人は、qmailに含まれるドキュメント「INSTALL.ids」を読んでください。

# groupadd nofiles
# groupadd qmail
# useradd -g nofiles -d /var/qmail/ qmaild
# useradd -g nofiles -d /var/qmail/ qmaill
# useradd -g nofiles -d /var/qmail/ qmailp
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -g qmail -d /var/qmail/ qmailq
# useradd -g qmail -d /var/qmail/ qmailr
# useradd -g qmail -d /var/qmail/ qmails

6、バグ対応


 DNS周りのバグがあるので、手作業で修正した方がいいらしいです。ファイルは「dns.c」で場所は24行目。
 コンパイル間にvi等で編集/修正しておいてください。

  • 修正前



static union { HEADER hdr; unsigned char bufPACKETSZ; } response;


  • 修正後



static union { HEADER hdr; unsigned char buf65535; } response;

※これよりもhttp://www.ckdhr.com/ckd/qmail-103.patchにあるパッチを当てた方が確実っぽいです。

$ wget http://www.ckdhr.com/ckd/qmail-103.patch
$ patch < qmail-103.patch

7、JST対策


 qmailはそのままコンパイルすると送信したメールの時間表示が全てGMT(世界標準時)になります。JST(日本時間)にするにはコンパイル前にパッチをあてなければなりません。
 操作はqmailのソースを展開したディレクトリの中で以下のような操作をします。

  • パッチの入手



$ wget ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch


  • パッチあて



$ patch < qmail-date-localtime.patch

 これでOK。

8、その他パッチあて


 qmail-vida等を導入する時は、メイクの前にパッチを当てる必要がある場合があります。

9、メイク


 以下の操作でコンパイル/インストールが行われます(要root権限)。

# make setup check

 コンパイルがうまくいかなかった場合、インストール先ディレクトリを作ってなかったとか、必要なユーザが居ないとか、他のインストールプログラムではあまり見られないようなことがあるので注意しましょう。

10、制御ファイルを編集


 /var/qmail/controlに制御ファイルを作成/設定します。
制御ファイルとは、いわゆる設定ファイルのことで、sendmailであればsendmail.cfにあたるものです。
 この点、始めにちょっと戸惑います。
 作成方法ですが、制御ファイル「me」に「hogehoge.jp」を設定する場合は「me」というテキストファイルを作って、内容を「hogehoge.jp」にします。つまりコマンドで表現するならば、

# echo hogehoge.jp > /var/qmail/control/me

となります。
 制御ファイルに関しては別記「qmailのファイル構成」の「制御ファイル」で解説していますが、主要ファイルは以下の通りです(以下の例ではホスト名を「mail.hogehoge.jp」と仮定しています)。

  • 制御ファイル「me」・・・mail.hogehoge.jp

  • 制御ファイル「defaultdomain」・・・hogehoge.jp

  • 制御ファイル「locals」・・・mail.hogehoge.jp

  • 制御ファイル「rcpthosts」・・・mail.hogehoge.jp


 「me」は絶対に必要です。これがないとqmailは動きません。他の制御ファイルが無い場合は決められた値がセットされたことになります。
 ちなみに「me」は自ホスト名。「defaultdomain」はメアドでホスト名(@より右)を省略したときに自動補完されるホスト名。「locals」はローカルサーバとみなすホスト名。rcphostsは主にSPAM対策用ですがそのホスト名のアドレス以外宛先への転送を許可しないという設定です。
※つまり上記の設定だと自ホスト以外へメールを送れなくなりますけど、それを可能にする方法は後ほど解説します。とりあえずこの設定をしないと公開して1日もすればSPAMの温床になります。

11、エイリアスファイル


 メールサーバを運用する際に必要なメールアドレスは、当然メールを使うユーザのアドレスを準備すればいいのですが、それ以外にも必要なメールアドレスが存在します。
 それぞれのメールアドレスを作ってもいいのですが、受け取る方にしてみればえらい面倒なことなので、それらのメールを「エイリアスファイル」に定義することにより、特定のユーザにメールを転送することが出来ます。
※つまり、sendmailのエイリアスと同じ意味
 最低限必要そうなのは、postmaster、MAILER-DAEMON、root宛のメールなので、ここでは例として「user」ユーザのエイルアスに設定し、「user」がメールを受け取るようにします。

echo user > /var/qmail/alias/.qmail-mailer-daemon
echo user > /var/qmail/alias/.qmail-postmaster
echo user > /var/qmail/alias/.qmail-root

※qmailはユーザ名を全て小文字で設定する。
 このように、「/var/wmail/alias」に「.qmail-宛先ユーザ名」というファイルを作って、そのファイルの内容に転送先のユーザ名を設定すればエイリアスの設定は完了です。
 なお、/var/qmail/alias、及び各エイリアスファイルは「chmod 644」のパーミッションに設定しておきましょう。

12、sendmailとの互換性


 よく、CGIのフォームメールなどで、sendmailの実行ファイルを直接起動することがあります。qmailをインストールするとそのままでは当然sendmailを呼び出すことが出来なくなる為、以下のようにして対策することが出来ます。
sendmailを探す。
 「# find / -name sendmail」コマンドなどを使ってsendmailを探します。ここで見つかるのは設定ファイルだったり、エイリアスだったりする場合もあるので、その点も確認しておいてください。
※ちなみに「/var/qmail/bin/sendmail」というファイルが見つかると思いますが、これがqmail版sendmail実行ファイルです(なんか妙な表現だな^^;)。これは消してはいけません。
 RedHatの7系でチェックしたところ、以下のようなシンボリックリンク構造になってました。

/usr/lib/sendmail → ../sbin/sendmail
/usr/sbin/sendmail → /etc/alternatives/mta
/etc/alternatives/mta → /usr/sbin/sendmail.sendmail

 えらいややこしいですけど、「/usr/sbin/sendmail.sendmail」が本体でしたので、以下のようにして「/var/qmail/bin/sendmail」に置き換えます。

# chmod 0 /usr/sbin/sendmail.sendmail

 ※ローカルハッキング防止の為、権限を外しましょう。ほおって置くとバッファーオーバフローの問題が見つかったらroot権限が取られます。

# mv /usr/sbin/sendmail.sendmail /usr/sbin/sendmail.sendmail.org
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail.sendmail

13、ローカル配信先の考慮


 qmailではsendmail等でおなじみのメールボックス(/var/mailや/var/spool/mail等)にメールを蓄積する方法の他に、「Maildir」という独自の方式がります。
 さらに、基本的にユーザのホームディレクトリ毎にメールボックスを作成します。
 Mailboxか、Maildirかでqmailの起動方法も異なりますが、それは後ほど設定します。
 sendmail等のメールサーバでは通常受信したメールを「/var/mail/ユーザ名」や「/var/spool/mail/ユーザ名」というファイルに蓄積し、そのデータをpop3などを利用してユーザは引き出します。qmailではこの「Mailbox方式」の他に「Maildir方式」を利用することが出来ます。それぞれの特徴は以下のとおりです。
Mailbox

 一般的。

 データ破損に弱い(1ユーザに付き、一つのファイルなので、ファイルが壊れるとそのユーザの蓄積されたメールが全部見えなくなる可能性がある)。

 メールが増えると重くなる。



Maildir

 qmail独自色が強い。他のデーモンとの兼合いに注意が必要。

 データ破損に強い(ファイルが細分化されて保存されるため、1個のファイルが壊れても、他のメールに影響が出ない)。

 メールの増大に強い。



 pop3を使う分にはほとんど問題無いですが、imapを使う場合はMaildirはダメだと思った方がいいです。
※imapデーモンの種類によってはパッチが提供されてるのもあるが、パフォーマンスに難があるらしい。

14、メールボックスの作成


 「Mailbox」と「Maildir」で方法が異なります。
-sendmail互換のメールボックス
 qmailでは「/home/ユーザ名/Mailbox」にメールが蓄えられるので、それを作成して、シンボリックリンクをはります。

1、# mv /var/mail/ユーザ名 /home/ユーザ名/Mailbox
2、# ls -s /home/ユーザ名/Mailbox /var/mail/ユーザ名

※もともとメールボックスが無い時は、「/home/ユーザ名/Mailbox」という空のファイルを作ってリンクを張ってもOK。
※最近のRedHatなどのディストリビューションは「/var/mail」が「/var/spool/mail」のシンボリックリンクになってるようなので、操作する前によく確認してください。
-Maildir
 作業はrootでは無く、各ユーザの権限で行います。

1、# su ユーザ名
2、$ cd
3、$ /var/qmail/bin/maildirmake /home/ユーザ名/Maildir

15、起動テスト


 ここまで設定されていれば、qmailは一応動きます。最終的には起動スクリプトを作ったりとかしないとダメですが、とりあえず「qmailのテスト」を参考にしてテストしてみるといいかも知れません。

16、スーパサーバの設定


 SMTPデーモンである「qmail-smtpd」は外部にポート(TCP25番)を開放するのでアクセス制限を施す必要があります。
 基本的にはSMTPポートは開放するのですが、たとえばSPAMメール対策の為に、特定ユーザのみ中継を許可すると言うような設定が必要になります。
 通常のデーモンはinetdやxinetdなどを使用しますが、qmailはucspi-tcpがいいので、別記の「ucspi-tcpのインストール」を参照し、インストールとルールデータベース「tcp.smtpd.cdb」を作ります。
 インストール方法は、「ucspi-tcpのインストール」で解説しています。
※inetd等でも動きますけど、さまざまな機能(APOPとか、POP before SMTP)を実装する際に非常に面倒になるので、ucspi-tcpをお勧めします。
※どうしてもxinetdがいい人は「xinetdでの設定」を見てください。

17、起動スクリプトの作成


 初めて起動するときは、シェルを別に開いておき、「tail -f /var/log/maillog」当たりを監視しながら起動チェックした方がいいです。
 起動スクリプトでは、スーパデーモンとして、ucspi-tcpに含まれるtcpserverや、xinetd、inetdなどを使用することが出来ます(どれでも大丈夫ですが、pop3の関連ツールに影響が出る場合があります)。ここの解説はtcpserverを利用しています。xinetdは次で解説しています。

qmail起動スクリプト


/var/qmail/rc(chmod 705)

#!/bin/sh
exec env – PATH="/var/qmail/bin:$PATH" \
qmail-start ./Mailbox splogger qmail&
/usr/local/bin/tcpserver -R -H -x \
/etc/tcp.smtp.cdb -v -u 503 -g 502 0 smtp \
/var/qmail/bin/qmail-smtpd 2>&1 | \
/var/qmail/bin/splogger smtpd 3 &

 qmail本体(qmail-start:3〜4行)及びsmtpデーモン(qmail-smtpd:6〜9行)の起動サンプル。qmail-smtpdはアクセス制御の為にtcpserverを使っている。
 上記の例は「Mailbox」対応版です、「Maildir」に対応させるには、4行目を以下のように書きます。

qmail-start ./Maildir/ splogger qmail&
※「./Maildir」の後ろのスラッシュ(/)を絶対に忘れないこと。

 qmailは基本的に後ろにスラッシュがあるか無いかで、MailboxかMaildirかを判断します。
 tcpserverを使うには、「ucspi-tcp」をインストールし、SMTPのアクセス制御データベースである「/etc/tcp.smtp.cdb」を作成しなければならない。
 7行目の「-u 503 -g 502」の「-u」は「qmaild」のユーザID、「-g」は「nofiles」のグループIDです。「/etc/passwd」と「/etc/group」を参照して設定してください。

自動起動スクリプト(/etc/init.d/qmail)


※「/var/qmail/rc」を参照してます。

#!/bin/sh
PATH=/var/qmail/bin
export PATH
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
${NETWORKING} = &quot;no&quot; && exit 0
-f /var/qmail/bin/qmail-start || exit 0
case "$1" in
start)
echo -n "Starting qmail:"
daemon /var/qmail/rc
echo
;;
stop)
echo -n "Stopping qmail:"
killproc qmail-send
killproc /usr/local/bin/tcpserver
echo
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage : $0 {start|stop|restart}"
exit 1
esac
exit 0

 RedHatやTurboLinux等で使用される起動スクリプトの例。ちょっと内容がテキトウです(^^;;。
※最近のRedHatでは記述方法が根本的に変わっちゃってるみたいです。
 もしかすると、所々うまく動作しないかもしれません。
「/var/init.d/qmail start」で起動。「/var/init.d/qmail stop」で終了できる。始めの数行は一般的な初期化コマンドで、ディストリビューションやそのバージョンによって違うので、別のファイルを参照した方がいい。
 ここの例では「/var/qmail/rc」で、幾つかのデーモンを起動するので、それを終了するのに2つのkillprocが必要となる。tcpserverを使わないなら「killproc /usr/local/bin/tcpserver」はいらない。
※ちなみに上記の例だと、qmail以外でtcpserverが起動している場合に、他のtcpserverも全て落としてしまうので注意が必要。

17.5、xinetdでの設定


 ひょんなことからxinetdでテストする機会があったので設定を記載しておきます(検索すれば何処にでもでてますが、、、(^^;;;)。

  • /etc/xinetd.d/qmail-smtp



service smtp
{
disable = yes
flags = REUSE NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = qmaild
server = /usr/sbin/tcpd
server_args = /var/qmail/bin/tcp-env /var/qmail/bin/qmail-smtpd
}

 これはsmtpデーモンだけなので、qmail-startとpop3デーモンは別途起動してください。
※popは「POP3デーモン・・・qpopperの導入(MailboxとAPOP)」あたりに書いてあります。

18、POP3の設定


 ここまで設定すればサーバ間のメール交換はできるはずです。最後に受信したメールをクライアントで見れるようにPOP3の設定をします。POP3はさまざまな形態により使用するソフトが違うので「POP3デーモン・・・総合解説」を参照してください。

qmailのファイル構成


 qmailが軽量であると言われる最大の理由でもあり、初心者にとっての一番の鬼門ともなるのが、その関連ファイルの多さです。
 ここでは、qmailのファイル構成を解説します。qmailを始めた方は、読む必要無い(というか混乱を招くだけだと思います)ですが、制御ファイルはかなり重要なので、実際の運用時には気にしてください。

システムプログラム


 メール送受信などに利用されるプログラムです。デフォルトで/var/qmail/binに配置されています。
qmail-clean
 キューからメールを削除するプログラム。送信できなかったり、送信中にエラーが発生して時間内に処理できなかったファイルを削除する。

qmail-inject
 ローカルユーザが送信したメールをメールキューに入れるプログラム。

qmail-pop3d
 pop3デーモン。

qmail-popup
 pop3用の認証プログラム。pop3とapopを使用可能。

qmail-qmtpd
 qmail独自のプロトコルであるqmtp関連のファイルだが、ここでは扱ってないので略。

qmail-queue
 受信したメールをキューに収める。

qmail-send
 メールキューの状態を判断し、メールの送信先(ローカルかリモートか)やメールの破棄などを判断する。

qmail-lspawn
 ローカル宛のメールの配信をスケジュールする。

qmail-rspawn
 リモート宛のメールの配信をスケジュールする。

qmail-local
 ローカルユーザのメールボックスにメールを入れるプログラム。

qmail-remote
 リモートユーザにメールを送信する。

sendmail
 sendmail互換用のプログラム。

splogger
 ロギングプログラム。syslogdでは信頼できないから独自のプログラムを持ってるらしい(ちゃんとsyslogd.confに応じた挙動をしますが)。

制御ファイル


 制御ファイルの解説を書くのをすっかり忘れてました(^^ゞ
※っていうか書いたけど、消えてしまったようなので書き直してます。その為、書いてる途中の項目が非常に多いです。
 制御ファイルは通常「/var/qmail/control」というディレクトリに格納されます。いわゆる設定ファイルなのですが、記述方法が独特です。たとえば「me」という値に「d77.jp」を設定したい場合は、「/var/qmail/control」ディレクトリに「me」というファイルを作成し、その内容を「d77.jp」と記述します。コマンドで示すと

echo d77.jp > /var/qmail/control/me

となります。
badmailfrom
 受信拒否をするメールアドレスを指定します。たとえば「aaa@aaa.sample」というメールアドレスからのメールを受信したくない場合は、「aaa@aaa.sample」と書き込みます。「aaa.sample」ドメインから受信したくなければ「@aaa.sample」と記述します。

bouncefrom、bouncehost、doublebounceto、doublebouncehost

 バウンスメール(送信エラー時のメール)の返信先を指定します。 ダブルバウンスメールはバウンスメールがさらにエラーで返信された場合に指定する値です。

 bouncefrom、doublebouncetoはユーザ名、bouncehost、doublebouncehostはホスト名です。初期値はbouncefromが「MAILER-DAEMON」、doublebouncetoが「postmaster」、bouncehost、doublebouncehostが制御ファイル「me」と同様の値です。



concurrencylocal/concurrencyremote

 qmailが同時に実行できる配信プロセス数の指定です。local、remoteはその名のとおりローカル配信とリモート配信です。大きすぎると(メールが多い場合)負荷が高くなりますが、少なすぎるメールの配信が遅くなります。詳細は「制御ファイルの実践向け設定」を見てください。初期値はlocalが10、remoteが20で、指定可能な最大値はコンパイル前のconf-spawnの設定に準じます。conf-spawnは初期値は120、最大が255。



defaultdomain/defaulthost
 メールアドレスのドメイン名とホスト名を省略した場合に補完する値を指定します。省略するとmeと同じ値になります。

databytes
 受け取ることができるメールの最大容量(Byte)を指定します。初期値はゼロ(無制限)です。2MByteまでのメールしか受け取らない場合は「2000000」を指定します。

idhost
 メールヘッダー内のMessage-IDフィールドの作成に使用するホスト名を指定します。初期値は「me」と同じです。

locals
 qmailがローカルアドレスとみなすホスト名を指定します。初期値は「me」と同じです。

me
 サーバのローカルメールアドレスを指定します。meが設定されてないとqmailは動きません。複数指定したい場合はlocalsを使用しますが、他の設定は主にmeを参照することに注意してください。

rcpthosts、morercpthosts:

 qmailが受信可能なメール(の送信先)のホスト名を指定する。この値を無視したい場合は環境変数「RELAYCLIENT」を設定する。つまり内部ユーザが他のサーバのユーザにメールを送る場合も環境変数を設定しないと送信できない。

 初期値は「無し」であり、この場合、すべてのメールの転送を許可する為、公開サーバの場合はSPAMメールの温床となるので必ず設定すること。



queuelifetime
 メールキューの保管期間。初期値は604800(秒)。

localiphost/percenthack/plusdomain/qmqpservers/smtpgreeting/smtproutes/timeoutconnect/timeoutremote/timeoutsmtpd/virtualdomains

制御ファイルの実践向け設定


 だらだらと解説してもピンと来ないかと思うんで、ここでは実際に実用で使うような設定に関して解説します。
最低限必要な設定
 他でも散々書いてますが、制御ファイル「me」は必須です。

これは設定した方がいいと思われる設定

 「concurrencylocal」と「concurrencyremote」。制御ファイルの方でも解説してますが、デフォルトでは配信数が少なすぎです。特に最近のディストリビューションはよく「root」宛にメールを送るので、「concurrencylocal」は50くらいでもいいと思います。

 この設定は「/var/log/maillog」で「Sep 2 17:53:56 hogehoge qmail: 1030956836.627728 status: local 0/10 remote 0/20」と表示されますので、頻繁に「local 10/10」とか「remote 20/20」と表示される場合はメールキューに溜まりすぎなので、それを目安として増やすといいでしょう(増やし過ぎないように)。



SPAM対策/セキュリティ

 別記で解説しますが、制御ファイルでは「rcpthosts」くらいしか使用しません。

※というか「rcpthosts」(と環境変数「RELAYCLIENT」)を使いこなせるようになるまで、外向けにサーバを公開しないこと。

 また、セキュリティ対策で外向け/内向けにサーバを分けたいときは「smtproute」を使用します。



ユーザ制限

 企業内メールサーバ等で、画像を貼り付けまくったMicrosoftWordのファイルを全社員に送ってサーバをパンクさせるような奴を抑制したい時は「databytes」を設定しましょう。



なんか凝りたい

 「smtpgreething」に凝ったグリーティングメッセージを書きましょう。ただし、気づいてくれる人はほとんどいません。



ネットワーク/サーバが極端に遅い環境での利用

 メールの数が増えないとあまり関係無いですが、「timeoutxxx」関連の設定を増やす必要はあるかも。

qmailのテスト


 ここではqmailの動作テストの方法について解説します。あくまでも基本的な動作テストの方法だけなので、SPAM対策とかの動作テストは他のコラムにて解説します。

テストの基本


 qmailは「/var/log/maillog」にログを出力します(正確にはsploggerやsyslogdの仕事だが)。これを見ずに問題の原因究明は出来ませんので、テスト中は常に監視してください。「tail -f /var/log/maillog」などのコマンドが便利です。
※/var/log/messagesも見ておいたほうがいいかも。

qmailの手動起動


 qmailを起動させるには、qmailの本体部分とも言える「qmail-start」とSMTPデーモンである「qmail-smtpd」を起動させる必要があります(受信したメールを見るのにPOPデーモンも必要かも知れませんが、テスト段階ではPOPは無くても問題ありません)。
 いずれともroot権限で起動します。

  • qmail-startの起動


 メールの蓄積を「/home/xxxx/Mailbox」にするか「/home/xxxx/Maildir」にするかによって違います(ここで/var/mailとかじゃないの?って疑問に思う人はインストールのところを読み直してください)。

Mailbox
qmail-start ./Mailbox splogger qmail&


Maildir(「Maildir」の後のスラッシュは必須です)
qmail-start ./Maildir/ splogger qmail&

※「qmail-start」、「splogger」は「/var/qmail/bin」にあります。

  • qmail-smtpdの起動


 qmail-smtpd 2>&1 | splogger smtpd 3&
※「qmail-smtpd」も「/var/qmail/bin」にあります。
 これでメールの送受信は可能です(ただし、rcpthostsの内容によっては受信できません)。
 あくまでもテスト起動なので終わったら落としましょう。killコマンドでqmail-sendとqmail-smtpdを落とせばOKです。

qmail起動時の動作


 qmail起動直後は「ps ax」コマンドなどでプロセスの状態を確認します。通常、「/var/qmail/bin/qmail-start」で起動した場合は以下の内容がプロセスリストに載ります。

qmail-send
splogger qmail
qmail-lspawn ./Mailbox
qmail-rspawn
qmail-clean

※上記は「qmail-start ./Mailbox splogger qmail&」で起動した場合の例。当然「./Maildir/」とかで起動した場合は違う表示になったりもします。
 手動でこのプロセスを停止したい場合は「qmail-send」のみを殺してください。それで全て止まります。
 「/var/qmail/bin/qmail-smtpd」を起動した場合のプロセスは以下の2つです。
※起動方法によって表示は異なりますが、ここではtcpserverを利用して起動した場合の例です。

/usr/local/bin/tcpserver 云々
/var/qmail/bin/splogger smtpd 3

 これらが動いてなければこれ以降のテストが出来ないので、設定ファイルなどをチェックして正しく起動できるようにしなければなりません。
 起動後に「qmail-remote」のプロセスが多量に発生する場合があります。これはキューに溜まったメールを吐き出す為の処理です。ただ、この処理は一瞬で終わりますが、終わらないときは何かしらの問題が起きていることが予想されますので、ログを見ましょう。この問題は制御ファイルの記述ミスか、tcpserverのルールのミスの場合がほとんどです。
※qmailはデフォルトで10〜20通分ずつメールを処理します(ローカルとリモートで違う)。これは2、3分で10〜20通しか送らないので、100通くらい溜まってると、全てのメールを処理するのに30分くらいかかります。詳しくは制御ファイル「concurrencylocal」「concurrencyremote」で解説しています。

ucspi-tcpのインストール


 ucspi-tcpはinetdやxinetd等のスーパサーバのような物です。qmailを使うときはこのucspi-tcpを使うといいでしょう。
 ucspi-tcpを推奨する理由はその特徴から来る理由も当然ありますが、何よりqmailと相性がいいというのがあります。xinetdとqmailのセットはいろいろ考えなければならないことが多いし、いろいろなサイトにも書かれてるとおり、設定上でよくわからない部分があります。

ucspi-tcpのインストール


 まずソースコードをhttp://cr.yp.to/ucspi-tcp.htmlから入手します。ダウンロードしたら以下の手順で展開/コンパイル、インストールします。

$ su
# tar zxvf ucspi-tcp-0.88.tar.gz -C /usr/local/src
# cd /usr/local/src/ucspi-tcp-0.88
# make setup check

 makeはroot権限が必要なので初めからsuしてます。
※qmail-vidaを使う場合はmakeの前にパッチを当てる必要があります。

設定


 qmailで、spamを防ぐ方法として、制御ファイル「/var/qmail/control/rcpthosts」に自ドメイン名を設定するのが一般的です(たとえば「d77.jp」と書くと、d77.jp宛のメールしか受信しなくなります)。
「/var/qmail/control/rcpthosts」に「d77.jp」を設定した場合のメールの動作。
○:d77.jp→d77.jp
○:他ドメイン→d77.jp
×:他ドメイン→他ドメイン
×:d77.jp→他ドメイン
 これで一見spamからの防衛が出来るように見えますが、実際は大きな問題があります。外部から見れば「d77.jp」宛しか受け取らないので、当然不正中継が不可能ですが、内部ユーザが他のドメイン宛にメールを送信する場合(d77.jp→他ドメイン)は、宛先が自ドメインではないため、spamという扱いにされ送信できなくなります(サーバプログラムがメールを受け取らない)。
 これを回避する為の一般的な方法として、内部IP(ここでは例として192.168.1.0/24とします)からとローカルホストからメールを受け取った場合ときのみ「rcpthosts」の設定を無視するという方法を用います。
 これをucspi-tcpで実現する為に、具体的には「192.168.1.と127.0.0.からのメールに関しては環境変数に「RELAYCLIENT=""(rcpthostsを無視する環境変数)」を設定する」という方法を用います。
 まず、以下の手順でSMTPのルールデータベースを作成します。
1、rules.txtというファイルを作る。内容は

192.168.1.:allow,RELAYCLIENT=""
127.0.0.:allow,RELAYCLIENT=""
:deny

 という3行です。1、2行目はアクセス元が「192.168.1.」と「127.0.0.」だった場合にのみ通信を許可(allow)し、さらに「RELAYCLIENT=""」を指定しています。3行目はそれ以外は全て拒否という意味です。「ゲートウエイのIP:deny」なんて設定も追加すると、うっかりルータが乗っ取られたとしても、そこからのアクセスを拒否できたりします。
2、rules.txtからルールデータベースを作成
 以下のコマンドでルールデータベース「rules.cdb」を作ります。

# cat rules.txt | tcprules rules.cdb rules.tmp

 そして、/etcにコピー

# cp rules.cdb tcp.smtp.cdb

3、起動

tcpserver -v -p -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd

 これで、「qmail-smtpd」に「tcp.smtp.cdb」のルールを適用することが出来ます。
 起動スクリプトの記述方法に関しては「qmailのインストール」→「起動スクリプトサンプル」付近を見てください。

SPAMメール/迷惑メール対策


 ここではqmailでのSPAMメールの対策方法を記述します。

Firewallやルータなどによる遮断


 たとえばWebサーバなどを運用していて、Webフォームからメールを送信するだけにメールを使用する場合は、受信の必要が無いので、WAN側からのSMTP接続(TCP:25番)を遮断すると確実です。
 inetdやtcpserver(ucspi-tcp)などでの遮断も有効です(この場合は自分自身「127.0.0.1」のみ許可)。

中継を一切禁止


 「/var/qmail/control/rcpthosts」に自分のホスト名を記述します。たとえば自ホストのメールアドレスが「hoge@example.jp」の場合は「/var/qmail/control/rcpthosts」に「example.jp」と書きます。
 これにより、「/var/qmail/control/rcpthosts」に記述されたホスト宛のメールしか受信しなくなります。
 上記の例(example.jpと書いた場合)は、「xxx@example.jp」宛のメールしか受信しなくなります。たとえ送信元が「example.jp」でも、送信先が別のホストの場合は以下のエラーを返します。

553 sorry, that domain isn’t in my list of allowed rcpthosts (#5.7.1)

 ちなみにこれをやると、内部ユーザもメールを送信できなくなります(内部ユーザが送信する場合は宛先が指定されていないホストになる為です)。これの回避方法は次の環境変数を使います。

一部のユーザのみ中継許可


 qmailのサーバを利用して、外部にメールを送信したい場合は、qmailのサーバが中継を許可していなければなりません。
 たとえば、「hoge@example.jp」というメールアドレスの人が、ホスト「example.jp」を利用して、「xxx@yyy.com.jp」へメールを送信したい場合、「/var/qmail/control/rcpthosts」で、「example.jpのみを受信」できる設定にしていると、「hoge@example.jp」からの送信も出来なくなってしまいます。
「/var/qmail/control/rcpthosts」に「example.jp」を設定した場合のメールの動作。

○:example.jp→example.jp
○:他ドメイン→example.jp
×:他ドメイン→他ドメイン
×:example.jp→他ドメイン  ←この部分が自分自身にも適用されてしまうのが問題。

 この場合は環境変数「RELAYCLIENT」を利用します。qmailでは基本的に、「/var/qmail/control/云々」よりも環境変数の値を優先しまので、「特定のIPアドレスから接続してきた人のみrcpthostsの設定を無効(環境変数:RELAYCLIENT="")にする」という方式をとります。
 たとえば、内部ユーザが「192.168.0.xxx」というIPアドレスの場合、tcpserverなどのスーパーサーバを使ってsmtpポートに対し、以下のような設定をします。

192.168.0.:allow,RELAYCLIENT=""

※tcpserverの説明は「ucspi-tcpのインストール」で詳しく解説しています。
 こうすると、内部ユーザ「192.168.0.xxx」がsmtpへ接続された場合、「RELAYCLIENT=""」という環境変数が有効になり、「/var/qmail/control/rcpthosts」が無視されます。「RELAYCLIENT=""」は「全ての中継を許可」の意味なので、指定されたIPのユーザのみが中継可能になるというわけです。

大きなサイズのメールを受け取らない


 「/var/qmail/control/databytes」で受信データのバイト数を指定できます。上限をどのくらいにするかは難しいところですが、以下のような値が目安でしょうか?
画像データをよく受け取る。
 1024×768のフルカラービットマップが大体1MByte強なので、1.5〜2MByteくらいでしょう。ただし、イラストレータ系の人は20MByteと平気で超えます。そういう人はメールで送らないでFTPや物理的なメールを使いましょう。

mp3などの音楽データ
 クラシックなどの長いものでなければ大体3MByte〜4MByteですね。

ビジネスメール

 たまに20MByte近いパワーポイントデータを送る方がいますが、そういうのを許可してたらサーバ負荷でビジネスどころではないので、5Mbyteくらいに制限してやりましょう。パワーポイントも画像をベタベタ貼らなければ1MByte超えることはないので、そういうプレゼンが不要な場合は1Mbyte位に制限しましょう。

 文書ファイルもたまに1MByteを超えることがありますけど、ビジネス用途のサーバなら2〜5Mbyteで大丈夫です。



 ちなみに容量制限オーバの場合、以下のエラーが*メールで*返送されてきます。

552 sorry, that message size exceeds my databytes limit (#5.3.4)

どこからでもメールを使いたい方法


 たとえば外出先からメールを使用したい場合、アクセス元のISPによってIPが変わる為、正規ユーザかスパマーかを判断できません。当然ながらrcphostsも使えないし、RELAYCLIENT環境変数も問題解決にはなりません。こういう場合は幾つかの方法があります。

1、あきらめる。
2、サーバにppp接続をし、そのユーザのみを許可。
3、pop before smtp(pop3で認証した後数分間だけ、そのIPにsmtp接続を許可する方法)を使用する。
4、smtp authを使用する。

 「pop before smtp」は別コラムで解説してます。
 smtp auth(SMTP認証)はその名の通りsmtpのセッションに認証するんですけど、しばらく一般的じゃないとされてあまり注目されていなかったようですね。OutlookやBecky!でも対応してるので、ちょっと興味アリ。興味のある方はqmail-vidaと言う物がよさそうですね。
※ただ、これを執筆段階では更新が止まってますし、まだβ段階のようなのでどうなんでしょうね?(追記:APOP、仮想メールボックスの併用になるとqmail-vidaしかないようです。とりあえず、別コラムを読んでください)。

フリーメールユーザや特定のメールアドレスを遮断


 「/var/qmail/control/badmailfrom」に遮断したいメールアドレスを書き込みます。たとえばメール爆弾がMicrosoftのHotmailから来る場合は、以下の2行を追加します。

@hotmail.com
@msn.com

 ホスト名だけ書くと、そこからのメール全てを遮断します。

POP3デーモン・・・総合解説


 qmailで受信したメールを読むにはPOP3デーモンを導入しなければなりません。POP3デーモンにはいくつかの種類がありますが、ここでは状況別に何がお勧めかを羅列します。
※当然、これが全てではないです。
※OutlookはAPOPには対応してないので注意(フリーウエアか何かで対応させるのはあったかも)。セキュリティを重視するのであればsmtp-authやS/MIME等を使うみたいです(ここでは解説してませんが、qmail-vidaあたりで実現できそう?)。
Maildir対応
qmail-pop3d

Mailbox対応
qpopper

APOP

qmail-pop3d + checkapoppw

qmail-pop3d + qmail-vida

qpopper



POP before SMTP
qmail-pop3d + relay-ctrl

仮想メールボックス

vpopmail(vchkpw)

qmail-pop3d + qmail-vida



※仮想メールボックスというのは、サーバアカウントが無くてもメールの送受信を可能にする為の機能です。
 デルタ的なお勧めとしては、Maildirなら「qmail-pop3d」、Mailboxなら「qpopper」で、APOPはどれでもOKです。POP before SMTPは「qpopper」ではちょっとわからないので「qmail-pop3d」しか選択の余地がありません。仮想メールボックスは上記のどちらでもいいですが、「vpopmail」でAPOPは使えないと思った方がいいです。「qmail-vida」はさまざまな機能が使えていいのですが、最近バージョンアップの話を聞かないので、仮想メールボックスがいらない人はわざわざ入れなくてもいいです。

POP3デーモン・・・qpopperの導入(MailboxとPOP/APOP)


 qmailには「qmail-pop3d」という物がありますが、sendmail互換のMailboxに対応してません。ここではsendmail互換のMailbox対応としてqpopperを紹介します。
 解説の中ではついでにAPOP対応方法も解説します。
 ちなみに、qpopperはかなりセキュリティ上の問題が多発してるので、セキュリティ情報を気にするなり、外部からの接続を遮断するなり、信頼できないユーザにアクセスさせないなど対策をとりましょう。
※だからと言ってqpopperがダメって訳ではありません。かなり一般的に広く普及しているので、信頼できると思います。
 ちなみにqmailのMailboxは「/home/ユーザ名/Mailbox」で、qpopperが参照するのは「/var/mail/ユーザ名」です。これに関しては「qmailのインストール」→「メールボックスの作成」のところに書いてますんで、注意してください。

ダウンロードとインストール


 公式サイトはhttp://www.eudora.com/qpopper/なので、そこからqpopperを落とします。今回は「qpopper4.0.4.tar.gz」というファイルを使用しました。
 ちなみにこのバージョンはセキュリティ上の問題が発見されています(T_T。
とりあえず、起動オプションに「-u」を設定しなければ問題ないらしいんで、一応気にかけておきましょう。
 では、インストール方法。
 APOPが必要な場合は以下のアカウント作成作業をします(POPではこの設定は不要)。

# groupadd pop
# useradd -g pop -d /dev/null -s /bin/false pop

 次にqpopperを展開(POP/APOP共)

$ tar zxvf qpopper4.0.4.tar.gz
$ cd qpopper4.0.4

 環境設定はAPOPに対応するかしないかで違います。APOPを使わない場合はサーバのアカウント(/etc/passwd、/etc/shadowが参照されます)。
-APOP対応

$ ./configure –enable-specialauth –enable-apop=/etc/pop.auth –with-popuid=pop

-APOP非対応(POP)

$ ./configure –enable-specialauth

※「–enable-specialauth」はシャドウパスワード対応。
 最後にメイク。

$ make

 コンパイルは以上。インストールは手動で行います。
まずは本体をコピー

# cp ./popper/popper /usr/local/bin

APOPを使う場合は、APOP用パスワード作成用ツールのpopauthのコピー(POPの場合は不要)

# cp ./popper/popauth /usr/local/bin
# chown pop /usr/local/bin/popauth

 コンパイルとインストールは以上

設定(APOPのみ必要)


 設定はAPOPを使う時のみなので、APOPに対応する必要がないなら読み飛ばしてください。
 APOP用のパスワードの作成です。まず、アカウントデータベースを初期化します。

# popauth -init

 これで「/etc/pop.auth」が出来ますが、既に存在している場合は初期化の確認メッセージ(Really initialize POP authentication DB?)が出ますんで「y」と入力すると初期化できます。
 次にユーザ名とパスワードを追加します。

# popauth -user ユーザ名

 これでパスワードを2回聞かれるので、入力すれば設定完了です。ちなみに通常のユーザからなら、

$ popauth -user

 でもOKです。
 qpopperに関する設定はこれだけでOKです。

起動設定(xinetd)


 xinetdをスーパサーバにした設定方法です。APOP対応/非対応関係無く同じ設定で行けます。まず、以下のファイルを作成します。
/etc/xinetd.d/popper

service pop3
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/local/bin/popper
server_args = -s
}

※ちなみに「inetd」で動かしたいなら、inetd.confに以下の行を追加します。

pop-3 stream tcp nowait root /usr/sbin/tcpd popper -s

 次にアクセス制限。xinetdはhosts.allowとhosts.denyで制限できます。
hosts.allow

popper:192.168.1.

※上記の例は「192.168.1.xxx」からのアクセスを許可している。必要に応じて他の設定などを追加してください。
hosts.deny

ALL:ALL

 あとはxinetdを再起動すればpop3が使用できるようになります。

起動設定(tcpserver)


 次にtcpserver上で稼動させる設定です。これもAPOP対応/非対応関係無しです。
rc.qpopper.sh

#!/bin/sh
/usr/local/bin/tcpserver -R -H -x /etc/tcp.pop3.cdb -v 0 110 /usr/local/bin/popper -s 2>&1 | /var/qmail/bin/splogger pop3d 3 &

※「-R -H」オプションを書き忘れてました。
 -R・・・通信時にIDENT(TCP113番)を飛ばさないようにする。
 -H・・・DNS検索をしない。
 デフォルトは上記両方とも「する」になってます。IDENTを通してないとタイムアウトまで26秒待たされます(通しててもクライアント側でパーソナルファイアウォールとか設定してると同じ問題が起きる)。
 これでqpopperが起動できます。ログは/var/log/messagesに「pop3d」というエントリーで記録されます。
 「/etc/tcp.pop3.cdb」はucspi-tcpで解説していますが、ルールデータベースです。変換前のデータベースの一例は以下の通りです。
tcp.pop3.txt

#!/bin/sh
192.168.1.:allow
127.0.0.:allow
:deny

※ローカルネットワーク(192.168.1.x)からの接続を許可して、それ以外は拒否という設定。
 上記のファイルを以下のコマンドで変換すればOKです。

cat tcp.pop3.txt | tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp

POP3デーモン・・・qmail-pop3dの導入(MaildirとPOP/APOP)


 ここでは「qmail-pop3d」の解説をしますが、実はqmailをインストールした段階で関連ファイル(主にqmail-popupとqmail-pop3d)がインストールされているので、改めてインストールする必要はありません。認証モジュールだけ必要なので
 ですので、既にqmailパッケージがインストール済みという前提で解説します。

認証モジュールの導入(checkpassword:POP3認証)


 qmailではqmail-popupがIDとパスワードの入力を促し、認証モジュールが認証チェックをして初めてqmail-pop3dがメールを読むことが出来ます。
 認証モジュールに関しては標準で入っていないので、導入します。
 http://cr.yp.to/checkpwd.htmlから「checkpassword」をダウンロードします。これはAPOPには対応してません。APOP対応にしたいならここを読み飛ばして次のcheckapoppwを導入してください。
 checkpasswordは良くも悪くも/etc/passwdや/etc/shadowを用いて認証します。まぁパスワード管理が楽なことがメリットでしょう。
 今回は「checkpassword-0.90.tar.gz」を使いました。ダウンロードしたら以下のようにしてインストールします。

$ su
# tar zxvf checkpassword-0.90.tar.gz -C /usr/src
# cd /usr/src/checkpassword-0.90/
# make
# make setup check

認証モジュールの導入(checkapoppw:APOP認証)(2002/09/03)


 APOPに対応するには、checkpasswordのかわりにcheckpwパッケージに含まれるcheckapoppwを利用します。
 http://checkpw.sourceforge.net/checkpw/から「checkpw」をダウンロードします。これはAPOPには対応してません。今回は「checkpw-1.00.tar.gz」を使いました。ダウンロードしたら以下のようにしてインストールします。

$ tar zxvf checkpw-1.00.tar.gz
$ cd checkpw-1.00

※設定はqmailと同様、1ファイル1設定です。

conf-home:インストール先。デフォルトは「/」(指定値にbinディレクトリを作るので実際は/bin)。
conf-qmail:qmailの所在。デフォルトは「/var/qmail」
conf-maildir:Maildirの名称。多分パスワードファイルの所在指定としてしか使われていない。デフォルトは「Maildir」。
conf-password:パスワードファイル名。デフォルトは「.password」

 以上の設定が終えたら(多分変更無しでOKですけど)メイクします。

$ make
$ su
# make setup check

※「conf-maildir」と「conf-password」の設定でパスワードファイルの位置が決まります。デフォルトは「/home/user/Maildir/.password」です。
 この認証モジュールは独自のパスワードファイルを使うので、ユーザ毎にパスワードファイルを準備する必要があります。

$ echo パスワード>/~Maildir/.password
$ chmod 600 /~Maildir/.password

 以上で設定は終わりです。パスワードがクリアテキストというのも心もとないですが、アカウントパスワードとは分断できますし、そもそもこのパスワードファイルが他人に見られるという状況=Maildirの中身も見られるということなので、まぁ問題無いでしょう。できればユーザアカウントのパスワードとは違うパスワードにした方がいいと思います。

起動設定(tcpserver)


 認証モジュールがインストールできれば、後は既にインストール済みなので、起動方法から解説します。全ての実行ファイルは特に特に指定していない物に限っては「/var/qmail/bin」にありますので、必要に応じてパスを通してください。パスはここに書いてある個所とは違う場合もあるので、事前に確認してください。
 qmail-pop3dを実行するには、スーパサーバ、認証、デーモン本体と3段階あります。まず、それぞれに関して解説します。
-まずは、スーパサーバであるtcpserverの起動設定

/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 popperプログラム

 「/etc/tcp.pop3.cdb」はucspi-tcpで解説していますが、tcpserver用のルールデータベースです。変換前のデータベースの一例は以下の通りです。
tcp.pop3.txt

#!/bin/sh
192.168.1.:allow
127.0.0.:allow
:deny

※ローカルネットワーク(192.168.1.x)からの接続を許可して、それ以外は拒否という設定。
 上記のファイルを以下のコマンドで変換すればOKです。

cat tcp.pop3.txt | tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp

-次は認証モジュールの部分です。
 書き方はAPOP対応の「checkapoppw」と「checkpasswd」で違います。
 APOP非対応

qmail-popup サーバ名 /bin/checkpassword 実行プログラム

 APOP対応

qmail-popup サーバ名 /bin/checkapoppw 実行プログラム

-最後にデーモン本体です。

qmail-pop3d Maildir 2>&1 | splogger pop3d 3

 「qmail-pop3d」自体は「qmail-pop3d Maildir」と書くだけです。画面にログを出したくないので「2>&1」と付いてます。ログはsploggerにリダイレクトします。sploggerはqmailに標準添付のロギングプログラムで、「splogger タグ ファシリティレベル」とオプションをつけます。「タグ」はログに記録される指標なので、わかりやすいように「pop3d」でOKです。ファシリティレベルはsyslogの話になってしまうのですが、簡単に説明すると「2(デフォルト)」だと/var/log/maillog、「3」だと「/var/log/messages」に出力されます。qmal-smtpdとかは「2」がいいですが、pop3dは通常「3」でOKです。
 さて、実際に実行するときはこれらをいっぺんに起動します。IPレベルでの接続をスーパサーバで振り分け→認証部分でPOP3認証→POP3の処理です。起動時はこれをいっぺんに書きます。
-非APOP

/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup サーバ名 \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
/var/qmail/bin/splogger pop3d 3&

-APOP

/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup サーバ名 /bin/checkapoppw \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
/var/qmail/bin/splogger pop3d 3&

 微妙に違っているところはバックグラウンドで動かさないとダメ(ダメって訳ではないがデーモンをフォアで動かしても意味がない)なので、最後に「&」が付いてます。サーバ名はメールサーバの名前なので「mail.hogehoge.jp」なら、それをそのまま書きます。
 あとはそれをスクリプトにしちゃいましょう。以下はサーバ名を「mail.hogehoge.jp」、APOP対応で起動する場合のスクリプトです。
※APOPに対応しない場合はcheckapoppwをcheckpasswdに書き換えるだけです。
-/var/qmail/rc.qmail-pop3d

#!/bin/sh
/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup mail.hogehoge.jp /bin/checkapoppw \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 |\
/var/qmail/bin/splogger pop3d 3&

 これでOKです。

(余談)動作チェック


 うまく動かない場合などはtcpserver等を使わないで起動したり、コマンドラインから起動することも出来ます。コマンドラインからは以下のコマンドで起動できます。
※以下はAPOPの場合。POPはcheckapoppwをcheckpasswdに書き直す。

/var/qmail/bin/qmail-popup サーバ名 /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir 2>&1

 ちなみにこの方法だとフロントエンドで動くのでctrl+cを押すまでプロンプトが帰ってきません。また、ログは標準出力に出力されるので、そのまま画面に出ます。

POP3デーモン・・・POP before SMTP対応


 通常の自宅サーバでのSPAM対策は「/var/qmail/control/rcpthosts」に自ドメインをして、送信可能なIPアドレスに対し、「RELAYCLIENT=""」という環境変数を指定すれば問題ありません。
 しかし、送信可能なIPアドレスが特定できない状況(ISPやダイヤルアップ接続ユーザ等)の場合はこの方法は使えません。
 「POP before SMTP」はこういうときに有効な手段の一つで、POP3認証を済ませたユーザだけSMTP中継を許可するというSPAM対策手法の一つです。SMTP認証(SMTP AUTH)のように認証を別々にすることによる煩わしさにも解放されます(SMTP認証の方が安全と言えば安全だが)。
 弱点としては、POP認証を済ませた後、同じIPを持つ人がきた場合(どこかのドメインでNATで振り分けられたユーザとか)に無防備になりますが、それは非常に難しいことですし、POP認証後の制限時間を短くすることによってもある程度避けられます。
 また、当然ながら、POP認証を事前に済ませる必要があるので、POP3へのアクセスも解放されて無ければなりません。
 なお、POP before SMTPを実現するのに、今回はqmail-pop3dへの機能追加という形を取っています。qpopperでがんばってみたのですがかなり大変そうなのでやめました。どうしてもMaildirがイヤだって人はqpopperでも調べれば方法があります。

インストール


 基本的にqmail-pop3dに機能追加するという方法なので、qmail-pop3dの導入は終わってるものと仮定します。APOP対応/非対応は関係なくどちらでもOKです。
 今回は「relay-ctrl」を使います。これを利用するには「daemontools」が必要になります(「daemontools」とはqmailと同じ作者が作ったツール群で、サービスが落ちたときの再起動をしてくれたりなどの便利なツールが入ってます)。今回使用するバージョンは以下のとおりです。

daemontools-0.76
relay-ctrl-3.1.1

 インストール方法は検索すればいくらでも出てくるので、簡単に解説します。

  • daemontoolsのインストール


 「http://cr.yp.to/daemontools.html」からダウンロード(How to install daemontoolsにある)。

$ su
# tar zxvf daemontools-0.76.tar.gz -C /usr/src
# cd /usr/src/admin/daemontools-0.76
# package/install


  • relay-ctrlのインストール


 「http://untroubled.org/relay-ctrl/」からダウンロード。

$ tar zxvf relay-ctrl-3.1.1.tar.gz
$ cd relay-ctrl-3.1.1
$ vi conf-man
(「/usr/local/man」を「/usr/local/share/man」に書き換える)
$ make
$ su
# ./installer

 インストールは以上です。

relay-ctrlの設定


 daemontoolsについては設定は不要です(一部のファイルを使うだけなので)。
 relay-ctrlはそのままでは動きません。以下の設定を行います。
-まず、キャッシュ(/var/spool/relay-ctrl/allow)を作成します。

# mkdir /var/spool/relay-ctrl
# mkdir /var/spool/relay-ctrl/allow
# chmod 700 /var/spool/relay-ctrl
# chmod 777 /var/spool/relay-ctrl/allow

 次に、キャッシュの位置を示す設定ファイル(/etc/relay-ctrl/RELAY_CTRL_DIR)を作成します。

# mkdir /etc/relay-ctrl
# echo "/var/spool/relay-ctrl/allow" > /etc/relay-ctrl/RELAY_CTRL_DIR

・キャッシュを操作するプログラムにsetuidの設定

# chmod u+s /usr/local/bin/relay-ctrl-allow

・キャッシュの削除の設定(要cron)
/etc/cron.d/relay-ctrl

* * * * * root /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

・キャッシュの生存時間の設定

# echo "600" > /etc/relay-ctrl/RELAY_CTRL_EXPIRY

単位は「秒」です。
 relay-ctrlの設定は以上です。
 キャッシュと生存時間に関しては、あとで解説します。

関連デーモンの設定


 まず、qmail-smtpdの起動ファイルに幾つかの指定を追加します。既存の設定に以下の強調されている部分を追加するだけでOKです。

/usr/local/bin/envdir /etc/relay-ctrl \
/usr/local/bin/relay-ctrl-chdir \
/usr/local/bin/tcpserver -R -H -x \
/etc/tcp.smtp.cdb -v -u 503 -g 502 0 smtp \
/usr/local/bin/relay-ctrl-check \
/var/qmail/bin/qmail-smtpd 2>&1 | \
/var/qmail/bin/splogger smtpd 3 &

 このとき、「tcp.smtp.cdb」に「RELAYCLIENT」の設定がされているとその設定が優先されます。
※つまり、「192.168.1.:allow,RELAYCLIENT=""」という行があった場合、「192.168.1.xxx」というIPアドレスを持つユーザはPOP認証をしなくてもSMTPによる転送が可能になります。
 次は「qmail-pop3d」関連の設定です。

/usr/local/bin/envdir /etc/relay-ctrl \
/usr/local/bin/relay-ctrl-chdir \
/usr/local/bin/tcpserver -x \
/etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup \
メールサーバ名 /bin/checkpassword \
/usr/local/bin/relay-ctrl-allow \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 \
| /var/qmail/bin/splogger pop3d 3 &

 こんな感じに追加し、各デーモンを再起動します。
APOPの場合も「 メールサーバ名 /bin/checkpassword \」の行を「 メールサーバ名 /bin/checkapoppw \」に書き換えるだけで対応できます。

動作テスト


 まず、自ドメインから外のドメインのメールに対しメール送信のチェックをします。
 送信が出来てしまったら問題です(^^;。POP before SMTPでは、POP認証を済ませないと、メール送信が出来ません。もし、認証もせずに送信できた場合は幾つかの原因が考えられます。

  • 「/var/qmail/control/rcpthosts」に自ドメインが指定されていない(指定しないとSPAMメールウェルカム状態になります)。

  • メールクライアントが親切にpop認証を事前にしてくれてる(「/var/spool/relay-ctrl/allow」にpop認証を済ませたIPアドレスのファイルが記録されるので、それを削除すれば再チェックできます)。

  • 送信者のIPからアクセスがあった場合、環境変数「RELAYCLIENT=""」がセットされてしまっている。


 送信でエラー「553 sorry,that domain isn’t in my list of allowed rcpthosts(#5.7.1)」が出ればOKです。
 次に、pop3接続をし、pop3認証を済ませます(メールの受信)。これにより、「/var/spool/relay-ctrl/認証者のIP」というファイルが作成されます(内容は「user=ユーザ名」です)。このファイルはほおって置けば消えますが、rmコマンドで手動で消せば何度でもテストできます。
 pop3認証後、メールが送信できればテスト完了です。

プロセスリストに変な物が、、、


 これらの設定が終わる頃、プロセス(ps aux)に「sh /command/svscanboot」とか、「svscan /service」とか、「readproctitle service errors: …..」とかいうものが見つかります。これらはdaemontoolsをインストールすると自動的に起動します。単に、relay-ctrlを使用するだけならメモリの無駄なので止めましょう。止め方は「/etc/inittab」にある「SV:123456:respawn:/command/svscanboot」という行をコメントアウトして再起動です。
※当然、daemontoolsを有効活用する場合はこれらのプロセスは必要です。
※それにしてもルートディレクトリにディレクトリ作るなよとか思いました(しかもインストーラではインストール先は固定になってます)。

ドメイン移行/複数ドメイン並行稼動時のqmailの設定


 このサイトのドメインはd77.jpですが、以前はdelta0.netというドメインでした。
 delta0.net(旧)はレンタルWebスペース+メールでしたので、d77.jp(新)への移行に伴い、qmailでメールサーバを構築。そして、delta0.netを業者のDNSからここのドメインへ移動してます(その証拠にwww.delta0.netとwww.d77.jpへのpingの結果は同じになると思います)。
 さて、メールの移行ですが、delta0.netへ届くメールをd77.jpで受信するのは簡単です(それも解説します)。しかし、複数のメールアドレス(例としてaaa@example.jpとbbb@example.jpとしましょう)を持っており、aaa@example.jpをaaa@example.jpへ転送する一方、bbb@example.jpは転送しないという場合もあります(bbb@example.jpは存在していたとしてもです)。
 ここでは、こういう複雑な要因が絡んだ時のqmailの設定方法を解説します。
 なお、ほとんど制御ファイル(デフォルトでは/var/qmail/control)とエイリアス(デフォルトでは/var/qmail/alias)の設定で解決します。

複数ドメインの平行稼動


 DNSの設定に関しては解説しませんが、とりあえず正引きデータは2つ分用意し、それぞれMXレコードを定義します。うちではdelta0.netへのメールは、d77.jpが管理するような設定にしてありますが、まぁ特に凝った設定は必要ありません。優先度も同一でいいです(1つのサーバに優先も何もないですから)。
 次にqmailの設定です。既に一方のドメインで正常稼動する状態であるとします。ここでは、d77.jpでqmailが稼動しており、そこにdelta0.netドメインを追加します。
 重要な制御ファイルは2つ、「locals」と「rcpthosts」です。「me」は1ドメインしか書けないのでここでは関係ありません。
 「locals」には、複数のドメイン、、、例に沿って説明すると「d77.jp」と「delta0.net」を記述します。基本的にはこれで複数ドメインに対応完了ですが、「rcpthosts」も設定しないとSPAMと勘違いされて遮断されますの。基本的には「rcpthosts」の内容は「locals」と同じになります。環境によってもしかすると違う設定になるかも知れませんので注意が必要です。
 設定はこれで完了。ちなみに「rcpthosts」は変更後即座に反映されるようですが、「locals」はqmailを再起動しないと反映されないようです(これで一日悩みました^^;)。
 再起動しなかったり、間違えた設定をすると「Sorry. Although I’m listed as a best-preference MX or A for that host,it isn’t in my control/locals file, so I don’t treat it as local. (#5.4.6)」のようなエラーが出ます。

特定のメールを受信する。(2002/10/29)


 ここで解説するのは、たとえば、example.jp1とexample.jp2というドメインを並行稼動していた場合に、以下のようなパターンでメールを受信したい場合の設定です。
※全て例のメアドなので、送っても無駄です。

aaa@example.jp1:通常に受信
aaa@example.jp2:aaa@example.jp1で受信。
bbb@example.jp1:通常に受信
bbb@example.jp2:受信しない(そんな人はいない旨のエラーを出す)。

 まず、必要なのが制御ファイル「rcpthosts」。これに受信する全てのドメインを記述します。上記の例なら、「example.jp1」と「example.jp2」です。ちなみに「locals」は不要です。
 次に制御ファイル「virtualdomains」を設定します。設定内容は「2つ目のドメイン:転送用の名前」です。転送用の名前は何でもいいですけど、次のaliasに影響します。例として「transfar」とした場合、上記の例と照らし合わせると「example.jp2:transfar」です。
 こうすると何が起きるかと言うと、「aaa@example.jp2」へメールを送ったとき、「transfar-aaa@example.jp1(転送用の名前-メアドのユーザ名@制御ファイルmeのドメイン)」というメールアドレスとして受信します。
 さて、これにより、「aaa@example.jp2」は「transfar-aaa@example.jp1」へ「bbb@example.jp2」は「transfar-bbb@example.jp2」へ送られるようになります。当然「transfar-???@example.jp1」というメールボックスが無ければエラーになります。というかそういうメールボックスは無いように制御ファイル「virtualdomains」を設定してください。
 最後に「aaa@example.jp2:aaa@example.jp1で受信」という設定をします」。上記の設定により「aaa@example.jp2」は「transfar-aaa@example.jp1」へ送られるようになったので、エイリアスを設定してやれば「transfar-aaa@example.jp1」を「aaa@example.jp2」へ送ることが出来ます。
 エイリアスの設定はエイリアスディレクトリ(デフォルトで「/var/qmail/alias/」)に「.qmail-transfar-aaa(.qmail-転送元アドレスのユーザ名)」というファイルを作成し、内容を「aaa」とするだけです。
 これにより、「aaa@example.jp2」は「transfar-aaa@example.jp1」として受信され、エイリアスにより「aaa@example.jp1」で受信可能となるわけです。
「bbb@example.jp1」のようにエイリアス設定されていないメールは、メールボックスが無いので、送信元に「Sorry, no mailbox here by that name. (#5.1.1)」というメールが返信されます。

apache2.0系

Apacheの概要


 Apacheとはwwwサーバソフトウエアで、主にWebサイトを閲覧する為の機能が実装されています。同じようなwwwサーバで有名なものにMicrosoftのIIS(Internet Infomation Server)がありますが(有名な理由は機能よりも、、、以下略)、それらの前身はスイスの欧州粒子物理学研究所(CERN)や、アメリカのNCSAのWebサーバが有名です。5年くらい前にCGIをいじってた人なら、この辺のことを知ってるかと思いますが、今となってはもはや昔のこととなってしまいました。
 ApacheはアメリカのNCSAベースのWebサーバにパッチをあてたことから始まり、一説によると名前の由来も「a pach」をもじってるそうです。
 歴史はともかくとして、今や世界No1のシェアであり、ほとんどのOSを網羅している上にタダで利用出来るところがなんとも喜ばしいソフトウエアです。
NetCraftによるシェア情報

前置き

 ここでの解説は特に明記されていない限り、apache2.0.43(httpd-2.0.43.tar.gz)を使用しています。バージョンの違いによる差異はほとんど無いアプリケーションですが、頻繁にバージョンアップ(主にセキュリティ関連)されていますので、なるべく最新のものを使用してください。

インストール

 ここでは基本的なインストール方法を解説します。apacheはさまざまなモジュールを使えます。各モジュールの説明は後半の章で解説しますが、コンパイルの時点で記述しなければならない設定もあります。コンパイルの時点で書く内容は可能な限りここの章で解説しますが、他の機能を入れたい場合に再コンパイルが必要になる場合があることに注意してください。

ダウンロード&インストール


 デフォルトインストール方法です。
 まずはapacheをダウンロードします。apacheはApache Software Foundation(ASF:http://www.apache.org/)からダウンロードできます。現在はapache1.3.xx系とapache2.0.xx系をダウンロードできます。ここでは、apache2.0を落とします。
例)$ wget http://www.apache.org/dist/httpd/httpd-2.0.43.tar.gz
 ダウンロードが終わったら展開します。

$ tar zxvf httpd-2.0.43.tar.gz
$ cd httpd-2.0.43.tar.gz

 次に環境設定→コンパイル→インストールをします。大分大きいので時間がかかります。なお、インストール先は「/usr/local/apache2」なので、既にapache1.3系を運用していても上書きはされません(ポート番号が重複しなければ同時起動も可能です)。
※実際は「./configure」でモジュール等の追加が必要になる場合があります。詳細は次の項で説明します。

$ ./configure
$ make
$ su
# make install

 これでインストールは完了です。

モジュールとDSO

 apacheはさまざまモジュールを追加することにより機能拡張が可能です。モジュールの追加には2つの方法があります。
 ひとつはapacheのデーモンに組み込む方法。処理は早いが、新たに機能を組み込む際にapacheをコンパイルしなければならないといった問題や、メモリを消費するという欠点もあります。
 もうひとつはDSO(Dynamic Shared Object)という方法で、デーモンとは別に用意しておき、機能を利用するときに動的に組み込む方法です。機能を組み込むたびにapacheをコンパイルしなくてもいいのですが、機能を利用する際の動作が遅くなります。
 頻繁に使用し、且つメモリ消費が少ない機能はデーモンに組み込んでも問題ありませんが、それ以外はDSOを用いたほうがいいでしょう。
 なお、apache2.0とapache1.3のモジュールに原則として互換性は無いそうです。

さまざまなコンパイルオプション

 インストールの段階で、モジュールやインストール先を指定する場合、基本的には「./configure」に対してオプションを指定します。
 以下はその一例です。

–prefix
apacheのインストール先。指定しないと「/usr/local/apache2」に入ります。
–with-mpm
マルチプロセスモジュールの指定。環境/OSに応じた設定をするとパフォーマンスがあがります。Windows系用の「–with-mpm=winnt」等もあります。UNIXの場合、「–with-mpm=worker」が安全です。バーチャルホストを使う場合は「–with-mpm=perchild」とかもいいらしいです。
–enable-shared
DSOを有効にします(これって省略可能な気がするけど未確認)。
–enable-deflate(mod_deflate)
前身は「mod_gzip」です。2ちゃんねるの閉鎖騒ぎでやや有名になりましたが、サーバ/クライアント間の通信を圧縮して、転送速度を節約します。圧縮する分CPU負荷もかかりますが、CPUパワーの低いOpenBlockSでテストした時(当時はapache1.3+mod_gzipでしたが)は圧縮の負荷よりも、転送の負荷が軽減が大きかったので、CPUパワーが低くても有効でした。この機能はクライアントも圧縮転送に対応してないとダメですが、サーバがクライアントの情報を認識して自動的に処理してくれるので、ほとんど気にする必要はありません。
–enable-ssl(mod_ssl)
通信の暗号、署名、認証の機能を有効にする。いわゆるhttps。詳細は別の章で解説しますが、OpenSSLとかが必要。
–enable-dav(mod_dav、mod_dav_fs)
WebDAVの機能を有効にします。WebDAVとは私もあまり詳しくないですけど、HTTPを利用してファイル交換が出来るような機能です。ファイル名に日本語を扱うときは注意が必要になります。

 なお、上記のように指定しなくても導入される機能もあります。HTTP通信機能、CGI、SSI、ディレクトリIndex表示、ログ管理等は何も指定しなくても導入されます。
 –enable-xxx(mod_云々系)は、apacheに組み込む、組み込まない、DSOとして組み込むの3タイプの指定が可能です。

--enable-deflate・・・Deflateを組み込む。
--enable-dav=shared・・・WebDAVをDSOとして組み込む。
--disable-include・・・SSI機能を組み込まない。

 以下の記述例は、マルチプロセスモジュールを「worker」でDeflateをDSO、WebDAVをデーモンへ組み込み、SSI機能を組み込まない、またWebDAVを日本語対応する為のmod_enableを後で組み込む為にDSOを有効にすると言った設定です。

$ ./configure --with-mpm=worker --enable-shared --enable-deflate=shared --enable-dav --disable-include

 この後「make」「su」「make install」でインストール完了です。

起動

 基本的にはちゃんと設定してから起動しなければなりませんが、ここでは起動方法を先に説明します。
 起動には「apachectl」を使用します。「httpd」も使用できますが、通常は「apachectl」にしましょう。「apachectl」「httpd」共に「/usr/local/apache2/bin」にあります。

・起動

$ ./apachectl -k start

・終了

$ ./apachectl -k stop

・再起動

$ ./apachectl -k restart
$ ./apachectl -k graceful

「graceful」は起動中(使用中)のプロセスを強制終了しないので安全です(使い終わったら古いプロセスは落ちる)。

設定(httpd.conf)

 apacheの設定はhttpd.confで行います。記述内容はapache1.3の時とさほど違いはありませんが、新たに設定する場合は記述しなおす必要があります。
 httpd.confの所在は「/usr/local/apache2/conf/httpd.conf」です。
※パッケージの場合は「/etc/httpd/…」あたりにある場合もあります。

セクション1:Global Environment

 apacheの基本的な設定です。ほとんどはそのままで大丈夫ですが、パフォーマンスに関わる設定が多いので、負荷の高いサイトでは注意が必要になります。

ServerRoot "/usr/local/apache2"
apache2のシステムがインストールされている個所です。通常は変更する必要はありません。
LockFile logs/accept.lock/ScoreBoardFile logs/apache_runtime_status
 ロックファイルと、スコアボードファイル(apacheの動作状態を記録するファイル)の指定です。「#」の後はコメントアウトなので、書いてないのと同じこと。通常はこのままでOKです。
PidFile logs/httpd.pid
 プロセスIDを記録するファイルの指定です。「/var/lock/httpd.pid」とかもいいかも。起動中に書き直すと「apachectl」で終了できなくなります。

 

Timeout 300/KeepAlive On/MaxKeepAliveRequests 100/KeepAliveTimeout 15
 クライアントとのタイムアウトの指定。キープアライブの指定(コネクション毎の複数の要求を処理する)。キープアライブの上限、タイムアウトの指定。
StartServers 5/MinSpareServers 5/MaxSpareServers 10/MaxClients 150/MaxRequestsPerChild 0
 Apache起動時サーバプロセス数、保持されているサーバプロセス数の最小数、保持されているサーバプロセス数の最大数、起動できるプロセスの最大数。ゼロは無制限です。
Listen 80
 使用するTCPのポート番号です。通常は変更する必要がありません。変更した場合は、アクセスする場合も「http://localhost:8080/」というふうに、明示的にポート番号を指定しなければなりません。
LoadModule
 DSOで読み込むモジュールの指定。「./configure」で指定したものはちゃんと設定されます。記述方法は「LoadModule deflate_module modules/mod_deflate.so」という感じ。

セクション 'Main' server configuration

 通常にWebサーバへアクセスされた場合の挙動に関する設定です。変更の必要が一番多い個所かもしれない。

User nobody/Group #-1
使用するユーザとグループ権限です。apacheにセキュリティの問題が見つかったときや、甘いCGIコードを記述した場合、ここに記述した権限が奪われることがあるので、rootやログイン可能なアカウントを使用しないようにしましょう。
ServerAdmin you@your.address
 管理者のメアド。エラーが表示された場合等に表示される場合がある。
ServerName new.host.name
 サーバの名前を指定します。始めはコメントアウトされてますが、公開サーバを立てるときは必須です。
UseCanonicalName Off
 自己参照する場合に、httpd.confの値を参照する場合はOnにします。Offだとクライアントの情報を利用するらしい。
DocumentRoot "/usr/local/apache2/htdocs"
 ドキュメントルートディレクトリの指定。ここにindex.htmlファイルとかがある場合、「http://localhost/index.html」で、ドキュメントルートのファイルが参照される。
<Directory />〜</Directory>
 ディレクトリに対する権限の付与。別の項で解説します。
UserDir public_html
 各ユーザのユーザルートディレクトリ(~user等)にアクセスされた場合のアクセス先ディレクトリの指定。上記の指定で、userユーザのホームディレクトリが「/home/user」だった場合、「http://localhost/~user/index.html」と指定されると「/home/user/public_html/index.html」が参照される。

 ちなみに「/home/user/public_html/」をドキュメントルート(DocumentRoot)にする場合は、UserDirとは無関係で「DocumentRoot "/home/user/"」ではなく「DocumentRoot "/home/user/public_html/"」とする。
:DirectoryIndex index.html index.html.var:
以下、作成中、、、。

具体的な設定例

 ここでは目的に応じた主な設定例を示します。

概要

 apacheはモジュールも含めて「httpd.conf」で設定します(別のファイルに書いてhttpd.confに取り込むことも出来る)。ここではhttpd.confのさまざまな設定方法を解説しますが、まずその際の注意事項を説明します。

記述個所
 httpd.confは非常に長いので設定の記述個所に迷うことがありますが、基本的にはどこに書いても大丈夫です。悩むようなら似た設定を検索して、そこに列挙するといいでしょう。例えばモジュールをDSOとして組み込む場合はLoadModuleを記述しますが、LoadModuleという文字を検索してそこに記述といいと思います。

 ただし、<Directory 云々>〜</Directory>や、<IfModule 云々>〜</IfModule>のように複数行にわたる設定の場合は、その中に書くのと外に書くのとで大きく意味が違うので注意が必要です。

設定を変更したら「apachectl -t」でシンタックステスト。
 設定変更後にいきなりapacheを再起動した場合、設定が間違っているとエラーで起動しません。必ず事前にテストしましょう。「apachectl」はapacheの「bin」ディレクトリに入ってます。

 また、起動後はちゃんと動作しているか、ログを確認するのも重要です。

mod_deflate(http圧縮)

 ここではDeflate(Apache1.3系ではmod_gzipという名前でした)の設定方法を解説します。Deflateはapacheとブラウザ間の通信を暗号化し、通信トラフィックを軽減します。圧縮の為のCPU負荷が増えますが、通信の為の負荷が軽減するので、結局はCPU負荷も軽減する場合があります(OpenBlockSとかは有効にしたら軽くなった)。当然ながらブラウザ側でも対応していなければならないですが、その辺は自動認識してくれるみたいです。
-mod_deflateをインストールする。
 既にコンパイルの項で解説していますが、apacheをソースからインストールする場合は「./configure」の段階で指定します。

a.DSO無効
$ ./configure --enable-deflate
b.DSO有効
$ ./configure --enable-deflate=shared

-httpd.confの編集・・・LoadModuleの追加
 ./configureで設定した場合はhttpd.confにも追加されているかと思いますが、DSOの場合はLoadModuleを設定しないとダメです。DSOじゃ無い場合は「apachectl -L」で「mod-deflate.c」があるか確認しましょう。

LoadModule deflate_module modules/mod_deflate.so

-httpd.confの編集・・・Deflateを有効にする
 まず、どこを読み込んだときに圧縮を有効にするか、、、「<Directory 云々>」に設定します。

SetEnv gzip_only_text/html 1
SetOutputFilter DEFLATE

 次は圧縮率等の設定。

DeflateFilterNote deflate_compression_ratio
DeflateBufferSize 8096
DeflateMemLevel 9
DeflateWindowSize 15
--DeflateFilterNote:ログに圧縮率を記録する。
--DeflateBufferSize:圧縮を行う単位。8096が規定値。
--DeflateMemLevel:使用メモリー量(1〜9)。高いほうがメモリーを消費するが高圧縮。
--DeflateWindowSize:圧縮ウインドウサイズ(1〜15)。意味はわからないが高いほうがメモリーを消費するが高圧縮。

 ログに圧縮率を出してもあまり利用意義が無いので、動作確認が終わったら設定を切ってもいいと思います。有効にするならちゃんとローテートしましょう。
 次にログの出力設定。通常のapacheのログ同様、LogFormatとCustomLogで指定が出来ます。

LogFormat "%h %l %u %t \"%r\" %>s%b %{deflate_compression_ratio}npct." deflate
CustomLog /var/log/httpd/deflate_log deflate

 この設定で、以下のように出力されます。

xxx.xxx.xxx.xxx - - 27/Jan/2003:12:47:48 +0900 "GET /hogehoge.html HTTP/1.1" 2008585 23pct.

 「23pct.」と言うのが圧縮率です。「-pct.」という出力もありますが恐らく圧縮されてない場合でしょう。apache1.3の時の「mod_gzip」の時に「何バイト以下のファイルは圧縮しない」とかの設定が出来たので、そういう関係だと思います。
※っていうか、mod_deflateでその設定がわからん。

SSL(https)の設定

 ここではApacheにSSL(Secure Socket Layer)を導入する方法を解説します。
 SSLとは、通常のWebサイトへのアクセスの信頼性を向上させる仕組みで、通信の暗号化、認証、署名による証明などの機能を付加します。
※認証に関しては今回解説してません。
 通信が安全な物であるかは第3者機関による証明書が必要です。これは(無料なのもあるみたいですけど)基本的に有料(1サーバあたり数万円/年)なので、とりあえず自前で用意した物を使います(お金ないし、、、)。ECや、会員サイト等の様に信頼性を重視するのであれば、この辺はちゃんと認証機関から入手するなり、セキュリティポリシーを立てるなどしてしっかりとした管理をしましょう。
 ここではあくまで勉強/個人サイトレベルでの解説しかしません。クライアントがサーバが信頼できるものであるか確認できるように、実際の運用では第三者署名も必須になってくるわけです。
 とりあえず、通信経路のデータを暗号化するだけでも盗聴を防ぐことが出来ます。特に一般的に欲利用されている基本認証(ダイアログが出てきてIDとパスワードを入力するやつ)は暗号化されずに通信が行われるので、SSLを組み合わせるのは非常に有効です。
 なお、私はこの暗号/署名の分野はとんと苦手なので、詳しく知りたい方はそれなりの文献や詳しい人に聞いてください(^^;;;。

インストール(その1:OpenSSLを入れる)

※ここではソースからコンパイルする方法を使用していますが、最近はrpmでOpenSSLが入っていることも多いので、RedHat9とFedoraCore5上でrpmでOpenSSLがインストール済みの環境でもテストして見ました。以後の項では、rpmでOpenSSLがインストールされている場合の設定方法も補足として掲載しておきますので、そういう環境の方はOpenSSLのコンパイルは読み飛ばしてかまいません。
 まず、OpenSSLをインストールします。これ自身、頻繁にバージョンアップされてるので、最新のものを入れましょう。OpenSSL Project(http://www.openssl.org/)から入手可能です。
 インストール方法はさほど難しくありません。まずはダウンロード。
※ここを書いてる時点でもバージョンは0.9.7ですが、他のバージョンでもさほど変わりません。

$ wget http://www.openssl.org/source/openssl-0.9.7.tar.gz

 次に解凍。

$ tar zxvf openssl-0.9.7.tar.gz
$ cd openssl-0.9.7

 そしてインストール。
ここで注意ですが、OpenSSL0.9.6までは「/usr/local/openssl」にインストールされましたが、0.9.7では「/usr/local/ssl」に入るようです。

$ ./config

(「./configure」では無く「./config」です)

$ make
$ su
# make install

 これで終わり。
インストール先を変更したいなら、./configにオプションをつければ大丈夫そうですが確認してません。とりあえず、./confgの後にMakefileを編集しても大丈夫だと思います。

インストール(その2:apacheのインストール)

 apacheのインストール方法の詳細は既に解説しているので省きますが、apacheの「./configure」の時点でSSLを有効にするオプションを指定する必要があります。

$ ./configure --enable-ssl --with-ssl=/usr/local/ssl

 「–enable-ssl」はSSLを有効にする設定。「–with-ssl」はOpenSSLがインストールされた個所を指定してます。
※RedHat9でOpenSSLがrpmでインストールされている環境の場合、「–enable-ssl」のみの指定でインストールできました。
 これ以外は通常どおりapacheをインストールすればOKです。
※RedHat9あたり(もしかしたらApacheのバージョンにもよるのかもしれませんが、、、)でmakeするとkssl.hに関連するエラーがでます。これを解決するには「krb5-devel」のrpmをインストールするか、「export CPPFLAGS="-DOPENSSL_NO_KRB5"」でkerberosへの参照を無効にすれば大丈夫みたいです。

設定(その1:仕組み)

d77-NetLabo-apache2.0Sys-labo_apachessl
 ここで解説するSSLの実現方法は上の図のようになっています。
※ファイル名は説明に使うものなので、上図に従う必要はありません。
1,まず、サーバ秘密鍵を作成します。これは大事なものなので、外部に漏れないように大事に保管します。
2,次に証明書署名要求書(CSR)を作成します。これは認証機関に提出するものです。
3,CSRを認証機関で署名してもらいます。実際はベリサインなりの第三者認証機関を用いますが、ここではテスト用の「demoCA」を作成し、それを用いて書名します。
 証明書はこれで完成です。
4,このままapacheに設定しても起動しますが、起動時に秘密鍵のパスワードを要求してきます。そこで、それを必要としないapache起動用の鍵を作成します。
5,そしてapacheの設定ファイルに組み込みます。
6,クライアントでサイトにアクセスすると「不明な認証機関から発行された証明書」として警告が発せられます(自前なので当然ですが)。そこで、demoCAからルート証明書を発行し、それをインストールすることで警告が出ないようにします。

設定(その2:サーバ秘密鍵と署名要求書の作成)

 秘密鍵を作成します。作業は適当にディレクトリを作成してroot権限で行ってください(ただし、作成されたファイルの管理は厳重に行ってください)。
 まず、乱数を発生させる為の種(.rnd)を作成します。乱数の元データはなるべく適当なテキストファイルがいいです。ここではmessagesとaccess_logを利用した例です(実際はもっと多くのファイル、消去可能なファイルがいいです)。
 opensslは/usr/local/sslにあります。

# openssl rand -rand /var/log/messages:/var/log/httpd/access_log -out .rnd 1024

 次に秘密鍵の作成。

# openssl genrsa -des3 -rand .rnd -out server_key.pem 1024

・・略・・

Enter PEM pass phrase:←パスワードを入力
Verifying password - Enter PEM pass phrase:←もう一度パスワードを入力

 これで秘密鍵「server_key.pem」が出来ます。「openssl rsa -in server_key.pem -text」で内容を確認できます。
 次に署名要求書(CSR)の作成。

# openssl req -new -key server_key.pem -out server_csr.pem
Using configuration from /usr/local/openssl/openssl.cnf
Enter PEM pass phrase:←秘密鍵のパスワードを入力
・・略・・
-----
 Country Name (2 letter code) [AU]:←国コードJP(JAかも)
 State or Province Name (full name) [Some-State]:←「県」Kanagawaとか
 Locality Name (eg, city) []:←「市」Sagamiharaとか。
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:←組織名。何でもいいけど見られて恥ずかしくないもの。
 Organizational Unit Name (eg, section) []:←部署。未入力でも可。
 Common Name (eg, YOUR name) []:←サーバのFQDN(重要)。
 Email Address []:←メールアドレス
 ・・略・・
 A challenge password []:←そのままenter
 An optional company name []:←そのままenter

これでCSR(server_csr.pem)が出来上がります。
ここで重要なポイントがあります。
たとえばInternetExplorereは、認証局、サーバ名、期限を確認し、証明書が信頼できるものかを判断します。そのうち、サーバ名はここの「Common Name」が用いられます。これはドメイン名(ここのサイトならd77.jp)ではダメです。サーバのFQDN(ホスト名、サブドメイン名、ドメイン名を連結したフルネーム。ここのサイトならlabo.d77.jp)を指定しないと警告が出ます。

設定(その3:テスト用認証機関の作成と署名)

署名要求書が出来たら、認証機関に提出して署名してもらいます。ここではテスト用に「demoCA」という認証機関を作成し、そこで署名してもらいます。

まず、demoCAの作り方。認証機関もパスワードが必要になります(署名の時に必要)。これは秘密鍵のと一致させる必要はありません。作成には「CA.sh」を用います。「/usr/local/ssl/misc/」にあると思いますが、OpenSSLのバージョンで微妙に違うようなので、探してみてください。

  • RedHat9は「/usr/share/ssl/misc/」に「CA」あります(.shが付いてませんが中身はシェルスクリプトです)。
  • FedoraCore5では「/etc/pki/tls/misc/CA」にありました。ちなみに「rpm -ql openssl | grep CA」とかのコマンドで調べられます。
    なお、入力内容は結構適当でも問題無いですが、見られて恥ずかしくないものの方がいいでしょう。
# CA.sh -newca
※RedHat9は「CA -newca」、FedoraCoreでは「/etc/pki/tls/misc/CA -newca」です。
CA certificate filename (or enter to create)←ここではEnter
・・略・・
Enter PEM pass phrase:←認証機関のパスワード
Verifying password - Enter PEM pass phrase:←もう一回認証機関のパスワード
・・略・・
-----
Country Name (2 letter code) [AU]:←国コードJP(JAかも)
State or Province Name (full name) [Some-State]:←「県」Kanagawaとか
Locality Name (eg, city) []:「市」Sagamiharaとか。
Organization Name (eg, company) [Internet Widgits Pty Ltd]:←組織名。
Organizational Unit Name (eg, section) []:←部署名
Common Name (eg, YOUR name) []:←名前(サーバ名)
Email Address []:←メールアドレス

これで「demoCA(ディレクトリと関連ファイル)」が出来上がります。次に署名します。具体的には「server_key.pem」に署名して「server_id.pem」を作ります。
*FedoraCore5に、apache2.2をソースから入れたところ、「/usr/local/apache2/CA/private」というディレクトリができており、そこがdemoCAの代わりになるようです。その場合、以下の「openssl.cnf」に関わる変更・指定は全てしなくてもよいようです。

まず、openssl.cnfをカレントディレクトリにコピーします。「/usr/local/ssl」にあります。openssl.cnfの内容を確認し、「dir = ./demoCA」を確認します(カレントディレクトリ内にdemoCAが無い場合は、パスを設定しなおす)。
※これもRedHat9は「/usr/share/ssl/」です。
CSR(server_key.pem)もカレントディレクトリに用意します。

署名の前に働き具合を確認。
 # cat demoCA/index.txt
 (署名してなければ何も表示されない)
 # cat demoCA/serial
 01(←初期値)

# openssl ca -config ./openssl.cnf -policy policy_anything -in server_csr.pem -out server_id.pem
※FedoraCore5では「-config ./openssl.cnf」を指定しない。
Using configuration from ./openssl.cnf
Enter PEM pass phrase:←認証機関のパスワード
・・略・・
Certificate is to be certified until [今の時間] (365 days)←証明書の有効期限。
Sign the certificate? [y/n]:←署名していいなら「y」
1 out of 1 certificate requests certified, commit? [y/n]←署名していいなら「y」(念のため再確認)

これで署名済み証明書(server_id.pem)が出来上がります。

働き具合を確認すると内容が変わってます。
 # cat demoCA/index.txt
 V云々
 # cat demoCA/serial
 02
!設定(その4:apache起動用鍵の作成)
このまま設定すると、apacheを起動する時にパスワードを要求してくるので、それが無い様に専用の鍵を作ります。

# openssl rsa -in server_key.pem -out server_key_run.pem

設定(その5:apacheの設定)

設定は基本的に「httpd.conf」に行いますが、SSLを有効にした時点で

<IfModule mod_ssl.c>
Include conf/ssl.conf
</IfModule>

とあるとおり、基本的な内容は「ssl.conf」が書かれています(IncludeはServerRootからの位置なのでconf/が付きます)。
ちなみにssl.confは「<IfDefine SSL>〜<IfDefine>」でくくられてます。何故かこのままだと動かなかったので、私はIfDefineを外してます。設定はほぼそのまま使えます、、、というか私も内容をあまり把握してないので、重要なポイントだけ解説します。

-----ssl.conf
Listen 443(←httpsのポート番号)
 
## SSL Global Context
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
SSLSessionCache dbm:logs/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex file:logs/ssl_mutex
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
 
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
 
(↓CGIで環境変数を取る時に値を付加するらしい?)
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/home/html/public_html/*/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
 
# SSL Protocol Adjustments:
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

(↓SSLログの設定。ちゃんとローテートしないとダメです)
# Per-Server Logging:
CustomLog /var/log/httpd/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

ssl.confの設定は以上。次にSSLを有効にしたサイトにアクセスした際の設定をします。基本的にはVirtualHostにして特定のURLだけ有効にします。そのまま「ssl.conf」に書いてもいいですけど、私はhttpd.confに書いてます。この辺は好みにお任せします。

以下は設定例です。VirtualHostは環境によってかなり異なるので注意してください。

NameVirtualHost [サーバのIP]
<VirtualHost [サーバのIP]:443>
ServerName [serverのFQDN。labo.d77.jpとか]
DocumentRoot [httpsでアクセスした場合のルート]
 
SSLEngine on
(↓証明書の指定)
SSLCertificateFile /usr/local/apache2/conf/ssl/server_id.pem
(↓apache起動用鍵の指定)
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server_key_run.pem
(↓ログの指定)
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/access_log combined
</VirtualHost>

apache1.3系の時はsslを有効にする場合、特別な起動オプションが必要でしたが、apache2系は普通に起動すれば有効になります。

設定(その6:ルート証明書の発行)

さて、以上でクライアントからアクセスすると警告が出るもののアクセスできるはずです。警告は署名したところが謎な認証機関であると言う物のはずです(それ以外の警告が出た場合はCSRの作成でサーバ名を間違えたかサーバかクライアントの時計が狂ってます)。
通常はブラウザの設定を見ると幾つかの認証機関が登録されています。当然自前で署名したところで自前のテスト用認証機関はブラウザに登録されていないので、警告が出て当然です。ここではブラウザに認証機関を登録するまでの作業を行います。

まず、以前作成した「demoCA」のディレクトリを確認します。「cacert.pem」というファイルがあるはずなので、それを変換します。

# openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der

これで「cacert.der」が出来上がります。
次にCGIスクリプトを書きます。ファイル名は拡張子がcgiであれば何でもいいですが、ここでは「democert.cgi」とします。

#!/bin/sh
echo "Content-type: application/x-x509-ca-cert"
echo
cat /home/html/cacert.der

「cacert.der」は、上記のとおりフルパス指定すればどこに配置してもいいです。ただし、ブラウザから直接アクセスできる個所に配置するのは止めましょう。

あとはこのCGIにアクセスするとルート証明書をダウンロードできるので、ブラウザにインストールすれば完了です。
※当然、apacheにCGIの設定は必要になります。

ダイジェスト認証(2.2系)

Webサイトにアクセスした際に、限られた利用者のみに限定する認証の仕組みですが、一般的なBASIC認証では、パスワードが暗号化されずにネットワークに流れるため、今回はダイジェスト認証を使ってみます。
なお、ダイジェスト認証の実装はapache2.0と2.2だけでも違うそうな・・・。
そんな訳で、今回は2.2系です。

必要なモジュール

DSOを使わないで、コンパイルからやってみます。

./configure --enable-auth-digest --enable-authn-file --enable-authz-user --enable-authz-owner ・・・

書かなくてもデフォルトで有効になっているモジュールはありますが、まぁ絵面的に書いておきました。
以下、apacheのコンパイルと導入に関しては省略。

ユーザファイルの作成

ファイルの新規作成は以下の通り。パスワードを聞かれるので、user1のパスワードにしたい文字を入れれば/hoge/.userfileにuser1というユーザが作成されます。

 ./htdigest -c /hoge/.userfile realm user1

※新規作成では無く、追加の場合は、-cは不要。
realmは何でもいいです。ただ、httpd.confのAuthNameと一致していないとダメ。また、認証画面にも出てくるので、それっぽい文字がいいでしょう。スペースを入れたい場合はダブルクオーテーションでくくればOKです。
!設定

httpd.confにはだいたい以下のような感じに書きます。

<Directory /hoge>
    …略…
    AuthType Digest
    AuthName "realm"
    AuthDigestProvider file
    AuthUserFile /hoge/.userfile
    Require valid-user
</Directory>

※AuthUserFileはWebからアクセスできないディレクトリに置かないと危険です。

その他

IEだとバグがあるらしく、認証は通るようですが、その先のページでリンクをクリックした際にBat Requestになるようです。とりあえずhttpd.confに以下のように書けば回避できるらしい。
 BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

OBS構築記録

注意
このページはもう更新していませんが、いろいろ役立ちそうなので残しておきます。
※当時のOBSはかなりCPUパワーが無かったので苦労していますが、最近のは普通のサーバとたいして違わないようです。

OpenBlockSとは?

OpenBlockSぷらっとホームが発売しているサーバです。サーバに必要な機能以外を可能な限り省き、小型化されたサーバです。ネットワークポートx2個、RS-232Cインターフェース、コンパクトフラッシュのインターフェース、IDEのインターフェース(ノート用の小さいコネクタ)のみの入出力機器を備えています。
※現在は複数の機種がある
購入するには直接行くか、通販しかありません(OEMで似たようなものはあるみたいだけど)。
ディスプレイは?キーボードは?と疑問に持つかもしれませんが、すべてネットワーク経由でリモート操作することを前提としているため、そんなものありません。
OSはLinux(Linuxがわからない人はココを読んでもつまんないと思うのであえて書きませんが、まぁパーソナルUNIXです)が搭載されています。
ネットワークの設定を間違えると二度と接続不能になり、使えなくなるのか?というとそうではなく、OSはフラッシュROM(プレステのメモリのようなもの)に記録されてて、起動するたびにRAMに展開されます。RAMは電源を切るたびに消去されるので、再起動するたびに元の設定に戻るという仕組みです。当然、変更した設定はフラッシュROMに書き込むこともできますが、これの容量は小さいので、複雑なことはできません。

OpenBlockSの可能性

OpenBlockSで何ができるか?というところですが、主に以下の目的で使うのが良いんじゃないかな?と思います。

  • ルータ/Firewallとして
  • Linuxの勉強用。
  • 簡易公開サーバ構築用。

ルータとしての用途ですが、はっきり言ってこれにはお勧めしません。OpenBlockS自体は約4万円しますが、一般のブロードバンドルータなどは1万円〜2万円程度で買えます。Firewallとしては意味があるかもしれません。細かいアクセス制御や、アクセスのロギングなどに使えます。ただ、こういう使い方はイマイチ面白くないかもしれません。勉強にはなりますが、、、。
Linuxの勉強用としては非常に有効だと思います。最近のLinuxディストリビューションはイロイロなものが入っていて、さらに自動設定が出来ますので勉強になりません。構築のときはいいですが、障害が出たときなどの問題が出ます。その反面、OpenBlockSは勉強になります。基本的に一般的なディストリビューションは使えません。ぷらっとホームのサイトに非常にシンプルなカーネルイメージがあるのでそれを入手する必要があります。さらに、サーバなどを構築するには、ソースを入手してコンパイルするか、有志によるrpmを使うしかありません。構築するのは非常に厳しいですが、構築が終わったころには一人前のLinux技術者としての第一歩を踏めるでしょう。
簡易公開サーバとしても有効です。特に消費電源量の少なさと、稼動部分が無いことによる静音性が魅力的です。
あえて、「簡易」と書いたのはやはりCPUパワーとメモリ不足の問題でどうしても重いです。イロイロなサービスを稼動させると、ちょっと実用が厳しくなります。
※HDDを増設する場合、2.5inchなので、そこだけちょっとうるさいです。
いづれにしろ、自宅で公開サーバを構築するにはもってこいの筐体といえるでしょう。

HDD購入

上のOpenBlockSとは?に書きましたけど、これ単体ではたいしたことができません。増設記憶装置としてコンパクトフラッシュメモリ(この文を執筆時の相場で256MByte→2万円位かな)か、2.5インチHDDが接続できます。
HDDは専用オプションとして販売されてますが、当然それを無視して秋葉原でIBMの5GByteHDDを購入し接続しました。はっきり言って差すだけなので簡単です。
無視したらメーカ保証がなくなるだろう?と思いますが、HDDを接続してサーバ代わりに使用すること自体が保証外なので、眼中無しです。っていうか、こういう使い方しないとOpenBlockSの真価が発揮できないしね。
ちなみに容量的にはコンパクトフラッシュで十分なんですが、実は*あること*をしたいがために大容量にしています。何をしたいかはまた後ほど書くとして、、、。
HDDを増設時はかなり注意が必要です。触ると壊れそうな個所がかなりあるので、カスタマエンジニア(パソコンの修理屋)を経験した私でもちょっと怖かったくらいです。

OpenBlockSSの可能性

OpenBlockSの後継機として、OpenBlockSSが2001年11月に発表されました。
※残念ながらデルタはOpenBlockSSを持っていません。発売前に今のサーバを作ってしまったもので、、、。
OpenBlockSSの大きなポイントはCPUのパワーアップ(50MHz→200MHz)と、メモリの増強(32MB→64MB)です。どのくらいのパフォーマンスが出るかの情報はまだ入手していませんが、非常に期待できるでしょう。

コラム

このコンテンツはOpenBlockSの構築記録ですが、ここにはそれと間接的に関係してきそうなネタを書きたいと思います。

OpenBlockSリンク集

はっきり言って、どこかの個人サイトを参考にしないと厳しい。というか、同じことを考える人は多いので、参考にさせていただいております。

セキュリティ1(バージョンの隠蔽)

デルタはブラックハットでもクラッカーでもないですが、一応セキュリティのお仕事をしているので、セキュリティ対策としてやっといたほうがいいなぁというのを記述しています。
バージョンの隠蔽というのは、所謂どういうサーバかよくわからない状態にすることにより、不正侵入される可能性を低くするという対策です。
バージョン情報はイロイロなところで出てきます。telnetのプロンプトの前や、Webサーバのエラーメッセージ/ヘッダー情報、SMTPに接続したときや、「HELP」コマンドを入力したときです。
バージョン情報の隠し方は特に書きませんが、ソースコードが読めるならチャレンジしてみましょう。
※それにしても、OpenBlockSはコンパイルに時間がかかるので、いざ直そうと思っても気力が出ない(^^;;

Linuxコマンド集

まぁ、メモってことで。
http://linux.nikkeibp.co.jp/command/

viのコマンド

Linuxには必ずといってもいいほど「vi」というテキストエディタが入っています(というかソレしか使い方知りません)。以下に簡単な使い方を記します。

  • 起動
    vi ファイル名
  • 挿入モード(viはいきなり文字を書くことができません)。また、以下のコマンド群は挿入モード中は使えません。
  • ロールアップ
    f
  • ロールダウン
    b
  • 一文字削除
    x
  • 行削除
    dd
  • 終了
    q(編集後の強制終了はq!)
  • 書き込み
    w
  • 検索
    「/」の後に検索文字列。正規表現が使えるようで、*とか?とか/とか.とか\とかいう文字の取り扱いには注意。

telnet

通常使用しているパソコンはWindows2000なので、Linuxへtelnetでログオンできる環境が必要になります。ちなみにWindows2000のtelnetは文字コードの認識がまともにできないヘタレなので使わない。
私が使用しているのはTera Term(http://hp.vector.co.jp/authors/VA002416/)です。まぁ、非常に有名であるのと、後でインストールするSSH(同サイトのリンクにある「TTSSH」というもの)のクライアントにもなれるところがすばらしいからである。

その他参考になるサイト

・TCP/IP入門
http://www.net-newbie.com/tcpip/
ものすごくわかりやすいです。じっくり読むと2,3日はイケるかも。
・Sendmailのテスト
http://www.kuis.kyoto-u.ac.jp/imel/tebiki/rvsettei/settei/node121.html
カンタンなテスト方法が書いてあります。本が無い人向け。
・sendmailとsendmail.cfのインストール
http://qubeley.ipc.kobe-u.ac.jp/Computers/SPAM/Mail/index.html
始め、Sendmail本をどこに置いたかわからなかったので、ココを読んで入れました。

デルタがOpenBlockSで何をしたいのか

結論を言ってしまえば、「UNIXとネットワークの勉強をしたい」が50%、「Linuxサーバでいろいろ遊びたい」が50%です。
UNIXという名前は昔から知っていたのですが、UNIXの考え方〜マルチユーザ、マルチタスクとか、C言語との関連性や、オープンソースという考え方〜を知ったのは専門学校のときです(大卒ではありません^^;;)。当時はまだ「32bitCPUの80386SX」を搭載した「PC-9801シリーズ」が主流で、OSは「MS-DOS3〜5くらい」が使われてました。私自身は「TurboC(ボーランド社)」を使ってCの勉強をしていたころです。
UNIX自体はまだパソコンではそんなに使われてなかった(と思う)時代でしたが、「将来UNIXの勉強をしたいな」とひそかに考えていました。
時間は流れて、UNIXやLinuxのことを知るにつれて、コンピュータやOS、ネットワーク等などの学習にはUNIXを知るとそれだけでもかなりの勉強になると思い、またLinux自体、リーナスさんが学生時代に作ったものであるということを知り、まぁ勉強の題材にはベストであると考えました。どちらにしろ、WindowsとかUNIXとかのブームもありますが、少なくとも基盤となる技術を知っておけば、一生ものだなと考えています。とりあえず「勉強としての50%」はこんなかんぢ。
「遊びの50%」はイロイロあるんですけど、その中のひとつとしてはまず、クラッカーが仕掛けた攻撃をどのようにして検知できるのかなというところ。他にも遊びネタはいろいろあるのですが、まぁうまく言ったらココに書こうと思います。

Windowsの罠

別にWindowsが悪いわけではないのですが、WindowsとLinuxを併用しているとイロイロと問題が起きます。大体はファイル転送の問題ですが、、、。

  • テキストファイルをバイナリで転送してしまう。
    普通はそんなに問題ではないですが、Perlスクリプトとかは動かなくなるときがあります。
  • パーミッションの設定
    転送したらちゃんと設定してあげましょう。
  • 改行コードの問題。
    Windowsの一般的な改行コードは「CR+LF」でLinuxは「LF」です。そのまま送って「vi」とかで開くと行末に「^M」とかいう文字が発生してゲンナリします。
    この辺の変換をやってくれるテキストエディタもありますので活用しましょう。

メモ

メモです。気にしないでください。
http://www.go.dlr.de/linux/src/
ZDnet Tips for Linux
http://www.zdnet.co.jp/help/tips/linux/

基礎構築

まずはHDDから起動してネットワークにつながる環境を構築しなければなりません。ここでは(ほとんど他のサイトの丸写しですが)その記録を残しています。

HDDの初期化

とりあえず、デフォルトの状態で、Telnetでログオンできる状態にしました。当然、HDDは接続済みですが、インストールする前に、HDDを初期化しなければなりません。
1、fdisk /dev/hda
ここではHDDのパーテイション管理ができます。メニューは「mENTER」で出るんで、さくさく切ります。swapは32MByteでいいらしいので、そのまま設定。quote(HDDの容量管理ソフト)とかでも遊びたいので、いくつかのパーテイションに分けてます。

/dev/hda1...プライマリ 1024Mbyte
/dev/hda2...swap 32MByte
/dev/hda3...プライマリ 1024Mbyte
/dev/hda4...プライマリ 残り全部

ちなみにfdiskの主なコマンドは以下のとおり。

  • m
    メニュー表示
  • n
    パーテイション作成。だいたい開始セクタはENTERのみ(デフォルト)で、終了セクタは「+1024M」みたいに容量で入力できます。
  • p
    作成したパーテイションの状況を表示。
  • t
    フォーマットタイプの設定。デフォルトはLinuxの標準なので通常は変更無し。swapだけ「Linux Swap」を選ばなければならない。
  • w
    書き込み終了
  • q
    書き込まずに終了

最後に「w」で書き込まないと機能は有効になりません。
パーテイションを切り終わったら、おのおののパーテイションを初期化します。通常の領域は、「mke2fs /dev/hda1」とかでOKですが、swapだけ「mkswap /dev/hda2」とコマンドが変わります。

hddイメージを登録

まず、hddイメージを入手します。入手場所は以下。
http://openlab.plathome.co.jp/OpenBlockS/hdroot_dl0.html
hddイメージというよりか、必要最低限のコマンド等は入ってます。入れれば動くって感じ。
「es1h_plat_1.03h_0905-2.tgz.Build」というファイルを使いますが、かなりでかいので、HDDに直接ftpでぶち込まなければなりません。やり方は以下をそのまま打ち込めばOK。

まずはHDDをマウント

  1. mount /ext1(/ext1は事前に用意されてる)
  2. cd /ext1(ここがHDDのルート)
    次にftp経由でファイルをゲット。
  3. ftp ftpサーバのIP
  4. ftpサーバへログオン
  5. get es1h_plat_1.03h_0905-2.tgz.Build
  6. bye
  7. 展開。
    tar zxvf es1h_plat_1.03h_0905-2.tgz.Build(かならずHDDのルートから展開しなければならないらしい)
    しばらく待てば完了します。あとは「halt」か「shutdown -h now」でシャットダウン。ディップスイッチをいじってHDD起動モードに切り替えればOKです。あ、このまま起動するとネットワークの設定が、初期値なのでシャットダウン前に変更したほうがいいかもしれません(viが使えないので、設定ファイルを「ftpでput」→「設定変更」→「ftpでget」しなければなりません)。

設定方法は次ってことで、、、
ちなみに、ftpサーバが無い場合(っていうか、始めはLANのftpサーバにしかつながらなかったし、、、)はftpサーバツールが使えます。私はこれ↓を使って、一時的にFTPサーバを作りました。結構楽ちんです。
http://www.vector.co.jp/soft/win95/net/se083171.html
あと、足りないパッケージ等は以下のサイトから入手できる。
http://openlab.plathome.co.jp/OpenBlockS/packages.html

基本的なネットワーク設定

とりあえず、telnetが繋がるような状況に持ってこないと困るので設定します。うちの環境では、OpenBlockSに固定IPを割り振りました。DHCPで割り振られるなら設定が違うので注意。

  • /etc/inetd.conf
    以下の2行だけ有効にし、それ以外をコメントアウト(行頭に#を付加)しました。
    ftp stream tcp …
    telnet stream tcp …
  • /etc/hosts
    「192.168.253.254」の部分を新しいIPアドレスに変更。
  • /etc/hosts.allow
    「ALL : ALL」の1行を追加。
  • /etc/sysconfig/network
    GATEWAYだけを、ゲートウエイのIPに変更(DHCP環境で、他にwindowsマシンがあるなら、DOSプロンプトで「ipcpnfig /all」でわかります)
    あと、GATEWAYDEVが外部接続されているポートに設定されていないと外部からの接続ができなくなります(かなりハマりました)。
  • /etc/sysconfig/network-script/ifcfg-etc0
    「192.168.253.254」の部分を新しいIPアドレスに変更。「NETWORK」と「BROADCAST」も変更。
    ちなみに
    IPADDR=192.168.0.10
    なら
    NETWORK=192.168.0.0
    BROADCAST=192.168.0.255
    って感じ。
  • /etc/resolv.conf
    「nameserver (ネームサーバのIP)」を設定。ネームサーバのIPも例の「ipconfig /all」をすると出てくる「DNS Servers」の値です。そのはず、、、イヤ違うかも、、、無くても動きます(爆。
    これでtelnetくらいなら動くハズです。

SSH(SecureShell)

Telnetでのログオン時の環境設定が気に入らないとか、FTPサーバ立てないととかイロイロ考えてましたが、最終的にはそういう管理系の通信は暗号化したかったので、ばっさり省略してSSHを入れることにしました。
SSHとは何か?というと、「セキュアシェル」という名前のとおりで、telnetやftpでログインする際に、パスワードを盗まれるときがあるので、それらを暗号化しようというもの。これがあれば、とりあえずtelnetとftpができて暗号化されるので安心なのである。
暗号化の仕組みはというと公開鍵方式を利用してるのだが、これがなかなかわかりづらい。
簡単に言うと、あるデータを「公開鍵」で暗号化し、「秘密鍵」で暗号化を解除するというもので、「公開鍵」で暗号化したものは、「秘密鍵」が無いと暗号化した人手さえ暗号化を解除することができない。「秘密鍵」は「データの受取人」しか持ってないので、一度暗号化したが最後、「データの受取人」しかそのデータが見れなくなるので、安全な通信が可能となる。
当然ながら、「秘密鍵」が「データの受取人」以外に流出するとこの手法は無意味になるので「秘密鍵」の管理が重要になる。「公開鍵」は一般公開されるものなので、データの送り手はそれを使っていくらでもデータを送ることができるのである。

SSHのインストール

始めはソースからのインストールをしようとしたが、よくわからないのでとりあえずrpmでインストールする。
インストールするrpmの順番は以下のとおり。

ldconfig-1.9.5-15obs.ppc.rpm
openssh-2.9p1-1obs.ppc.rpm
openssh-server-2.9p1-1obs.ppc.rpm
openssl-0.9.6a-1obs.ppc.rpm

ldconfigは入ってないとopensslを入れる段階でエラーになるんで。このまま起動するとイロイロエラーが出るので以下の操作をする。
あと、/dev/urandomとlibcrypto.so.0.9.6のパスがおかしいらしいので(この辺はよくわからんがML見たら書いてあった)直す。

# ln -s /usr/lib/libcrypto.so.0.9.6 /lib
# ls -l /dev/urandom
-rw-r--r-- 1 root root 0 Feb 2 1999 /dev/urandom
# rm /dev/urandom
# mknod /dev/urandom c 1 9
# ls -l /dev/urandom
crw-r--r-- 1 root root 1, 9 Dec 15 03:01 /dev/urandom

こんな感じ。

キーの生成と接続

細かいことは調べてないのでやり方だけ。
まずはとりあえず以下のように打ち込む。

/etc/rc.d/init.d/sshd start

これでキーが生成される。
次に自分の秘密鍵と公開鍵の生成。そしてフォルダへのコピー。この作業はroot権限でなくても大丈夫なので、suは解除しておいたほうがいいかもしれない。

$ ssh-keygen -f keyfile
$ mkdir ~user1/.ssh
$ cat keyfile.pub >> authorized_keys

後はアクセス権の設定

$ chmod 700 .ssh
$ chmod 600 .ssh/*

あとは/usr/sbin/sshdで起動するが、起動スクリプトに書き込んで自動起動するようにする必要がある。
/etc/rc.d/rc.sysinitに以下のように書き込む。(initdの起動の後くらい)

if  -f /usr/sbin/sshd ; then
echo "starting sshd..."
/usr/sbin/sshd
fi

あとはinetdの起動に関するスクリプト文をコメントアウトすればいいのだが、一度sshで接続できるのが確認できた後のほうがいいかも。
サーバへの接続はWindowsの場合、Tera Term+TTSSHを使うといい。SSHに接続して「Use RSA key to log in」を選び、先ほど作成した「keyfile」を指定する(事前にサーバから取り出してないとダメだけど)。
ログオンメッセージが気に入らなければ、/etc/motdを編集すればOK。

GCCによるコンパイル環境を整える

gccは入ってるんだけど、ちょっとした規模のアプリはまともにコンパイルできない。特にapacheとかを入れる時に「./configure」とか入れても、「trが無い」とか「cmpが無い」とか言われる。
「tr」に関しては「textutils」入れればOKらしく、また「cmp」に関しては「diffutils」が必要になるらしい。とにかく入れまくる。ただし、これら2つの「utils」は「/sbin/install-infoが無い」といわれる。install-infoに関しては「info-3.12h-2obs.ppc.rpm」を入れるとできる。

Apacheのインストール

Apacheのインストール〜って言っても、ApacheはすでにOBSに入ってます。ただし、バージョンが古いです。せっかくなので最新バージョンを入れよう!っていうか、そもそもrpmでのインストールよりもソースからのインストールのほうが(多少大変だが)メリットが多い。
一応、前もってgccによるコンパイルがちゃんとできる環境にしていなければならない。
まずは、最新版のApacheを入手する。最新版はhttp://www.apache.org/で入手することができる。ファイル名は「apache_1.3.xx.tar.gz」という感じ。コンパイル手順は以下のようになる。

$ ./configure --prefix=/usr/local/apache_1.3
$ make
$ su
# make install

–prefixはインストール先の指定。コンパイルまでは原則としてユーザ権限。インストールだけroot権限で行うのが基本。
ちなみにコンパイル時間は非常に長いので、覚悟して置いてください:)

Apacheの設定

このままだと自動起動しないので、「/etc/rc.d/rc.sysinit」の「httpd」の記述を「/usr/local/apache_1.3/bin/httpd」って感じに書き換える。設定ファイルは「/usr/local/apache_1.3/conf/httpd.conf」にあるのでそれを書き換える。重要なポイントは大体以下のとおり(すでに設定されている個所もある)。

ServerRoot "/usr/local/apache_1.3"
Port 80

↑最近のApacheは8080になってる。

ServerAdmin (管理者のメールアドレス)
ServerName ドメイン名

↑設定しないと「http://hoge.com」のように後ろにスラッシュを付けてないとアクセスできないなどの問題が出る。

DocumentRoot "/home/webmaster/public_html"

↑「webmaster」ユーザのWebディレクトリをトップページにしたい場合。

<Directory />
  Options FollowSymLinks
  AllowOverride None
</Directory>

↑全ディレクトリの設定。
※OptionsにCGIを使いたいとか、SSIを使いたいとかを設定する。指定できるのは「All(何でも許可)」「Include(SSI使用許可)」「Indexes(ファイル一覧表示許可)」「FollowSymLinks(シンボリックリンクの許可)」「ExecCGI(CGI実行許可)」です。
例)CGI、SSI、シンボリックリンクの許可

Options ExecCGI Includes FollowSymLinks

※AllowOverrideはユーザディレクトリに「.htaccess」を置いてアクセス制限をすることを許可するかどうかという設定(詳細は略)。

<IfModule mod_userdir.c>
UserDir public_html
</IfModule>

↑ユーザディレクトリの指定

<IfModule mod_dir.c>
DirectoryIndex index.html
</IfModule>

↑ファイル名が指定されない場合にどのファイルが参照されるかの指定。

AddHandler cgi-script .cgi

↑CGIの拡張子指定

AddType text/html .html
AddHandler server-parsed .html

↑SSIの拡張子指定(デフォルトは.shtmlになっているが、.htmlと共存したい場合は上記の設定になる)

Apacheの備忘録

CGIの挙動にかなり悩んだ。まぁやり方はイロイロあるだろうけど、調べたところまでのメモ。
基本的にはperlのopen(DB,xxx)関連。

  • CGIで作成したファイルはプログラムの中でchmodしてやらないと後で何もできなくなる。
  • 別ディレクトリにファイルを作る場合はそのディレクトリに実行権限がないとダメ。

nmapの導入

nmapってな〜に?って方も多いかも知れませんが、いわゆるポートスキャナです。ポートスキャナとはポートスキャンをするものですが、たとえばhttpサービスは80番、telnetは23番と定められているTCPポートをスキャンしていって、どんなサービスが動いているのを調べるものです。実行結果は以下のような感じになります。

root@deltasv /# nmap localhost
Starting nmap V. 2.54BETA26 ( www.insecure.org/nmap/ )
Interesting ports on localhost (127.0.0.1):
(The 1544 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
80/tcp open http
Nmap run completed -- 1 IP address (1 host up) scanned in 6 seconds

まぁ、クラッカーとかいう方々がよく使われるモノなんですが、ネットワーク管理にも使えるので、入れておくと何かと便利です。たとえば、apacheを入れたのにWebページが見れないって時に、これを使うと、簡単なミスの場合は、

8080/tcp open http

ってなったり、また企業内とかでFirewallが設定されている場合は、

80/tcp fillterd http

なんて出たりもします。
psコマンドで調べるのもいいですが、こういうのもあわせて使うと非常に問題解決が早くなります。
ちなみに他人のホストにかけると管理者から怒られるのでやめましょう。

nmapのインストール

nmapは「http://www.insecure.org/nmap/」で手に入ります。Windows版もありますが、いまいち使い方がよくわからないので使ってません。また、GUIフロントエンドもありますが、CUIで十分なので使ってません。
今回は「nmap-2.54BETA26.tgz」を入手しました。これをftpで転送し、いつものコマンドで導入します。

$ ./configure
$ make
$ su
# make install

makeの時にnmapFEが云々というエラーが出るかもしれませんがこれはGUIフロントエンドの話です。無視しておいてもCUIで使用する分には問題ありません。もしかしたらパスが通ってないかもしれないので(本体は/usr/local/bin/nmapにあります)、私はシンボリックリンクを作成しました。

# cd /usr/sbin
# ln -s /usr/local/bin/nmap ./

あとは「nmap localhost」と打ち込めば結果が表示されます。

nmapの応用

nmapはいろいろな使い方ができます。以下はその一例。
・OSの推測

# nmap -O hostname

・ステルススキャン

# nmap -sS hostname

普通はログに残りません。
・UDPスキャン

# nmap -sU hostname -p 130-140

結果表示が遅いのでポートスキャンの範囲を指定しています。135とか137,138あたりが開いていれば大体Windowsです。
こんなコマンド何に使うのか?といわれてもソレは内緒♪

Sendmailの導入

Sendmailのインストールの仕方は本とかが無いので一番よくわからないのですが、とりあえずソースコードを入手し、構築してみました。http://www.sendmail.org/から最新のソースを入手し、展開。以下のコマンドでインストールしました。

$ sh Build
$ make
$ su
# make install

とりあえずできたらしい。ちなみにこの間30分ほどかかりました(汗

CFの導入

sendmailの設定ファイルはまさに宇宙語なので直接編集する気がしない。その為、CFツールを使用する。
以下のURLから最新版とパッチを入手。
ftp://ftp.kobe-u.ac.jp/pub/Net/net/mail/CF/
次にパッチ当てとコンパイル。

$ tar zxvf CF-3.7Wpl2.tar.gz
$ cd CF-3.7Wpl2/Master
$ patch < ../../CF-3.7Wpl2-smtpcheck.patch1

ぬぁっ。patchが無い。OBSのパッケージサイトを見たらあったので、ここで導入、、、。

$ patch < ../../CF-3.7Wpl2-smtpcheck.patch1
$ patch < ../../CF-3.7Wpl2-smtpcheck.patch2
$ cd ..

どこからsuすればいいのかわからないのでとりあえずこの辺でsu。

$ su
# make cleantools
# make tools

どうやら、「インストール」という概念は無いらしい。というか、上記の内容を実行した場所がインストール場所らしい。

SPAMテスト

SPAMとはまぁSPAMメールの略ですけど、つまり第三者があるメールサーバを使って他の第三者にメールを送るという行為です。そのメールサーバはいい迷惑なだけですので、そういう行為はさせない設定をしましょう。とりあえず、ここではその設定がちゃんとされているか、チェックの仕方だけを解説します。
ちなみに文中に「telnet IP 25」とありますけど、これはTCP25番に接続して、直接SMTPサービスとお話する為の方法です。IPは当然ながらSMTPサーバのIPです。※使ってるコマンドはtelnetですけど、telnetサービス(TCP23番)とはぜんぜん関係ありません。
接続に成功すると、「220 云々」と出ます。この「220」のように頭が「2」で始まるサーバ応答は「処理の成功」を意味します。「550」のように「2」以外は何かしらのエラーです。SMTPはコマンドを打つたびに成否応答を返します。
接続を解除するときは「QUIT」です。

テスト1、他ドメインからの接続

SMTPサーバとは違うドメインから「telnet IP 25」で接続してみる。「違うドメインのユーザがSMTPサーバを使用しない」という運用形態ならば最強の対策でしょう。

テスト2、第三者中継テスト。

これはどこのドメインで接続してもいいです。以下のコマンド打ちます。
※間違えて入力した場合、BackSpaceがうまく処理されないときがあるので、その場合は再入力すればOKです。

$ telnet IP 25
$ HELO ugege(←ugegeの部分は何でもいいです)
$ MAIL FROM:<hogehoge@otherdomain.com&lg
$ RCPT TO:<hogehoge2@otherdomain2.com&lg

「MAIL FROM」と「RCPT TO」には自分のドメイン以外のメールアドレスを指定しましょう。実際に存在するアドレスだとなおよいです。ちなみにここまでの処理ならメールは送信されません。
「RCPT TO」が入力し終えたところまでの間に、処理の失敗(頭が「2」以外の応答)があれば合格です。

テスト3、ドメインを偽装した中継テスト

内容は「テスト2」と同じですが、SMTPサーバへの接続は別のドメインからのほうが効果的です。ただし、「MAIL FROM」のメールアドレスを「自分のドメイン名が含まれた存在しないユーザのメールアドレス」にします。
UserUnknownとかいうメッセージ(または他のエラー)が発生すれば合格です。
SPAMerは送信元のアドレスを好きなように設定できるので、当然ながらこれに成功しないとぜんぜんダメです。

テスト4、ユーザを偽った中継テスト

このテストは別のドメインからじゃないとあまり意味がありませんが、非常に有効的なテストです。通常のテストツールではテストできない(テストしようが無い)方法ですからね。
テストの仕方は「テスト2」「テスト3」と同じです。ただし、「MAIL FROM」には「実際に存在するユーザ」を指定します。
エラーになれば合格です。しかし、これは運用上必要になる場合がありますが、実際にこの手法を使ったSPAMメールが存在するのも事実です。一応、解決策として「POP before SMTP(POPでの認証を成功した後の数分間だけ、SMTPを許す機能)」があるそうです(設定したことはありません^^;;)。

syslogdの導入

やっぱり、Linuxで公開サーバを立てるからにはログを取りまくるべ〜ということで、syslogdを探しに行く、、、syslogdってどこにあるの?誰が作ったの?、、、そんな状態のまま悶々と探しているうちに、どうも「sysklogd」という名前が正しいらしいことに気が付く。カーネルロガーもいっしょなのかと自分に根拠の無い納得をさせた上体で探す。
そんなときに見つけたサイトがココ→http://homepage1.nifty.com/yohta/diary/2000/12/20/
「ゼロからLinuxを作ろう!」、、おぉ〜。これこそ求めていたサイト。lessのソースもあるじゃん。ま、気を取り直してsysklogdをget。

sysklogdのインストール

いつもどおりの、、、と思ったら./configureが無い。とりあえず「INSTALL」を読んでみると、英語はよくわからんのだが、Makefileをカスタマイズしてコンパイルしてくれというようなことが書いてあるらしい。よくわからないので

$ make
$ su
$ make install

とやってみる。「/usr/bin/install」が無いと言われるので、調べてみると「/bin/install」にあることがわかった。Makefileを修正して、再度「make install」を試みてみると美しく成功した。syslogdとklogdが/usr/sbinに導入された。
はてさて、これをどうやって動かすのであろうか、、、?

iplogの導入

iplogはパケット監視ツールのようなもので、IDS(侵入検知システム)のように複雑な攻撃パターンを認識できるわけではありませんが、ポートスキャンやフラグメントされた通信を監視するのに向いてるそうです(受け売り)。
とにかく、おかしな通信パケットを見つけるのにベストらしいので、導入してみることにしました。

iplogのインストール

iplogを入れるにはパケットをキャプチャするためのlibpcapが必要です。で、libpcapを入れるにはflexが必要です。flexを入れるにはyacc?が必要です、、、、。
いいかげんムカついてきたので、OBSのパッケージからyaccと検索したら、byaccというものがあったので、よくわからないけどインストール(短気)。
flexはftpサイト「ftp://ftp.gnu.org/non-gnu/flex/」に落ちていたので、そのソースを拾ってきてインストール(往年の./configure、make、su、make installってかんじ)。ちなみにいまさらlibpcapの./configureオプションに–without-flexなんてオプションを発見したのは内緒(TT。
次にlibpcap。こいつも、./configure、make、su、make installでOK、、、。と、思いきや、iplogの./configureでエラーになりました。どうやらlibpcap系のファイルが/usr/localに入ったのがダメだったらしい。とりあえず、libpcapのMakefileを見たところ、はじめのほうに「prefix=/usr/local」という記述を発見。これを「prefix=/usr」にしたらうまくいった。もっとスマートな方法があるかもしれないけど、結果オーライということで(いいのか?w)。
さて、やっとiplogのコンパイル。./configure、make、su、make installの順でイキます。

cronの導入

linuxに入っているcronってvixie-cronっていうやつなのね、、、。これを知るのにえらい時間がかかりました。
んで、vixie-cronのソースを探しに行ったのですが、どうもよくわかりませんでした。vixieのサイト(多分間違いない)は見つけたのですが、肝心のソースがダウンロードできませんでした。
とりあえず、今回はバイナリからの導入で行きます。
ちなみに、事前にchkconfigというツールを入れておかないと、バイナリでの導入でエラーが出ます。

cronのインストール

今回はバイナリなので、特にインストール方法は書きません。cronを入れた後は設定ファイルを記述しなければなりません。
記述内容は下のほうに入れてあります。crontabの記述のポイントは「#run-parts」以下です。

42 4 1 * * root run-parts /etc/cron.d/cron.monthly

↑たとえばこの場合、「42 4 1 * *」が「分 時 日 月 曜日」を示しています。で、「*」は任意なので、この場合「毎月、1日4時42分」にスケジューリングしていることになります。ずいぶん中途半端な時間だなぁとお思いかもしれませんが、やはり「サーバ一番空いている時間」「他のスケジュールとぶつからない時間」を選ぶべきでしょう。ひとつのスケジュールの処理に時間がかかる場合は、その処理が終わる時間を予測すべきです。特に月が変わった瞬間は月変更、日変更、時間変更の処理が行われることを考えなければなりません。
あとは肝心のcrontab本体ですが、情報を調べると2つの方法があるのに気が付きます。「/etc/crontab」を編集する方法と「crontab -e」コマンドで編集する方法です。試したところこの2つの設定は連携してません。
イロイロ実験してみましたが、設定は「crontab -e」の処理が行われます。しかし、「/etc/crontab」が無いと動きません。これも悩んだ挙句、一度「crontab -u root /etc/crontab」を実行した後に、「crontab -e」をすると「/etc/crontab」が編集対象になるらしいというのがわかりました。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.d/cron.hourly
02 4 * * * root run-parts /etc/cron.d/cron.daily
22 4 * * 0 root run-parts /etc/cron.d/cron.weekly
42 4 1 * * root run-parts /etc/cron.d/cron.monthly

NTPの導入

ログを確認してて、外部からのアタックがあったときに、時間を確認したら「1980/05/03」とか、えらい過去からアタックを受けないように、サーバ内部の時計は常に正しく稼動しないと運用に支障をきたします。
そんな時刻を自動的に合わせるものがNTP(Network Time Protcol)です。今回はxntpというツールを導入します。

NTPのインストール

xntpはftp://ftp.udel.edu/pub/ntp/ntp3/でダウンロードできます。ntp4というのもあるんですが、私はntp3しかわからないので、とりあえずコレを選びました。
ダウンロードしたら、いつもの「./condifure」「make」「su」「make install」で導入完了です。
これが終わったら、以下のコマンドで時間を調整します。
#/usr/local/bin/ntpdate (タイムサーバ)
当然、元となるタイムサーバが無いと時計を合わせられません。さてどうするかというところですが、「http://www.eecis.udel.edu/~mills/」にアクセスすると「Public NTP 云々 Time Servers」というのがあるので、それを使います。Serversなのでサーバ群がずらずらと出てきますが、まぁ海外のを使って言葉が通じないと困るのでページ内検索で「Japan」を探して、ソレを使わさせていただきました。
ちゃんと動作するか、「date」コマンドで時計をづら下後に実行すると動きがよくわかります。
動作が確認されたら、とりあえず毎日実行されるようにcronでスケジューリングしましょう。スケジューリングするときは「ntpdate -s 云々」のように「-s」オプションをつけるとsyslogに記録されるので、動作状況を確認することができます。

logrotateの構築

サーバを立てる以上、ログをとってそれを管理しなければなりませんが、どんどん蓄積されているログを放置しておくと無意味にディスク容量を圧迫してしまいます。
そこでlogrotateを使い、ログを分割、また古いものは破棄という処理をします。
logrotateは以下のアドレスから入手できます。
ftp://ftp.redhat.com/pub/redhat/linux/code/logrotate/

logrotateの構築

logrotateは「./configure」無いみたいなので、そのまま「make」「su」「make install」でやったところOKみたいです。
次に設定ですが、まずは「/etc/logrotate.conf」です。もしかしたら無いかも知れないので、その場合はソースファイルを展開したディレクトリの「examples」あたりから拾ってきてもいいですし、自前で作ってもいいです。内容は以下のような感じ。
weekly
# 毎週実行
rotate 4
# 4回まわしたら古いものから消す
errors root
# エラーはrootへメールする
create
# 新しいログファイルを作る
include /etc/logrotate.d
# ↑このディレクトリにある設定もすべて実行。
これで、完了です。「log」というログファイルなら「log.1」「log.2」…と回転されていき、「log.5」になると消えます。また、createを指定してるので、回転したときに0バイトのログファイルが作成されます。
次に、どのファイルを回転させるかの設定。「logrotate.conf」に直接書いてもいいですが、今回は分けます。「logrotate.conf」に「include /etc/logrotate.d」と書いてあるので、次のデータはそこに書きます。
参考例としてapacheのログ。

/var/log/httpd/access_log {
postrotate
/etc/rc.d/init.d/httpd restart
endscript
}

こんな感じに書くと「/var/log/httpd/access_log」を回転することができます。また、回転時にデーモンがログを見失うことがあるのでデーモンを再起動してます。
同じくerror_logやmessages等も回転させましょう。

自動起動の設定

結構はまりましたが、

/usr/sbin/logrotate /etc/logrotate.conf

とすると回転できるはずなんですが、できませんでした。どうも初回は

/usr/sbin/logrotate -f /etc/logrotate.conf

で強制的に回転させないとダメみたいです。
これができたら

#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf

のようなシェルスクリプトを「cron.weekly」あたりに入れておけば毎週回転されます。

デーモン起動ルーチンの整理

ここでシステムの構築を一時休み、ぐちゃぐちゃになってるサーバ内の整理を始めました。
まずは/etc/rc.d/init.d/httpdとかを実行するとエラーが出る問題を解決し、デーモンの起動と終了のロジックをきれいにしたいところから始めます。

pidof

まず、「pidofが無い」というエラーを何とかしたい。確かにpidofは無い。んで、pidofをいろいろ探したのだが無い。とりあえず、情報収集をいた結果、sysvinitに付属のkillall5のシンボリックリンクらしいというところまでわかったので、ftp://sunsite.unc.edu/pub/Linux/system/daemons/init/からsysvinitを入手した。
こいつを展開すると展開先のフォルダに「src」というフォルダができ、shutdownとかinitとかありがたいファイルがいっぱいある。「pidof->../sbin/killall5」なんてファイルもあるので、ここでpidof=killall5なんだ〜と確信する。とりあえず、目的のkillall5.cのみをコンパイル。
gcc killall5.c -o killall5
ちなみにkillall5はもともと「/sbin/killall5」に入っている。しかしなぜか動かなかったので、今回新しく作ったkillall5を上書きし、pidofにシンボリックリンク。
最後に試しに「/etc/rc.d/init.d/httpd status」なんて入力してちゃんと動いていることを確認。
これで今日は眠れる(^^

Run Level管理

通常のディストリビューションは、RunLevelが設定されていて、その値に応じてテキストコンソールになったり、Xが起動したりします。
この動きは、システムで一番初めに起動される「init(PIDが常に1)」が「/etc/inittab」を読み込み、デフォルトのRunLevel(initdefault)を読み込み、その値に応じて、処理が行われます。「/etc/inittab」は
識別子:ランレベル:処理方法:実行するプログラム
という書式になっています。始めはRunLevelにかかわらず、sysinitの行が処理されます。OpenBlockSでは
si::sysinit:/etc/rc.d/rc.sysinit
と定義されてるので、「/etc/rc.d/rc.sysinit」スクリプトを処理します。
ちなみに今まではこのスクリプトにhttpdの起動とか全部書いてました。なぜかというと、「/etc/rc.d/init.d/httpd start」とかがうまく動かなかったからです。これにはいくつか原因がありました。前にも書いたとおり、pidを調べるコマンドである「pidof」が無かったのもあるのですが、どうも「/etc/rc.d/init.d/functions」がおかしかったみたいです。これにはデーモンの起動や終了の処理のサブルーチンが記述されています。
とりあえず、近場にあるTurboLinuxも同じ仕組みだったので、そこから奪ってきました。
あとは、一通りのデーモン起動終了スクリプトの確認と必要に応じて修正を行いました。
また、通常のディストリビューションは「/etc/inittab」に特定のRunLevelの場合に行う処理として
l3:3:wait:/etc/rc.d/rc 3
と書いてあります。この場合はたとえば、RunLevelが3の場合に、「/etc/rc.d/rc」というスクリプトを起動しているのですが、このスクリプトに対する引数(プログラムに渡すオプションスイッチ)に「3」を指定してます。
「/etc/rc.d/rc」は与えられた引数に応じて、それらに対応したディレクトリ無いのファイルをすべて実行します。たとえばRunLevelが「3」の場合は「/etc/rc.d/rc3.d」ディレクトリ内をすべて実行するわけです。ただし、ヤミクモに実行するわけではなく、ファイル名が「S30httpd」のように、ファイル名の先頭が「S」のものだけを実行します。さらに「S」の後に続く数字の順番に起動します。たとえば「S10syslogd」があった場合は「S30httpd」よりも先に「S10syslogd」が処理されます。
「/etc/rc.d/rc3.d」内にあるファイルはすべて「/etc/rc.d/init.d」へのSymlinkなので、どのRunLevelでもデーモンの実行は同じスクリプトが使われます。
、、、と、まぁこういう風に実行されるように、環境を整備しました。そうそう。OpenBlockSは「/etc/rc.d/rc」も上記のような動きをするように作られていませんでしたので、これもTurboLinuxからもらってきました(一応、前のrcの残しておいたほうが無難そうなので、名前をrcxに変えてます)。
rcxとfunctionsは以下に置いてあります。
http://delta-jp.homeip.net/pub/functions
http://delta-jp.homeip.net/pub/rcx

snortの導入

サーバはコンピュータウイルスやクラッカーによく狙われているという話がありますが、実際に私自身そういう話にかかわる仕事をしており、その被害をよく見ています。まぁ、そんなことはどうでもいいとして、Linuxをクラッカーから守る方法はイロイロあります。基本的な考え方はいろいろあるのですが、大雑把に分類すると「攻撃、侵入されない対策」「攻撃、侵入の傾向を調べる記録」、「侵入されてもデータへアクセスできないようにする対策」「データの変更を検知するための対策」「データを復旧するための対策」、というところです。
今回の「snort」は「攻撃、侵入の傾向を調べる記録」の部分にあたります。syslogやiplogのようなログとは一味違います。一般的にはNIDS(ネットワーク型侵入検知システム)と言われ、流れてくる通信データをすべて監視して、ある特定のパターンを見つけると、不正な通信と判断して記録するものです。「ある特定のパターン」というのはウイルスワクチンと同じような「辞書」です。
snortはLinux同様、世界各国の開発者から協力を得て作られているNIDSで、市販のIDSを作っている技術者や国内のプログラマも協力しています。
また、ディスカッションも盛んで、侵入パターンの「辞書」もそういうところから作られているので、更新も早いです。
今回はsnort1.8というバージョンを使っています。

snortのインストール

snortを入れるには、libpcapが必要です。これは「iplog」のところに書いてあるので、そこを読んで入れてください。
snort自身はhttp://www.snort.org/から入手できます。入手後はいつもどおり、展開した後に「./configure」「make」「su」「make install」でOKです。
次に、snortの辞書を入れます。辞書もhttp://www.snort.org/から入手できます。辞書も適当な場所へ展開し、「snort.conf」を編集します。
snort.confは4ステップに分かれています。
1つ目はネットワークの設定。

var HOME_NET xxx.xxx.xxx.xxx/24

ここでは監視するネットワークの範囲を指定します。当然ながら自分自身のみを監視することもでき、その場合は自分のIPアドレスを設定し、後ろに「/32」とつける場合です。他にも

var SMTP $HOME_NET

と、ありますが「$HOME_NET」はHOME_NETの値と同じことを示すので、特に理由が無ければそのままでOSです。
次にプリプロセッサの設定です。プリプロセッサは通常の「辞書」では対応できない攻撃パターンを処理するプログラムです。基本的にはコメント行として認識されてしまう「#」をはずせば設定され、たとえばフラグメント化されたパケットを処理する場合は、

preprocessor defrag

でOKです。
URLに文字コードを使って行われる攻撃を検知するには以下の行が必要になります。

preprocessor http_decode: 80 8080

ポートスキャンの検知は以下の行なんですが、基本的にiplogの方がポートスキャンの検知に優れてると言われてますので、これはコメントアウトしてます。まぁ、あっても悪くないですけどね。

# preprocessor portscan: $HOME_NET 4 3 portscan.log

3つ目はログの出力先ですが、これは特に変更しなくてもログディレクトリにalertというファイルが記録されます。大規模なシステムの場合はデータベースとかを使ったほうがいいのかもしれませんが、あえて使うなら以下のsyslogに記録するオプションくらいでしょうか。

output alert_syslog: LOG_AUTH LOG_ALERT

最後は検知のための「辞書」であるルールセットの指定です。ルールファイルは通常別ファイルになっているので、includeでファイル名を指定しています。ディレクトリ名を変えたりとか、新しいルールを追加するときにいじりましょう。
後はsnortの起動です。ログディレクトリを「/var/log/snort」などにし、デーモンモードで起動するときは以下のような感じになります。

/usr/local/bin/snort -Dd -c snort.conf -l /var/log/snort