仙石浩明の日記

2006年4月14日

SO_PEERCRED

UNIX ドメインソケットならば、カーネルはどのユーザが そのソケットに connect したか知っているはずで、 きっと getsockopt(2) でユーザID が取得できるに違いない、 と思ってカーネルソースを見ていたら SO_PEERCRED を発見。

ついでに SO_PEERCRED をググってみたら、 PostgreSQL や w3m では、 既に SO_PEERCRED を使った認証をサポートしていることが判明。 負けじと stone にも実装してみる。

$Id: stone.c,v 2.2.2.18 2006/04/13 09:02:15 hiroaki_sengoku Exp $

README から引用:

        stone [-C <file>] [-P <command>] [-Q <options>] [-N] [-d] [-p] [-n]
              [-u <max>] [-f <n>] [-l] [-L <file>] [-a <file>] [-i <file>]
              [-X <n>] [-T <n>] [-r]
              [-x <port>[,<port>][-<port>]... <xhost>... --]
              [-s <send> <expect>... --]
              [-b [<var>=<val>]... <n> <master>:<port> <backup>:<port>]
              [-B <host>:<port> <host1>:<port1>... --]
              [-I <host>]
              [-o <n>] [-g <n>] [-t <dir>] [-D] [-c <dir>]
              [-q <SSL>] [-z <SSL>]
              [-M install <name>] [-M remove <name>]
              <st> [-- <st>]...

        ...

        <st> は次のいずれかです。<st> は「--」で区切ることにより、複数個
        指定できます。

        ...

        (4)        <host>:<port>/http <request> [<xhost>...]
        (5)        <host>:<port>/proxy <header> [<xhost>...]

        (4) は、http リクエストにのせて中継します。<request> は HTTP 1.0 
        で規定されるリクエストです。リクエスト文字列中、「\」はエスケー
        プ文字であり、次のような置き換えが行なわれます。

                \n        改行 (0x0A)
                \r        復帰 (0x0D)
                \t        タブ (0x09)
                \\        \    (0x5C)
                \a        接続元の IP アドレス
                \A        「接続元の IP アドレス」:「ポート番号」
                \d        接続先の IP アドレス
                \D        「接続先の IP アドレス」:「ポート番号」(透過プロキシ用)
                \u        接続元のユーザID (番号)
                \U        接続元のユーザ名
                \g        接続元のグループID (番号)
                \G        接続元のグループ名
                        \u \U \g \G は UNIX ドメインソケットの場合のみ
                \0        SSL 証明書のシリアル番号
                \1 - \9        SSL オプションの re<n>= で指定した正規表現中、
                        ( ... ) 内の正規表現にマッチした文字列
                \?1<then>\:<else>\/
                        もし \1 (\2 - \9 も同様) の文字列が、空文字列で
                        なければ <then>、空文字列であれば <else>

        (5) は、http リクエストヘッダの先頭に <header> を追加して中継し
        ます。(4) と同様のエスケープを使うことができます。
Filed under: stone 開発日記 — hiroaki_sengoku @ 06:58

1 Comment »

  1. DB サーバのセキュリティ向上策 (6)

    「DB サーバのセキュリティ向上策 (3)」では、
    どのユーザが UNIX ドメインソケットにアクセスしたか特定するために、
    ユーザごとにソケットを作成しました。
    しかし Linux などの OS では、UNIX ドメインソケットに限り
    アクセス元のユーザを getsockopt(2) で調べる….

    Comment by 仙石浩明CTO の日記 — 2006年4月14日 @ 08:13

RSS feed for comments on this post.

Leave a comment