2

新しいグループとユーザーを追加して、システムグループに追加しましょうvideo

$ sudo addgroup --system mydaemon
$ sudo adduser --system --no-create-home --ingroup mydaemon mydaemon
$ sudo adduser mydaemon video

ファイルを作成し、その所有者をルートに変更し、グループをに変更しますvideo

$ touch video0
$ sudo chown root:video video0
$ sudo chmod 0660 video0

setgid()ここで、とを使用してCで記述された単純なアプリケーションについて考えてみます。setuid()

/* perms.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>


int main(int argc, char const *argv[])
{
    int ret;
    int gid;
    int uid;
    struct passwd *pw;
    struct group  *gr;

    pw = getpwnam("mydaemon");
    if (pw) {
        ret = setgid(pw->pw_gid);
        if (ret < 0) {
            printf("error with setgid\n");
            exit(1);
        }

        ret = setuid(pw->pw_uid);       
        if (ret < 0) {
            printf("error with setuid\n");
            exit(1);
        }
    }

    pw = getpwuid(getuid());
    gr = getgrgid(getgid());

    printf("gid: %d gr_name: %s\n", gr->gr_gid, gr->gr_name);
    printf("uid: %d user_name: %s\n", pw->pw_uid, pw->pw_name);

    ret = open("video0", O_RDWR);

    printf("open status: %d (errno %d)\n", ret, errno);

    return 0;
}

コンパイル後、通常のユーザーとして実行できます。

$ ./perms
error with setgid

setgidへのアクセス許可がないため、失敗します。mydaemonとして直接実行します。

$ sudo -u mydaemon ./perms
gid: 126 gr_name: mydaemon
uid: 116 user_name: mydaemon
open status: 3 (errno 0)

setgid結構です、私はできますsetuid(私は同じユーザーです)そして私は期待通りにファイルを開くことができます

次に、rootとして実行します。

$ sudo ./perms
gid: 126 gr_name: mydaemon
uid: 116 user_name: mydaemon
open status: -1 (errno 13)

私はできるしsetgid、 mydaemonとして実行していると言いますがsetuidファイルを開くことができません。(errno 13はEACCES:許可が拒否されました)getgidgetuid

問題はどこだ?

4

1 に答える 1

2

グループデータベースに従ってグループを初期化するには、initgroups()呼び出しを使用する必要があります。

于 2012-10-03T09:58:02.187 に答える