仙石浩明の日記

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件のコメント »

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

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

    コメント by 仙石浩明CTO の日記 — 2006年4月14日 @ 08:13

この投稿へのコメントの RSS フィード。

コメントする