Как разрешить монтирование тома LUKS от имени пользователя, отличного от -root?

На самом деле, все хосты в сети действительно заявляют о своих собственных IP-адресах. Всегда!

На стороне локальной сети маршрутизатор имеет IP-адрес в определенном диапазоне (, например. 192.168.9.x )и если маршрутизатор получает пакет байтов, скажем, для 192.168.9.12, маршрутизатор перенаправляет его на свой физический порт с диапазоном IP-адресов (192.168.9.0/24 )сконфигурировано так, чтобы оно соответствовало адресу назначения. В том порту,он вещает в локальной сети:«Какой хост требовать IP-адрес 192.168.9.12?" . И любой хост, сетевая карта которого настроена на иметь этот конкретный IP-адрес будет отвечать, тем самым заявляя адрес. Если все ну, есть ровно один хост, который на это претендует, и роутер отправит пакет данных на этот хост.

Эта широковещательная рассылка «у кого есть IP-адрес x.x.x.x» и заявление об этом путем ответа: происходит на более низком уровне и работает только в локальной сети LAN (). Этот протокол называется "ARP" (Протокол разрешения адресов)

Другими словами:

Адрес, на который маршрутизатор отправляет пакет данных, на этом нижнем уровне: фактически MAC-адрес сетевой карты (NIC )хоста, который требует IP-адрес. Он делает это, отвечая на запрос ARP -, передаваемый маршрутизатором.

Таким образом, хост сам решает, какой IP-адрес он будет использовать. претендовать на наличие в сети.

В сетях, превышающих несколько хостов, будет утомительно поддерживать отслеживание того, какой IP-адрес должен использоваться каким хостом. А затем представьте, что вы редактируете файл на всех компьютерах, разрешенных в сети, чтобы указать только его IP-адрес!

Кроме того, если два (или более )хоста претендуют на один и тот же IP-адрес, оба будут иметь серьезная проблема с сетью! Вот почему очень практично иметь центральный служба в локальной сети, которая отслеживает, какой MAC-адрес можно использовать какой IP-адрес. Это называется "DHCP" (Протокол динамической конфигурации хоста ), который также можно использовать для информирования хостов многих других параметров конфигурации в локальной сети.

Протокол DHCP также работает на том же более низком уровне, что и протокол ARP. Когда хозяин настраивает сетевую карту (сетевой карты ), чаще всего во время загрузки, она передает "Какой IP-адрес я могу использовать в этой сети?" .Это делается DHCP клиентское программное обеспечение. Поскольку это широковещательная рассылка, ее получают все хосты, но только DHCP. сервер ответит, надеюсь, упомянув уникальный IP-адрес, свою сетевую маску, адрес шлюза (маршрутизатора )и, возможно, другие вещи. Хозяин держит это в памяти, зная, что он может безопасно претендовать на этот IP-адрес в сети в течение некоторого времени.

Но это работает только потому, что хосты сотрудничают , запрашивая у сервера DHCP -IP-адрес для использования. В конечном счете всегда хосты решают, какой IP-адрес им претендовать....

0
14.12.2020, 19:46
1 ответ

Вы можете попробовать вспомогательную программу. Что-то вроде:

#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Configuration parameters.  Change to fit your site.
   Some of these must be string constants.  String pasting is used. */
#define UUID "b3b7bd7b-4f00-4848-8af9-33a56f0b8a97"
#define NAME "cryptdisk"
#define MOUNTPOINT "/mnt/1"
/* The next line is optional.  If specified, the user won't even be
   prompted for the encrypted disk password. */
/* #define KEY_FILE "/root/disk_key_file" */


/* Replacement environment, for safety */
char * replacement_environment[] = {
    "PATH=/bin:/usr/bin:/sbin:/usr/sbin",
    "HOME=/root",
    "TERM=dumb",
    0
};

void run(char *exec,...)
{
    #define MAXARGS 20
    char *args[MAXARGS];
    char *arg;
    int count = 0;
    va_list ap;
    
    args[count++] = exec;
    va_start(ap, exec);
    while ((count < MAXARGS) && (arg = va_arg(ap, char *))) {
        args[count++] = arg;
    }
    if (count >= MAXARGS) {
        fprintf(stderr, "Too many arguments\n");
        exit(127);
    }
    args[count++] = 0;

    pid_t pid = fork();
    switch (pid) {
        case -1:
            perror("fork error");
            exit(127);

        case 0:
            execve(exec, args, replacement_environment);
            perror("exec error");
            exit(127);

        default:
        {
            pid_t wpid;
            int status;
            for (;;) {
                wpid = wait(&status);
                if (wpid == -1) {
                    perror("wait error");
                    exit(127);
                }
                if (pid == wpid) break;
            }
            if (status != 0) {
                if (WIFSIGNALED(status)) 
                    fprintf(stderr, "Child %s terminated with signal %d\n", exec, WTERMSIG(status));
                else if (WIFEXITED(status))
                    fprintf(stderr, "Child %s exited with status %d\n", exec, WEXITSTATUS(status));
                else
                    fprintf(stderr, "Child %s exited with result %d\n", exec, status);
                exit(126);
            }
            break;
        }
    }
}

void do_mount(void)
{
    setreuid(0,0);
#ifdef KEY_FILE
    run("/sbin/cryptsetup", "--key-file", KEY_FILE, "luksOpen", "UUID="UUID, NAME, NULL);
#else
    run("/sbin/cryptsetup", "luksOpen", "UUID="UUID, NAME, NULL);
#endif
    run("/bin/mount", "/dev/mapper/"NAME, MOUNTPOINT, NULL);
}

void do_umount(void)
{
    setreuid(0,0);
    run("/bin/umount", MOUNTPOINT, 0);
    run("/sbin/cryptsetup", "luksClose", NAME, 0);
}

int main(int argc, char **argv)
{
    char const *prog = argv[0];
    char const *last_slash = strrchr(prog, '/');
    if (last_slash) prog = last_slash+1;
    if (prog[0] == 'u') 
        do_umount();
    else
        do_mount();
    exit(0);
}

Вам потребуется изменить значения конфигурации вверху. Если вам нужно дополнительно настроить аргументы cryptsetup, это должно быть довольно очевидно. Что касается того, как связать это с "Thunar", я не могу вам помочь.

Создайте что-то вроде:

gcc -o mount_it mount_it.c
sudo chown root mount_it
sudo chmod u+s mount_it
ln -s mount_it umount_it
1
18.03.2021, 22:43

Теги

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