Как можно настроить запуск своей программы перед выполнением команды в Linux?

Как мне настроить систему так, чтобы PATH содержал папки sbin, но обычные пользователи не могли запускать программы из этих папок? Я уже создал скрипт, который частично решает эту задачу, вот его код: <pre><code class="bash">#!/bin/bash

if [[ $UID -eq 0 ]]; then
    exec "$@"
    exit 0
fi

cmd=$(readlink -f "$1")

if [[ $cmd == /usr/sbin/* ]]; then
    echo "Запуск программ из /usr/sbin запрещен для обычных пользователей."
    exit 1
fi

exec "$@"</code></pre> <br/> Однако у меня возникла проблема с внедрением этого скрипта в систему. Мне необходимо, чтобы он выполнялся перед каждой командой вне зависимости от используемой оболочки, и в случае нарушения правил, отменял выполнение команды.
  • 28 августа 2024 г. 6:14
Ответы на вопрос 3
Чтобы настроить запуск своей программы перед выполнением команды в Linux, можно рассмотреть использование нескольких различных подходов. Однако, чтобы это работало во всех оболочках и при любых сценариях, лучшим подходом было бы использование механизма оболочки для выполнения команд уровня пользователя. 

### 1. Использование оболочки

#### サンプル `bash`
Если вы хотите, чтобы этот скрипт выполнялся перед каждой командой в `bash`, вы можете использовать встроенную функциональность оболочки. Например, добавьте функцию `preexec` в файл конфигурации `~/.bashrc`:

```bash
function preexec {
    cmd=$(readlink -f "$1")

    if [[ $UID -ne 0 && $cmd == /usr/sbin/* ]]; then
        echo "Запуск программ из /usr/sbin запрещен для обычных пользователей."
        return 1
    fi
}
trap 'preexec "$BASH_COMMAND"' DEBUG
```

Это будет срабатывать перед каждой командой, выполненной в оболочке `bash`.

### 2. Использование `sudo`

Если вы хотите разрешить запуск только для суперпользователя, можете настроить права доступа на программы в `/usr/sbin`, чтобы обычные пользователи не могли их запускать. Например:

```bash
sudo chmod 750 /usr/sbin/*
```

Это гарантирует, что только root и члены группы могут запускать программы из этой директории.

### 3. Альтернативные оболочки
Для других оболочек, таких как `zsh` или `fish`, нужно будет адаптировать подход, подобным образом, используя подходящие механизмы этих оболочек.

### 4. Замена `command`
Другим подходом является создание специального скрипта, который будет выполняться вместо команды. Однако это требует более серьезной настройки и может привести к конфликтам и путанице. Вы можете сделать это с помощью переопределения PATH или создания подменяющих скриптов, которые будут проверять выполняемую команду.

### 5. Использование `sudo` для выполнения команд
С помощью `sudo` можно ограничить запуск команд через специфические группы или пользователей так, чтобы только администраторы могли выполнить определенные команды. Это довольно гибко и безопасно.

### 6. Использование `setuid`
Вы также можете использовать `setuid` для скрипта, однако это потребует, чтобы ваш скрипт был написан на языке программирования, который можно исполнять с правами суперпользователя, и это действие может иметь определенные риски.

### Заключение
Лучший подход зависит от ваших конкретных требований и окружения, в котором вы работаете. Каждый из указанных методов имеет свои плюсы и минусы, и следует тщательно проверить, удовлетворяют ли они ваши нужды по безопасности и функционалу.
Добавление /usr/sbin в PATH не даёт никаких новых привелегий - как определённые бинарники не выполнялись из-под обычного пользователя, так и не начнут. Фактически, любой пользователь может напрямую обратиться к программе из /usr/sbin по полному пути и без PATH.
По-моему, это типичная проблема X-Y. 
Окружение каждого пользователя настраивается индивидуально. Кому надо - включайте в поиск sbin, кому не надо - не включайте.

Можно правами на каталог /sbin запретить доступ к файлами не пользователю root.
Только надо помнить что многие процессы запускаются из под своих пользователей и не факт что им ничего не потребуется из этого каталога.

Если очень хочется идти по выбранному Вами пути, то с каждым shell придётся разбираться отдельно. В zsh это вроде встроено, для bash вот тут есть проект:
https://github.com/rcaloras/bash-preexec
Похожие вопросы