LOGIN_CAP(3)

名称
login_close, login_getcapbool, login_getcaplist, login_getcapnum, login_getcapstr, login_getcapsize, login_getcaptime, login_getclass, login_getclassbyname, login_getpwclass, login_getstyle, login_getuserclass, login_setcryptfmt - ログインクラスケーパビリティデータベースをアクセスする関数

ライブラリ
libutil

書式
#include <sys/types.h> #include <login_cap.h> void login_close(login_cap_t *lc) login_cap_t * login_getclassbyname(const char *nam, const struct passwd *pwd) login_cap_t * login_getclass(const char *nam) login_cap_t * login_getpwclass(const struct passwd *pwd) login_cap_t * login_getuserclass(const struct passwd *pwd) char * login_getcapstr(login_cap_t *lc, const char *cap, char *def, char *error) char ** login_getcaplist(login_cap_t *lc, const char *cap, const char *chars) char * login_getpath(login_cap_t *lc, const char *cap, char *error) rlim_t login_getcaptime(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error) rlim_t login_getcapnum(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error) rlim_t login_getcapsize(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error) int login_getcapbool(login_cap_t *lc, const char *cap, int def) char * login_getstyle(login_cap_t *lc, char *style, const char *auth) const char * login_setcryptfmt(login_cap_t *lc, const char *def, const char *error)

解説
これらの関数は login.conf(5) に備わっているログインクラスデータベースに対する プログラミングインタフェースを表します。 このデータベースに収録されているのは、 ケーパビリティ、属性およびデフォルト環境、ユーザや特殊ユーザとしての 稼動中のプログラムに対する課金上の設定などで、 /etc/master.passwd の登録データ内のログインクラスフィールドに定義されています。

login.conf(5) 内のレコードは、コロン ‘’: で分離されるフィールドで構成されています。 各レコードの最初のフィールドは (データベース全体で一意な) レコードのための 1 個以上の識別子です。それぞれ '|' で分離されており、 最後尾に 'name' 識別子が付いていることもあります。 レコードの残りのフィールドはキーワード/データのペアで構成されます。 長い行は、空レコード内でバックスラッシュを後に付けることで継続可能であり、 継続行は読み易さのためにインデントされているかもしれません。 このことは、キーワードが 2 文字に限定されないことを除けば、 termcap(5) で使用されている形式と類似しており、読み易すく改善されている点が利点です。 termcap レコードの場合と同様に、tc=<recordid> が記述されているフィールド によって複数レコードを相互に関連させることができます (レコードが包含関係にあります)。 <recordid> で示されるすべてのレコードは発生した箇所で tc= フィールドにより置きかえられます。 ケーパビリティデータベースの形式と利用方法に関する詳細については、 getcap(3) を参照してください。

login_cap インフェースには、tc= 参照の拡張により、 ログインレコードクラスを取り出す便利な方法が備わっています。 プログラム要求により、 login_getclass(), login_getpwclass(), login_getuserclass(), login_getclassbyname() のうちどれか 1 つを呼び出して実行します。 それぞれの関数はログインケーパビリティ構造体 login_cap_t を戻り値として返し、API の残りを使用して指定した値をデータベースに引き続き 問い合せするときに使用されます。 login_cap_t が不要になった場合は、関数 login_close() の呼び出しを実行して使用していたリソースをすべて解放する必要があります。

login_cap_t の構造は login_cap.h で次のように定義されます。

    typedef struct {
    	char *lc_class;
    	char *lc_cap;
    	char *lc_style;
    } login_cap_t;

lc_class メンバには取り出したログインクラスの名前に対するポインタがあります。 これは、 login_getclass() または login_getuserclass() を使用したクラス名により login_getclassbyname() 経由で直接的に、または、 login_getpwclass() を使用したユーザのログインレコード経由で間接的に 要求されたものと必ずしも同じではありません。参照されたユーザに /etc/master.passwd で定義されたログインクラスがない場合、クラス名は NULL か空文字列です。 また、定義されたクラスがデータベースに存在しない場合、 各関数は、"default" という ID のレコードを探索し、 lc_class フィールドにその名前を戻り値として取得します。 更に、参照されるユーザが UID 0 である場合 (通常 "root" ですが、ユーザ名は関係ありません)、 login_getpwclass() は、"default" という ID のレコードの前に、"root" という ID のレコードを探します。

lc_cap フィールドは、ライブラリで内部的に使用され、 拡張されたログインケーパビリティレコードを保持します。 例外的な要件のプログラムは、低次の getcap() 方式の関数と共に使用して、レコードを直接アクセスしようとします。

lc_style フィールドに対しては、ログイン自身の操作プログラムからの 要求に従って、関数 login_getstyle() により、認可方式が設定されます。

