2006年10月アーカイブ

openssl/opensshにセキュリティホールが見つかったらしいので、buildworld & installworldする。
慣れてきていて慢心していたのか、途中で出たであろうコンパイルエラーに気がついていなくて、/bin/の実行ファイルがすべて使えない状態に。
気がついた時には、rootのシェルはログアウトしてしまっていて、sh が起動できないからsuもできないし、ほぼ何もできない状態に。
/rescue/ に実行できそうなファイルがあるけど、rootになれないから何もできない。
しょうがないから、コンソールで Ctrl + Alt + Del を押して、再起動。
起動時に/etc/rcが実行できなくて止まるので、Ctrl + C を押すと、shellのパスを聞いてくる。
で、/bin/で唯一生きていた /bin/tcsh を入力。(/rescue/binでも良いかも)
/bin/にファイルはあるけど、xが立っていないように見えたので、/rescue/chmodを使って x を立ててみた。(あ、mount -u -o rw / はお約束)
しかし、Formatが違うとか言われてコマンドが実行できない。
lessで中を見てみると、なんかCのソースみたいなんですけど・・・。
しょうがないので、/rescueの下から /binに必要そうなファイルをコピーしようとしたら、/ が溢れた。
どうも、/rescueの下のファイルは、実体は一つらしいので、shだけコピーして後はハードリンクにする。
これで再起動してみると、なんとかOSは起動した。

原因究明原因究明。
/usr/src/bin/ が、ほぼ空っぽ状態で、make buildworldが失敗する状態だった。
どうも、cvsup でソースを持ってくるのに失敗しているらしい。supfileを書き換えて、cvsup2.jp.freebsd.orgの代わりにcvsup2.jp.freebsd.orgを見るようにして cvsup を実行。
再び、buildworld & installworld して、なんとかまともな状態に戻った模様。

portsに、sysutils/fastest_cvsup と言うものがあることを知り、インストールする。
# fastest_cvsup -c jp
>>  Querying servers in countries: jp
--> Connecting to cvsup.jp.freebsd.org [210.224.172.75]...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 34.00 ms
--> Connecting to cvsup2.jp.freebsd.org [203.216.196.85]...
    * error: connect: timeout
--> Connecting to cvsup3.jp.freebsd.org [210.188.224.44]...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 19.17 ms
--> Connecting to cvsup4.jp.freebsd.org [133.1.44.1]...
    - server replied: OK 17 0 SNAP_16_1f CVSup server ready
    - time taken: 31.35 ms
--> Connecting to cvsup5.jp.freebsd.org [210.161.150.4]...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 20.16 ms
--> Connecting to cvsup6.jp.freebsd.org [210.188.224.44]...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 19.45 ms

>>  Speed Daemons:
    - 1st: cvsup3.jp.freebsd.org
    - 2nd: cvsup6.jp.freebsd.org
    - 3rd: cvsup5.jp.freebsd.org
みたいな感じで、どこのサイトが近いかを教えてくれる。
cvsup2 は、現在は死んでるみたいですね。

は~、いつもは、buildworldするときにログをとるのに、今回に限って手を抜いたら、痛い目にあいました。
気をつけないといけないですね~。
TeraStation(TS-1.0TGL/R5)用に、シリアルのクロスケーブルを買ってきたので、TeraStation で遊ぼうを参考にroot奪取を試みる。
まずは、FreeBSDとケーブルでつなぎ、tipで接続してみることに。
/etc/remote に以下の行を追加する。
tera:br#57600:dv=/dev/cuad0:pa=none:
で、tip tera なんてやると、反応なし。
そうそう、シリアルコンソールを有効にする必要があるのでした。
http://{TeraStation の IP アドレス}/cgi-bin/task.cgi?task=console¶m=on
にブラウザからアクセスすると、シリアルコンソールが有効になるらしい。
で、再度tip。なんか文字が出るけど、かけかけになります。ためしに、admin でログインしてみると、ログインできるけど表示される文字が飛び飛びなのと、改行がLFだけになるのでまともに使えない。
あきらめて、Windowsマシンに繋ぎなおしてteratermから試してみます。
スピードを57600にしたら、今度はちゃんと文字が読めました。Unix用のシリアルターミナルソフトって、何かないのかなあ?
で、adminでログインしてみると、参考ページに書いてある手法で・・・、既につぶれてます!
googleで探してみると、TeraStation に SSH をと言うのを発見。
しかし、この穴もふさがれてました。

