Позвольте пользователям изменять принадлежность файла определенного файла без sudo

Скажем, то, что у нас есть эта ситуация:

-rwxrwx-r- 1 user1 mygroup  0 Sep 12 16:53 testfile

Группа разработчиков работает над тем же VM (Linux). Я должен моделировать понятие контроля/регистрации. Если пользователь проверяет файл, никто не должен мочь записать в нем, пока он не регистрирует его.

Я пытался изменить владельца файла; каждый раз, когда пользователь хочет к контролю, он становится владельцем файла и предотвращает другой от записи до него и затем регистрируется путем изменения владельца файла на значение по умолчанию и задерживает полномочия на файле к значению по умолчанию. Это означает, что мне будет нужно chown и chmod но эти команды требуют sudo и я не могу дать sudo разрешение разработчикам.

Я могу дать пользователю возможность chown и chmod только определенный файл?

4
задан 13 September 2017 в 11:04

4 ответа

Необходимо будет записать сценарий, который проверяет на условия, и затем дайте пользователям sudo доступ к одному только тому сценарию. Что-то как:

#! /bin/bash
set -e
die()
{
    printf "%s\n" "$@"
    exit 1
}

if [[ $EUID != 0 ]]
then
    die "This script must be run with sudo."
fi

DEFAULT_USER=nobody
SOURCE_DIR=/some/dir

cd "$SOURCE_DIR"

# Get path of file relative to the source directory
# Then we can check if it is actually in the directory.
FILE=$(realpath -e --relative-base="$SOURCE_DIR" "${1?}")    
if [[ $FILE == /* ]]
then
    die "$1 is outside $SOURCE_DIR."
fi

FILE_OWNER=$(stat -c %U "$FILE")

case $FILE_OWNER in
    $DEFAULT_USER)
        # checkout
        echo "Checking out $FILE..."
        chown "$SUDO_USER" "$FILE"
        ;;
    $SUDO_USER)
        # checkin
        echo "Checking in $FILE..."
        chown nobody "$FILE"
        ;;
    *)
        die "Sorry, this file is checked out by $FILE_OWNER."
        ;;
esac

Сохраните это как, скажем, /usr/local/bin/check, добавьте следующее sudoers правило:

%dev ALL = (root) /usr/local/bin/check

Это принимает:

  • Разработчики - все в dev группа (в противном случае используют имена пользователей или группы соответственно).
  • Файлы находятся в /some/dir. Изменить $SOURCE_DIR соответственно.
  • Пользователь по умолчанию nobody, и неконтролируемые файлы принадлежат пользователю по умолчанию.
  • Ни у кого нет полномочий записи на исходном каталоге кроме корня.

Затем devs может сделать:

sudo check some/file

к контролю /some/dir/some/file, и выполненный это снова для регистрации его.

6
ответ дан 23 November 2019 в 11:35

Можно сделать это, хотя я думаю, что существует, вероятно, более практическое решение, разработанное для этого вида сотрудничества.

Так или иначе, вот то, что сделать:

Создают группу, добавьте пользователей к группе и дайте разрешение записи группы на родительском каталоге. Затем они смогут к chown и chmod файл, не используя sudo

Демонстрация:

sudo addgroup devs
sudo adduser zanna devs
sudo adduser pixie devs
mkdir development
chmod g+w development 
sudo chown root:devs development 
touch development/testfile
cd development
sudo chown root:devs testfile

Это - сделанная установка. Давайте протестируем его:

zanna@xubi:~/development$ chown $USER testfile
$ stat -C "%U %G" testfile
zanna devs
$ chmod 600 testfile
$ stat -c %a testfile
600
$ su pixie
[enter password...]
pixie@xubi:/home/zanna/development$ chown $USER testfile
$ stat -c %U testfile
pixie

и так далее..., но это будет только работать вообще, если люди проверят полномочия или попытку записать в файл, прежде чем они начнут работать chown и chmod, который, вероятно, не интуитивен... И если у них будет разрешение записи на родительском каталоге, то они будут всегда мочь вызвать запись в файл, хотя они должны получить некоторое предупреждение, в зависимости от редактора, они используют.

6
ответ дан 23 November 2019 в 11:35

Если у пользователя есть способность выполнить следующий sudo команда:

sudo bash

Он сможет выполнить любую команду как корень, включая chown на любом файле.

можно настроить /etc/sudoers, чтобы позволить определенному пользователю выполнять определенные команды

, например, можно установить следующую строку в /etc/sudoers:

user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod

Примечание: Если у кого-то есть способность работать chown, и chmod как root они могут легко стать сытыми root доступ (например, путем редактирования /etc/passwd)

3
ответ дан 23 November 2019 в 11:35

Я соглашаюсь, что sccs (Система управления исходным кодом) включая исходную с начала 70-х мог бы быть хорошим решением для регистрации совместно используемые файлы, так как это поддерживает управление версиями, а также документацию изменений.

Как дополнение к предложению Zanna, короткому сценарию, который проверяет, является ли пользователь владельцем, то, в противном случае проверки, если у группы есть разрешение записи. Это означало бы, что в этом зарегистрировались. При наличии это было бы показанный затем изменять полномочия на 600 (файл занят). Для выпуска его он возвратил бы полномочия к 660. Таким образом имя владельца указало бы, кому заблокировали его или кто продержался, заблокировал его, и разрешение группы укажет, было ли это доступно или все еще используемо.

2
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

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