Рекомендации по безопасности Linux :CAP _SETFCAP и файл sudoer

вы можете попробовать изменить права доступа к каталогу.

$ sudo chmod -R 777 /home/admin/public_html

Это делает каталог доступным для любого пользователя на машине или, если вы настроили сеть, для любого пользователя в сети.

2
06.09.2020, 03:56
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_niceс помощью ACL. Например, сделайте программу группа исполняемой, но не другой исполняемый файл(chmod o-rwx./make_nice)и разрешите ее запуск только членам этой группы (sudo chgrp nicefolk./make_nice).
0
12.09.2021, 02:50

Теги

Похожие вопросы