내 홈 디렉토리에 스크립트가 있습니다. 다른 사용자나 그룹이 특정 스크립트를 실행할 때 마치 내가 로그인한 것처럼 실행되고 내 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
.