ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Trusted Extensions 開発者ガイド Oracle Solaris 10 1/13 Information Library (日本語) |
1. Trusted Extensions API およびセキュリティーポリシー
9. Solaris Trusted Extensions ラベル API のための試験的な Java バインディング
クライアントでは、ラベルなしシステム上のサーバーにアクセスできることが必要な場合があります。「ラベルなしシステム」とは、Trusted Extensions ソフトウェアを実行しないシステムです。そのような場合は、マルチレベルポートを使用できません。それらは大域ゾーンまたはラベル付きゾーンで動作する特権サーバーに制限されるからです。
たとえば、ブラウザが INTERNAL ゾーンで動作しているとします。tnrhdb データベースによって PUBLIC 機密ラベルが割り当てられた単一レベルネットワークで動作している Web サーバーにアクセスしてみます。デフォルトでは、そのようなアクセスは許可されません。ただし、HTTP リクエストを PUBLIC の Web サーバーに転送する特権プロキシサーバーを記述できます。このプロキシは、SO_MAC_EXEMPT と呼ばれる特別な Trusted Extensions ソケットオプションを使用します。このソケットオプションによって、信頼できない下位レベルのサービスにリクエストを送信したり、そのサービスからの応答をリクエスト元に返したりすることが可能になります。
注 - SO_MAC_EXEMPT オプションの使用は保護されていないダウングレードチャネルを意味するので、十分に注意するようにしてください。SO_MAC_EXEMPT オプションは、呼び出し元プロセスの実効セットに PRIV_NET_MAC_AWARE 特権が含まれていない限り設定できません。そのようなプロセスでは、上位レベルのデータが下位レベルのサービスに漏れないように、それ自身のデータフィルタリングポリシーを強制する必要があります。たとえば、単語が値として使用されるのを禁止するために、URL の不適切な箇所をプロキシで削除します。
次のコード抜粋は、connect.c にある wget コマンドの connect_to_ip() ルーチンの変更バージョンにおける SO_MAC_EXEMPT の使用法を示しています。SO_MAC_EXEMPT オプションの設定方法を示すために、setsockopt() の呼び出しが追加されています。
int connect_to_ip (const ip_address *ip, int port, const char *print) { struct sockaddr_storage ss; struct sockaddr *sa = (struct sockaddr *)&ss; int sock; int on = 1; /* If PRINT is non-NULL, print the "Connecting to..." line, with PRINT being the host name we're connecting to. */ if (print) { const char *txt_addr = pretty_print_address (ip); if (print && 0 != strcmp (print, txt_addr)) logprintf (LOG_VERBOSE, _("Connecting to %s|%s|:%d... "), escnonprint (print), txt_addr, port); else logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port); } /* Store the sockaddr info to SA. */ sockaddr_set_data (sa, ip, port); /* Create the socket of the family appropriate for the address. */ sock = socket (sa->sa_family, SOCK_STREAM, 0); if (sock < 0) goto err; if (setsockopt (sock, SOL_SOCKET, SO_MAC_EXEMPT, &on, sizeof (on)) == -1) { perror("setsockopt SO_MAC_EXEMPT"); } #if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY) if (opt.ipv6_only) { /* In case of error, we will go on anyway... */ int err = setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on)); } #endif