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 つのいずれかの方法で動作します。
要求元のプログラムが行ってよい動作と行ってはならない動作を自身で判断しながら,自身の ID,アクセス権,および特権の下で動作します。この場合,自身のユーザ ID を変更する必要はありません。
デーモンがクライアントのセキュリティ属性 (ユーザ ID,アクセス権など) を持ち,基礎となるオペレーティング・システムの強制動作を利用して実行します。
後者の方法の場合,デーモンは一連のセキュリティ属性を設定する必要があります。お勧めする方法は,プロセスをフォークし,SIA を使って ID と特権を設定し,そして動作を直接行うか,その動作を行うプログラムを実行することです。
4.4 エンハンスト (保護) パスワード・データベースの使用
エンハンスト (保護) パスワード・データベースは主に Tru64 UNIX
プログラム用ですが,以下にリストしたフィールドをユーザのプログラムで使用しなければならないこともあります。(これらのフィールドについては,
getespwent
(3)prpasswd
(4)prot.h
インクルード・ファイル,および『セキュリティ管理ガイド』でも説明されています。
ユーザ名 (u_name
) とユーザ ID (u_id
) -- これらのフィールドは,/etc/passwd
のユーザ名とユーザ ID に対応します。
暗号化パスワード (u_pwd
) -- このフィールドは,実際の暗号化パスワードです。
回収状態 (u_retired
) -- このフィールドは,認証プロファイルが有効かどうかを示します。有効でない場合は,ログインすることができません。一度,回収状態になると,そのアカウントを再度使用することはできません。
ログイン・セッション優先順位 (u_priority
) --
setpriority()
を使ってユーザのログイン・セッションのプログラムに割り当てられた,プロセスの優先順位です。
ユーザ監査マスク (u_auditmask
) と制御フラグ (u_audcntl
) -- このマスクと制御フラグをシステム監査マスクとともに使用して,ログイン・セッションの間に監査されるイベントが決定されます。login
プログラムは,ユーザのログイン・シェルにマスクを割り当てます。監査マスクと制御フラグは,exec()
および
fork()
の呼び出し後も継承されます。詳細については,
audcntl
(8)
パスワード・パラメータ -- 以下のパラメータによって,ログイン・パスワードとその生成方法が決まります。
ユーザが選択したパスワードの最大文字数 (u_maxchosen
)
パスワード有効期間 (u_exp
)
最短のパスワード存続期間 (u_minchg
)
パスワード存続期間 (u_life
)
パスワードの変更が成功した最後の日時 (u_succhg
)
パスワードの変更に失敗した最後の日時 (u_unsucchg
)
パスワードを最後に変更したユーザ (u_pwchanger
)
パスワード生成パラメータ (u_genpwd
)
ユーザが生成したパスワード生成パラメータ (u_pickpw
)
ログイン・パスワードの必要条件 (u_nullpw
) -- 「ヌル・パスワード・オプション」と呼ばれることもあり,空のパスワード設定を制御します。
大半の管理者は,このオプションを許可しません。
ユーザがログインできる時間帯 (u_tod
) -- このフィールドのフォーマットは,UUCP の
systems
ファイルに似ています。(systems
ファイルには,リモート・システムがファイル転送のために接続できる時間帯を記述します)。このフィールドは,ユーザがログインできる時間帯を決めます。
最後にログインした日時 (u_suclog
) -- 標準 UNIX 時間 (1970 年からの秒数) で表されます。
最後にログインしたときに使用した端末 (u_suctty
) -- 端末名は,デバイス割り当てデータベースおよび端末制御データベースとの対応付けに使用されます。
最後にログインした後にログインに失敗した回数 (u_numunsuclog
) -- この値を使用して,失敗回数が多すぎるために端末を使用不能にするかどうかが判断されます。
失敗しても使用不能にしないログイン失敗の回数 (u_maxtries
) -- この値は,アカウントを使用不能にする前に何回失敗を許すかを示す,ユーザ指定の制限です。
ロック状態 (u_lock
) --
管理者がアカウントをロックしたかどうかを示します。ロックされたプロファイルは,ログインやその他のサービスには使用できません。システム管理者が明示的に要求したときのみ認証プロファイルがアンロックされ,このような要求を処理するプログラムだけが,ロックされたフィールドをリセットします。よくあるプログラミング上の誤りとして,このロックがすべてのロック状態を示すとみなしてしまうことがあります。これは,管理上のロック状態を示しているだけです。パスワードの存続期間を過ぎたか,アカウントに許可されている失敗回数を超えたために使用不能となり,アカウントがロックされたように見えることがあります。
ユーザのプログラムでは,エンハンスト・セキュリティが有効な場合,エンハンスト (保護) パスワード・データベース内のユーザ名とユーザ ID はシステムが保守し,対応するエントリが
/etc/passwd
ファイルに入っているとみなすことができます。
4.4.1 例:パスワードの有効期限出力プログラム
例 4-1
の
myexpire
という名前のプログラムは,エンハンスト・セキュリティとともに使用するプログラムで,エンハンスト (保護) パスワード・データベースに設定されている,ユーザのパスワード有効期限を出力します。このプログラムは,認証による保護サブシステムの一部で,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
を設定しなければなりません。のリファレンス・ページを参照してください。この情報を書き込むには,UID に 0 を設定するか,UID にユーザ ID を設定しグループ ID を setgid
(2)auth
にしなければなりません。