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.private と smtp.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 とかにして再起動させて、
ログを見ながらメールを出してみると解決策が見えるかもしれませんよ。