IDENTD(8)

名称
identd - TCP/IP IDENT プロトコルサーバ

書式
identd [-i|-w|-b] [-t<seconds>] [-u<uid>] [-g<gid>] [-p<port>] [-a<address>] [-c<charset>] [-C[<keyfile>]] [-n] [-o] [-e] [-l] [-V] [-m] [-N] [-d] [-F<format>] [kernelfile[kmemfile]]

解説
identd は、 RFC 1413 で明記されている標準 IDENT ユーザ識別プロトコルを TCP/IP で実装したサーバです。

identd は特定の TCP/IP コネクションを見て、そのコネクションを所有しているプロセスの ユーザ名を返します。オプションを指定することで、ユーザ名の代りに その他の情報を返すこともできます。

引数
-i フラグは、 /etc/inetd.conf ファイル内に "nowait" オプションがついた状態で デーモンを inetd から起動する場合に指定すべきです。このモードを使うと、 inetd は各コネクション要求につき 1 つの identd デーモンをスタートさせます。

-w フラグは、 /etc/inetd.conf ファイル内に "wait" オプションがついた状態で デーモンを inetd から起動する場合に指定すべきです。このモードでは、最初のコネクション要求で identd のコピーが走り、その後、 -i モードの場合にはリクエストが来るたびにごとに行うカーネルファイル内の nlist 検索をこのモードでは行わずにその後に続くリクエストを扱います。 よって、こちらのモードの方が好まれます。 identd デーモンは、バグでクラッシュするまで永遠に動き続けるか、 -t フラグで指定したタイムアウトに達するまで動作し続けます。

-b フラグは、 inetd の補助なしでデーモンをスタンドアロンモードで走行させる場合に使います。 バグや致命的な事態が起こってデーモンが終了してしまった場合に 手動で再スタートしなければならなくなるため、 このモードが最も好ましくありません。 これ以外は、nlist を 1 回しか検索しないという点で -w モードと同じ利点があります。

-t<seconds> オプションは、タイムアウト時間を指定するためのものです。 -w フラグつきでスタートしたサーバが新しい接続を待つ期限を秒数で指定します。 サーバが終了しても、新しい接続要求があれば inetd が自動的にサーバを再スタートさせてくれます。 設定するならば、120 (2 分) ぐらいが適当です。 デフォルトではタイムアウトは起こりません (つまり、永遠に待ち続けるか、サーバが致命的な事態に陥るまで待ち続けます)。

-u<uid> オプションを指定すると、 ident サーバが -b モードで動作している場合に、 TCP/IP ポートをバインドした後にサーバのユーザ ID 番号を指定したものに変更します。

-g<gid> オプションは、 ident サーバが -b モードで動作している場合に、 TCP/IP ポートをバインドした後にサーバのグループ ID 番号を指定したものに変更します。

-p<port> オプションは、動作モードとして -b モードを使う場合に、バインドする代替ポート番号を指定するためのものです。 名前と番号のどちらでも指定可能です。デフォルトは IDENT ポート (113) です。

-a<address> オプションは、動作モードとして -b モードを使う場合に、ソケットをバインドするローカルアドレスを指定するための ものです。ドメイン名は使えず、IP アドレスしか使えません。 デフォルトのアドレスは INADDR_ANY で、通常は全てのローカルアドレスを意味します。

-V フラグを使うと、 identd はバージョン番号を表示して終了します。

-l フラグを指定すると、 identd はログを取るためにシステムログデーモン syslogd を使うようになります。

-o フラグを指定すると、 identd は動作している OS の種類を明かさず、その代りとして常に "OTHER" を 返します。

-e フラグを指定すると、 identd は "NO-USER" や "INVALID-PORT" エラーの代りに常に "UNKNOWN-ERROR" を返します。

-c<charset> フラグを指定すると、リプライを作成するためのオプションキャラクタセット (IDENT プロトコルに関連する) を追加します。 charset は MIME RFC に記述されている正しいキャラクタセットを 大文字で指定しなければなりません。

-C[<keyfile>] オプションを指定すると、 identd は、ユーザ名の代りに暗号化したトークンを返すようになります。 ローカル側とリモート側の IP アドレスと TCP ポート番号、 ローカル側のユーザの uid 番号、タイムスタンプ、乱数、チェックサムが 全て DES で暗号化されます。暗号化時のシークレットキーは keyfile ( des_string_to_key(3) を使う) の最初の行から作ります。 その後、リモートクライアントに送るトークンを生成するため、 暗号化してできたバイナリ情報は、base64 の文字列 (文字列長 32) に エンコードされ、角括弧で括られます。 暗号化されたトークンは、後で idecrypt(8) で復号できます。 -C と keyfile の間には空白を置いてはいけません。 もし keyfile が指定されなければ、デフォルトとして /etc/identd.key が使われます。

もしユーザ名を隠したい場合には、 -n フラグを指定すれば、 identd はユーザ名の代りに常にユーザ数を返します。 -N フラグを指定すると、 identd は、渡しかけているユーザ名のユーザのホームディレクトリに ".noident" というファイルがあるかどうかを調べます。 もしそのファイルが存在すれば、デーモンは通常の USERID レスポンスの代りに HIDDEN-USER エラーを返します。

