Permitir que os usuários alterem a propriedade de arquivo de um arquivo específico sem sudo

4

Digamos que tenhamos essa situação:

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

Um grupo de desenvolvedores está trabalhando na mesma VM (Linux). Eu preciso simular o conceito de checkout / checkin. Se um usuário fizer o check out de um arquivo, ninguém poderá escrever nele até que ele faça o check-in.

Eu tentei alterar o proprietário do arquivo; cada vez que um usuário deseja fazer o checkout, ele se torna o proprietário do arquivo e impede que outro grave e, em seguida, faz check-in alterando o proprietário do arquivo para o padrão e voltando as permissões no arquivo para o padrão. Isso significa que precisarei de chown e chmod , mas esses comandos exigem sudo e não posso conceder permissão sudo aos desenvolvedores.

Posso dar a um usuário a possibilidade de chown e chmod apenas um arquivo específico?

    
por ILY 13.09.2017 / 16:32

4 respostas

6

Terá de escrever um script que verifique as condições e, em seguida, atribua aos seus utilizadores sudo acesso ao script that sozinho. Algo como:

#! /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 " 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

Salve isso como, por exemplo, /usr/local/bin/check , adicione a seguinte regra sudoers :

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

Isso está assumindo:

  • Os desenvolvedores estão todos no grupo dev (se não, use nomes de usuários ou grupos de acordo).
  • Os arquivos estão em /some/dir . Modifique $SOURCE_DIR de acordo.
  • O usuário padrão é nobody e os arquivos não verificados são de propriedade do usuário padrão.
  • Ninguém tem permissões de gravação no diretório de origem, exceto root.

Então os desenvolvedores podem fazer:

sudo check some/file

para fazer o checkout de /some/dir/some/file e executá-lo novamente para verificá-lo.

    
por muru 14.09.2017 / 07:26
6

Você pode fazer isso, embora eu ache que provavelmente há uma solução mais prática projetada para esse tipo de colaboração.

De qualquer forma, eis o que fazer:

Crie um grupo, adicione os usuários ao grupo e conceda ao grupo permissão de gravação no diretório pai. Em seguida, eles poderão usar chown e chmod o arquivo sem usar sudo

Demonstração:

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

Essa é a configuração feita. Vamos testar:

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

e assim por diante ... mas isso só funcionará se as pessoas verificarem permissões ou tentarem gravar no arquivo antes de começarem a executar chown e chmod , o que provavelmente não é intuitivo ... E se eles têm permissão de gravação no diretório pai, eles sempre serão capazes de forçar a gravação no arquivo, embora devam receber algum aviso, dependendo do editor que usam.

    
por Zanna 13.09.2017 / 19:48
3

Se um usuário tiver a capacidade de executar o seguinte comando sudo :

sudo bash

Ele poderá executar qualquer comando como root, incluindo chown em qualquer arquivo.

Você pode configurar /etc/sudoers para permitir que um usuário específico execute comandos específicos

por exemplo. você pode definir a seguinte linha em /etc/sudoers :

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

Observação: se alguém tiver a capacidade de executar chown e chmod como root , eles    pode obter facilmente o acesso root completo (por exemplo, editando /etc/passwd)

    
por Yaron 13.09.2017 / 16:34
2

Concordo que um sccs (Sistema de Controle de Código Fonte), incluindo o original do início dos anos 70, pode ser uma boa solução para fazer o check-out de arquivos compartilhados, pois ele mantém o controle de versão e a documentação das alterações.

Como um complemento à proposta de Zanna, um script curto que verifica se o usuário é o proprietário e, em caso negativo, verifica se o grupo tem permissão de gravação. Isso significa que foi feito check-in. Se disponível, seria chown e alteraria as permissões para 600 (o arquivo está ocupado). Para liberá-lo, ele alteraria as permissões de volta para 660. Assim, o nome do proprietário indicaria quem o bloqueou ou quem o trancou pela última vez, e a permissão de grupo indicaria se ele estava disponível ou ainda em uso.

    
por jpezz 13.09.2017 / 23:57