So-net無料ブログ作成
検索選択
メッセージを送る
前の10件 | -

BIND9.8.0rc1でDNS64を使ってみる

BIND-9.8.0rc1dns64を試したメモ。

IPv6のみのホストがIPv4のホストにアクセスする場合に、IPv6セグメントとIPv4セグメントの間にNAT64サーバーという変換機能付ゲートウェイを設置してアクセスを可能にする仕組みがあるようですが、その際、DNSがIPv4ホストのAを返してもIPv6セグメントでは海を車で渡れと言われているようなもので使えないので、エンドポイントとなるNAT64サーバーのインターフェースへの繋ぎとなるAAAAをある規則に従って合成して返すのがDNS64の役割みたいです。

named.confに記載するdns64ディレクティブは、そのAから合成変換したAAAAを作る作り方みたいなものを定義するもので、optionsviewに書けるみたいです。具体的には、
acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
...
dns64 64:FF9B::/96 {
    clients {
        2001:BD8:0:1::/64;
    };
    mapped { !rfc1918; any; };
    exclude { 64:FF9B::/96; ::ffff:0000:0000/96; };
    suffix ::;
    recursive-only yes;
    break-dnssec yes;
};
dns64-server "dns64.example.jp.";
dns64-contact "hostmaster.example.jp.";

のように書くようです。合成変換するフォーマットについての詳細はRFC6052を参照することになりますが、dns64の後の64:FF9B::/96のところにIPv6-prefixを定義します。これは合成変換後のAAAAのプレフィックスになります。残りのものについては以下に列挙します。
  • clients…合成変換したAAAAを返す対象となるクライアントを定義します。デフォルトはany;です。
  • mapped…合成変換の対象となるA RRの値を定義します。デフォルトはany;です。
  • exclude…合成変換が適用されたアドレスかどうかの判定から除外するアドレスを記載します。
  • suffixRFC6052の2.2.IPv4-Embedded IPv6 Address Formatに記載されているprefixが96以外のときにsuffixにはめ込む値を定義します。例えば、prefixが64:FF9B::/40でsuffixが::1f2aで変換対象のAが192.0.2.2だとすると、変換後のAAAAは64:ff9b:c0:2:2::1f2aになります。
  • recursive-only…RDビットが起っている問い合わせのみに変換後のAAAAを返すかどうかを定義します。つまりyesにすると再帰クエリーの場合に変換後のAAAAを返します。
  • break-dnssecDNSSECの問い合わせに対してAAAAを返すかどうかを定義します。noにするとAにDNSSECの署名がある場合にDOビットをセットした問い合わせを行うと変換後のAAAAを返しません。yesにすると変換対象とします。当然ですが変換後のAAAAに署名は付きません。といいますか付けることができません。
  • dns64-server…prefixに対するIP6.ARPA.マスターサーバーの値を定義します。例えば、prefixが64:FF9B::/32の場合にb.9.f.f.4.6.0.0.ip6.arpa.のSOAを問い合わせると、マスターサーバーのところにここに定義した値が入ります。
  • dns64-contact…prefixに対するIP6.ARPA.の管理者メールアドレスの値を定義します。dns64-serverの例と合わせて具体的なSOAの値を記載すると以下のようになります。
    b.9.f.f.4.6.0.0.ip6.arpa. 86400 IN SOA 
    dns64.example.jp. hostmaster.example.jp. 
    0 28800 7200 604800 86400

ちなみに、dns64は複数記載してクライアント毎にprefixを変えたりできるようです。

上記具体例の設定で
host.example.jp. 86400 IN A 192.0.2.2

のAAAAを問い合わせると
host.example.jp. 10800 IN AAAA 64:ff9b::c000:202

となるようです。変換後のTTLはネガティブキャッシュのものとなるようです。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

ISC DLVからDS方式の移行

JPRSがJPドメイン名サービスにDNSSECを導入したことに伴いISC DLVからJPRS上のDS方式に移行したので、そのメモでもと。尚、他の関連ネタ同様、ここなんかに書いているauto-dnssec maintain;が前提になっています。auto-dnssec maintain;についてはBIND97付属のARMの他、これなんかも参考になりそうです。

