2009-11-07

関西オープンソース 2009 (11/6)

LPIC レベル 3 303 Security 技術解説無料セミナー

流れとしては公開鍵暗号方式と電子署名の仕組みをざっと解説し、Apache で SSL 通信を行う手順、OpenVPN を使う手順の解説という感じで期待していたモノとはちょっと違った感じ。

最初に気になったのは「HTTPS の 3つの役割」というところでタイトルからして気になった。このあたりを解説するにはやはりネットワーク上の脅威から解説をした方がいいのではないかなぁと思います。盗聴、改ざん、なりすましについてはあがっていましたが否認について触れられていなかったのが残念でした。

次に気になったのは「秘密鍵で署名」という言葉。これは現在一般的な RSA がたまたまこういった性質を持っているだけであって厳密には違います。高木浩光さんの日記のエントリ にも以下のようにあります。

最もひどく蔓延っていてしばらく消えそうにない間違い解説の典型例は次だ。


  • 「公開鍵で暗号化したものを秘密鍵で復号するのと同様に、秘密鍵で暗号化したものを公開鍵で復号できるようになっている。」
    • ... (略) ...
  • 「公開鍵暗号方式による署名は、メッセージダイジェストを秘密鍵で暗号化することで実現する。」
    • ... (略) ...

これらの解説は誤っている。これらは、RSAアルゴリズムを説明するものにはなり得ても、公開鍵暗号方式を説明するものになっていない。公開鍵と秘密鍵が「逆に使える」というのはRSAアルゴリズムがたまたま(まあまあ)そうなだけであって、そのような性質を持たない他の公開鍵暗号方式がたくさん存在する。


気になったついでに書いておきます。資料に何度も出てくる「復号化」という言葉。「暗号化」というので「復号化」と言いたくなる気持ちはわからないでもないけど、使われている文脈を考えると正しくは「復号」ですよね。

その後は Apache や OpenVPN の how-to というか手順の説明。

全体を通して LPIC レベル 3 Security というものから期待していたモノとは違ったので個人的にはイマイチなセミナーでした。

セキュアコーディングノススメ

参考になればいいなぁくらいの感じで聴きにいったのですが、思いの外良かったです。

JPCERT/CC の紹介から始まり、適宜事例紹介をしながらセキュアコーディングの必要性を説いたのち、プラクティスをざっと紹介し、JPCERT/CC の取り組みの紹介をして終わるという流れでした。

特に印象に残ったのが「言語仕様を理解せずにコーディングすることが脆弱性を埋め込む一因になる」という感じの言葉です。正確な言い回しは忘れましたがこんな意味合いでした。当たり前の人にとっては当たり前なんだろうけど、確かにそうですよね、と。

このコマではいくつかの有用なサイトの紹介もありましたので以下に挙げておきます。


リアルタイムレプリケーションソフト DRBD の概要と活用事例紹介

業務用途で必要な機能が充実してきたことと、業務での活用事例が聴けたことがまぁ良かったかなと。ちょうど日本語マニュアルも公開されたらしいですし、時間を作って DB のレプリケーションなどを色々試してみたいです。マニュアルは こちら です。

DRBD を使ってデータベースをレプリケーションした場合オーバヘッドによるパフォーマンスへの影響は 3 - 5% 程度とのことでした。

Ruby でソフトウェアづくりをアジャイルにするということについて

プレゼン自体はおもしろかったですが、Ruby 自体はあまりテーマに関係なかったことと、テーマが壮大すぎてやや焦点がぼやけてしまった感とが気になりました。念のため繰り返しておくとプレゼン自体はおもしろかったですよ。

強引にまとめると結論以下のような感じでしょうか。

  • プログラマはもっと力を持っていいし、持つようにならなければならない。また力を持ったらそれだけの責任を果たさなければならない
  • アジャイル開発は一番自然な形でのソフトウェア開発なのではないだろうか

特に 2つめの論点については興味深かったのでおすすめされていた以下の本を読んでみようと思います。

StringBuffer, StringBuilder の落とし穴?


  1. AyakoBaba
    AyakoBaba Sbにnullをappendすると"null"になる巧妙なわな
-- this quote was brought to you by quoteurl
というつぶやきを見て気になったので自分自身でも検証コードを書いて試してみた。
public class SbTest {
    public static void main(String[] args) {
        String foo = "foo";
        String bar = null;
        String baz = "baz";

        StringBuilder sb1 = new StringBuilder();
        sb1.append(foo);
        sb1.append(bar);
        sb1.append(baz);
        System.out.println(sb1.toString());

        StringBuffer sb2 = new StringBuffer();
        sb2.append(foo);
        sb2.append(bar);
        sb2.append(baz);
        System.out.println(sb2.toString());
    }
}
これを実行すると…
foonullbaz
foonullbaz
ほんとだ。

それぞれの append() メソッドのソースを見てみると以下のようになっています。
    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
で、super.append(str) で呼び出されるメソッドのソースはというと…
    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
null の場合は null という文字列として扱うとなってます。このあたりは思い込みで何も追加されないと思っている人も少なくないと思うので注意が必要ですね。