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

ラベル付き出力の印刷

ラベル対応アプリケーションの設計

マルチレベル印刷サービスについて

get_peer_label() ラベル対応関数

印刷サービスがラベル付き環境で実行されているかどうかの確認

リモートホストの資格について

資格とリモートホストラベルの取得

label_to_str() 関数の使用

メモリー管理の処理

返されたラベル文字列の使用

プリンタのラベル範囲に基づいたラベルリクエストの検証

5.  プロセス間通信

6.  Trusted X Window System

7.  ラベルビルダー API

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

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

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

B.  Trusted Extensions API リファレンス

索引

get_peer_label() ラベル対応関数

lp/lib/lp/tx.c ファイルに含まれている get_peer_label() 関数は、Trusted Extensions でのマルチレベル印刷のロジックを実装します。以降のセクションでは、この関数について説明し、その実装を順を追って行なっていきます。

Trusted Extensions ソフトウェアでは、印刷サービスでのラベルを処理するためのロジックの大部分は、get_peer_label() 関数に含まれています。この関数は、ucred_t データ構造体に含まれるリモートプロセスの資格を取得し、その資格からラベルを抽出します。

次に、get_peer_label() のコードを示します。

int
get_peer_label(int fd, char **slabel)
{
    if (is_system_labeled()) {
        ucred_t *uc = NULL;
        m_label_t *sl;
        char *pslabel = NULL; /* peer's slabel */

        if ((fd < 0) || (slabel == NULL)) {
            errno = EINVAL;
            return (-1);
        }
    
        if (getpeerucred(fd, &uc) == -1)
            return (-1);
    
        sl = ucred_getlabel(uc);
        if (label_to_str(sl, &pslabel, M_INTERNAL, DEF_NAMES) != 0)
            syslog(LOG_WARNING, "label_to_str(): %m");
        ucred_free(uc);
    
        if (pslabel != NULL) {
            syslog(LOG_DEBUG, "get_peer_label(%d, %s): becomes %s",
                fd, (*slabel ? *slabel : "NULL"), pslabel);
            if (*slabel != NULL)
                free(*slabel);
            *slabel = strdup(pslabel);
        }
    }
    
    return (0);
}

印刷サービスがラベル付き環境で実行されているかどうかの確認

印刷サービスは、ラベル付き環境とラベルなし環境で機能するように設計されています。そのため、印刷アプリケーションでは、リモートホストのラベルがリクエストされる時期と、そのラベルが適用されるかどうかを特定する必要があります。印刷プロセスは最初に、それ自身の環境をチェックします。プロセスがラベル対応の環境で実行されているかどうかを確認します。

アプリケーションではリモートリクエストがラベル付けされているかどうかを最初に確認しないことに注意してください。代わりに、印刷アプリケーションはそれ自身の環境がラベル付けされているかどうかを確認します。アプリケーションがラベル付きホストで実行されていない場合、MAC ポリシーによって、印刷アプリケーションはラベル付きのリクエストを受信できません。

印刷サービスはis_system_labeled() 関数を使用して、プロセスがラベル付き環境で実行されているかどうかを確認します。この関数については、is_system_labeled(3C) のマニュアルページを参照してください。

このコード抜粋は、アプリケーションがラベル付き環境で実行されているかどうかを確認する方法を示しています。

if (is_system_labeled()) {
    ucred_t *uc = NULL;
    m_label_t *sl;
    char *pslabel = NULL; /* peer's slabel */

    if ((fd < 0) || (slabel == NULL)) {
        errno = EINVAL;
        return (-1);
    }

Trusted Extensions で構成されたシステムで印刷アダプタプロセスが実行されている場合、is_system_labeled() 関数はリモートプロセスから ucred_t 資格抽象を取得します。次に、リモートプロセスの ucred_t 構造体とピアのラベルが NULL に設定されます。資格とピアのラベルを表す値を返す関数によってそのデータ構造体が満たされます。これらのデータ構造体については、以降のセクションで説明します。

get_peer_label() ルーチン全体のソースを調べるには、get_peer_label() ラベル対応関数」を参照してください。

リモートホストの資格について

Oracle Solaris OS ネットワーク API は、プロセスの資格を抽象化した概念を提供します。この資格データは、ネットワーク接続を通じて使用できます。これらの資格は ucred_t データ構造体によって表現されます。この構造体にはプロセスのラベルを含めることができます。

ucred API には、リモートプロセスから ucred_t データ構造体を取得するための関数が備わっています。この API には、ucred_t データ構造体からラベルを抽出するための関数もあります。

資格とリモートホストラベルの取得

リモートプロセスのラベルの取得は、2 つの手順から成るプロシージャーです。最初に、資格を取得する必要があります。次に、その資格からラベルを取得する必要があります。

資格は、リモートプロセスの ucred_t データ構造体に含まれています。ラベルは、その資格の m_label_t データ構造体に含まれています。リモートプロセスの資格を取得したあとで、その資格からラベル情報を抽出します。

getpeerucred() 関数は、リモートプロセスから ucred_t 資格データ構造体を取得します。ucred_getlabel () 関数は、ucred_t データ構造体からラベルを抽出します。get_peer_label() 関数では、次のように、2 つの手順から成るプロシージャーがコード化されています。

if (getpeerucred(fd, &uc) == -1)
    return (-1);

sl = ucred_getlabel(uc);

get_peer_label() ルーチン全体のソースを調べるには、get_peer_label() ラベル対応関数」を参照してください。

これらの 2 つの関数については、getpeerucred(3C) および ucred_getlabel(3C) のマニュアルページを参照してください。

リモートホストのラベルのほかに、リモートホストのタイプも取得できます。リモートホストのタイプを取得するには、tsol_getrhtype() ルーチンを使用します。「リモートホストタイプの取得」を参照してください。

label_to_str() 関数の使用

資格とリモートホストラベルを取得したあとに、アプリケーションで label_to_str() を呼び出して、ラベルデータ構造体を文字列に変換できます。ラベルデータ構造体の文字列形式は、アプリケーションで使用できます。

Trusted Extensions 印刷サービスでは、ラベルは文字列として返されることに注意してください。get_peer_label() 関数は、m_label_t データ構造体に対して label_to_str() を呼び出すことによって取得される文字列を返します。この文字列値は、get_peer_label() 関数の slabel パラメータである char** slabel に返されます。

次のコード抜粋は、label_to_str() 関数がどのように使用されるかを示しています。

sl = ucred_getlabel(uc);
if (label_to_str(sl, &pslabel, M_INTERNAL, DEF_NAMES) != 0)
    syslog(LOG_WARNING, "label_to_str(): %m");
ucred_free(uc);

if (pslabel != NULL) {
    syslog(LOG_DEBUG, "get_peer_label(%d, %s): becomes %s",
        fd, (*slabel ? *slabel : "NULL"), pslabel);
    if (*slabel != NULL)
        free(*slabel);
    *slabel = strdup(pslabel);
}

get_peer_label() ルーチン全体のソースを調べるには、get_peer_label() ラベル対応関数」を参照してください。

メモリー管理の処理

get_peer_label() ラベル対応関数」に示すように、多くの場合、ラベルは動的に割り当てられます。関数 str_to_label()label_to_str()getdevicerange()、およびその他の関数は、呼び出し側で解放する必要があるメモリーを割り当てます。これらの関数の次のマニュアルページに、メモリー割り当ての要件が説明されています。

返されたラベル文字列の使用

get_peer_label() 関数は、リモートホストからラベルを抽出し、そのラベルを文字列として返します。ラベル対応のアプリケーションではよくあるように、印刷アプリケーションは次の目的でラベルを使用します。