2

プログラムを作成する必要があります。その一部には、プログラムを実行しているユーザーのユーザー ID が、プログラムが使用するファイルの ACL ファイルに存在するかどうかを確認する必要があります。つまり、このプログラムはファイルに書き込みますが、ACL に ID と権限が入力されているユーザーのみが書き込みを許可されます。プログラムはこれをどのようにチェックできますか? 関数を使用しgetresidて実行中のプロセスの RUID を取得する必要があることはわかっていますが、この値を ACL に格納されているすべての値と照合するにはどうすればよいでしょうか? 私を助けてください!

4

2 に答える 2

2

伝統的に、Linux プログラムは解釈的なアクセス制御をあまり行いません。2 つのケースがあります。

ケース1、単純なケース。ファイルには acl (または単にモード) があります。一部のユーザーが自分のユーザー/グループ セットでプログラムを実行すると、カーネルはモード/ACL に基づいて許可または拒否します。すべて完了。

ケース2、ハードケース。プログラムはルートとして実行されますが、他のユーザーに代わって操作したいと考えています。そのため、setuid/setgid を呼び出してそのユーザーに「なり」、(ファイルを開くなどの) 操作を実行し、その後、自分自身を root-itude に復元するために呼び出します。

ただし、chown の回答に対するコメントに基づいて、ケース 1 に該当すると思います。ユーザー foo がプログラムを実行するため、カーネルがすべての作業を行います。

于 2011-09-24T22:44:49.157 に答える
1

質問を誤解していた場合は申し訳ありませんが、これが役立つことを願っています。

いくつかのacl ドキュメントからの抜粋:

次の関数は、ACL エントリを取得して操作します。

acl_copy_entry()
acl_create_entry()
acl_delete_entry()
acl_first_entry()
acl_get_entry()

次の関数は、ACL エントリのフィールドを取得して操作します。

acl_add_perm() 
acl_clear_perm()
alc_delete_perm() 
acl_get_permset() 
acl_get_qualifier() 
acl_get_tag_type() 
acl_set_permset() 
acl_set_qualifier() 
acl_set_tag_type()

...

ACL エントリ

ACL エントリは次のフィールドで構成されます。

タグ タイプ (acl.h ヘッダー ファイルで定義):

ACL_USER_OBJ - 所有者のユーザー エントリ。

ACL_GROUP_OBJ - 所有グループ エントリ。

ACL_USER - 他のユーザーのエントリ。

ACL_GROUP - 他のグループのエントリ。

ACL_OTHER_OBJ - 別のエントリに含まれていないすべてのユーザーとグループのエントリ。

タグ修飾子 - ACL_USER エントリの修飾子値はユーザー ID です。

ACL_GROUP エントリの修飾子の値はグループ ID です。*_OBJ エントリの修飾子の値は NULL です。

acl_update.cから:

/* 
Find the the ACL entry in 'acl' corresponding to the tag type and
   qualifier in 'tag' and 'id'. Return the matching entry, or NULL
   if no entry was found. */

static acl_entry_t
findEntry(acl_t acl, acl_tag_t tag, id_t qaul)
{
    acl_entry_t entry;
    acl_tag_t entryTag;
    uid_t *uidp;
    gid_t *gidp;
    int ent, s;

    for (ent = ACL_FIRST_ENTRY; ; ent = ACL_NEXT_ENTRY) {
        s = acl_get_entry(acl, ent, &entry);
        if (s == -1)
            errExit("acl_get_entry");

        if (s == 0)
            return NULL;

        if (acl_get_tag_type(entry, &entryTag) == -1)
            errExit("acl_get_tag_type");

        if (tag == entryTag) {
            if (tag == ACL_USER) {
                uidp = acl_get_qualifier(entry);
                if (uidp == NULL)
                    errExit("acl_get_qualifier");

                if (qaul == *uidp) {
                    if (acl_free(uidp) == -1)
                        errExit("acl_free");
                    return entry;
                } else {
                    if (acl_free(uidp) == -1)
                        errExit("acl_free");
                }

            } else if (tag == ACL_GROUP) {
                gidp = acl_get_qualifier(entry);
                if (gidp == NULL)
                    errExit("acl_get_qualifier");

                if (qaul == *gidp) {
                    if (acl_free(gidp) == -1)
                        errExit("acl_free");
                    return entry;
                } else {
                    if (acl_free(gidp) == -1)
                        errExit("acl_free");
                }

            } else {
                return entry;
            }
        }
    }
}

特定のファイルの ACL を確認する必要はないと思いますが、間違っている場合は、次の情報を参照してください。

$ getfacl myFile 
# file: myFile
# owner: jon
# group: people
user::rwx
user:foo:rwx
group::rwx
mask::rwx
other::--- 

次に、名前からuidを取得します(テストされていませんが、近いはずです):

$ grep /etc/passwd `getfacl myFile | grep owner | split -d":" -f2` | egrep -o "[0-9]+"

その他のリソース:

acl/facl の例とリファレンス man acl

POSIX アクセス制御リスト

静的

于 2011-09-24T22:20:15.970 に答える