Como permito que usuários não raiz controlem um serviço systemd com instâncias?

12

Eu preciso permitir que os usuários do dbagrupo controlem os database@serviços. A resposta para esta pergunta relacionada é apenas listar todos os systemctl"verbos" que eu quero permitir no sudoersarquivo; no entanto, isso não se aplica ao meu caso, porque não sei de antemão quais bancos de dados podem existir no sistema. Por exemplo, se eu listar

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

que não cobre instâncias que possam existir no futuro e um dba não poderá

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Enfim, estou pensando mais em termos de embalagem do que mexendo com um sistema específico.

Observe que, conforme mostrado nesta incrível resposta a outra pergunta relacionada , o uso de sudo globs para isso é inseguro:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

permite

$ sudo systemctl start database@awsesomeapp unrelatedservice

Eu suspeito que o uso sudonão resolverá meu problema (embora eu espero que esteja errado). Existe alguma outra maneira de permitir que usuários não raiz controlem systemdserviços?

Quanto vale a pena, eu preciso fazer isso em um sistema CentOS 7 e sistemas RHEL7 no futuro. Eu também estaria interessado em soluções que funcionam no Arch Linux.

Vitor Eiji
fonte

Respostas:

1

O arquivo Sudoers não funcionará assim, ou assim me parece. O arquivo Sudoers destina-se a conceder acesso a um comando específico, não a especificar os argumentos que podem acompanhar esse comando.

Crie um script que seja executado como root e execute o seguinte:

/usr/bin/systemctl start database@

Faça com que o script use um argumento como anotherawesomeapp para que ele execute o seguinte:

O script executa: / usr / bin / systemctl start database @ anotherawsesomeapp

Dê a seus usuários permissão para executar o arquivo script.sh com / etc / sudoers.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

O usuário pode executá-lo assim:

sh script.sh anotherawsesomeapp

Exemplo:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi
Baazigar
fonte
1
Como está, isso tem os mesmos problemas que o do sudoers. Você precisa citar a variável ou ela será dividida em espaços.
Kyrias
Isto não vai funcionar; setuid não é respeitado por scripts de shell (no Linux).
Martijn
Tudo o que está fazendo é usar o sudo para executar um script. Não é diferente do mesmo com o script 'hello world'. Se o root puder executar o script, ele funcionará.
Baazigar
0

Uma solução proposta com base emSUID

Você pode criar o referido script que chama systemctl com sudo. Torne o script de propriedade da raiz. Forneça SUIDpermissão para root e leia e execute permissões para o grupo de administradores de banco de dados (dba).
Apenas tome cuidado para não fornecer permissão de gravação ao grupo ou a outras pessoas, pois dessa forma eles podem alterar o script e executar qualquer coisa precedida pelo sudo! Verifique também se o script é à prova de balas.

$ cat >> start_database.sh
sudo / usr / bin / systemctl start database @ $ 1
(Ctrl + D)

Esse script pode ser aprimorado verificando se o argumento é realmente fornecido e imprimindo uma mensagem Usage: if not ... ... também porque é um script com o SUIDqual seria apropriado procurar; para evitar a injeção de outros comandos após o argumento. Ou, melhor ainda, certifique-se de permitir como entrada apenas uma das sequências relacionadas ao aplicativo que você mencionou!
Em seguida, verifique se as permissões para o script são estritamente as seguintes:

$ sudo raiz do chown: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

Em seguida, para verificar as permissões corretas:

$ ls -la
.
.
.
-rwSr-x --- 1 dba raiz 35 de agosto 2 19:11 start_database.sh
.
.
.

Então, para recapitular:

1. o owner of the script is root
2. o arquivo can be read and executed by the dba group members
3. no-one else will be able to even readit.
4. SUIDpermitirá que o usuário que executa o script se torne root enquanto o script for executado.
5. Portanto, o sudo não para para obter uma senha.

Em qualquer caso, em um sistema com vários usuários, seja muito cuidadoso com SUIDporque pode deixar espaço para o abuso permissão.

Angelos Asonitis
fonte
Está faltando um shebang em seu script e, mesmo assim, SUIDnão funcionará para scripts por padrão.
Jan Tojnar 3/11