4    識別と認証

この章では,次の内容について説明しています。

4.1    監査 ID

Tru64 UNIX では,従来のプロセスのユーザ ID およびグループ ID をすべて維持しています。この他に,Tru64 UNIX 独自の,プロセスごとの監査 ID (AUID) をサポートしています。AUID は基本的には,実ユーザ ID と似ています。ただし,実ユーザ ID が変更される場合でも変更されないところが異なります。

すべての監査レコードには監査 ID が関連付けられています。この監査 ID があることで,実ユーザ ID および実効ユーザ ID がログイン時の値から変更されていても,ユーザを識別できます。

監査 ID は,プロセスの特権に関係なく,プロセスの子孫全体にわたって,1 度だけ設定できます。ログイン時,監査 ID には認証ユーザ (実ユーザ ID および実効ユーザ ID と同じ) が設定されます。プロセスが fork() システム・コールを呼び出して子プロセスを生成すると,この監査 ID は親から子へ引き継がれます。

スタートアップ・スクリプトから生成されるプログラムや,inittab ファイルの respawn エントリによって生成されるプログラムは,監査 ID が未設定の状態で生成されます。 (このようなプログラムは通常,インタフェースを通して認証されたユーザに対して AUID を設定する認証プログラム (getty/login シーケンス,ウィンドウ・マネージャ,トラステッド・パス・マネージャ) です。

スタートアップ・スクリプトを通して開始されるプログラムは通常,ユーザのためにサービス要求を受け取り,その要求のサービスを行うプロセスを生成します。このようなプログラムは通常,要求側のプロセスの実効 ID をベースとして,子サービス・プロセスの監査 ID を設定します。この種のプログラムを書く場合は,SIA ルーチンを使用する必要があります。SIA ルーチンは,システム上で使用されているセキュリティ・メカニズム (BASE,拡張,DCE など) に関係なく,子プロセス内のユーザ環境を正しく設定します。

システム・コール getluid() および setluid() は,監査 ID を読み取り,設定します。 詳細については,リファレンス・ページを参照してください。

4.2    識別サポート・ライブラリ

Tru64 UNIX オペレーティング・システムでは,ユーザ ID およびグループ ID を管理するためのライブラリ・ルーチンをいくつか提供しています。たとえば,エンハンスト・セキュリティで使用される一部のルーチンでは,set_auth_parameters() ルーチンを必要とします。 このルーチンは,他のルーチンが後から照会またはテストできるように,初期ユーザ ID および初期グループ ID を格納します。エンハンスト・セキュリティ・オプションを使用するプログラムまたはルーチンを書く場合は,プログラムの main() ルーチンの先頭で set_auth_parameters() を呼び出さなければなりません。

認証データベースを照会する一部のエンハンスト・セキュリティ・ルーチンを使用するときは,プログラムでユーザ ID またはグループ ID のどれか,またはコマンド引数 argc および argv を変更する前に,set_auth_parameters() を呼び出す必要があります。

詳細については,リファレンス・ページの identity(3) を参照してください。

セキュリティ・メカニズム間でのコードの移植性を確保するには,SIA セッション・ルーチンを使用します。

4.3    デーモンの使用

デーモンがユーザのプログラム (クライアント) からの要求で操作を実行するときは,次の 2 つのいずれかの方法で動作します。

後者の方法の場合,デーモンは一連のセキュリティ属性を設定する必要があります。お勧めする方法は,プロセスをフォークし,SIA を使って ID と特権を設定し,そして動作を直接行うか,その動作を行うプログラムを実行することです。

4.4    エンハンスト (保護) パスワード・データベースの使用

エンハンスト (保護) パスワード・データベースは主に Tru64 UNIX プログラム用ですが,以下にリストしたフィールドをユーザのプログラムで使用しなければならないこともあります。(これらのフィールドについては, getespwent(3) および prpasswd(4) のリファレンス・ページ,prot.h インクルード・ファイル,および『セキュリティ管理ガイド』でも説明されています。

ユーザのプログラムでは,エンハンスト・セキュリティが有効な場合,エンハンスト (保護) パスワード・データベース内のユーザ名とユーザ ID はシステムが保守し,対応するエントリが /etc/passwd ファイルに入っているとみなすことができます。

4.4.1    例:パスワードの有効期限出力プログラム

例 4-1myexpire という名前のプログラムは,エンハンスト・セキュリティとともに使用するプログラムで,エンハンスト (保護) パスワード・データベースに設定されている,ユーザのパスワード有効期限を出力します。このプログラムは,認証による保護サブシステムの一部で,GID に auth を設定するセット・グループ ID (SGID) モードで実行されます。

例 4-1:  パスワードの有効期限出力プログラム

#include <sys/types.h>
#include <stdio.h>
#include <sys/security.h>
#include <prot.h>
 
main (argc, argv)
int argc;
char      *argv[];
{
   struct es_passwd  *acct;
   time_t expire_time;
   time_t expire_date;
 
/*--- Standard initialization ---*/
 
   set_auth_parameters(argc, argv);
   initprivs();
 
/*--- fetch account information using audit ID ---*/
 
   if ((acct = getespwuid(getluid())) == NULL)
      errmsg("Internal error");
 
/*-- test if personal or system default applies and print --*/
 
   if (acct->uflg->fg_expire)
      expire_time = acct->ufld->fd_expire;
   else if (acct->sflg->fg_expire)
      expire_time = acct->sfld->fd_expire;
   else {
      audit_db_error(acct);     /* audit (externally defined) */
      errmsg("No user-specific or system default \
                                             expiration time.");
   }
 
   if (!acct->ufld->fg_schange) {
      audit_db_error(acct);      /* audit (externally defined) */
      errmsg("Account does not have successful change time");
   }
 
expire_date = acct->ufld->fd_schange + expire_time;
 
   if (acct->uflg->fg_psw_chg_reqd && \
                 acct->ufld->fd_psw_chg_reqd) \
                          expire_date = time((time_t *) NULL);
 
   audit_action(acct->ufld->fd_name, expire_date);
exit(0);
}

注意

エンハンスト (保護) パスワード・データベースのファイルは,auth グループのプロセスだけがアクセスできます。エンハンスト・パスワード・データベースのファイルを読み取る必要のあるプログラムでは,グループ ID に auth を設定しなければなりません。 setgid(2) のリファレンス・ページを参照してください。この情報を書き込むには,UID に 0 を設定するか,UID にユーザ ID を設定しグループ ID を auth にしなければなりません。