Usar Puppet para eliminar claves SSH no permitidas explícitamente

12

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

ssh_authorized_key { "[email protected]":
   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.

Dylan Tack
fuente
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 [email protected]',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH [email protected]',
    ],
}

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 [email protected]'
}

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.

Mikko
fuente
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.

Sciurus
fuente
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