2

managerGNU / Linux (Ubuntu 14.04) で実行され、1 つのプロセスと複数のプロセスで構成されるソフトウェア (私は作成者ではありません) を拡張していworkerます。マネージャーは、構成ファイルで指定できるコマンド ラインを使用してワーカーを開始できます。

ワーカーを開始した後、マネージャーはパイプを使用してワーカーと通信します。manager-userセキュリティ上の理由から、ワーカーをマネージャーとは別のユーザーで実行できるようにすることにしました (ワーカーをおよび と呼びましょうworker-user)。suこれは、ユーザーを切り替えて新しいワーカーを開始する小さなラッパー スクリプトを作成することによって実現されます。この後、マネージャーはパイプを介してワーカー プロセスと通信できます。このアプローチは、何ヶ月もの間機能しています。

の代わりに、ビットを使用してワーカーを実行するsuことを検討しました。そのため、マネージャーが呼び出してワーカーを開始できるラッパーをsetuid作成しました。Cが所有するようにラッパーを構成するmanager-userと、ワーカーは正しく開始されます (もちろん、間違った権限で)。ラッパーを所有するように構成し、ビットworker-userを設定するとsetuid、ワーカーは開始されますが、マネージャーに接続できないため終了します。

だから私の質問は:実行可能ファイルをsetuid実行すると、親プロセスと子プロセスの両方によって作成されたパイプのアクセス許可にどのように影響しますか? setuid-wrapper を介して開始されたワーカー プロセスに、マネージャーのパイプを開く権限がない (またはその逆の) 可能性はありますか? これが当てはまる場合、これらのアクセス許可をどのように変更できますか?

私は使用経験がほとんどないsetuidため、情報/説明は大歓迎です。

4

2 に答える 2

0

次のように、関数を使用して無名パイプを使用します (例はドイツの Wikipediapipe()から借用しています)。

# check the link above for #includes and const definitons

int main(void) {
    int fd[2], n, i;
    pid_t pid;
    char line[MAX_CHARS];

    // Create the pipe
    if (pipe(fd) < 0)
        fprintf(stderr, "Failed to create pipe()");

    // Fork child
    if ((pid = fork()) > 0) {
        // Parent process

        close(fd[0]);
        fprintf(stdout, "Parent : ");
        fgets(line, MAX_CHARS, stdin);
        write(fd[1], line, strlen(line));

        if (waitpid(pid, NULL, 0) < 0)
            fprintf(stderr, "Error: waitpid()");
    }

    else {
        // Child process
        close(fd[1]);
        n = read(fd[0], line, MAX_CHARS);

        for (i = 0; i < n; i++)
            line[i] = toupper(line[i]);
        fprintf(stderr, "Child : ");

        write(STDOUT_FILENO, line, n);
    }
    exit(0);
}

上記のプログラムは、親プロセスが読み取り側を保持し、子プロセスが書き込み側を保持する単方向パイプを作成します。

于 2015-07-29T18:11:44.750 に答える