で、こうなったら自分のハッカー魂を発揮するしかありません。
で、見つけました(あっさり)。次のバージョンアップでつぶされると嫌なので詳細は書きませんが、私のやり方も webブラウザを使います。
ヒントとしては、
  • httpd はrootで動いている
  • /etc/apache/httpd.conf は root しか書き込めない。けど・・・。
で、/etc/sudoersに書き込めれば、adminがsudoでrootになれるようになります。
後は、Vine3.1のftpからopenssh周りを持ってきて、FreeBSDでrpm2cpio, cpioで中身を取り出して、TeraStationに転送して・・・、と参考サイトの通りです。
んが、sshdが起動しません。
/etc/rc.d/init.dのスクリプトからでなく、直接sshdを起動しても、何も言わずに終了してしまいます。
/var/log/messagesにも何も出ないし、わけがわかりません。
シリアルを繋いでいるのは、普段立ち上げていないWindowsマシンだし、sshdが動いてくれないと激しく遊びにくいんだけどなあ。
しかし、時間切れなので今日はここまでです。
また暇が取れたら続きにチャレンジすることにしましょう。
FreeBSDからのシリアルの接続がtipではうまく行かなかったので、/usr/ports/commsを眺めていると、懐かしのkermitを発見。
早速インストールして、~/.mykermrcを以下の内容で作成してみた。
set line /dev/cuad0
set speed 57600
set terminal bytesize 8
set command bytesize 8
set file character-set dec-multinational
set transfer character-set transparent
set flow-control rts/cts
set carrier-watch off
set parity none
set delay 0
set transmit linefeed
で、kermitを起動して、cなんて打つと、無事にterastationに繋がりました。
これで、デスクトップのWindowsを起動しなくても、ノートから無線LANでFreeBSD経由でTeraStationに入れるってもんです。

で、なんでsshdが起動しないのかを調べることに。sshdには、-dオプションなんてものがあるので、そいつをつけて起動してみます。
root@TS-TGLD4C:~# /usr/sbin/sshd -d -d -d
debug2: load_server_config: filename /etc/ssh/sshd_config
debug2: load_server_config: done config len = 212
debug2: parse_server_config: config /etc/ssh/sshd_config len 212
debug1: sshd version OpenSSH_3.9p1
debug1: private host key: #0 type 0 RSA1
debug3: Not a RSA1 key file /etc/ssh/ssh_host_rsa_key.
debug1: read PEM private key done: type RSA
debug1: private host key: #1 type 1 RSA
debug3: Not a RSA1 key file /etc/ssh/ssh_host_dsa_key.
debug1: read PEM private key done: type DSA
debug1: private host key: #2 type 2 DSA
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: rexec_argv[2]='-d'
debug1: rexec_argv[3]='-d'
Segmentation fault
Segmentation faultらしいです。
持ってきてたのが、openssh-3.9p1-0vl2.ppc.rpmって奴だったので、ためしにopenssh-4.4p1-0vl1.ppc.rpmってのも持ってきて見ましたが、やっぱり同じところで落ちます。4.4の場合は、さらにlibpamのバージョンがわからんで~みたいなエラーも出ます。
まあ、kermitでログインできるから、無理にsshdが動いてる必要はないのですが、動かないのは気持ちが悪いなあ・・・。
Segmentation Fault で落ちるsshd。何が原因か突き止められなかったので、ソースから入れてみることに。
かなり苦戦したんだけど、なんとか動いた。んが、細かい手順は覚えていないので、適当に書く。

まずは、コンパイルできるように以下のrpmをかき集めて、rpm2cpioとcpioで展開し、リンクを張ったりしながら動くようにする。
  • binutils-2.15.92.0.2-5vl2.ppc.rpm
  • gcc-3.3.6-0vl7.ppc.rpm
  • gcc-cpp-3.3.6-0vl7.ppc.rpm
  • glibc-devel-2.3.4-2vl3.ppc.rpm
  • kernel-headers-2.4.26-0vl17.6.ppc.rpm
  • make-3.80-0vl4.ppc.rpm
  • openssl-0.9.7d-0vl3.2.ppc.rpm
  • openssl-devel-0.9.7d-0vl3.2.ppc.rpm
  • zlib-devel-1.1.4-0vl2.ppc.rpm
