다른 사용자가 내 ID로 특정 스크립트를 실행할 수 있도록 허용

다른 사용자가 내 ID로 특정 스크립트를 실행할 수 있도록 허용

내 홈 디렉토리에 스크립트가 있습니다. 다른 사용자나 그룹이 특정 스크립트를 실행할 때 마치 내가 로그인한 것처럼 실행되고 내 ID가 가진 모든 권한을 갖도록 권한을 부여해야 합니다. sudo 또는 su를 사용하여 sudoers로 설정하거나 비밀번호를 입력하고 싶지 않습니다.

답변1

sudo를 사용하면 권한을 매우 세분화할 수 있습니다. 사용자에게 스크립트만 실행하고 다른 작업은 수행하지 않도록 권한을 부여하려면 /etc/sudoers에 다음 줄을 추가하면 됩니다.

user ALL=(yourusername) NOPASSWD: /path/to/your/script

그런 다음 대안으로 다음을 실행합니다.

sudo -u yourusername /path/to/your/script

답변2

sudo 사용가장 간단한 방법입니다. 그러나 이를 설정하려면 시스템 관리자의 협조가 필요합니다.

특별한 권한 없이 이 작업을 수행하려면 다음을 사용할 수 있습니다.사용자 ID 설정실행 가능하지만 호출자가 의도한 것보다 더 많은 작업을 수행하도록 허용하지 않도록 주의해야 합니다.

대부분의 Unix 변형은 setuid 쉘 스크립트를 비활성화합니다.;예를 들어 Linux에서 커널은 항상 스크립트의 setuid 비트를 무시합니다. 따라서 네이티브 코드에 대한 래퍼가 필요합니다.

래퍼는 사용자가 코드를 실행하기 위해 호출할 수 있는 모든 것을 제거합니다. 예를 들어 화이트리스트 환경 변수는 안전하지 않은 것으로 알려진 항목(예: TERM)은 그대로 두어야 합니다.

이는 환경 변수만 보존하는 setuid 래퍼에 대한 제안입니다 TERM. 나는 그것을 검토하지 않았거나 실제로 테스트하지 않았으며 피드백을 환영합니다.

/* Compilation command:
   c99 -DTARGET='"/absolute/path/to/script"' -o setuid-wrapper setuid-wrapper.c
 */

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

void die(const char *argv0, const char *obj, const char *msg) {
    if (msg == NULL) msg = strerror(errno);
    fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg);
    exit(127);
}

int env_want(const char *entry) {
    size_t n;
    for (n = 0; entry[n]; n++) {
        if (entry[n] == '=') {
            break;
        } else if (!(isalnum(entry[n]) || entry[n] == '_')) {
            return 0;
        }
    }
    if ((n == 7 && !strncmp(entry, "DISPLAY", n)) ||
        (n == 10 && !strncmp(entry, "XAUTHORITY", n))) {
        return 1;
    }
    if ((n == 4 && !strncmp(entry, "LANG", n)) ||
        (n >= 3 && !strncmp(entry, "LC_", 3)) ||
        (n == 2 && !strncmp(entry, "TZ", n))) {
        return !strpbrk(entry, "/%");
    }
    return 0;
}

int main(int argc, char *argv[], char **environ) {
    size_t i, j;
    const char *program_name = argv[0];
    if (program_name == NULL) program_name = "setuid-wrapper";
    /* Drop privileges */
    if (setgid(getegid())) die(program_name, "setgid", NULL);
    /*if (setgroups(0, NULL)) die(program_name, "setgroups", NULL);*/
    if (setuid(geteuid())) die(program_name, "setuid", NULL);
    /* Sanitize the environment */
    for (i = j = 0; environ[i]; i++) {
        if (env_want(environ[i])) {
            environ[j] = environ[i];
            j++;
        }
    }
    environ[j] = NULL;
    /* Execute the command */
    execle(TARGET, TARGET, NULL, environ);
    die(program_name, TARGET, NULL);
}

보조 그룹은 루트가 아니면 제거할 수 없기 때문에 대상 프로그램은 호출자의 보조 그룹과 함께 실행됩니다.

또 다른 방법은 서버(예: 웹 서버)를 실행하고 해당 서버에서 스크립트를 호출하는 것입니다. CGI 스크립트를 지원하는 소규모 HTTP 서버가 많이 있습니다. 이 접근 방식의 가장 큰 장점은 서버가 클라이언트가 아닌 대상(코드가 실행되는 보안 컨텍스트의 당사자)이 선택한 컨텍스트에서 실행되기 때문에 보안이 더 쉽다는 것입니다.

이 접근법의 변형은 다음을 통과하는 것입니다.퓨즈파일 시스템. 예를 들어스크립트 파일 시스템allow_other마운트 옵션이 있는 스크립트가 포함된 디렉토리입니다 . 이를 위해서는 user_allow_other에서 옵션을 설정 해야 합니다 /etc/fuse.conf.

관련 정보