Eu tenho nginx com aplicativo php. Também instalei playbooks ansible e copiei neste servidor. O que eu quero fazer é executar playbooks ansible por meio do webapp. Quero saber como fazer isso de forma segura.
O Nginx está rodando no usuário nginx, o php-fpm está rodando no apache e o ansible tem seu próprio usuário. O aplicativo PHP está em/var/www/html/ e os playbooks ansible estão em/var/www/html/ansible, mas esses diretórios podem ser lidos por todos.
Então o fluxo deve ficar assim:
- o usuário seleciona uma ação na página da web
- ajax envia para php
- php prepara o comando ansible e executa o playbook ansible
- execuções ansible
- php captura stdout e stderr e envia de volta para a página da web como json
- ajax mostrará stdout e stderr na página da web.
Agora, no script php, pretendo exec('ansible-playbook site.yml -t ...'). Isso será executado como usuário Apache. Ou devo iniciá-lo no usuário do ansible com sudo? Ou melhor é iniciar o nginx, php-fpm e ansible em ninguém?
Não tenho certeza do que é melhor para isso.
Obrigado por suas opiniões.
Responder1
As interfaces web existentes para Ansible incluem:
- Semáforo
- Torre ou AWX
Se você deseja construir o seu próprio, usecorredor ansiblecomo o script/biblioteca/contêiner Python para executar o Ansible. ansible-playbook é para uso interativo e não possui uma API estável.
Antes de escrever seu próprio projeto, entenda que este é um aplicativo privilegiado que pode fazer muitas coisas em sua infraestrutura. Você não está limitado pelo modelo de segurança padrão dos servidores web instalados.
Por exemplo, você pode ter um daemon executor de tarefas que seja executado como seu próprio usuário dedicado, separado do usuário com o qual o servidor web é executado. Dessa forma, comprometer o usuário nginx não faz com que o sudo faça root automaticamente, você também precisaria passar por alguma API.
Aprecie também as possibilidades de isolar manuais em execução. AWX optou por implementarisolamento de trabalho estilo chroot.
O desenvolvimento de um aplicativo da web seguro e utilizável em geral é um tópico muito grande para uma resposta, e existem sites Stack Exchange melhores para tópicos de desenvolvimento. Estude o que já existe.