まず、新しいKSKを作ります。ISC DLVで使っていたものをそのまま移行でもよいのでしょうけど、折角だしこの機会に切り替えた方がよいかと思いまして。使用期間もわかりやすいかと思いますし。まあ、ゴタクは兎も角、新しいKSK作ります。

$ su -
# su - named --shell=/bin/bash
$ /usr/sbin/dnssec-keygen -f KSK -r /dev/urandom -3 -a \
 RSASHA256 -b 2048 -P now -A now+30h -I now+13mo -D now+13mo \
 -K /var/named/chroot/var/named/keys/example.jp \
 -n ZONE example.jp
Generating key pair...
Kexample.jp.+008+02746


KSKのロールオーバー方式ですが、こことかここに2重署名方式(Double Signature)とありますので、それに準じてみたいと思います。とはいうものの、そもそも登録しているところが違うので意味合いが変わって来ている感はありますが、まあ、似たような感じでやったと思って頂ければ。まず、publishedになってからactiveにするまでの時間ですが、DNSKEYのTTLとゾーン転送にかかる時間と誤差程度の作業時間(例えば、鍵作ってから実際に公開するまでの時間とか)ぐらいみればいいわけですが、TTLはまあ一般的には1日ぐらいだと思いますし、ゾーン転送は最近はNOTIFYとかあるのでそんなに掛からないとは思えども、普通に転送する場合とか失敗する場合とかも考えて多めに見積もって6時間ぐらいみておけばいいかなということで30時間としています。retiredとdeletedはどうせ更新時に明示的に行うことなので、ちょっと長めに適当です。

で、これで、鍵が出来ているはずなので、

$ rndc loadkeys example.jp.


とします。で、作成したKexample.jp.+008+02746でDNSKEYの署名が開始されるまで待ちます。要するに30時間後です。署名が開始されたらDSを申請します。dnssec-dsfromkey(8)を使ってDS RRを得ます。

$ /usr/sbin/dnssec-dsfromkey \
 /var/named/chroot/var/named/keys/example.jp/Kexample.jp.+008+02746.key
example.jp. IN DS 2746 8 1 1D8F72D56BEA0EABA6E6BCAC2093906135C9457B
example.jp. IN DS 2746 8 2 C6884BFF053E0F63B00153411AD3873DCD9462CBDD1261707CA83F2B 762319F7


レジストラにもよるのでしょうけど、利用中の名づけてねっとでは鍵ID以降、つまり、

2746 8 1 1D8F72D56BEA0EABA6E6BCAC2093906135C9457B
2746 8 2 C6884BFF053E0F63B00153411AD3873DCD9462CBDD1261707CA83F2B 762319F7


フォームに貼り付ける方式でした。まあ、このあたりは利用中のレジストラのやり方に従えばよいだけかと思います。

親のゾーン(この場合はjp)にDS RRが登録されるのを待ちます。jp.のNS RRは、

$ dig jp. ns


なんぞで得られると思いますし、それらに

$ dig +norec @a.dns.jp example.jp. ds


等とすれば確認はできるかと思います。確認できたら、ISC DLVからDLV RRを消します。Zone Actionsの(delete)をぽちっとするだけです。ここで、また、DLV RRのTTLとゾーン転送にかかる時間程度を待つことになりますが、TTLが3600、Refreshが7200のようなので、3, 4時間程度待てばよいでしょう。その後、古いKSKがKexample.jp.+008+12199だったとしますと、dnssec-settime(8)使って、

$ /usr/sbin/dnssec-settime -I now \
 /var/named/chroot/var/named/keys/example.jp/Kexample.jp.+008+12199
$ rndc loadkeys example.jp.


とします。その後、

$ /usr/sbin/dnssec-settime -D now \
 /var/named/chroot/var/named/keys/example.jp/Kexample.jp.+008+12199
$ rndc loadkeys example.jp.


とすればゾーンから古いKSKは消えてくれます。(*1)




*1: 別に-I-Dを一気にやってしまってもいいのですが、なんとなくかわいそうな気がするものでw
nice!(0)  コメント(1)  トラックバック(0) 
共通テーマ:日記・雑感

NSEC3PARAMをCRON(8)で更新する(DNSSECネタ)

ネタ的には「auto-dnssec maintain; を試してみる」あたりの設定が前提です。

