SSブログ

やっとこさ復旧 [Linux]

今日は久しぶりにPCのおはなし。

/Double-Slash/のHPは家においてあるサーバーで運営されています。
ちょっとメンテで再起動させました。

そしたら・・・・

続きを読む


smX [Linux]

ひさびさに覗いたら、sendmail X が verupしてた。

続きを読む


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:blog

MySQLはバグが少ない [Linux]

■MySQLはバグが少ない
http://japan.cnet.com/news/sec/story/0,2000050480,20080516,00.htm

らしいです。
Coverityが独自に調査した結果、
MySQLは悪用されそうな脆弱性は多くないそうです。

このCoverity、以前Slashdot話題になっていたこともあるように、
結構その道では有名な会社だそうです。

こういう会社はこれからももっと必要とされてくるでしょうね。
日本からもこういう会社出てこないかな。日本人のほうが緻密な作業は向いてると思うし。

でも、ここでいうバグとは一体なんなんだろう、と思ったり。
バッファオーバーフローの可能性とか、変数の初期化がされてないとか、
変数内の文字のEscape処理をしていないとか、そんなもんでしょうか。

Postgresはどうなんでしょう?調査して比較してくれないかなー

個人的にはApacheを調査してもらいたい感じです。
でも公表してないだけで、調査は行われてるのかもしれませんね。
あ、Apache 2.0.53が出てる・・version up しよっと。

今回の調査で見つかった脆弱性は、当然次のversionのMySQLに反映されるようです。
さすがに早い。近々出てくると思われます。
アンテナはっておこう・・・


ClickPathの利点と弱点 [Linux]

まぁ弱点というか、そんなものでもないんですけどね。

利点は当然ユーザーを追跡できることです。
ですけど、追跡するためには「Apache::ClickPath::OutputFilter」というものを
通してHTMLを表示してあげないといけない。

このOutputFilterを通すとどうなるのかというと、Aのタグ(アンカーリンク)に
追跡用のSessionが埋め込まれます。

具体的に言うと・・

通常は
http://www.makocchi.net/test/
へのリンクが
http://www.makocchi.net/-S:9XtNsN:drNdo9NNq7aFA9NNNRNM/test/
となります。

Sessionが埋め込まれてますね。
これの何が嫌かっていうと、例えばユーザーとかがブックマークやリンク張ろうと
した時にこのSessionが丸見えのまま登録されたりリンクされたりするわけですよ。
なんかかっこわるいですよねー。

リンクとかされた場合、Session情報がいつも同じだから
ユーザー判別できないし・・・(意味なし)

しかもこのSession情報はユーザーがいくらでも書き換えられるっぽい。
http://www.makocchi.net/-S:TestTestTestTestTest/test/
とかできるわけです。

うーむ・・・・意味あるのか・・・?
あんなに苦労して入れたのに・・・(泣)

なんとかして隠したい・・・んですけどやっぱ無理なんでしょうかね・・・
mod_rewrite とかでできないかなー

ちなみに、ユーザーの追跡はできなくなりますけど、一応「-S:~」を表示させない
ことは出来ます。

/etc/apache2/conf/modules.d/75_mod_perl.conf の
PerlOutputFilterHandler Apache::ClickPath::OutputFilter
をコメントアウトして apache を再起動すればいいだけ。
この状態でもログにはちゃんと%{SESSION}の情報は書かれます。
ただ、HTTPのリクエスト毎に違ったSessionになっちゃってますけどね・・・
つまり同一ユーザーのアクセスでも違ったSession情報になります。むー・・

ただ、OutputFilter をコメントアウトした状態でも、正確ではないですが
ユーザーの追跡ができそうな感じです。

大体Session情報は下記のようになってるんですが、
9XtNsN:drNdptNNq7aFC9NNNRNM
この「:」の後の部分の前半部分
drNdptNNq
が、ユーザーごとに共通してくれてそうです。

とあるユーザーAがアクセスにくると・・・・・
GET /index.html HTTP/1.1 "drNdptNNoXXXXXXXXXXXX"
GET /test.jpg HTTP/1.1 "drNdptNNoXXXXXXXXXXXX"
GET /test.css HTTP/1.1 "drNdptNNoXXXXXXXXXXXX"

