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) と同様のエスケープを使うことができます。
DB サーバのセキュリティ向上策 (6)
「DB サーバのセキュリティ向上策 (3)」では、
どのユーザが UNIX ドメインソケットにアクセスしたか特定するために、
ユーザごとにソケットを作成しました。
しかし Linux などの OS では、UNIX ドメインソケットに限り
アクセス元のユーザを getsockopt(2) で調べる….
Comment by 仙石浩明CTO の日記 — 2006年4月14日 @ 08:13