まず、以下のようなスクリプトを作ります。なるべく通常インストールされてそうなコマンドに限定して書いたつもり。

$ su -
# cd /var/named
# mkdir bin
# chown -R named:named bin
# su - named --shell=/bin/bash
$ cd bin
$ cat > update-nsec3param.sh
#!/bin/sh

RETVAL=0

usage () {
    echo $"Usage: $0 -s server_ip_address -d zone_name" 1>&2
    RETVAL=1
}

OPT=""
DOMAIN=""
SERVER=""
while getopts s:d: OPT
do
    case $OPT in
        d) DOMAIN=$OPTARG
           ;;
        s) SERVER=$OPTARG
           ;;
        \?) usage
            exit $RETVAL
            ;;
    esac
done
shift `expr $OPTIND - 1`

if [ -z "$DOMAIN" ]; then
    usage
    exit $RETVAL
fi

if [ -z "$SERVER" ]; then
    usage
    exit $RETVAL
fi

ITER=$((RANDOM % 6 + 5))
LEN=$((RANDOM % 16 + 3))
HASH=`/usr/bin/openssl rand $LEN | /usr/bin/hexdump -e '1/1 "%02x"'`


cat << UFILE
server $SERVER
update delete $DOMAIN. IN NSEC3PARAM
update add $DOMAIN. 0 IN NSEC3PARAM 1 0 $ITER $HASH
send
UFILE

exit 0


スクリプトはopenssl(1)hexdump(1)がインストールされていることを前提にしてます。saltの長さやiterationsの回数は適当です。まあ、長すぎず短すぎない程度にした感じ。

nsupdate(1)を受け付けてくれるIPアドレス192.0.2.2、更新対象のゾーンをexample.jpと仮にでもしておきます。crontab -eとかして以下のような行を追加します。

10 3 1,11,21 * * /var/named/bin/update-nsec3param.sh \
 -s 192.0.2.2 -d example.jp \
 | /usr/bin/nsupdate \
 -k /var/named/chroot/var/run/named/session.key \
 > /dev/null 2>&1


言うまでもないですが\は継続行の意味です。これで毎月1日11日21日の3時10分頃にNSEC3PARAMを更新してくれるはず。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

多数派は言わざるですので

引用:窒息死亡事故が多発する餅はなぜ規制されないのか?

危ないと言われれば、コストがかかり多少利便性が悪くなっても、危なくないように対応するのが日本の行政だ。彼らは国民の声を聞いて仕事をしているのだ(と少なくとも彼らは主張するだろう)。

責任の一端は彼らにそういう仕事をさせてきた我々社会の側にもある。無視できるほどのリスクに目くじらを立て、責任者は誰だ?と犯人探しをし、多額の損害賠償と再発防止策を求める。そのたびに新たな規制が追加され、少しずつ社会は住みにくくなる。もちろんそうした規制の中には必要なものも多い。しかし不要なものも多いのもまた事実だ。

この負の連鎖をなんとか断ち切り、より全体的な視点でバランスのとれた対応をすることは出来ないのか、それこそ政治主導の出番なのだろうけれど……ねえ?


恐らく、無視できるほどのリスクに関しては、犯人探しをしたり多額の損害賠償を求めたり再発防止策を求めている方々は少数なはずで、それらを不要と思っている人は多数なはずだと思うのですが、そもそも不要と思っている人は目くじらを立てない、つまり、意見を出さないですから。

何も言わない人と何か言ってくる人のどちらに対応するかといえば、通常、何か言ってくる人に対応せざるを得ないでしょうし。「危ないと*言われれば*」もそうなのでしょう。

そういう多数派が積極的に意見を出さないという意味で「責任の一端は彼らにそういう仕事をさせてきた我々社会の側にもある」というのは的を射ているとは思いますけど、例えば、モンペにその他の親御さんが「おまえの教育は間違っている」と思っても面と向かって主張しないのと同じで、ある意味三猿的なものが今の日本の文化的なところに根付いてますから。

結局のところ、より全体的な視点でバランスのとれた対応をするためには、そういう物言わぬ少数派が積極的に意見を言う社会を作るか、行政が積極的に意見を取りに行くかしかないんでしょうけど、それをどう実現するかが難しいところですかね。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