-m フラグを指定すると、 identd は各セッションで複数のリクエストを処理できる動作モードになります。 各リクエストは 1 行に 1 つ指定し、レスポンスも 1 行につき 1 つ返されます。 EOL で接続を切るまではコネクションは閉じられません。 このモードは現在のプロトコル仕様に違反していることに注意して下さい。

-d フラグはデバッグコードを有効にしますが、 有効にしてしまうとプロトコルに違反してしまい、 外部に見せるべきではない情報まで漏らしてしまうので、 通常使用時には有効にしてはいけません。

-F<format> オプションを指定すると、 identd は指定したフォーマットで情報を表示するようになります。 利用可能なフォーマットは以下の通りです:
%u   ユーザ名を表示します
%U   ユーザの番号を表示します
%g   (primary) グループ名を表示します
%G   (primary) グループ番号を表示します
%l   全てのグループを名前で表示します
%L   全てのグループを番号で表示します
%p   実行中のプロセスのプロセス ID を表示します
%c   コマンド名を表示します
%C   コマンドと引数を表示します
グループのリスト (%l, %L) はコンマで区切られ、先頭は primary グループで、 これが再度出てくることはありません。%p, %c, %C のフォーマットは 全てのアーキテクチャでサポートされているわけではありません (未サポートの場合は 0 や空文字列が表示されます)。
その他の文字 (% が先頭につくものと、つかないもの) はそのまま表示されます。 "デフォルト" のフォーマットは %u で、 -o フラグをつけていない時はこれ以外を使うべきではありません。
まだ実装はしていませんが、wish-list には以下のものがあります:
%w   (カレント) ワーキングディレクトリの表示
%h   ホーム (ログイン, ネーミング) ディレクトリ
%e   環境変数の表示

kernelfile 実行中のカーネルのファイルです。

kmemfile 実行中のカーネルのメモリ空間です。

ドキュメントのないフラグ
-v フラグは出力をさらに冗長にします。 (後に登場する予定の -v フラグはなおいっそう冗長にします)。現在は使用しておらず、無視されます。

-f<config-file> により、 identd は、指定したコンフィグファイルを使うようになります (デフォルトの /etc/identd.conf の代り)。 現在は使用しておらず、無視され、コンフィグファイルも使われません。

-r<indirect_host> をどうにかして使います (proxy を介した問い合わせ用)。

インストール
identd は、 -w または -i モードで使う場合は /etc/services ファイル ( services(5) 参照) で指定された IDENT ポートからの接続要求によりインターネットサーバ ( inetd(8C) 参照) から起動されるか、または、 -b モードで手動で起動します。

使用例
サーバが /usr/libexec/identd にあると仮定した場合、

ident stream tcp wait nobody.kmem /usr/libexec/identd identd -w -t120

または:

ident stream tcp nowait nobody.kmem /usr/libexec/identd identd -i

のいずれかを /etc/inetd.conf ファイルに書きます。カーネルに書かずに読むだけなので、ユーザが "nobody" で グループが "kmem" であれば充分です。

-b モードで動作を開始させるのであれば、以下の行を /etc/rc.local ファイルに入れるとよいでしょう:

/usr/libexec/identd -b -u32767 -g2

これはユーザ 2 グループ 2 (NetBSD ならばユーザ "nobody" グループ "kmem") でバックグラウンドで動作します。

注意
ユーザ名 (または UID) はログイン名のはずです。しかしながら、 (たぶんほとんどのアーキテクチャの実装では) "実ユーザ ID" がプロセスに 保存され、"実効ユーザ ID" を返すための手段がありません。 このため、 setuid(3) コールで setuid されたプログラム (たいていは root で実行されている) とその子供の場合はおそらく、返される UID がログイン名と違っているでしょう。 たとえば、 接続してきている ftpd ではたぶん間違っていると思われます (間違っているはず?)。 また、我々は実行中の shell に興味があるのであって、 繋いできている telnet セッションの telnetd ではないのです。 (もちろん identd は接続してきているコネクションではなく、出ていっているコネクションに関する 情報を返します。)

identd が返す ( -F オプションをつけた場合に) グループまたはグループのリストは、 返す UID をもとに、ファイル /etc/passwd と /etc/group を見て調べています。よってこの値は、 setuid や setgid した実行中のプロセスやその子供のグループとはあまり関係がない かもしれません。

%c と %C で返されるコマンド名は違っている可能性があるので、どちらかを使うか、 両方を使うかしてください。

関連ファイル

/etc/identd.conf
    このファイルはまだ使われていませんが、そのうち identd のコンフィギュレーションオプションを入れておくファイルとして使います。

/etc/identd.key
    -ldes つきでコンパイルされていれば、リプライを暗号化するためのシークレットキー を指定するために使われます。

関連項目
authuser(3) , inetd.conf(5) , idecrypt(8)

バグ
致命的なエラーハンドリングについては、改善の余地があります。