ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Trusted Extensions 開発者ガイド Oracle Solaris 10 1/13 Information Library (日本語) |
1. Trusted Extensions API およびセキュリティーポリシー
9. Solaris Trusted Extensions ラベル API のための試験的な Java バインディング
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() を呼び出して、ラベルデータ構造体を文字列に変換できます。ラベルデータ構造体の文字列形式は、アプリケーションで使用できます。
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() 関数は、リモートホストからラベルを抽出し、そのラベルを文字列として返します。ラベル対応のアプリケーションではよくあるように、印刷アプリケーションは次の目的でラベルを使用します。
ラベルに関連付けられている情報が正しいラベルで明確にマークされていることを確認するため。バナーページとトレーラページ、およびヘッダーとフッターは、印刷されるドキュメントのラベルでマークされます。
あるリソースのラベルが、別のラベル付きリソースによる特定の操作の実行を許可することを検証するため。つまり、リクエスト中のプロセスのラベルは、このプリンタがそのリクエスト中のプロセスからリクエストを受け入れるのを許可します。この許可は、プリンタに割り当てられているラベルの範囲に基づいています。