前述したように、関数 get*class() は、ケーパビリティデータベースの マッチングまたはデフォルトレコードのアクセスに使用される login_cap_t オブジェクトを戻り値として返します。 getclassbyname() は 2 つの引数を受け取ります。 最初のものは取り出し対象レコードのレコード識別子で、 2 番めのものは、任意指定のディレクトリ名です。 最初の引数 name が NULL か、空文字列か、 あるいは 補助的なまたはシステムのログインクラスデータベースにクラスが存在しない場合、 システム デフォルト レコードが代わりに返されます。 2 番めの引数 dir パラメータが NULL のとき、 システムログインクラスデータベースだけが使用されますが、 NULL でないときは、 .login_conf(5) というファイル内で名前付きディレクトリが検索され、中にある ケーパビリティレコードがシステムデフォルトを上書きします。 この体系によりユーザは、'me' という ID のレコードがある プライベートクラスに対する クラスレコードを生成して、システムログインクラスデータベースのレコード におけるログイン設定値を上書きできます。 login のコンテキストでは、次の 2 つの理由により、 ユーザが上書きできないオプションがあります。 第 1 に、 リソース設定値やデフォルトのプロセス優先順位などの多くのオプションでは、 効果を発揮させるために root 限が必要であること、 第 2 に、ユーザファイルの他のフィールドは、ログインの初期段階ではセキュリティや 管理上の理由から、十分な検討が行われていません。 どの設定がユーザが上書きできるのかについての詳細については、 login.conf(5) を参照してください。 実際には、これらは、そうでない場合に常に初期起動 シェルスクリプトで上書きされるユーザのデフォルトログイン環境によって明確に 制限されます。 ユーザの .login_conf は、ログイン時、 シェルが呼ばれる前に実行される優先ログイン環境設定での簡便な方法をユーザ に提供します。

指定レコードがNULL か、空または存在しないとき、さらに不測の事態に 備えてデフォルトレコードがシステムにない場合、メモリアロケーションエラー になるか、あるいは cgetent(3) が何らかの理由によりログインケーパビリティデータベースにアクセスできなくなり、 NULL を返します。

関数 login_getpwclass(), login_getclass(), login_getuserclass() で、ユーザパスワード登録情報に対応するログインクラスレコードの取り出し、 login_getclassbyname() 呼び出しによるクラス名の取り出しができます。 処理が失敗した場合は NULL が返されます。 これらの関数の間で、 login_getuserclass() はユーザによる上書きが可能なユーザホームディレクトリ上の を含んでいますが、 login_getpwclass() および login_getclass() では、それへの参照を /etc/login.conf 上のシステムログインクラスに制限している点で異なります。 上記に示したように、 login_getpwclass() が login_getclass() と異なる唯一の点は、 パスワードデータベースでの定義がないときに、 ユーザ 'root' をシステム "root" として認めていることです。 他方、パスワードのポインタが NULL のとき、 またはユーザレコードにログインクラスがない場合、 システムの「デフォルト」登録レコードの取得が行われます。

プログラムで login_cap_t オブジェクトを使用する必要がなくなると、 login_close() 呼び出しを実行し、ログインクラスで使用していたリソースを 解放します。 login_close() は NULL ポインタを返しますが、これには弊害はありません。

残りの関数は、個別の権限レコードの取り出しに使用されます。各関数は、 login_cap_t オブジェクトを第 1 引数とし、 ケーパビリティタグを第 2 引数とします。 残りのパラメータは、ケーパビリティレコードが見つからないときの デフォルトまたはエラー値を指定します。受け渡しされるパラメータの型は 関連するケーパビリティのタイプによって変わります。たとえば、 文字列、リスト、時間値、ファイルやメモリサイズ、パス (コロンで 分離されたディレクトリリストから構成される)、またはバイナリ値フラグ などです。

このグループのすべての関数では、ポインタを返すとき free(3) 呼び出しを使用できないことに注意してください。検索や ケーパビリティタグ処理の間に 割り当てられたメモリは、後続するこのグループの関数呼び出しで自動的に 再利用されるか、または login_close() 呼び出しで解除されます。
login_getcapstr() この関数は、単純文字列ケーパビリティを返します。 文字列が見つからないとき、 def 内の定義値がデフォルト値として 返されます。エラーが発生したとき、 error パラメータの値が返されます。

login_getcaplist()
    本関数は、名前付きケーパビリティタグの値を NULL で終了する配列の値リストとして返します。ログインクラスデータベースには、 リストタイプのタグがあり、複数のカンマまたはスペースで分離した値で 構成されています。通常、この関数は直接アプリケーションから呼び 出されることはなく、 login_getstyle() 経由で間接的に使用されます。

