Warning: Error while sending QUERY packet. PID=2158 in /home/uls/public_html/wordpress/wp-includes/class-wpdb.php on line 2351 FreeBSDな生活

2006.01.29

携帯電話からの投稿(post2blog)・・・(Movabletype)

そもそもpost2blogは携帯電話からの投稿が出来る、いわゆるmoblogに適したものだが、持っていた携帯電話のディジカメ機能は画素数が少なくて使っていなかった。
そこで、新しい携帯電話に取り替えた(vodone 902T)のだが、画素数は1.92Mピクセルで、これなら使えると思っていた。 
ところが、画像を添付するとMMS(Multi Message Service)とか言って必ずhtml形式のメールになり、post2blogでは処理できない。
これでは、携帯を変えた意味がないので強引にhtml形式のメールをテキスト形式に変換する前処理のスクリプトを書いた。
だいたい、html形式のメールフォーマットなど知らないので、これを調べるところから始めた。
受け取ったメールは以下のようになっていた。

From - Sun Jan 29 16:14:11 2006
          ・
          ・
Date: Sun, 29 Jan 2006 16:13:48 +0900
Subject: Fw:テスト
Content-Type: multipart/related;Type="multipart/alternative";
Content-Type: multipart/mixed;
boundary="BoundaryXXYYZZ" ・・・・ ?
From: <hogehoge@t.vodafone.ne.jp>
Message-ID: <200601291148513D5E8>
To: hogehoge@uls.fam.cx
Mime-Version: 1.0
X-UIDL: W:##!58A!!;Z0"!6nK!!
--BoundaryXXYYZZ ・・・・ ?
Content-Type: multipart/alternative;
boundary="BaFpaNPqVXR912gDOAspNg" ・・・・ ?
--BaFpaNPqVXR912gDOAspNg ・・・・ ?
Content-Type: text/plain;charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
テストです
--BaFpaNPqVXR912gDOAspNg ・・・・ ?
Content-Type: text/html;charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
<html>
  ・
  ・
</body>
</html>
--BaFpaNPqVXR912gDOAspNg ・・・・ ?
--BoundaryXXYYZZ ・・・・ ?
Content-Location: dce99f2f.jpg
Content-ID: <A0001>
Content-Type: image/jpeg;name="DCF_0003~00.jpg"
Content-Transfer-Encoding: base64
/9j/4QFaRXhpZgAATU0AKgAAAAgACgE
    ・
    ・
--BoundaryXXYYZZ

これを見ると、赤字で示した区切り文字列(実際はもっと複雑)がヘッダー部で定義され、この区切り文字列で大きく文章部分と画像部分に分けている。
そして、文章部分をさらに青字で示したサブの区切り文字列でプレーンテキスト部とhtml部に分けているのが分かる。
この構造が分かれば、まずヘッダー部の削除線で消した部分をその次の赤字で示したものに置き換え?〜?ならびにhtml部分である?〜?を取り除いて、?の区切り文字列を赤字の文字列に差し替えてやれば、プレーンテキストフォーマットに変換出来ることが分かる。
そこで、文末に添付したようなフィルターをperlで書き(html2text)、post2blogの前に入れてやる。 すなわち /etc/aliaseに以下のように書き足す。

htmladdress: "| /usr/local/bin/html2text | /usr/local/bin/post2blog"

/etc/aliaseに書き加えたらnewaliasesコマンドで変更を反映させれば、これで準備完了です。
かなり、強引なやり方なので、他の携帯電話やメーラーからhtml形式で送って動作するか否かは分からないが、Outlook Expressでhtml形式で送ったところ、機能した。
なお、添付無しのhtml形式の場合は、上記の?〜?は存在せず、?の区切りは最初から赤字の区切りが同じものが入っているので?以降を強制的に切り捨てて、一応は動作している。
本来は1つの入り口でhtmlでもプレーンテキストでも自動的に見分けて処理できるようにすべきかと思うが、手抜きしてhtml形式のメールの入り口とプレーンテキストの入り口を分けて(/etc/aliasに2つ設けて)対処しています。
htmlからtext形式へのコンバート : html2text


2006.01.25

apache2.1版以降のhttpd.confと.htaccess・・・(Apache)

以前に.htaccessの仕様がapache2.0と2.1以降で異なるので2.0を使うと書いた。