とあるユーザーBがアクセスにくると・・・・・
GET /index.html HTTP/1.1 "drNdptNNSXXXXXXXXXXXX"
GET /test.jpg HTTP/1.1 "drNdptNNSXXXXXXXXXXXX"
GET /test.css HTTP/1.1 "drNdptNNSXXXXXXXXXXXX"

ってな感じになってる(っぽい)

うん、まぁ・・・当分はこれでいっかぁ~


Apache::ClickPath で Cookie を使わずにユーザーを Tracking の続き [Linux]

やりました。
ついにできました。

苦労したかいがあった!

ちなみに、どんな風になるかというと、
apach の access_log に session 情報が記述されます。

具体的に見てみると、

192.168.1.1 - - [06/Jan/2005:16:28:14 +0900] 304 - "" -> "GET / HTTP/1.1" "Don't hack me ...." "9XtNsN:dq,1wtNNYNjUltNNNNNM"

※Logformat は以下のようにしてる場合です。
"%h %l %u %t %>s %b \"%{Referer}i\" -> \"%r\" \"%{User-Agent}i\" \"%{SESSION}e\""

httpd.conf の CustomLog に %{SESSION}e と書けばいいんです。

最後の 「9XtNsN:dq,1wtNNYNjUltNNNNNM」 が session 情報というわけです。
これで NAT された環境から複数の人が access にきても、
誰がどこをみたのか分かるんですよ。ええ。

まぁそれだけなんですけどね。

さて、やり方ですけど、、、、、、
かなり Gentoo の掟破りをしていると思いますので、あんまり参考になるかわかりませんが
一応備忘録として書いておきます。
導入しておかしくなっても知りません。(無責任)


自作 mod_perl-2.0.0.ebuild

まずやるべきことは PORTDIR_OVERLAY を指定することです。
/etc/make.conf の PORTDIR_OVERLAY=/usr/local/portage の記述がコメントアウトされていたら#を外してください。

その次に

mkdir -p /usr/local/portage/dev-perl/mod_perl

mod_perl の 2.0.0 じゃないと駄目なので自分で ebuild を作らないといけません。
(まだ portage に入ってないみたい)

というわけで既存の ebuild をコピーしてきましょう。

cd /usr/local/portage/dev-perl/mod_perl
cp -p /usr/portage/dev-perl/mod_perl/mod_perl-1.99.17-r1.ebuild ./mod_perl-2.0.0.ebuild

mod_perl-1.99.17-r1.ebuild を雛型にして新しい 2.0.0 を作ります。
cp したやつを3箇所ほどいじります。

vi mod_perl-2.0.0.ebuild

