名称
secure_rpc, authdes_getucred, authdes_seccreate, getnetname, host2netname,
key_decryptsession, key_encryptsession, key_gendes, key_setsecret,
key_secretkey_is_set, netname2host, netname2user, user2netname ― Secure RPC のライブラリルーチン
構文
#include <rpc/rpc.h>
#include <sys/types.h>
int authdes_getucred(const struct authdes_cred *adc,
uid_t *uidp,
gid_t *gidp,
short *gidlenp,
gid_t *gidlist);
AUTH *authdes_seccreate(const char *name,
const unsigned int window,
const char *timehost,
const des_block *ckey);
int getnetname(char name[MAXNETNAMELEN+1]);
int host2netname(char name[MAXNETNAMELEN+1],
const char *host,
const char *domain);
int key_decryptsession(const char *remotename,
des_block *deskey);
int key_encryptsession(const char *remotename,
des_block *deskey);
int key_gendes(des_block *deskey);
int key_setsecret(const char *key);
int key_secretkey_is_set(void);
int netname2host(const char *name,
char *host,
const int hostlen);
int netname2user(const char *name,
uid_t *uidp,
gid_t *gidp,
int *gidlenp,
gid_t gidlist[NGROUPS]);
int user2netname(char name[MAXNETNAMELEN+1],
const uid_t uid,
const char *domain);
説明
RPC ライブラリルーチンは、C プログラムからネットワークを通じて他のマシンに対してプロシージャコールを行えるようにします。
RPC は、さまざまな認証方式をサポートしています。それは次のとおりです。
| AUTH_NONE | | (なし) 認証なし。 |
| AUTH_SYS | | 従来どおりの UNIX スタイルの認証。 |
| AUTH_DES | | DES 暗号化ベースの認証。 |
authdes_getucred() および authdes_seccreate() ルーチンは、 AUTH_DES 認証方式を実現します。 AUTH_DES 認証システムが動作するためには、キーサーバデーモン keyserv keyserv(1M) を参照) が実行されていて、 keylogin(1) が実行済みでなければなりません。ここでは、 AUTH_DES スタイルの認証だけを説明します。 AUTH_NONE および AUTH_SYS スタイルの認証については、 rpc_clnt_auth(3N) を参照してください。
このページで説明するルーチンはマルチスレッドセーフです。他の認証スタイルのマルチスレッドレベルについては、その認証スタイルのページを参照してください。
HP-UX での RPC の実装は、XTI (X/Open Transport Interface)
のみをサポートしています。 TLI (Transport Layer Interface) を使用して記述されたアプリケーションで
RPC を使用する場合は、アプリケーションを XTI 対応に変換する必要があります。
ルーチン
AUTH データ構造の定義については、 rpc(3N) を参照してください。
| int authdes_getucred() |
| | | authdes_getucred() は、 AUTH_DES として知られる、RPC
セキュリティ認証システムにインタフェースする最初の ルーチンです。
2 番目のルーチンは、この後で説明する authdes_seccreate() です。 authdes_getucred() は、サーバ側で、オペレーティングシステム独立の AUTH_DES 資格認定を AUTH_SYS 資格認定に変換するため使用します。このルーチンは正常終了すると 1 を戻し、異常終了すると 0 を戻します。 *uidp は、 adc に結合するユーザー ID の数値が設定されます。 *gidp は、ユーザーのグループ ID の数値が設定されます。 *gidlist には、このユーザーが所属するグループの他の数値
ID が含まれます。 *gidlenp は、 *gidlist の中の有効なグループ ID の個数が設定されます
(後の netname2user() を参照)。 警告 : ホストのネット名を使って authdes_cred 構造体を作成した場合、 authdes_getucred() は異常終了します。このような場合、ホスト名を取得するには、authdes_cred
構造体の中のホストのネット名に対して netname2host() を使用しなければなりません。 |
| AUTH *authdes_seccreate() |
| | | 2 つの AUTH_DES 認証ルーチンのうちの
2 番目 authdes_seccreate() は、クライアント側で、認証システムを使用可能にする認証ハンドルを戻すため使用します。最初のパラメータ name は、サーバプロセスの所有者のネットワーク名、または netname です。このフィールドは通常、ユーティリティルーチン host2netname() から取り出せるホスト名を表しますが、後で説明する user2netname() を使用してユーザー名を表すこともできます。 2 番目のフィールド window は、クライアント資格認定の有効期限であり、秒で指定します。クライアントのクロックとサーバのクロックの差が window より大きいと、サーバはクライアントの資格認定を拒否し、クロックを再同期化する必要が生じます。期限が小さい方が大きいときより安全ですが、あまり小さい期限を選択すると、クロックの誤差のため、再同期化の頻度が増えます。 3 番目のパラメータ timehost は、ホストの名前であり、これは省略可能です。これが NULL の場合、認証システムはローカルクロックが常に timehost のクロックと同期がとれていると見なし、再同期化しません。timehost
を指定した場合は、システムは再同期化が必要になるとリモート タイムサービスを調べます。このパラメータは通常、サーバが動作するホストの名前です。 最後のパラメータ ckey も省略可能です。これが NULL の場合、認証システムは資格認定の暗号化に使用されるランダムな
DES キーを生成します。 ckey キーを指定すると、代わりにこれが使用されます。 authdes_seccreate() は異常終了すると NULL を戻します。 |
| int getnetname() |
| | | getnetname() は、呼び出し側の固有の、オペレーティングシステム独立のネットワーク名を、固定長の配列 name
で戻します。正常終了すると 1 を戻し、異常終了すると 0 を戻します。 |
| int host2netname() |
| | | ドメイン固有のホスト名 host をオペレーティングシステム独立のネットワーク名に変換します。正常終了すると 1 を戻し、異常終了すると 0 を戻します。 netname2host() の逆です。 domain が NULL の場合、 host2netname() はマシンのデフォルトのドメイン名を使用します。 host が NULL の場合、デフォルトとしてマシン自身がホストになります。 |
| int key_decryptsession() |
| | | key_decryptsession() は、RPC
のセキュリティ認証システム (AUTH_DES 認証) に関連するキーサーバデーモンへのインタフェースです。ユーザープログラムではこのルーチン、またはその関連ルーチン key_encryptsession()、 key_gendes()、
および key_setsecret() を呼び出す必要はめったにありません。 key_decryptsession() は、サーバのネットワーク名 remotename および DES キー deskey を取り、サーバのパブリックキーおよび呼び出し側プロセスの有効
UID に結合したシークレットキーを使って、そのキーを解読します。これは key_encryptsession() の逆です。 |
| int key_encryptsession() |
| | | key_encryptsession() は、キーサーバ
インタフェースルーチンです。このルーチンはサーバのネットワーク名 remotename および DES キー deskey を取り、サーバのパブリックキーおよび呼び出し側プロセスの有効
UID に結合したシークレットキーを使って、それを暗号化します。これは key_decryptsession() の逆です。このルーチンは正常終了すると 0 を戻し、異常終了すると -1 を戻します。 |
| int key_gendes() |
| | | key_gendes() は、キーサーバ インタフェースルーチンです。キーサーバに、安全会話キーを要求するため使用します。キーをランダムに選ぶのは、あまり安全とはいえません。なぜなら、例えば現在の時刻などのようなランダムな数の選び方は、非常に推定されやすいからです。このルーチンは正常終了すると 0 を戻し、異常終了すると -1 を戻します。 |
| int key_setsecret() |
| | | key_setsecret() は、キーサーバ
インタフェースルーチンです。呼び出し側プロセスの有効 UID にキーを設定するため使用します。このルーチンは正常終了すると 0 を戻し、異常終了すると -1 を戻します。 |
| int key_secretkey_is_set(void) |
| | | key_secretkey_is_set() は、呼び出し側プロセスの有効
UID にキーが設定されているかどうか判定するため使用できる、キーサーバ
インタフェースルーチンです。キーサーバが呼び出し側プロセスの有効
UID に対応するキーを格納している場合には、このルーチンは 1 を戻します。そうでない場合は 0 を戻します。 |
| int netname2host() |
| | | オペレーティングシステム独立のネットワーク名 name をドメイン固有のホスト名 host に変換します。 hostlen は host の最大長です。正常終了すると 1 を戻し、異常終了すると 0 を戻します。 host2netname() の逆です。 |
| int netname2user() |
| | | オペレーティングシステム独立のネットワーク名をドメイン固有のユーザー
ID に変換します。正常終了すると 1 を戻し、異常終了すると 0 を戻します。 user2netname() の逆です。 *uidp は、 name に結合したユーザー ID の数値を設定します。 *gidp は、ユーザーのグループ ID の数値を設定されます。 gidlist には、このユーザーが所属するグループの他の数値 ID
が含まれます。 *gidlenp は、 gidlist の中の有効なグループ ID エントリの個数が設定されます。 |
| int user2netname() |
| | | ドメイン固有のユーザー名をオペレーティングシステム独立のネットワーク名に変換します。 netname2user() の逆です。 |
マルチスレッドの使用法
| Thread Safe: | | Yes |
| Cancel Safe: | | Yes |
| Fork Safe: | | No |
| Async-cancel Safe: |
| | | No |
| Async-signal Safe: |
| | | No |
これらの関数は、マルチスレッド環境下で安全に呼び出せます。
これらの関数は、キャンセルポイントの関数を呼び出した時点でキャンセルポイントになります。
マルチスレッド環境では fork() の後および exec() の前で、子プロセスからこれらの関数を呼び出すことは安全ではありません。
非同期キャンセル、または、非同期シグナルをサポートするマルチスレッドアプリケーションでこれらの関数は呼び出さないようにしてください。