そして、opensshの配布サイトからopenssh-4.4p1.tar.gzを落としてきた。
後は、展開してconfigureしてmakeしてmake install。
と言いたいところだけど、configureがsortがないとか言ってエラーになる。
sortなんてどのrpmに入っているか知らないので、無視することにする。Makefileまではできたみたいだし。
んが、makeしてみるとエラー出まくり。
どうも、config.hが正しくないのではないかと思う。そこで、config.logの最後に、confdefs.hはこうですよ!なんて内容が書いてあるので、その部分をconfig.hとして保存した。
再度makeしてみると、今度はリンク時にエラーが出る。
__dn_expand他が見つからないとか言うエラーで、googleで調べたところ libresolv をリンクしてやれば良いらしい。
と、言うことでMakefileに-lresolvを追加してみたが、今度は別のシンボルが見つからないと言われてしまった。
どうも、/libにあるものと、上のrpmのどれかに入っていた/usr/libのものが違うらしいので、とりあえず/libを見てもらうことにした。
Makefileを、以下のように修正
LIBS=-lcrypto -lutil -lz -lnsl  -lcrypt /lib/libresolv.so.2
これで、コンパイルが通って、make installして試してみたら実行しても落ちなくなった。
他のマシンからログインできることも確認できたので、これでシリアルは使わなくても良くなったはず。

TeraStationでこの先やりたいことを書いておく。
  • sambaのログや設定ファイルを見直して、ドメインユーザが何故TeraStationで見えないのかを確認、対処する。
  • sambaの設定を修正して、一覧に表示されない共有を作る。
  • sambaのクライアントをインストールして、以前のNAS(Landisk)に自動バックアップできるようにする。
Todoのうち、TeraStationのバックアップを最初にやってみる。
バックアップ先は、別メーカーのNASのLANDISK。
LANDISKの方も中身はsambaだと思うけど、rootになれないしrsync等は使えない。
となると、TeraStationをsambaのクライアントにするしかない。
まずは、以下のrpmを入れてみた。
  • cyrus-sasl-2.1.18-0vl6.ppc.rpm
  • openldap-2.3.27-0vl2.ppc.rpm
  • samba-client-3.0.23c-0vl2.ppc.rpm
が、samba-client-3.0.23c-0vl2.ppc.rpmにはsmbmountは入っていても、smbclientが入っていない。smbclientを呼び出すsmbtarは入っているんだけど・・・。
しょうがないので、samba-client-2.0.10_ja_1.2-0vl1.ppc.rpmを入れてみたらsmbclientが入っていた。
ためしに、smbclientでlandiskにつないでみると、いろいろ警告は出るもののちゃんと見れる。
日本語のファイル名が化けるのは、smbclientに -t euc オプションをつけることで解決した。
続いて、TeraStationが共有フォルダ内の日本語のファイル名を、ローカルに何コードで保存しているかを見てみると、どうもSJISらしい。
いろいろ試した結果、以下のようなシェルスクリプトでバックアップを実施することにした。
#!/bin/sh
cd /mnt/array1/disk
tar cf - photo | smbclient //landisk/disk -N -Tx -
tar cf - data | smbclient //landisk/disk -N -Tx -
tar cf - music | smbclient //landisk/disk -N -Tx -
上の例だと、photoとdataとmusicをバックアップする。別に1回の実行でやっても良いんだけど、それぞれの時間を計りたかったので分けた。
本来は、差分バックアップにしたいのだけれど、smbclientだけでは難しそうなので当面はフルバックアップで我慢する。後は、実行時間を見て、dailyにするかweeklyにするか検討しよう。

cactiのグラフにTeraStationも追加したいな~と思い、snmpdを動かしてみようと思う。
以下のrpmを寄せ集めてみた。
  • net-snmp-5.2.1.2-0vl3.ppc.rpm
  • rpm-libs-4.4.2-0vl15.ppc.rpm
  • beecrypt-4.1.2-9vl3.ppc.rpm
  • neon-0.25.5-0vl2.ppc.rpm
  • sqlite3-3.3.6-0vl3.ppc.rpm
  • expat-1.95.8-0vl5.ppc.rpm
