JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Trusted Extensions 開発者ガイド     Oracle Solaris 10 1/13 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  Trusted Extensions API およびセキュリティーポリシー

2.  ラベルと認可上限

3.  ラベルのコード例

4.  印刷とラベル API

5.  プロセス間通信

6.  Trusted X Window System

7.  ラベルビルダー API

8.  信頼できる Web ガードプロトタイプ

管理手法による Web ガードプロトタイプ

label_encodings ファイルの変更

トラステッドネットワークの構成

Apache Web サーバーの構成

信頼できる Web ガードデモの実行

下位レベルの信頼できないサーバーへのアクセス

9.  Solaris Trusted Extensions ラベル API のための試験的な Java バインディング

A.  プログラマーのリファレンス

B.  Trusted Extensions API リファレンス

索引

下位レベルの信頼できないサーバーへのアクセス

クライアントでは、ラベルなしシステム上のサーバーにアクセスできることが必要な場合があります。「ラベルなしシステム」とは、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