しかし、将来を考えると何時までも古い版数のapacheを使い続けるのも問題なので、色々調べてみた。apacheのサイトのDocumentを読んだが分かり難いので、ここに自分の言葉で書いておくことにした。

ざっと、見たところ基本的な方針はrootになれる人は全てhttpd.confで設定すべきで、rootになれない人のために最低限許すとの考えで貫かれているようだ。

それで、いままで気安くAllowOverride Allなどと書いてたのが許されなくなったようだ。

1. htaccessを許す場合

もし、CGIの実行とユーザ認証をDocument Root内において.htaccessでの指定を許すなら(このケースが多いと思う) Document Rootのディレクティブで

AllowOverride Options AuthConfig

となる。 記述は実行名でなくカテゴリーなのが要注意で、ExecCGIではなくOptionsとなる。 そしてディれクティブ内の

#    AddHandler cgi-script .cgi

のコメントアウトの#を除いて有効にする。

2. 全てhttpd.confで設定する場合(こちらが正統)

もし、rootで何時も設定するとの方針ならDocument Rootディレクティブで

    Options Indexes FollowSymLinks ExecCGI
    AllowOverride None

そして、認証を行うページ(仮にabcdとする)に対して新しいディレクティブを作り次のように記述する。

<Directory "/web/data/abcd"> ・・・・ /web/dataがDocument Rootのケース
AuthType Basic
AuthUserFile 設定ファイル
AuthName "メンバーのグループ名"  ・・・これは好きな名前でよい
<Limit POST GET>
 require valid-user
</Limit>
</Directory>

となる。


2006.01.19

ウイルスチェックソフト(clamAV)のインストール・・・(mail)

WindowsのクライアントPCにはNorton Anti Virusを入れているが、ウイルスはサーバで阻止した方が好ましい。
特にMLを運用していると、誰かがウイルスに感染すると急速に広がる危険性を帯びており、以前から何とかしたいと考えていた。
しかし、個人のクライアント用は数千円で買えるのにサーバ用は数十万円もするので二の足を踏んでいた。 個人使用は無料のものもあるが、試してみたがどうもしっくりこないので、本格的な導入は見合わせていた。
ところが、最近Clam Antivirus (略称ClamAV)というソフトが見つかり、フリーとは言うもののApple, IBM, SunMicroなどでも採用していて営利目的でも使えるとして評判が良いので入れることとした。
インストール方法の下記に手順を書いておく。
FreeBSDにはportsにclamavがあるので、/usr/ports/security/clamavでインストールする。

# cd /usr/ports/security/clamav
# make WITH_MILTER=yes clean

clean動作が終わったら、次にインストールです。

# make WITH_MILTER=yes install

インストールが終わると、/usr/local/etcにclamd.confというファイルが出来ていて、/usr/local/etc/rc.d
に clamav-clamd.sh, clamav-freshclam.sh, clamav-milter.shの3つのファイルが出来る。
ここで、/etc/mailに移動しsendmail.cfのバックアップを取って、freebsd2.mcに次の赤字部を追加してsendmai.cfを作り直す。

dnl Enable for both IPv4 and IPv6 (optional)
DAEMON_OPTIONS(`Name=IPv4, Family=inet')
DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O')
INPUT_MAIL_FILTER(`clmilter', `S=local:/var/run/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')dnl
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')

そして、インストール

# make all install restart

次に/etc/rc.confに次の3行を追加。

clamav_clamd_enable="YES"
clamav_milter_enable="YES"
clamav_freshclam_enable="YES"

ここで、サーバをリブートすれば有効になって立ち上がるはず。
ところが、3つの起動ファイルで # xxxxx.sh startとすると、clamav-clamd.sh以外はalready runnningと出るのにclamav-clamd.shのときは/var/log/clamav/clamd.logがPermissionが許容されていないとして立ち上がらない。

# chown clamav /var/log/clamav/*

として再度起動したら、うまく起動できたようだ。
あとは、動いていることの確認だがWindowsのメーラから自分宛にメールを出して、届いたメールのヘッダをみると、以下の2行が追加されいている。 これでOKだ。
X-Virus-Scanned: ClamAV version 0.87, clamav-milter version 0.87 on uls.fam.cx
X-Virus-Status: Clean