しかし、expat-1.95.8-0vl5.ppc.rpmの中には、soの実体が入っていなくて、断念。.aが入っているので、無理やり自前でsoを作ってしまうと言うのもありかな?

と、言うことで、以下のコマンドラインで libexpat.so.0 を作成。
$ gcc -shared -o libexpat.so.0 libexpat.a
これで、snmpdを起動しようとすると、今度は
# /etc/init.d/snmpd start
Starting snmpd: /usr/sbin/snmpd: /lib/libc.so.6: version `GLIBC_2.3.4' not found (required by /usr/lib/librpm-4.4.so)
/usr/sbin/snmpd: /lib/libpthread.so.0: version `GLIBC_2.3.4' not found (required by /usr/lib/librpmio-4.4.so)
/usr/sbin/snmpd: /lib/libc.so.6: version `GLIBC_2.3.4' not found (required by /usr/lib/librpmio-4.4.so)
/usr/sbin/snmpd: /lib/libc.so.6: version `GLIBC_2.3.4' not found (required by /usr/lib/librpmdb-4.4.so)
                                                           [FAILED]
なんて言われる。glibc-2.3.4-2vl3.ppc.rpmを持ってきて、/lib/libc.so.6 を・・・。
はい、やっちゃいました。
libc.so.6 が見えなくなった瞬間から、すべてのコマンドが実行できなくなりました。
きゃーーーーーー、ここまでやって初期化ですか?と言うか、データ消さずに初期化できるんでしょーか?うぎゃーーーー。
焦って傷を広げないように、今日はここまでにしておこう。

とか言いながら、復旧しました。
rootのbashはログアウトしないで残していたので、以下の手順で復旧しました。
# export LD_PRELOAD=/lib/libc-2.3.2.so
# ln -s /lib/libc-2.3.2.so /lib/libc.so.6
# LD_PRELOAD=
は~、焦った焦った。今回は、傷が広がる前に対策を思いついて良かったですが、焦ってリカバリーでもしてたらどうなっていたことか・・・。
結局、LD_PRELOADとか使って無理やりlibc-2.3.4をロードしたりしてみても、snmpdは動かなかったので、http://net-snmp.sourceforge.net/download.htmlからnet-snmp-5.3.1.tar.gzを持ってきてコンパイルしてみることに。
configureを動かすと、sortがないとか、egrepがないとか、cmpがないとかuniqがないとか文句を言われるが、とりあえずMakefileはできる。
が、やっぱりmakeでエラーになってしまう。egrepとかもろもろを入れないと駄目かしらん。
しかし、egrepとかsortとかは、基本的なコマンドだけにrpmが見つからない。それぞれソースから入れるのもだるいしなあ・・・。
egrep や uniq がどのRPMに入っているかわからないので、busyboxを入れてみることに。
TeraStationにもともと入っている busybox は、0.6.0 で、uniq は入ってるけど、egrep や sort は入っていない。
http://www.busybox.net/downloads/から、busybox-1.2.1.tar.gz をダウンロードして、展開する。
make config で、全ての質問にEnterを押し、できた.configを編集する。(もちろん、質問に真面目に答えれば良いのだが、だるかったので)
とりあえず欲しかったのがcmp, egrep, sort, uniqだったので、以下の行を修正
PREFIX="/usr/local/bin"
CONFIG_CMP=y
CONFIG_GREP=y
CONFIG_FEATURE_GREP_EGREP_ALIAS=y
CONFIG_OD=y
CONFIG_SORT=y
CONFIG_TAIL=y
CONFIG_FEATURE_FANCY_TAIL=y
CONFIG_UNIQ=y
CONFIG_WHO=y
CONFIG_WHOAMI=y
make すると、ドキュメントを作るあたりでエラーが出るけど、コマンドはできているので気にしない。
出来上がったbusyboxを/usr/local/bin/にコピーし、cmp, egrep, sort, uniq にシンボリックリンクを張る。
※ その後 net-snmpをconfigure/makeする過程で必要になったので、od, tail, whoamiを追加した。
busyboxのおかげでconfigureが動くようになったので、net-snmpに再挑戦。
とりあえず、configureのオプションは --prefix=/opt/usr/localにしてみました。(/optは、/mnt/array1/opt からのシンボリックリンク)
configureの途中から、いくつか質問されるけど、基本的にデフォルト。persistant ほにゃららをどこにするか聞かれるところで、/opt/var/net-snmp と答えた。
後は、make & make install で、/opt/usr/local にインストールされる。
続いて、/opt/usr/local/etc/snmp ディレクトリを作成し、rpmから入れた/etc/snmp/snmpd.conf をコピーする。
後は、/etc/init.d/snmpd の中のsnmpdのパスを/opt/usr/local/sbin/snmpd に修正して、/etc/init.d/snmpd start で起動。
ついでに、/etc/rc.d/rc3.dにS99とかでリンクしておく。
これで、cactiにデバイスを追加してみたけど、
  1. ucd/net - CPU Usage
  2. ucd/net - Load Average
  3. ucd/net - Memory Usage