謹賀新年

年賀状2011


新年あけましておめでとう御座います。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

なんだかな…ServersMan@VPS

今朝、ServersMan@VPSのメンテに関してメールが。

引用:ServersMan@VPS メンテナンス経緯のご報告 ならびに AirDisplay設定変更のお願い

# 当メールは、SSH のポート番号変更にあたりまして、再度手動による設定が
# 必要なお客様を対象にお送りさせていただいております。
# 大変ご面倒ながら、ご協力をお願いいたします。


勝手に環境弄っておいてその修正は客の方で行えと?まあ、各所で勝手に弄るなと突っ込まれた手前、弄れない立場になってしまったんでしょうかね。個人的には、どのみち使ってないし使わない機能なのでどうでもいいんですが。そもそも、

引用:ServersMan@VPSサービス SSH接続用のポート変更に伴う設定変更のお願い

プリインストールされているアプリケーションの他、お客様が自由に環境を構築できるメリットもありますが、その反面、セキュリティ対策もお客様ご自身で行っていただく必要があります。


と言っておきながら、その対策を客に任せていないからこういうことになるんじゃないかと思ったり。まあ、途中から高負荷対策などという名目が案内メールに入り込んできてますので、DTI都合の意味合いが大きいメンテなんだと邪推したりしてますが。

別にたいした料金払っているわけではないので、弄りたきゃ弄ってもらえればいいとは思うのですが(*1)、なんかセキュリティ対策を口実に負荷対策を行うのはなんだかなといったところ。言っていることが首尾一貫してないし、言い訳がましい口実を書いているように読めてしまうところが個人的に反感を買う要因ではないかと思うところ。




*1: 事前に断る必要はあると思いますけど。
nice!(0)  コメント(1)  トラックバック(0) 
共通テーマ:日記・雑感

続・YAMAHAルータDNSリカーシブサーバー機能検証(フルリゾルバがBIND 9.7.2-P3の場合)

YAMAHAルータDNSリカーシブサーバー機能検証

同じテストをフルリゾルバBIND 9.7.2-P3にしてやってみた。

まず、dhcp scope optionを付けない場合。要するに、

DNS Servers . . . . . . . . . . . : 192.168.141.1
                                    192.0.2.81


となる場合。結果は、

DNSSEC compatibilty report(RTX1100 Rev.8.03.90)その1


42/43 tests passed(failedしたのはEのみ)。かなり良好です。

次に、dhcp scope option 1 dns=192.168.141.1とした場合。要するに、

DNS Servers . . . . . . . . . . . : 192.168.141.1


となる場合。ルータのみに問い合わせる場合です。結果は、

DNSSEC compatibilty report(RTX1100 Rev.8.03.90)その2


6/43 tests passed(passしたのはB, G.1, G.2, G.3, G.4, G.5)。変わらず悲惨です。

次に、dhcp scope option 1 dns=192.0.2.81とした場合。要するに、

DNS Servers . . . . . . . . . . . : 192.0.2.81


となる場合で、直接フルリゾルバに問い合わせる場合です。結果は、

DNSSEC compatibilty report(RTX1100 Rev.8.03.90)その3


43/43 tests passed。この上ないですな。Unboundの場合はバージョンが古いからか設定に不足があるのかもですね。いずれにしろ、RTX1100のDNSリカーシブサーバー機能は駄目っぽい。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

YAMAHAルータDNSリカーシブサーバー機能検証

RTX1100のDNSリカーシブサーバー機能ですがDNSSECが絡むとあまりよろしくない感じがするので検証してみようかと。検証といってもhttp://www.nic.cz/dnssectests/あたりからダウンロードしたDNSSEC Hardware Tester(Windows version)によるものなのでおもいっきり他力本願ではありますが。

まあ、枯れた機種かもしれませんけど、一応現役で売ってますし、ファームウェアも2010年12月30日現在最新のRev.8.03.90にして検証してみました。

RTX1100のプライベート側のIPアドレスは192.168.141.1、DNSサーバーのIPアドレスは実際のものを書くのも何なので192.0.2.81としておきます。192.0.2.81で動作しているフルリゾルバはFedora EPELのunbound 1.4.4です。この場合、要所だけ書くと、

