Solaris Trusted Extensions 開発ガイド

バークレーソケットと TLI

Trusted Extensions ソフトウェアは、単一ポートおよびマルチレベルポートでバークレーソケットおよび TLI を使用することによって、ネットワーク通信に対応します。システムコールの AF_UNIX ファミリは、完全解決のパス名で指定される特別なファイルを使用して、同じラベル付けされたゾーンでプロセス間接続を確立します。システムコールの AF_INET ファミリは、IP アドレスとポート番号を使用して、ネットワークにまたがるプロセス間接続を確立します。

AF_UNIX ファミリ

インタフェースの AF_UNIX ファミリでは、UNIX® ドメインソケットである特別な 1 つのファイルに対してサーバーバインドを 1 つだけ確立できます。AF_UNIX ファミリはマルチレベルポートに対応しません。

UNIX ドメインソケット同様に、ドアおよび名前付きパイプは、認識し合う目的で特別なファイルを使用します。

すべての Trusted Extensions IPC メカニズムのデフォルトポリシーは、すべてのメカニズムが 1 つのラベル付けされたゾーン内で機能するように制約されることです。このポリシーの例外は次のとおりです。

AF_INET ファミリ

AF_INET ファミリでは、プロセスは、特権または非特権のポート番号に対して単一ラベル接続またはマルチラベル接続を確立できます。特権ポート番号に接続するには、net_priv_addr 特権が必要です。マルチレベルポート接続にするには、net_bindmlp 特権も必要です。

サーバープロセスには、マルチレベルポート接続のために、その実効セットに net_bindmlp 特権が必要です。それに対して単一レベルポート接続を行う場合、サーバープロセスにはソケットに対する必須同等読み取りアクセスが必要であり、クライアントプロセスには必須同等書き込みアクセスが必要です。両方のプロセスには、ファイルに対する必須と任意のアクセスが必要です。ファイルへのアクセスが拒否される場合、アクセスが拒否されるプロセスには、アクセスを得るために、適切なファイル特権がその実効セットに必要です。

次のコーディング例は、接続されたクライアントのラベルをマルチレベルサーバーがどのように取得するかを示します。標準 C ライブラリ関数 getpeerucred() が、接続されたソケットまたは STREAM ピアの資格を取得します。Trusted Extensions において、マルチレベルポートサーバーの待機ソケットが接続要求を受け入れると、通常、最初の引数がクライアントソケットファイル記述子になります。Trusted Extensions アプリケーションは、標準のアプリケーションプログラムとまったく同じに getpeerucred() 関数を使用します。Trusted Extensions には ucred_getlabel() が追加され、ラベルを返します。詳細は、ucred_get(3C) のマニュアルページを参照してください。

/*
 * この例は、接続されたクライアントのラベルをマルチレベルサーバーが 
 * どのように取得するかを示す。
 */
void
remote_client_label(int svr_fd)
{
	ucred_t *uc = NULL;
	m_label_t *sl;
	struct sockaddr_in6 remote_addr;

	bzero((void *)&remote_addr, sizeof (struct sockaddr_in6));

	while (1) {
		int clnt_fd;
		clnt_fd = accept(svr_fd, (struct sockaddr *)&remote_addr,
				&sizeof (struct sockaddr_in6));

		/*
		 * ソケットからクライアント属性を取得する
		 */
		if (getpeerucred(clnt_fd, &uc) == -1) {
			return;
		}

		/*
		 * ucred 構造体から各フィールドを抽出する
		 */

		sl = ucred_getlabel(uc);

		/*
		 * セキュリティーラベルの使用法
		 * .....
		 */

		ucred_free(uc);
		close(clnt_fd);
	}
}