の3つしか追加できない。かつ、値はNaNになっている。
/opt/usr/local/etc/snmp/snmpd.confの以下を修正してみた。
#view    systemview    included   .1.3.6.1.2.1.1
#view    systemview    included   .1.3.6.1.2.1.25.1.1
view    systemview    included   .1
これで、SNMP - Interface Statistics も追加できるようになり、Load Average とMemory Usageは出るようになった。が、CPU UsageとTraffic - eth0 はNaNのままだ。(と思ったら、次の5分で見れるようになった)
さらにsnmpd.confを眺めて、以下の行を追加してみた。
disk /mnt/array1 10000
これで、無事ディスク容量のグラフも追加できるようになった。

geli

| | コメント(0) | トラックバック(0)| Edit
Windowsでは、ディスクの暗号化に TrueCryptを使っている。
TrueCryptのLinux版はあるらしいけど、FreeBSDにはない。
で、最近FreeBSDのメーリングリストを見ていたら、gbdeって言うのとgeliって言うのがあるらしい。
FreeBSD6以降であれば、geliがメジャーになるのではないかと言うことで、ちょっとだけ試してみた。
# mdconfig -a -t malloc -s 4m
md0
# geli init /dev/md0
Enter new passphrase:
Reenter new passphrase:
# geli attach /dev/md0
Enter passphrase:
# newfs /dev/md0.eli
/dev/md0.eli: 4.0MB (8188 sectors) block size 16384, fragment size 2048
        using 4 cylinder groups of 1.00MB, 64 blks, 128 inodes.
