Modifique el archivo sudoers con la plantilla de libro de jugadas ansible

8

Estoy tratando de crear un archivo sudoers con plantilla ansible. El archivo sudoers debería verse a continuación:

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Lo que he logrado hasta ahora está a continuación:

Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

La plantilla se ve a continuación:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}

vars

commands:
  - ls
  - less
  - du

Hasta donde sé, el módulo de plantilla ansible no tiene nada que ejecute el comando en el servidor remoto e imprima la salida; de lo contrario, estaba pensando en cambiar el archivo de plantilla para que se vea a continuación:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}    
{% endfor %}

y la salida será como lo que quería.

¿Hay algún otro método que pueda simplificarlo?

Por cierto, ya he revisado esta publicación

Err0rr
fuente
Simplemente colocaría la ruta completa del comando en sus vars
jdog
Para modificaciones en el sistema, prefiero incluir scripts en bash para ejecutar mejor.
Señor

Respuestas:

5

TL; DR: BESO. No uses menos.

La gente a menudo comete un error con ansible al tratar de hacer cosas variables que no necesitan ser. A menos que haya varios lugares donde defina la lista de comandos a los que puede acceder el soporte, es perfectamente aceptable simplemente colocarlos en el archivo de creación de plantilla:

templates / etc / sudoers.d / support1

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /bin/cat
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

o incluso explícitamente, ya que no reutiliza Cmnd_Alias ​​en ningún lado

%support1 ALL=(ALL) NOPASSWD: /bin/ls
%support1 ALL=(ALL) NOPASSWD: /bin/cat
%support1 ALL=(ALL) NOPASSWD: /usr/bin/du

Y agregue alguna tarea como:

- name: add templates
  template:
    src: {{ item }}
    dest: /{{ item }}
    owner: root
    group: root
    mode: 0640
  with_items:
    - etc/sudoers.d/support1

Solo usaría plantillas en lugar de archivos porque más adelante podría haber alguna variable para agregar a todas ellas o el nombre del grupo podría provenir de la variable si obtiene otro rol que crea los grupos.

Si necesita usar variables, lo que puede hacer es usar una lista de hashes como esta:

sudoers.support1.commands:
- { alias: "LS", path: "/bin/ls" }
- { alias: "DU", path: "/usr/bin/du" }

Luego en la plantilla:

{% for item in sudoers.{{ group }}.commands %}
Cmnd_Alias {{ item.alias }} = {{ item.path }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {{ sudoers.{{ group }}.commands | map(attribute='alias') | join(', ') }}

No es seguro usar / usr / bin / less

En todo esto, no notaste algo muy importante y ese es el uso de less como espectador. Lamentablemente ese es un agujero de seguridad. Puede escribir '! Bash' para invocar bash. Y al presionar 'v' ingresa al editor en función de las variables VISUAL, EDITOR o LESSEDIT. Entonces puede darles '/ bin / cat' y siempre pueden canalizar el contenido en menos ellos mismos. Tenga en cuenta que esto sigue siendo un agujero de seguridad, ya que algunos archivos en Unix están restringidos intencionalmente, por ejemplo:

/etc/shadow
/etc/sudoers
/etc/ssh/ssh_host_rsa_key
$HOME/.ssh/id_rsa
Jiri Klouda
fuente
1
Me gusta la segunda parte Deberíamos abstenernos de usar less como comando sudo.
Err0rr
1
No hay diferencia entre cambiar la variable y cambiar la plantilla si el cambio está en un solo lugar. El uso de la variable hace que sea menos legible. Si realmente necesita usar la variable, asígnele un mejor nombre y una lista de hashes,
Jiri Klouda
1

primeramente

debe consultar el manejo de espacios / líneas nuevas de Jinja. su plantilla actual crearía nuevas líneas, y creo que esto confundirá sudoy fallará la validación de la sintaxis (IIRC, la sintaxis correcta es agregar -como: -%}en el bucle for, pero debe "jugar" y ver qué sucede). Para representar una plantilla, puede hacerlo en su estación de trabajo, sin ejecutarla en la máquina de destino real.

Además, creo que crear la plantilla con 1 comando en la línea de instrucciones es más legible:

{% for command in commands %}
%{{group}} ALL=(ALL) NOPASSWD: {{command}}
{% endfor %}

En segundo lugar

No recomiendo editar archivos globales existentes con ansible. En su lugar, cree su plantilla personalizada debajo /etc/sudoers.d/(como ha mencionado que vio).

Esta es la forma correcta de hacerlo, porque:

  • el sistema tendrá todos los valores predeterminados tal cual.
  • Su plantilla será mucho más corta.
  • si comete errores, estaría seguro de dónde buscar, en su plantilla.

En tercer lugar

Creo que ejecutar whichdentro sudoerses una idea original, pero no debería funcionar.

mvk_il
fuente
1
de hecho, recibí un mensaje de error de sintaxis. Examinaré la sintaxis. Y, por supuesto, he creado un archivo separado para esto.
Err0rr