Linux 보안 모범 사례: CAP_SETFCAP 및 sudoer 파일

Linux 보안 모범 사례: CAP_SETFCAP 및 sudoer 파일

저는 Linux 증권을 ​​처음 접했고 Linux 기능에 대한 모범 사례가 무엇인지 이해하려고 노력하고 있습니다. 내 시나리오는 다음과 같습니다.

다른 실행 파일에 부여된 권한이 foo필요한 실행 파일(이라고 부르겠습니다)이 있습니다 . CAP_SYS_NICE기본적으로 이 작업을 수행하는 방법에는 두 가지가 있습니다.

  1. foo사용자 setcapGrant가 Binary 호출을 시작할 수 있도록 sudoer 파일에 규칙을 추가합니다 CAP_SYS_NICE. 예를 들어 이와 같은 기능을 user ALL=(root) NOPASSWD: /usr/sbin/setcap cap_sys_nice+epi /path/to/target/directory/*사용하여 system새 쉘을 시작하여 실행합니다 /user/sbin/setcap.
  2. 실행 파일에서 일부 Linux 시스템 기능을 호출할 수 있도록 CAP_SETFCAP실행 파일이 부여되었습니다 .foofoocap_set_file https://linux.die.net/man/3/cap_set_file

각 접근 방식의 장점/단점이 무엇이며 이 상황에 대한 모범 사례는 무엇인지 말해 줄 수 있습니까?

답변1

CAP_SYS_NICE가장 좋은 방법은 필요한 방식으로 대상 바이너리를 부여하는 전용 프로그램을 작성하는 것입니다 .

대상 바이너리에 특정 파일 이름 패턴, 소유권 또는 기타 속성이 있어야 하는 경우 기능을 적용하기 전에 전용 프로그램 코드의 세부 정보를 확인하세요. 간단한 예:

/* make_nice.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/capability.h>

#ifndef base
#define base "/only/allowed/base/directory/"
#endif

int main(int argc, char **argv) {
    static cap_value_t c_sys_nice = CAP_SYS_NICE;
    static cap_value_t c_setfcap = CAP_SETFCAP;

    if (argc != 2) {
        fprintf(stderr, "usage: make_nice <path>\n");
        exit(1);
    }
    if (strncmp(argv[1], base, sizeof(base)-1)) {
        fprintf(stderr, "<path> must have prefix: %s\n", base);
        exit(1);
    }
    if (strstr(argv[1], "/../") != NULL) {
        fprintf(stderr, "<path> must not contain /../\n");
        exit(1);
    }
    /* should probably confirm no symlinks in argv[1] too... */
    cap_t fc = cap_init();
    if (fc == NULL) {
        perror("no memory for cap_t");
        exit(1);
    }
    cap_t pc = cap_get_proc();
    if (pc == NULL) {
        perror("serious problem");
        exit(1);
    }
    cap_set_flag(pc, CAP_EFFECTIVE, 1, &c_setfcap, CAP_SET);
    if (cap_set_proc(pc)) {
        perror("failed to raise CAP_SETFCAP");
        exit(1);
    }
    cap_set_flag(fc, CAP_PERMITTED, 1, &c_sys_nice, CAP_SET);
    if (cap_set_file(argv[1], fc)) {
        perror("failed to set CAP_SYS_NICE");
        exit(1);
    }
    exit(0);
}

테스트 목적으로 다음과 같이 컴파일하고 실행하십시오.

$ gcc -Dbase=\"$(pwd)/\" make_nice.c -o make_nice -lcap
$ sudo setcap cap_setfcap=p ./make_nice
$ touch test_target
$ ./make_nice $(pwd)/test_target
$ getcap -r .
./test_target cap_sys_nice=p
./make_nice cap_setfcap=p

모범 사례 섹션은 다음과 같습니다.

  1. 해당 기능이 있어야 하는 파일에만 기능을 적용하도록 보장하는 것은 코드 make_nice의 책임 입니다.CAP_SYS_NICE
    • 어떤 경우에는 업그레이드 시 예상치 못한 상황을 --static피하기 위해 바이너리를 컴파일할 수도 있습니다 ...glibc
  2. make_niceACL을 사용하여 바이너리 파일을 보강 할 수 있습니다 . 예를 들어 프로그램을 만들어 보세요.그룹실행 가능하지만 그렇지 않음다른실행 파일( chmod o-rwx ./make_nice) 및 이 멤버만 허용됩니다.그룹( sudo chgrp nicefolk ./make_nice)를 실행합니다.

관련 정보