Portsを最新版にする・・・(FreeBSD)

昨日、clamAVのインストールを書いた。
うまく動いているようだが、freshclamコマンドを実行するとお前の使っているバージョンは古いと以下のようなメッセージがでる。

WARNING: Your ClamAV installation is OUTDATED
WARNING: Local version: 0.87 Recommended version: 0.88

それでは、最新版を入れ直そう思い、まずportsを最新版にすることにした。
このためにcvsupを動かす必要があるのでcvsupをportsで入れる。

# cd /usr/ports/net/cvsup-without-gui
# make install clean

だいぶ時間が掛かるが、終了したら、/usr/share/examples/cvsupにあるports-supfileを/etcにコピーする。

# cp /usr/share/examples/cvsup/ports-supfile /etc

このファイルはRead-Onlyになっているので chmod 644 ports-supfileで編集可能としてから、中身を編集する。
編集個所は *default hostの指定のみで、ここに記述したhostと同期を取ることになる。
私は *default host=cvsup.jp.freebsd.org とした。

*default host=cvsup.jp.freebsd.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix

これで、updateする準備が出来たが、要らないports/chineseやports/vietnameseなどもupdateされるので /var/db/supにrefuseというファイルを作り、要らないportsを列記しておく。

# mkdir /var/db/sup
vi /var/db/sup/refuse
ports/arabic
ports/chinese
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/korean
ports/polish
ports/portuguese
ports/russian
ports/ukrainian
ports/vietnamese

あとは、cvsup -g -L2 /etc/ports-supfile で同期が始まる。

# cvsup -g -L2 /etc/ports-supfile

かなり時間が掛かる。 終わったら、clamAVの入れ直しだ。

# cd /usr/ports/security/clamav
# make WITH_MILTER=yes clean
# make WITH_MILTER=yes install

これで、サーバをrebootして最新版を起動する。
freshclamコマンドでもWarningは出なくなった。
なお、例えばclamscan -r /home とすると/home以下のウイルスをチェックしてくれる。
延々とファイルリストの表示が続いたあと結果が以下のように出力される。

# clamscan -r /home
Known viruses: 42492
Engine version: 0.88
Scanned directories: 558
Scanned files: 14193
Infected files: 0
Data scanned: 1092.54 MB
Time: 1108.554 sec (18 m 28 s)

2006.01.16

Firewallの設定・・・(FreeBSD)

韓国からの不正浸入を試みようとするアクセスが異様に多い。 そんなに簡単には破られる事は無いと思うが、無気味であり、もしものことを考えてFirewallでサーバを守ることとにした。
FreeBSD 6.0で運用しているが、設定は簡単で /etc/rc.conf に次の2行を追加する。

firewall_enable="YES"
firewall_type="/etc/ipfw.conf"

しかし、ここでサーバを再起動すると私のようにWindowsからTera Termでアクセスしていると、その後一切アクセスできなくなるので要注意です。
理由は、defaultで
65535 0 0 deny ip from any to any
が設定されているからです。 この意味は全てのipパケットを禁止するとなる。
そこで、/etcに ipfw.confの名前のファイルを作り、最低次の1行を書いておく。
add 65000 allow all from any to any
ipfwのルールは番号の若い順に評価されるので、65535番より若い65000で全てのパケットを通すと指定しておく。 これでサーバをrebootして、

# ipfw -a list  と入力して設定ルールを見ると、
65000 354796 84007947 allow ip from any to any
65535      0        0 deny ip from any to any
となる。

後は、中国・韓国のIPアドレスを拒否するからipアドレス一覧をダウンロードし、Editorで開いて全選択してコピーし/etc/ipfw.conf の 6500 all allow ip from any to anyの行の前に貼り付ける。
これで、再度サーバをrebootすれば公式に韓国に割り当てられたip addressからのパケットは全て拒否できる。

            ・
            ・
            ・
add deny log all from 222.120.0.0/15 to any
add deny log all from 222.122.0.0/16 to any
add deny log all from 222.231.0.0/18 to any
add deny log all from 222.232.0.0/13 to any
add deny log all from 222.251.128.0/17 to any
add 65000 allow all from any to any

それでも、proxy経由でアクセスされたら防げないが、90%程度は阻止できるとのことである。