Libserver3度目の大改造!RSS購読方法、リンク・コメントについての考え方は説明ページを参照して下さい。2008年11月BASIC認証を気楽に安全に使う新システム200記事目ということで、まぁすばらしいですね。旧システムが1133記事なので、合計1333記事ということですね。具体的には2005/05/31からだから、まぁ3年半ですね。以前も書いたような覚えがあるが、古い記事はよくわからない記事も多い。非常によい記録になってるのも多いのでかなり有意義な日記ではないかなと。CentOSでは標準でWebalizerってのが入ってるみたい。これはApacheのアクセスログを解析するもの。cronに登録されてて毎日解析プログラムが動いているだけです。この手のものとしてはLogwatchというログファイルの抜粋メールをrootに送ってくれるやつとか。結果は/var/www/usageにあるので、Apacheから見れるようにしたいですね。実はその設定が/etc/httpd/conf.d/webalizer.confだったのか...いらんと思って.conf_にしてた。この設定ファイルでは127.0.0.1以外からのアクセスを禁じてた。うーん...それでは不便と192.168.0.を追加しようと思ったのだが、けど出先でも見たいし、家庭内に悪意がいないとも限らんし...まぁ僕は別にアクセスログは個人情報とは思ってないんだけどね。いう考えをする人がいればなんか制限をかけた方がいいだろうと。それで考えたのはHTTPS強制とBASIC認証の組み合わせ。BASIC認証ならApacheの設定だけで簡単に認証かけれますからね。BASIC認証は特に暗号化を行わない認証だけど、HTTPSと組み合わせればパスワードの流出は多分防げる。いうのは、ブラウザが自動でパスワードを再送信する範囲がわからないから。一般に成功したディレクトリ以下なので、https://www.example.com/private/foo.phpで成功したら、HTTPSの範囲でしか再送されないだろう、という予測が当たればまぁ安全。あとBASIC認証は平文で送信されるので、サーバーに保管するのは暗号化したパスワードでOK。いう意味では暗号化しないというのは利点です。IMAPとかもCRAM-MD5とかじゃなくてSSLで暗号化して平文認証を選んでると。具体的な設定は少しめんどくさい。いうのもSSLの場合だけBASIC認証をするためには、VirtualHostディレクティブを使わないとだめなんだよね。それで元のwebalizer.confのアクセス制限を行うLocationディレクティブを全削除して、ssl.confをいじることにした。なんでssl.confなのかというと、同じVirtualHostディレクティブが二個あると後に読み込んだのが無視されるから。443からのアクセスの場合のみのBASIC認証だけですね。わかってしまえば非常にシンプルですね。443以外にあるならまずいですが、じゃなければこれでOKだと。.htpasswdはApacheから見えないところに置けば非常に安心です。見えるところにおいても.htから始まるのは見えない設定だろうけど。作成もコンソールからやるのがもっとも簡単です。user-cを付けてやればファイル作成もやってくれる。2人目からは-cは付けない。いえばカウンタのログは制限かけてないなと思って、同様に書いてみた。ログはscount/XXX.csvとscount/XXX.countにあるんだけどね。SuExec以後は600にしてPHP以外からアクセスされないようにしてたけど、これも非常に便利な資料なのでHTTPSで見れるようにした。[L,R]2つの拡張子だからLocationMatchディレクティブを使ったけど、csvだけなら*.csvでLocationディレクティブを使った方が読みやすいですね。rewriteもこんな感じでOKです。これでログも安心して見られる土壌が出来ました。ちなみにAuthNameが同じところは同じユーザー名・パスワードの組が送られることがある。実際は同じドメインに限られそうです。使い方を吟味すればまぁまぁ安全に使えます。ブラウザのお節介がどの程度かによって変わってくる話です。多くの人が使うところでBASIC認証はよろしくないと思います。かっこわるいですしね。めんどくさいけどPHPで作ればいいです。OKならSessionにREMOTE_ADDRとHTTP_USER_AGENTをくっつけた文字列を書き込めばいいですね。それを比較すればかなり安心して使えます。Cookieは盗まれたら終わりだから、大切な事はSessionで管理するのがいいです。IDが盗まれても、Sessionに登録されてるIPとUAが一致すれば本人に違いないと。いう仕組みを作ればいいんです。後付で付けるにはそれは大がかりな仕組みだし、内輪でしか使わないわけだから、そういうときはBASIC認証というのは結構便利な仕組みだと言うことです。Comment新Libserverを調整した一日のこととりあえず何があったのかというのは回復後すぐ記事書きましたが、まぁその後いろいろやっていくうちに完成しました。CentOSに移行しても何にも違和感ないな。Libserver以外で使ってるLinuxディストリビューションはすでに全部CentOSだったからな。これで全部CentOSに統一されたと。CentOSは一応RedHatの本流と思っていいのかな?さて、最初にyumにリポジトリを追加してみた。5用リポジトリを入れた。updateするだけ。5のバイナリが必ず使えるとも言えないらしいけど、2つともCentOSにも対応していると言っているので安心です。5・Dovecot・BINDは入ってる。PHPのFastCGI動作のためにmod_fcgidを導入。それで/etc/httpd/conf.d/fcgid.confなどをいじる。「FastCGIは本当に速いけど...それだけ?」・「みんなにFastCGI用PHPを配りにいきましょう」の記事を見ながらやった。前の方の記事にはいらんことも書いてあるのよね。使うときは注意するといいですね。あと、php.confとかperl.confなどのCGIの高速化環境などの設定ファイルがあるけど、いらんので無効化のためにphp.conf_などにリネーム。.confで終わらなきゃいいんですよ。これでApacheは完成ですね。SELinuxがONになってる。getenforceコマンドで確認できるんですけどね。SELinuxは非常に複雑なので現状はOFFにするのが実用的。0これでとりあえず無効化できるのでこれで動くかチェック。これである程度問題は解決できた。あと設定ファイルのミスを直せばOKだった。それでSELinuxを無効化するには設定ファイルを変えないといけない。/etc/sysconfig/selinuxをSELINUX=disabledのようにすればOK。あとPHPにmbstringが入ってなかったのでphp-mbstringをyumで導入mbstringはPHPとセットで入れるものだと、日本人は思ってるはず。あとBlognplusで必要なgdもyumでphp-gdとして導入。次にPostfixの設定。RHELでは標準のMTAはsendmailのようです。現代人はPostfixの方が好きなので、次のコマンドで標準MTAを変更。mtaさて、Postfixの設定だが、まぁ基本的にはあまり変えることもない。/etc/postfix/main.cfを編集。myhostnameとmydomainとmynetworksとhome_mailbox=Maildir/ぐらいですね。最近はMaildir形式が一番COOLだと思われているようです。このようにすると各ユーザーのホームディレクトリにMaildirディレクトリができて蓄積される。テストはmailコマンドを使って行えばOK。world(最後にはCtrl+D)Cc:こんな感じでOKです。宛先を単にfooとすると、foo@libserver.ddo.jpのようなところに送られる。自身のfooユーザーに届くということです。標準MTAを変更してあるのでPostfixから送られてるはず。ホームディレクトリのMaildirのnewに届いたメールのファイルがある。catとかで見るとわかる。するとPostfixが受け取ったメールである旨がRecivedのところに書かれてる。外部への送信、外部からの受信とテストする。mynetworksの設定がきちんと出来てればオープンリレーの心配もたぶんない。(Abuse.net)で確かめると多分うまくいくはず。これはmynetworksの範囲以外からはmydestinationで定義した自身宛以外のメールは受け取らんから。あとDovecotの設定もたいしたことはない。/etc/dovecot.confを編集。pop3sを有効にして、Maildir用mail_locationをコメントアウトするだけ。セキュアなプロトコルは置いておいて、これでメールは使えるようになった。セキュアなプロトコルについてはApacheにhttps、Postfixにsmtps、Dovecotにimaps・pop3sを導入した。「SSLの鍵を打ち出す単純な方法」・「SPAMメールでないかはっきりさせるSMTP-AUTH」をそれぞれ丸写し。丸写し以外どうにもならんような複雑な作業だから困る。HTTPS強制は「よく切れるナイフmod_rewriteは大切なURLを守る」の記事の通りやった。[L,R]上のようにすれば特定のスクリプトだけHTTPS強制も簡単ですね。その後開放ポートの整理をして、SMTP(25)・HTTP(80)・HTTPS(443)・SMTPS(465)・IMAPS(993)・POP3S(995)と互換性のため81だけにした。(GRC)を使うと便利。あとはSambaとBINDだが、どっちも別に外部からすればどうでもいい。Sambaはyumで入れないとだめ。今回はSambaの設定を非常に真面目にかいた。777丁寧に書いた設定はこの程度です。publicは気楽に使いたいということを実現したわけです。存在しないユーザーでのログイン要求はGuestでのログインとみなすと。いうことでして気楽にGuestに入れます。only=Yesとすると、ユーザーがある人もない人もGuest扱いになる。Guestはlinuxのnobodyに相当するのが普通なので、誰でもnobody。fooユーザーから作ったファイルをtomユーザーからでも消せると。BINDはCentOSではchroot環境で動くのが標準になってるので、まぁ別に変えることもないのでそのままいきます。BINDにとっての/は/var/named/chrootにあるというのがchrootです。/var/named/chroot/etc/named.confが設定ファイル、/var/named/chroot/var/namedに諸々のゾーンファイルを置く。ところがnamed.confがない。サンプルも見つからん。しゃあないので別の環境で使ってたnamed.confを盗んできた。"lib_int.rev";};家庭用のBINDの設定はほとんどこれでOKです。そりゃ192.168.0.XXXじゃなくて、192.168.1.XXXだったら変えないとダメだけど。ここで定義されてない分はforwardersで指定したところに聞きに行ってくれます。allow-updateはDHCPと組み合わせて使うときに役立つかも。あとゾーンファイルは適当に書き方を見ながら書けばOK。そうそう、ddo.jpの更新スクリプトを/etc/cron.dailyに追加したんだった。2>&1結果を全て/dev/nullに捨ててメールが届かないようにしてる。あと/etc/cron.tabのcron.dailyとかの実行時刻はずらしておこうね。標準ではcron.dailyは4時02分に実行になってた。その設定になってる人は結構いるはず。みんながそうだとよろしくない。夜間の適当な時間に変更しておけばいいですね。ddo.jpは便利でいいですよと。無料ユーザーはTOPページに検索窓置くことになってるけど。実はlibserverのTOPページにあるんですよ。本文が長いので見えにくいですが...最後にマシンがすごく高速になったので日記トップページの生成時間を。Blognplusが出してる数字だから参考になるようなならないようなだけど。平均0.472秒でした。FastCGI動作で。旧LibserverではApache組み込み動作で2.26秒、FastCGI動作で1.98秒でした。確実に生成速度は高速になってますね。今まではちょっと時間がかかる感じでしたが、今は一瞬ですね。Comment急に壊れたから急に新しくしたえらいことでした。再起動したら急に起動できんもんで。なんかRSS取得失敗しとるとかで気付いた人もいるかも。それでアクセスしてみたら、なんか「現在修理中」とか出てるし。と心配してくれたなら、ごめんなさい。一晩と少しかけて、新しいシステムに移行しました。実はいらなくなった、Libserverよりもずっと強力なマシンがあったので、これにCentOSを入れて、そこに必要なファイルを送ったわけですけどね。前のLibserverとは似てもにつかない代物になってます。CentOSへの移行も、新マシンへの変更も後々やるつもりだったので、それを前倒しにしたということです。痛かったのはファイルシステムがぐちゃぐちゃになってたこと。lost+found送りになってたファイルが山ほど。実はfdiaryのログファイルも飛んでました。実は11月15日にhtdocs以下はバックアップを取ってました。定期的に取ってるんですよ。これで11月15日の状態に戻して、fdiaryはThunderbirdのRSSから回復。カウンタは幸い残ってたので、これは電源が消える前の状態に復帰できました。確認してHTTPは問題ないとなったので、HTTPに限り今回復させました。これからPostfix・Dovecot・BINDと...専ら僕が使ってるサービスを回復させないとね。メールについては転送メールの行き先を変えてるので、まぁ一応大丈夫かなと思ってるので、ゆっくり進めて行きたいなと。回復中に気付いたのだが、PHPのFastCGI動作では、$_SERVER[‘PATH_INFO’]が使えないらしい。なんか正しいPATH_INFOがなんちゃらかんちゃら書いてあるが...結論から言えば、php.iniにcgi.fix_pathinfo=1と追加して、$_SERVER[‘PATH_INFO’]の代わりに$_SERVER[‘ORIG_PATH_INFO’]を使う。それにしてもPHPはApache組み込み動作を中心に考えすぎだよなぁ...多少振る舞いが違うから違う変数名にしました、というのはひどい。PATH_INFOってCGI発祥なんですよね。CGIにおける正しいPATH_INFOはPHPではORIG_PATH_INFOであるとなってるのよね。