super-block backups (for fsck -b #) at:
 160, 2208, 4256, 6304
# mount /dev/md0.eli /mnt

/mntを読み書きする

# umount /mnt
# geli detach /dev/md0
# mdconfig -d -u 0
ここでは、コマンドの雰囲気を掴みたかっただけなので、意味があることはしていない。
上の例だと、4Mのメモリディスクを作成し、そこにgeliを初期化し、ファイルシステムを作り、マウントしている。
この例だとパスフレーズのみを使っているが、キーファイルを使うこともできるらしい。
/boot/loader.conf に書けば、/ を暗号化すること(/boot以外の全てのパーティション)も、swapを暗号化することもできるらしい。
この辺を真面目に使っておくと、マシンやHDDを廃棄するときにあまり考えずに行うことができそうだ。
# 遠隔地からリブートすると、パスフレーズ入れないと立ち上がらない状態になるけどね。
会社のメールのspamの量がすごい。
spam assassinではじいているが、毎朝100通近くのspamを手でより分けなければならない。
ベイジアンフィルタも効果なしか?

自宅の方がまだましな状況なのは、razor-agentsが使えているおかげだと思う。
そこで、会社でもrazor-agentsを使えるようにproxy越えを試してみることに。
googleで探してみた結果、海外のメーリングリストらしきところでRE: [Razor-users] can RAZOR use server proxy ?と言うのを発見した。
しかし、razor-agent.conf(5)のマニュアルを見ても、そんな記述は見当たらない。
仕方がないので、perlのソースをつらつらと読んでいくと、configファイルに
socks_server = socksサーバのIPアドレス
を書いてやると良いらしい。あと、Net::Socksパッケージを使っているようなので、portsからnet/p5-Socksをインストールしてやる。
spamdを使っている場合は、~/.razor/razor-agent.confは見てくれないようなので、/usr/local/etc/にrazor-agent.confをコピーしたところ、無事にrazorが使えるようになった模様。
これで少しはspamがはじけるようになると良いのだが・・・。

PEM_read_PrivateKeyは、SSL_library_init(); を事前に呼んでおかないと動作しないようでした。
yさんから、上記のコメントをいただきました。ありがとうございます。
追試してみた結果、SSL_library_init()を呼ぶことで、PEM_read_PrivateKey()の第三引数が有効になるようです。
そこで、プログラムを以下のように変えたところ、無事に -des3 つきで作成したキーが読めるようになりました。
# 自分で書いておいてなんなんですが、前のエントリーが何を見て書いたか覚えていないので、opensslの関数の説明がどこを見れば良いのか全然わかりません。manでも出ないし。
とりあえず、第4引数に直接パスワードを渡すか、第3引数のコールバック関数でbufにパスワードを書いて、パスワードの文字数を返してやれば良いようです。
#include <openssl/ssl.h>

int cb(char *buf, int size, int rwflag, void *userdata) {
    printf("enter passphrase> ");
    scanf("%s", buf);
    return strlen(buf);
}

int main(int argc, char *argv[]) {
    FILE *keyfp, *orig, *enc, *dec;
    EVP_PKEY *private;
    RSA *rsa;
    char *orig_buf;
    char *crypted_buf;
    char *decrypted_buf;
    int crypted_len;
    int decrypted_len;
    int size;
    int read_len;
    time_t t1, t2, t3;

    SSL_library_init();
    ERR_load_crypto_strings();

    keyfp = fopen(argv[1], "r");
    if (keyfp == NULL) {
        fprintf(stderr, "ファイルが開けません: %s\n", argv[1]);
        return 1;
    }

    private = PEM_read_PrivateKey(keyfp, NULL, cb, NULL);
    if (private == NULL) {
        fprintf(stderr, "PEM_read_PrivateKey:%s\n", ERR_error_string(ERR_get_er\
ror(), NULL));
        return 1;
    }
    fclose(keyfp);

    rsa = EVP_PKEY_get1_RSA(private);
    if (rsa == NULL) {
        fprintf(stderr, "EVP_PKEY_get1_RSA:%s\n", ERR_error_string(ERR_get_erro\
r(), NULL));
        return 1;
    }
    RSA_print_fp(stdout, rsa, 0);

    printf("RSA_size: %d\n", RSA_size(rsa));

    orig = fopen(argv[2], "r");
    if (orig == NULL) {
        fprintf(stderr, "ファイルが開けません: %s\n", argv[2]);
        return 1;
    }

    enc = fopen(argv[3], "w");
    if (enc == NULL) {
        fprintf(stderr, "ファイルが開けません: %s\n", argv[3]);
        return 1;
    }

    size = RSA_size(rsa);

    orig_buf = malloc(size);
    crypted_buf = malloc(size);
    decrypted_buf = malloc(size);

    t1 = time(NULL);

    while (read_len = fread(orig_buf, 1, size - 11, orig)) {
        crypted_len = RSA_private_encrypt(read_len, orig_buf, crypted_buf, rsa,\
 RSA_PKCS1_PADDING);
        if (crypted_len == -1) {
            fprintf(stderr, "RSA_private_encrypt:%s\n", ERR_error_string(ERR_ge\
t_error(), NULL));
            return 1;
        }
        fwrite(crypted_buf, 1, crypted_len, enc);
    }
    fclose(orig);
    fclose(enc);

    t2 = time(NULL);
    printf("encrypt: %d\n", t2 - t1);

    enc = fopen(argv[3], "r");
    if (enc == NULL) {
        fprintf(stderr, "ファイルが開けません: %s\n", argv[3]);
        return 1;
    }

    dec = fopen(argv[4], "w");
    if (dec == NULL) {
        fprintf(stderr, "ファイルが開けません: %s\n", argv[4]);
        return 1;
    }

    while (read_len = fread(crypted_buf, 1, size, enc)) {
        decrypted_len = RSA_public_decrypt(read_len, crypted_buf, decrypted_buf\
, rsa, RSA_PKCS1_PADDING);
        if (decrypted_len == -1) {
            fprintf(stderr, "RSA_public_decrypt:%s\n", ERR_error_string(ERR_get\
_error(), NULL));
            return 1;
        }
        fwrite(decrypted_buf, 1, decrypted_len, dec);
    }
    fclose(enc);
    fclose(dec);

    t3 = time(NULL);
    printf("decrypt: %d\n", t3 - t2);

    EVP_PKEY_free(private);
    RSA_free(rsa);
    return 0;
}
コールバックはもろ手抜きなので、scanfは使ってるし、パスワードそのまま画面に出るしって感じですが、まあサンプルと言うことで。

しかし、参考URLとかは書いておかないと、後で見たときに何がなんだかわからないなあ・・・。
※ この話は、MT 2.661, mt-blacklist 1.6.5限定の話だ。
mt-blacklistと言うプラグインを導入してみた。
のだが、trackbackを削除するときに、同時にリビルドしようとすると、エラーが表示される。
表示されながらも、エントリー自身のリビルドはうまく行っているようだが、indexがリビルドされない。
エラーの出所を探していくと、mt/extlib/jayallen/Blacklist.pm の_rebuildObjectPageと言う関数の中で、$object->entry_id を取る所に問題があるらしいことがわかった。
ここは、コメントの場合は MT::Comment のオブジェクトが、トラックバックの場合は MT::TBPingのオブジェクトが渡されてくるのだが、MT::TBPingはentry_idを持っていないことが原因らしい。
でも、トラックバックはどのエントリに打たれたかわかるよな~?と思って調べていったところ、トラックバックのエントリーIDは MT::Trackbackが持っているらしい。
MT::TBPing->tb_id が MT::Trackback->id(trackback_id)になっているようなので、その辺を見るようにBlacklist.pmを修正してみた。
# そもそも、今の実装だと、MT::TBPingは削除されるけど、MT::Trackbackはゴミが溜まっていくような気がするんだが、問題ないのかな?
*** Blacklist.pm.ORIG	Fri Jun 10 12:35:07 2005
--- Blacklist.pm	Tue Oct 24 13:37:37 2006
***************
*** 1294,1300 ****
  
  
      # DELETE THE COMMENT/PING IF REQUESTED
!     my ($object,$findMoreLink);
  	if (my $action = $q->param('despamAction')) {
  
          # Load up the ping/comment
--- 1294,1300 ----
  
  
      # DELETE THE COMMENT/PING IF REQUESTED
!     my ($object,$findMoreLink,$robject);
  	if (my $action = $q->param('despamAction')) {
  
          # Load up the ping/comment
***************
*** 1307,1312 ****
--- 1307,1320 ----
              $object = MT::TBPing->load($id);
          }
          return $app->error("Could not load $type for deletion (ID: $id):") unless $object ;
+         if ($type eq 'comment') {
+             $robject = $object;
+         } elsif ($type eq 'ping') {
+             use MT::Trackback;
+             $robject = MT::Trackback->load($object->tb_id);
+ 			return $app->error("Could not load trackback for deletion (ID: $object->tb_id):") unless $robject ;
+         }
+ 
  
  
          $findMoreLink = $q->p('Find other '.$type.'s that match <a href="'.
***************
*** 1318,1327 ****
              $results{'obj_removal'} = $q->strong({-class=>'msg_success'},'SUCCEEDED');
  			if ($action eq 'deleteRebuildEntry') {
                  $results{'entry_rebuild'} = 
!                         $app->_rebuildObjectEntry($object);
  			} elsif ($action eq 'deleteRebuildEntryIndexes') {
                  $results{'entry_rebuild'} = 
!                         $app->_rebuildObjectAll($object);
  			}
  			
  			if ($results{'entry_rebuild'}) { 
--- 1326,1335 ----
              $results{'obj_removal'} = $q->strong({-class=>'msg_success'},'SUCCEEDED');
  			if ($action eq 'deleteRebuildEntry') {
                  $results{'entry_rebuild'} = 
!                         $app->_rebuildObjectEntry($robject);
  			} elsif ($action eq 'deleteRebuildEntryIndexes') {
                  $results{'entry_rebuild'} = 
!                         $app->_rebuildObjectAll($robject);
  			}
  			
  			if ($results{'entry_rebuild'}) { 
これで、エラーも出ないし、indexもリビルドされているように見える。
Firefox 2.0 が出たので、インストールしてみた。
1.5になったときは、使っていた拡張機能が対応していなくて苦労したりしたのだけれど、今回は2.0のインストーラを動かすと、互換性のない拡張機能の一覧を出してくれて、さらに拡張機能のアップデートまで調べて入れてくれた。
私が使っていた拡張機能は、全て2.0対応版が存在していたようで、そのまま無事に2.0に上げることができた。
気がついた範囲で目に見えて変わった所は、以下のような感じ。
  • ツールバーのアイコンと、タブバーのデザインが変わった。個人的には、前のシンプルな方が良いかも。
  • タブのクローズボックスが、右端ではなくタブ毎になった。これは、以前でも拡張機能で実現できていたものだが、私は使っていなかったので慣れるまではしばらくマウスの行き先で苦労しそうだ。
  • 拡張機能の一覧を出すのが、ツールメニューの拡張機能から、ツールのアドオンに変わった。
  • レンダリングが気持ち早くなった(キビキビ動く気がする)
サーバからクライアントにpingを打つとサーバとクライアントの間でだけ通信ができるようになりました。
その後いろいろ試した結果、一度切断して接続しなおすと、また通信できなくなったりしました。
で、最終的にこの手順を踏めば通信できると言う手順がわかったので、試したことと結果を書いておきます。

まず、いつものようにgoogleで参考ページを探します。Setting up bridging for OpenVPN on FreeBSDと言うページを発見。
ここを見ながら、最初からbridge0をtap0とrl0で作る代わりに、接続時に bridge0に tap0 を追加するようにしてみました。
しかし、openvpnサーバをnobodyで実行していると、bridge0にtap0を追加する権限がないといわれます。
とりあえず、openvpn.confの中でnobody指定しているところをコメントアウトしたら、接続時にスクリプトが実行できるようにはなりましたが、状況は変わらず。

続いて、if_bridgeのマニュアルをつらつらと見ていたら、bridgeにfilterを掛けるかどうかみたいなオプションがあることがわかりました。
そこで、以下のように無効にしてみます。
# sysctl -w net.link.bridge.pfil_member=0
# sysctl -w net.link.bridge.pfil_bridge=0
これで、うまく通信ができているときにはサーバ以外の家庭内の別のマシンとの間でも通信ができるようになりました。
セキュリティ的に良いのかどうかわかりませんが、/etc/sysctl.confに書いておきます。

さて、後の問題はなんでうまく通信ができたりできなかったりするかです。
いろいろ試行錯誤した結果、たどり着いたのは以下の結論です。
arp -a を実行したときに、前回繋いだときのクライアントのエントリがあると通信できない
で、以下の手順を踏むと通信ができることがわかりました。
  1. クライアントからopenvpnで接続する
  2. サーバ側で、arp テーブルにクライアントがある場合はarp -dで削除する。
  3. サーバからクライアントにpingする。
この手順を踏むと、arpテーブルに新しいエントリが追加され、無事に双方向通信ができるようになります。
前回、サーバからpingを打たないと通信できないように見えたのは、初期状態でarpテーブルにエントリがないときに、pingを打つことでarpテーブルにエントリが追加されるからでした。
そして、一度切断して接続しなおすと、前のエントリが残っているので通信できない状態になるのでした。
わからないのは、クライアントのtapインターフェイスのMACアドレスは変わらないので、arpテーブルに登録される情報は変わらないはずなのに、なんで一度削除する必要があるかと言うことです。

上記手順を踏んでも、一定時間たつと通信ができなくなり、arp -dとpingをやり直すとまた通信できるようになります。
なんか根本的なところを間違ってるのかなあ・・・。
2006年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

このアーカイブについて

このページには、2006年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年9月です。

次のアーカイブは2006年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1