…
ip lan1 address 192.168.141.1/24
…
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.141.192-192.168.141.224/24 expire 1:00
dns service recursive
dns server 192.0.2.81
…


みたいな設定を入れるかと思うんですが、この設定でWindowsクライアントなんぞでipconfig /allなんぞを実行すると、以下のような感じで、

IP Address. . . . . . . . . . . . : 192.168.141.192
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.141.1
DHCP Server . . . . . . . . . . . : 192.168.141.1
DNS Servers . . . . . . . . . . . : 192.168.141.1
                                    192.0.2.81
Lease Obtained. . . . . . . . . . : 2010年12月30日 0:42:09
Lease Expires . . . . . . . . . . : 2010年12月30日 1:42:09


DNS Servers欄にDNSリカーシブサーバー機能が動作しているRTX1100のIPアドレスと実際のDNSサーバーのIPアドレスが返ってきます。実際、この場合はそこそこ良好な結果(38/43 tests passedでfailedはC.1, C.2, D.1, D.2, Eのみ)を叩き出すのですが、なんとなく192.0.2.81に直接問い合わせた結果がよいだけで本来のDNSリカーシブサーバー機能は頑張ってないんじゃないのかと思えたので検証してみる次第。

そのようなわけで、DHCPがDNSサーバーとして192.168.141.1しか返さないように、以下の設定を加えます。

dhcp scope option 1 dns=192.168.141.1


これで、ipconfig /allなんぞを実行すると、

IP Address. . . . . . . . . . . . : 192.168.141.192
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.141.1
DHCP Server . . . . . . . . . . . : 192.168.141.1
DNS Servers . . . . . . . . . . . : 192.168.141.1
Lease Obtained. . . . . . . . . . : 2010年12月30日 0:52:36
Lease Expires . . . . . . . . . . : 2010年12月30日 1:52:36


となります。これでテストしてみると、

DNSSEC compatibilty report(RTX1100 Rev.8.03.90)


6/43 tests passed(passしたのはB, G.1, G.2, G.3, G.4, G.5)のみ。結構悲惨な有様。

そもそもルータにDNSリカーシブサーバー機能が要るのかどうかは兎も角、RTX1100のDNSリカーシブサーバー機能は使えない感じ。何か設定が足らんのでしょうか。最新の機種だとそうでもないんですかね。

ちなみに、実際のルータの全設定は以下のような感じです。なるべく余計なものは書かないようにしたつもり。

dhcp scope option

console character ascii
ip route default gateway pp 1
ip filter source-route on
ip filter directed-broadcast on
ip icmp redirect send off
ip lan1 address 192.168.141.1/24
pp select 1
 pp always-on on
 pppoe use lan2
 pp auth accept chap
 pp auth myname user_id password
 ppp lcp mru on 1438
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 ip pp mtu 1438
 ip pp nat descriptor 1
 pp enable 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 ipcp
nat descriptor address inner 1 auto
rip use off
telnetd service on
telnetd host 192.168.141.1-192.168.141.254
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.141.192-192.168.141.224/24 expire 1:00
dhcp scope option 1 dns=192.168.141.1
dns service recursive
dns server 192.0.2.81
httpd service off
httpd host none


dhcp scope option

console character ascii
ip route default gateway pp 1
ip filter source-route on
ip filter directed-broadcast on
ip icmp redirect send off
ip lan1 address 192.168.141.1/24
pp select 1
 pp always-on on
 pppoe use lan2
 pp auth accept chap
 pp auth myname user_id password
 ppp lcp mru on 1438
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 ip pp mtu 1438
 ip pp nat descriptor 1
 pp enable 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 ipcp
nat descriptor address inner 1 auto
rip use off
telnetd service on
telnetd host 192.168.141.1-192.168.141.254
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.141.192-192.168.141.224/24 expire 1:00
dns service recursive
dns server 192.0.2.81
httpd service off
httpd host none


nice!(0)  コメント(1)  トラックバック(1) 
共通テーマ:日記・雑感

ECPGでSELECT FOR UPDATE

Windows版のPostgreSQL 8.4に付いてきたECPGでSELECT ... FOR UPDATEをやってみたときの微妙なメモ。まあ、普通に動くので微妙ではないかもしれないですけど。ちなみに開発環境はVisual C++ 2005。

