Usar Puppet para eliminar claves SSH no permitidas explícitamente


12

Estoy usando una marioneta para distribuir claves SSH, así:

ssh_authorized_key { "alice@foo.com":
   ensure => present,
   key => 'xxxx',
   type => 'ssh-rsa',
   user => 'deploy',
}

El archivo ~ / .ssh / optional_keys termina conteniendo una combinación de claves de múltiples clases, que es el resultado deseado. Sin embargo, si una clave se agrega manualmente a $ HOME / .ssh / Authorized_keys, Puppet la dejará en su lugar. ¿Hay alguna manera de eliminar siempre cualquier clave que no se haya definido explícitamente en un manifiesto?

Tengo la versión de títeres 2.7.1.


Estaba pensando en usar los recursos exportados para obtener una copia de todos mis archivos de claves autorizadas en una ubicación central. Luego podría ejecutar scripts para encontrar claves inusuales, y agregarlos a la marioneta o agregar un recurso para eliminarlos.
Zoredache

Respuestas:



13

En lugar de usar ssh_authorized_keyrecursos, decidí definir un authorized_keysrecurso, que toma una lista de todas las claves SSH para un solo usuario. La definición se ve así:

define authorized_keys ($sshkeys, $ensure = "present", $home = '') {
    # This line allows default homedir based on $title variable.
    # If $home is empty, the default is used.
    $homedir = $home ? {'' => "/home/${title}", default => $home}
    file {
        "${homedir}/.ssh":
            ensure  => "directory",
            owner   => $title,
            group   => $title,
            mode    => 700,
            require => User[$title];
        "${homedir}/.ssh/authorized_keys":
            ensure  => $ensure,
            owner   => $ensure ? {'present' => $title, default => undef },
            group   => $ensure ? {'present' => $title, default => undef },
            mode    => 600,
            require => File["${homedir}/.ssh"],
            content => template("authorized_keys.erb");
    }
}

$ssh_keysEl parámetro toma todas las claves necesarias como una lista. La authorized_keys.erbplantilla se ve así:

# NOTICE: This file is autogenerated by Puppet and should not be modified
<% sshkeys.each do |key| -%>
<%= key %>
<% end -%>

Uso

user {'mikko':
    ...
}
authorized_keys {'mikko':
    sshkeys => [
        'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ mikko@domain.tld',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
    ],
}

Agregar claves SSH condicionalmente (por ejemplo, en diferentes clases) también es fácil, gracias al +>operador de Puppet :

Authorized_keys <| title == 'mikko' |> {
    sshkeys +> 'ssh-rsa ASDFASDFASDFASDF mikko@somewhere-else.tld'
}

Con este método, el usuario nunca tendrá claves que no estén especificadas explícitamente en la configuración de Puppet. La cadena de clave se usa en claves_autorizadas tal como es, por lo que agregar opciones y restricciones es trivial.

Me encantaría saber si otros han utilizado este método con éxito.


3

Debería poder hacer esto utilizando el metatipo de recursos . P.EJ

resources { 'ssh_authorized_key': noop => true, purge => true, }

La configuración noop => true,evita que se realice la eliminación. En cambio, la marioneta informará lo que se eliminaría. Si es lo que desea, elimine la declaración noop .

La sintaxis ideal para realizar operaciones en recursos no administrados está en discusión .

EDITAR: Como se menciona en los comentarios, esta respuesta no funciona.


Esto suena como lo que estoy buscando. Cuando agrego esta línea, Puppet produce este error: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. intenté agregar un usuario y luego dice Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . ¿Algunas ideas?
Dylan Tack

No estoy seguro. Probablemente valga la pena preguntar en groups.google.com/group/puppet-users
sciurus

1
No estoy muy claro por qué esta es la respuesta aceptada: según Puppet Labs, esto no funciona y no lo ha hecho: projects.puppetlabs.com/issues/1917 . OP, ¿funcionó para ti?
Bill Weiss

1
No, no lo intenté, solo esperaba que se comportara como lo hizo con otros recursos (por ejemplo, hosts, tipos nagios). Parece que tienes razón y todavía no funciona para las claves ssh- projects.puppetlabs.com/issues/1581
sciurus

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.