login_getpath()
    この関数は、 ‘&:’ で分離されたディレクトリリストを 返します。 この関数の呼び出しが実行される ケーパビリティタグはスペースで分離されたディレクトリリストで構成されます。

login_getcaptime()
    この関数は、時、分、秒 (デフォルト)、年 ( 365 日基準)、週、あるいはこれらの任意の組み合わせで表される値の特殊な ケーパビリティ タグに関連する時間値を返します。接尾語により使用される単位を 決定します。 S は秒を、M は分を、H は時を、D は日を、W は週を表し、Y は 365 日基準による年を表します。 単位接尾語では大文字、小文字の区別はありません。

    時間値は、通常はリソースの設定値、課金システム、およびセッション制限値に 使用されます。オペレーティングシステムやコンパイラ ( FreeBSD 対応) で サポートしている場合、戻り値は 2 次元 (long long) の rlim_t 型になります。値 'inf' または 'infinity' で無限の値を表せます。 その場合 RLIM_INFINITY が 戻り値となります。

login_getcapnum()
    この関数は、タグに関する数値を返します。数値は、 tag=<value> または標準的な cgetnum() 書式 tag#<value> で表現されます。 最初の書式は 2 番目のものより優先的に使用されます。 2 番めの書式は、 getcap(3) データベースの書式との互換性と整合性があり、数値タイプの場合、 数値のデリミタとして ‘#’ が使われます。最初の書式の場合、指定される値は 'inf' または 'infinity' で、戻り値は RLIM_INFINITY になります。指定された ケーパビリティタグを見つけることができない場合、 def パラメータが返されます。 エラーが起きると、 error パラメータが返されます。

login_getcapsize()
    login_getcapsize() は、サイズ（ファイルまたは メモリの場合）を表す値を、バイト数（デフォルト）、 512 バイトのブロック数、 KB, MB, GB 表示で返します。また long long タイプをサポートしているシステム であれば、 TB 表示もあります。使用されている接尾語により単位、複合値を 決定し、単位は組み合せた形で使用されます。(例えば、 1m500k = 1.5megabytes) 接尾語がない値 A はバイトを、 B は 512 バイトブロックを、 K は KB を、 M は MB を、 G は GB を、 そして T は TB を表します。 大文字と小文字の区別はありません。エラー値が返ってくるのは、 ログインケーパビリティデータベースエラーがあるか、 間違った接尾語が使用されているか、または数値が変換ができない場合です。

login_getcapbool()
    この関数は、特定のフラグに関連したバイナリ値を、返します。指定された ケーパビリティタグがないか、 'tag@'(boolean フラグの詳細については getcap(3) を参照) により無効にされているとき、0 が返ります。 タグが見つかれば 1 が返ります。

login_getstyle()
    この関数は、ログイン認可システムで使用され、特定の ケースで有効なログインの形式を決定します。関数は、 3 つのパラメータと、 login_cap 登録レコードそのもの、および 2 つの任意指定パラメータ、 'auth' と 'style' の認可タイプを受け取り、これらを用いてこれらのルールと矛盾しない 認可スタイルを決定します。

    •   'auth' が NULL または 空文字列でなければ、 ケーパビリティレコードの "auth-<auth>" タイプのタグの検索を行います。 存在しなければ、デフォルトの デフォルトタグ "auth=" を検索します。

    •   先のステップで正当な認可リストが見つからない場合、 'passwd' がデフォルトの認可リストとされます。

    •   'style' が NULL でも 空でもないとき、先行ステップで見つかった認可方式の リストからそれを検索します。

    •   'style' が NULL か空文字列のとき、 'passwd' をデフォルトの認可に使用します。

    •   'style' が、認可方式の選択リストに見つかった場合、それを返し、 そうでないときは NULL を返します。

    •   crypt(3) 書式の設定のために、 ‘passwd_format’ 設定エントリを使用し、 login_setcryptfmt() 関数が使用されます。 エントリが見付からない場合、 def がフォールバックとして使用されます。 指定した引数の crypt_set_format(3) が失敗すると、 error が返されます。

    この体系により、管理者は、アクセス方式に従って、システムが受け取る 認可方式を決定します。たとえば、管理者がネットワークを経由したシステムへの アクセスに使用された認証方式として、skey または kerberos を要求します。 また、直接のダイアルアップまたはコンソールログイン経由での標準的方式を 要求することもあり、"snooping" ネットワークパケットによりパスワードが 発見されるリスクを著しく減少させられます。

関連項目
crypt(3), getcap(3), login_class(3), login.conf(5), termcap(5)