取り敢えず、テスト用に簡単なテーブルを作ってみる。

CREATE TABLE T_TEST (
    TEST_ID SERIAL NOT NULL PRIMARY KEY,
    TEST_STR VARCHAR(8) DEFAULT '' NOT NULL
);


序でに申し訳程度にレコードも足しておく。

INSERT INTO T_TEST (TEST_STR) VALUES ('aaaa');
INSERT INTO T_TEST (TEST_STR) VALUES ('bbbb');
INSERT INTO T_TEST (TEST_STR) VALUES ('cccc');
INSERT INTO T_TEST (TEST_STR) VALUES ('dddd');


以下のようなECPGに食わせるコードを書いてみる。

EXEC SQL
    BEGIN;

EXEC SQL
    SELECT TEST_ID 
     FROM T_TEST 
      WHERE TEST_ID > 0 FOR UPDATE;
...
EXEC SQL
    COMMIT WORK;
...


BEGIN;で明示的にトランザクションを開始してCOMMIT WORK;しているので、プリプロセッサecpg(1)に渡すときには-tオプションを付けます。で、エラーもなくVisual C++ 2005のビルドまで通るのですが、実行するとSQLCODE-202SQLSATTE07002なエラーを吐きます。INTO句がないからなのですが、エラーだからといって別にロックに失敗しているわけでもなくそこでトランザクションがROLLBACKしているわけでもなく正常に動作してたりします。まあ、デフォルトがEXEC SQL WHENEVER SQLERROR CONTINUE;なので処理を続行するのはわかるんですが、エラーって続行可能な場合を指すのかなと。SQLWARNING扱いでも良さそうな気が。兎も角、INTO句を付ければ解消しそうなので付けてみることに。返ってくる行数が事前にわかるわけでもないので、ここはDESCRIPTORを使って以下のように書いてみる。

EXEC SQL
    BEGIN;

EXEC SQL ALLOCATE DESCRIPTOR test_desc;

EXEC SQL
    SELECT TEST_ID 
     INTO DESCRIPTOR test_desc 
      FROM T_TEST 
       WHERE TEST_ID > 0 FOR UPDATE;

EXEC SQL DEALLOCATE DESCRIPTOR test_desc;
...
EXEC SQL
    COMMIT WORK;
...


別にdescriptor areaから値を取り出すわけでもないので何となくもったいない感はありますが特にエラーも吐かず実行できます。勿論、ちゃんとロックもかかります。で、マニュアルの32.7. Dynamic SQLを読んでみると、こんな記述が。

引用:PostgreSQL 8.4.6 Documentation(32.7. Dynamic SQL)

An EXECUTE command can have an INTO clause, a USING clause, both, or neither.


日本語だとここ。

引用:PostgreSQL 8.4.4文書(32.7. 動的SQL)

EXECUTEコマンドはINTO句、USING句、この両方を持つことも、どちらも持たないこともできます。


ん?動的SQLを使うとINTO句が省略できるのか?とか思って以下のようにやってみましたが、

EXEC SQL BEGIN DECLARE SECTION;
    ...
    const char *sfu_stmt 
     = "SELECT TEST_ID FROM T_TEST WHERE TEST_ID > ? FOR UPDATE;";
    ...
EXEC SQL END DECLARE SECTION;
...
EXEC SQL
    BEGIN;

EXEC SQL
    PREPARE test_query FROM :sfu_stmt;

EXEC SQL
    EXECUTE test_query USING 0;

EXEC SQL
    DEALLOCATE PREPARE test_query;
...
EXEC SQL
    COMMIT WORK;
...


同じようにSQLCODE-202SQLSATTE07002なエラーを吐きました。この場合もINTO句は要るようで、

EXEC SQL BEGIN DECLARE SECTION;
    ...
    const char *sfu_stmt 
     = "SELECT TEST_ID FROM T_TEST WHERE TEST_ID > ? FOR UPDATE;";
    ...
EXEC SQL END DECLARE SECTION;
...
EXEC SQL
    BEGIN;

EXEC SQL
    PREPARE test_query FROM :sfu_stmt;

EXEC SQL ALLOCATE DESCRIPTOR test_desc;

