Eu preciso permitir que os usuários do dba
grupo controlem os database@
serviços. A resposta para esta pergunta relacionada é apenas listar todos os systemctl
"verbos" que eu quero permitir no sudoers
arquivo; 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 sudo
não resolverá meu problema (embora eu espero que esteja errado). Existe alguma outra maneira de permitir que usuários não raiz controlem systemd
serviç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.
fonte
Uma solução proposta com base em
SUID
Você pode criar o referido script que chama systemctl com sudo. Torne o script de propriedade da raiz. Forneça
SUID
permissã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.
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
SUID
qual 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:
Em seguida, para verificar as permissões corretas:
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 read
it.4.
SUID
permitirá 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
SUID
porque pode deixar espaço para o abuso permissão.fonte
SUID
não funcionará para scripts por padrão.