ベアボーンにおけるsu/sudoの代替

ベアボーンにおけるsu/sudoの代替

chroot私はSolarisのベアボーン刑務所でいくつかのユニットテストを実行したいと思います。いいえsuまたはsudosu、(with)のコピーはlibpam.so.1単に終了コード1を返し、引数の有無にかかわらず出力を返しません。簡単な方法はありませんかroot以外のユーザーとしてBashスクリプトを実行するそのようなシステムでは?たぶんsetuidまたはラッパースクリプトですか?

ベストアンサー1

私が正しく理解したら、suルートから別のユーザーに切り替えることができます。私はバイナリコピーを試しましたがsu(setuidルートは必要ありません)、これがSolarisで動作するかどうかわかりません。または、小さなCプログラムをコンパイルし、権限を削除してコマンドを実行します。

これは小さな「ダウンオンリー」数です。最小限のテストを受けました。 Solaris および *BSD でそのままコンパイルするには、Linux-D_BDS_SOURCEで実行する必要があり、#include <grp.h>他のプラットフォームでは一般的ですが、非標準のsetgroups.examples をコメントアウトする必要があるかもしれませんsugexec UID GID bash /path/to/script(chroot への依存関係を避けるために数値ユーザーとグループ ID を渡す必要があります)。可能 どの種類のユーザーデータベースも使用できません。)

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

void die(char *argv0, char *obj, char *msg) {
    if (msg == NULL) msg = strerror(errno);
    fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg);
    exit(127);
}
int main(int argc, char *argv[]) {
    uid_t uid;
    gid_t gid;
    char *endp;
    /* Command line parsing */
    if (argc <= 3) {
        fprintf(stderr, "Usage: %s UID GID COMMAND [ARG...]\n",
                argv[0]==NULL ? "sugexec" : argv[0]);
        exit(127);
    }
    uid = strtoul(argv[1], &endp, 0);
    if (*endp) die(argv[0], argv[1], "Bad uid");
    gid = strtoul(argv[2], &endp, 0);
    if (*endp) die(argv[0], argv[2], "Bad gid");
    /* Drop to specified user and group */
    if (setgid(gid)) die(argv[0], "setgid", NULL);
    if (setgroups(0, NULL)) die(argv[0], "setgroups", NULL);
    if (setuid(uid)) die(argv[0], "setuid", NULL);
    /* Execute the command */
    execvp(argv[3], argv + 3);
    die(argv[0], argv[3], NULL);
}

おすすめ記事