EXEC SQL
    EXECUTE test_query 
     INTO DESCRIPTOR test_desc USING 0;

EXEC SQL DEALLOCATE DESCRIPTOR test_desc;

EXEC SQL
    DEALLOCATE PREPARE test_query;
...
EXEC SQL
    COMMIT WORK;
...


とすると特にエラーも吐かず実行できました。ちなみに、動的SQLじゃない場合と同様にどちらも正常に意図した通りに動いてはいます。でも、なんだか「INTO句やUSING句は書かなくて良い場合は書かなくてよい。」と言われているようでなんだか「赤く塗られたところは赤いです。」とか「500円のものは500円です。」と同じような感覚があり、そりゃそうだろうと言いたくなるような仕様ではあります。

後、最新のPostgreSQL 9.0.2 Documentationでもそうなんですが、ずっと、

引用:PostgreSQL 9.0.2 Documentation(32.7. Dynamic SQL)

EXEC SQL EXECUTE mystmt INTO v1, v2, v3 USING 37;


と書かれていますが、:v1, :v2, :v3と書かないと動作しないはず。このあたりからしてECPGってあんまり使われてないんでしょうね。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Phreebird Suite 1.02お試し

まだまだデモレベルな感じですが、Dan Kaminsky氏ご提供のPhreebird Suite 1.02phreebirdをお試し程度に使ってみる。大雑把にいえば、DNSSEC未対応のDNSサーバーのレコードに署名を付けてくれるプロキシーのようです。

モノは、

http://s3.amazonaws.com/dmk/phreebird_suite_1.02.tar.gz

あたりにあるようです。後、プレゼンらしきものが、

http://www.slideshare.net/dakami/phreebird-suite-10-introducing-the-domain-key-infrastructure

なんかにあります。

テスト環境は、某βテスト中のクラウド/VPSのCentOS5.5。まずは、インストール。取り敢えず、取得と展開

$ wget \
    http://s3.amazonaws.com/dmk/phreebird_suite_1.02.tar.gz
$ tar xpvzf  phreebird_suite_1.02.tar.gz
$ cd phreebird_suite_1.02


まずは、依存するライブラリとかのインストール

$ su
# sh depbuild.sh
# exit
$


うまくいかなければ、depsディレクトリcdしてアーカイブ展開して./configure && make && make installとか各々のドキュメントの指示に従う等してインストールします。

そして本体のインストール。

$ su
# make && make install


後は、ldconfig(8)を実行しておきます。

# cat > /etc/ld.so.conf.d/phreebird.conf
/usr/local/lib
# ldconfig


で、使い方。

# phreebird -?


とすると簡単なヘルプが出ます。ZSKを作成します。

# phreebird -g


とするとカレントディレクトリにdns.keyという名前で秘密鍵が出来ます。アルゴリズムはRSASHA1_NSEC3。できるモノはldns-keygen(8)dnssec-keygen(8)で作られるモノと同じなので、他のアルゴリズムを使いたい場合、そっちで作っても構わないのですが、Private-key-formatv1.3なモノは使えないようなので、イマドキのdnssec-keygen(8)なんぞで作る場合は-Cオプションを付ける必要があるようです。

後は、適当なコンテンツDNSサーバ(Authoritative Server)を指定して起動します。以下は、適当なコンテンツDNSサーバのIPアドレスが192.0.2.2だった場合。

# phreebird -b 192.0.2.2:53


-bを指定しなければ、ローカルの50053に向くようです。

後は、dig(1)とかで、動作確認。

$ dig +dnssec +multiline @127.0.0.1 example.jp. soa


キャッシュDNSサーバ(Recursive Server)といいますかフルリゾルバに向けてやると漏れなく署名付けてくれたりします。すでに付いているものは署名し直されることになります。
ちなみに、rootのhint fileが設定されていないコンテンツDNSサーバー、たとえば、

zone "." {
    type hint;
    file "/dev/null";
};


になっているものや、zone "."がないコンテンツDNSサーバー(*1)に向けてやって、

$ dig +dnssec @127.0.0.1 . ns


とかすると、Segmentation faultで落ちます。




*1: コンテンツDNSサーバーって普通そうだとは思いますけど。
タグ:DNSSEC phreebird
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感
前の10件 | -

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