・back=\_${PV##*\.} を back=\.${PV##*\.} に変更
・MY_P=${PN}-${MY_PV} を MY_P=${PN}-${MY_PV}-RC3 に変更
・epatch ${FILESDIR}/${PN}-1.99.16-sneak-tmpdir.patch をコメントアウト

※ MY_P の部分は http://perl.apache.org/dist/ を確認してから決めてください。自分がやったときは mod_perl-2.0.0-RC3.tar.gz があったのでそれを使いました。

さて、これだけでは emerge できません。digest を作ります。
(FEATURES="digest" が無い人)

ebuild mod_perl-2.0.0.ebuild digest

これで compile の準備が整いました。
その前に、mod_perl の 1.2.X とか入ってると compile でエラーになるのでunmerge しといてください。

emerge unmerge dev-perl/mod_perl


もともと入ってない人は飛ばして構いません。

では emergeしましょう。

ACCEPT_KEYWORDS="~x86" emerge -vp ">=dev-perl/mod_perl-2.0.0"


で確認して、OKだったら -vp を -v にして emerge してください。


Apache::ClickPath

ebuild 作ったんだけど上手く動かなかった・・・
原因は configure のところで perl の library の PATH が足りないことだって
わかってるんですけど・・・
ebuild でどういう風に修正したらわからず。
結局 ebuild ではなく手動でインストール
Apache-ClickPath-1.0.tar.gzを落として解凍してください。

perl -I/usr/lib/perl5/vendor_perl/5.8.5/i686-linux-thread-multi/Apache2  Makefile.PL
make
make install ※Include は各自の環境に変えてくださいね

でOK!!


Apacheの設定

Gentoo の Apache は結構管理が変わってて(自分にとっては)理解するのに
時間がかかります・・・

さて、まずは /etc/conf.d/apache2 を編集します。

APACHE2_OPTS="-D PERL"

上記のようにします。自分の場合は PHP も入ってるので実際には
APACHE2_OPTS="-D PHP4 -D PERL" になってます。

Gentoo は -D PERL とすることで mod_perl が Apache に
読み込まれるような httpd.conf になってるようです。

その次に /etc/apache2/conf/modules.d/75_mod_perl.conf を変更します。

vi /etc/apache2/conf/modules.d/75_mod_perl.conf

<IfModule mod_perl.c> 内の
PerlRequire "/etc/apache2/conf/modules.d/apache2-mod_perl-startup.pl"
をコメントアウトしてください。

そしたら続いて <IfModule mod_perl.c> の中に
  PerlModule Apache2
  PerlLoadModule Apache::ClickPath
 <ClickPathUAExceptions>
   Google     Googlebot
   MSN        msnbot
   Mirago     HeinrichderMiragoRobot
   Yahoo      Yahoo-MMCrawler
   YahooSlurp http://help\.yahoo\.com/help/us/ysearch/slurp
   Livedoor   livedoorCheckers
   Globalspec Ocelli
   Naver      NaverBot
   IBM        http://www\.almaden\.ibm\.com/cs/crawler/
 </ClickPathUAExceptions>
 ClickPathSessionPrefix "-S:"
 ClickPathMaxSessionAge 18000
 PerlTransHandler Apache::ClickPath
 PerlOutputFilterHandler Apache::ClickPath::OutputFilter
と書いてください

次に /etc/apache2/conf/commonapache2.conf を編集します。

LogFormat の部分で表示させたい場所に 「%{SESSION}e」を追記してください。

ちなみに自分は以下のようになってます。combined で log に書いてます。
LogFormat "%h %l %u %t %>s %b \"%{Referer}i\" -> \"%r\" \"%{User-Agent}i\" \"%{SESSION}e\"" combined

これで Apache を再起動すればOKです。

この ClickPathUAExceptions で指定すれば、特定のものからの access 時に
SESSION の値を決められるようです。
Googlebot が来れば Google に、msnbot が来れば MSN になるようです。
User-Agent で判断してるっぽい。


さて、これで本家の mod_perl-2.0.0 が出るまでは凌げそうです。
まぁ本家のが出てきたらさっさと入れ替えます。
それまでのつなぎということでお願いします。


MySQLで幸せ生活 [Linux]

最近ちょこちょこMySQLをいじる機会が多くて、いまさらながらMySQLの便利さを痛感。

PHP とかと連携してデータを表示する時とかは以下のように limit を多用します。
表とか作る時は便利です。

たとえば、1000件あるデータのうち、100件だけ表示したい場合
どうしますか?

$sql = "select data1, data2 from db";
$result  = mysql_query($sql);

$c = 0;
while ( $item = mysql_fetch_array($result)) {
  $c++;
  print "${item['data1']} , ${item['data2']} \n" ;
  if ( $c > 99 ) {
    break;
  }
}

こんな感じですかね?一般的なのは。

さて、表とかあるページにはよくありますよね?
「次の100件を表示」とかのボタン。
この場合、SQLの結果の101-200件目を取ってこなくてはいけない。

さて、どうしますか?

ぱっと思いつくのを考えると

$c = 0;
while ( $item = mysql_fetch_array($result)) {
  $c++;
  if ( $c > 100 ){
    print "${item['data1']} , ${item['data2']} \n" ;
  }
  if ( $c > 200 ) {
    break;
  }
}

こんな感じでしょうか。ちょっと雑な気がしますが・・・
無駄なloopしてるし。
if 文が必要になってきてめんどくさかったりします。

さて、ここで limit の登場です。
これはSQLの結果の件数を制限してくれるわけです。
101-200件目を表示したい場合は
「limit 101,100」 を追加してあげればいいだけです。
これは101件目から100件を表示するっていう意味です。

ですから

$sql = "select data1, data2 from db limit 101,100";
$result  = mysql_query($sql);

while ( $item = mysql_fetch_array($result)) {
  print "${item['data1']} , ${item['data2']} \n" ;
}

こんだけで済んじゃうんですよ!
件数を数える変数も使わなくて済むし、無駄な loop もしない。
すばらしい~。

limit に指定する数字を POST とかから拾ってくれば
「次の100件を表示」とかいう機能がかなりラクチンに作れます!

この limit は MySQL だけじゃなくて PostgreSQL にもあります。
Oracle や Sybase には無いとですたい。


Apache::ClickPath で Cookie を使わずにユーザーを Tracking [Linux]

Apache に食わせる module(mod_perl) で Apache::ClickPath っちゅーのがあるらしい。
これを使えば Cookie に頼らずにユーザーごとにログからいろいろ追跡できるらしい。

http://naoya.dyndns.org/~naoya/mt/archives/001494.html

おもしろそうなので入れてみようとしたのだが・・・

インストールしようとしても
「Undefined subroutin &Apache::Module::add」 ってなって
どうしてもエラーになる。

mod_perl の 1.99.17 を入れても変わらんかった。

もうちょっと調べてたら
mod_perl の 1.99.18 なら大丈夫そうという情報をゲットした。
http://mathforum.org/epigone/modperl/phehcroyghal/200412140907.09179.torsten.foertsch@gmx.net

しかし・・・我が gentoo では mod_perl は 1.99.17 までしかない・・・

http://perl.apache.org/dist/ にも 1.99.17 までしかないじゃんか!
うーん、、、どうしよう。
と思ってたら、どうやら 2.0.0-RC1 っていうのが 1.99.18 らしい。
http://search.cpan.org/~gozer/mod_perl-2.0.0-RC1/

はやく portage になってくれー。
2.0.0-RC1 は 12月12日に release されたっぽいからまだ portage になってないのかな。
自分で portage 作ってもいいんだけど、めんどくさい。

mod_perl-2.0.0 の ebuild が出来てたらさっそくインストールに挑戦してみます。
しばしおまちを。


sendmail 8.13.1 + dk-milter 0.2.3 インストール [Linux]

sendmail 8.13.1 + dk-milter 0.2.3

dk-milter に関しては http://www.sendmail.net/dk-milter/ とかに

いろいろ情報が載ってますが、いかんせん英語だし、まだまだ量が少ないです。

というわけで dk-milter とかインストールする人へのお役に立てれば幸いです。

ちなみに sendmail のインストール設定は検索すれば腐るほどでてくるので省きます。

dk-milter に関しては検索しても出てこないのでここに書いちゃいます。

書きなぐりですけど、勘弁してください。 

 

それぞれの source は

sendmail  http://www.sendmail.org/8.13.1.html

dk-milter  http://sourceforge.net/projects/dk-milter/

 から取って来てくださいね。注意することは、sendmail は 8.13.1 か、それ以上の version にすることです。

dk-milter はなるべく最新のものを。今の最新は 0.2.3 です。

あと、openssl 入れといてください。

 

ソースを get してきたら展開しましょう。

# gzip -dc dk-milter-0.2.3.tar.gz  | tar xvf -

 

compile する為の site.config.m4 を書きます。

# cd dk-milter-0.2.3/devtools/Site

# cp -p site.config.m4.sample site.config.m4

# vi site.config.m4

自分のところの sendmail は TLS やってるので

APPENDDEF(`confENVDEF',`-DSTARTTLS')

と書いておきました。

あと、

APPENDDEF(`confENVDEF', `-UNIS')

-UNIS は NIS を使わない設定です。

また、ssl の library が必要です。 /usr/local/ssl とかに入ってる人は

APPENDDEF(`confLIBDIRS', `-L/usr/local/ssl/lib -R/usr/local/ssl/lib')

APPENDDEF(`confINCDIRS', `-I/usr/local/ssl/include')

APPENDDEF(`confLIBS', `-lssl -lcrypto')

としてください。

 

では compile しましょう。source を展開したところに Build というものがあるはずです。

こいつを sh で起動させましょう。

# sh Build

 

そうすると obj.ARCH というディレクトリが作成されます。

自分は gentoo Linux なので obj.Linux.2.6.9-gentoo-r1.i686 になりました。

この中に compile したものが入ってます。sendmail を compile した時と同じ感じですね。

普通ならこの後 install とかするんですけど、今回は実験なので install しないで

起動させてみます。

 

起動させる前に・・・sendmail.cf で milter として dk-milter を通す設定しないといけないです。

milter を UNIX-domain Socket 経由にするか inet 経由にするか決めないといけないんですけど、

今回は inet にしてみます。port は適当でいいんですけど、とりあえず 9010 とかにしておきます。

sendmail.mc に

INPUT_MAIL_FILTER(`dk-filter', `S=inet:9010@localhost')

を追加してcf 作り直してください。

 

さて、肝心の key なんですけど、ツールが用意されてます。

gentxt.csh です。引数に host 名をいれて起動させます。smtp という host ですと、

# cd /usr/local/src/dk-milter-0.2.3/dk-filter/

# ./gentxt.csh smtp

 とします。

gentxt.csh の中身は単なる openssl 叩いてるだけです。

key の byte 数を変えたい時とかは改造しちゃいましょう。

openssl genrsa -out ${selector}.private 512 >& /dev/null

openssl genrsa -out ${selector}.private 1024 >& /dev/null

改造したら再度 gentxt.csh を叩きます。

# gentxt.csh smtp

smtp._domainkey IN TXT "g=; k=rsa; t=y; p=.....key......"

DNS の TXT レコードとして登録するべきものがそのまま表示されます。

DNSに smtp._domainkey という host を登録して、TXT レコードのところに上記のやつをそのまま書きます。

smtp._domainkey という名前で TXT レコードを引けるようになればOKです。

さらに、 smtp.privatesmtp.public っていうファイルが出来ているはずです。

private を pem として適当なディレクトリに持っていきましょう。

どこでもいいんですけど、/var/db/domainkeys の下が一般的っぽいです。

# cp -p ./smtp.private /var/db/domainkeys/smtp.key.pem

 

/etc/mail/ilist というのを作成します。

この list に書かれている host を認証するらしいです。

最初、この ilist が無かったのでいつまでたっても認証してくれなかった・・・

# cd /etc/mail

# vi ilist

ilist の中身は host 名とか IP アドレスとか domain とか書いておきましょう。

smtp

127.0.0.1

smtp.makocchi.net

makocchi.net

こんなかんじでしょうかね。

 

では dk-milter を起動させましょう。

自分の場合は /usr/local/src に展開したので

/usr/local/src/dk-milter-0.2.3/obj.Linux.2.6.9-gentoo-r1.i686/dk-filter/dk-filter -D

-p inet:9010@localhost -d makocchi.net -s /var/db/domainkeys/smtp.key.pem

-l -S smtp -P /var/run/dk-filter.pid -A -h -i /etc/mail/ilist -c nofws

長いですけど、、、これで動くはずです。1行で書いてください。

各オプションの意味は README とか見といてください。

・・・と思ったら書いてない!(´ー`;)

-a peerlist     file containing list of hosts to ignore
-A              auto-restart
-c canon        canonicalization to use when signing
-C config       configuration info (see man page)
-d domlist      domains to sign
-D              also sign subdomains
-f              don't fork-and-exit
-h              append identifying header
-H              sign with explicit header lists
-i ilist        file containing list of internal (signing) hosts
-l              log activity to system log
-m mtalist      MTA daemon ports to sign
-P pidfile      file to which to write pid
-s keyfile      location of secret key file
-S selector     selector to use when signing
-u userid       change to specified userid
-V              print version number and terminate

こんなかんじです。

# netstat -na | grep 9010

できちんと起動されたか確認してくださいね。

 あと、sendmail も忘れず再起動しといてください。

メールを出して、DomainKey-Signature:っていうヘッダがつけばOKです。

 

テストがうまくいったら dk-milter を inittab で起動させてあげれば、

いちいち起動させなくて済む予感がします。

 

分からない時は sendmail.cf の中の LogLevel を 99 とかにして再起動させて、

ログを見ながらメールを出してみると解決策が見えるかもしれませんよ。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。