L'utilisation de Puppet pour supprimer les clés SSH n'est pas explicitement autorisée

12

J'utilise marionnette pour distribuer des clés SSH, comme ceci:

ssh_authorized_key { "[email protected]":
   ensure => present,
   key => 'xxxx',
   type => 'ssh-rsa',
   user => 'deploy',
}

Le fichier ~ / .ssh / authorized_keys finit par contenir un mélange de clés de plusieurs classes, ce qui est le résultat souhaité. Cependant, si une clé est ajoutée manuellement à $ HOME / .ssh / authorized_keys, Puppet la laissera en place. Existe-t-il un moyen de toujours supprimer une clé qui n'a pas été explicitement définie dans un manifeste?

J'ai la version 2.7.1 de marionnettes.

Dylan Tack
la source
Je pensais utiliser des ressources exportées pour obtenir une copie de tous mes fichiers authorized_keys dans un emplacement central. Ensuite, je pouvais exécuter des scripts pour trouver des clés inhabituelles et les ajouter à la marionnette ou ajouter une ressource pour les supprimer.
Zoredache

Réponses:

13

Au lieu d'utiliser des ssh_authorized_keyressources, j'ai décidé de définir une authorized_keysressource, qui prend une liste de toutes les clés SSH pour un seul utilisateur. La définition ressemble à ceci:

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_keysLe paramètre prend toutes les clés nécessaires sous forme de liste. Le authorized_keys.erbmodèle ressemble à ceci:

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

Usage

user {'mikko':
    ...
}
authorized_keys {'mikko':
    sshkeys => [
        'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ [email protected]',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH [email protected]',
    ],
}

L'ajout conditionnel de clés SSH (par exemple dans différentes classes) est également facile, grâce à l' +>opérateur de Puppet :

Authorized_keys <| title == 'mikko' |> {
    sshkeys +> 'ssh-rsa ASDFASDFASDFASDF [email protected]'
}

Avec cette méthode, l'utilisateur n'aura jamais de clés qui ne sont pas explicitement spécifiées dans la configuration Puppet. La chaîne de clé est utilisée dans authorized_keys telle quelle, l'ajout d'options et de restrictions est donc trivial.

Je serais heureux d'entendre si d'autres ont utilisé cette méthode avec succès!

Mikko
la source
3

Vous devriez pouvoir le faire en utilisant le métatype de ressources . PAR EXEMPLE

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

Le réglage noop => true,empêche le retrait d'avoir lieu. Au lieu de cela, la marionnette signalera ce qui serait supprimé. Si c'est ce que vous voulez, supprimez l' instruction noop .

La syntaxe idéale pour effectuer des opérations sur des ressources non gérées est en cours de discussion .

EDIT: Comme mentionné dans les commentaires, cette réponse ne fonctionne pas.

sciurus
la source
Cela ressemble à ce que je recherche. Lorsque j'ajoute cette ligne, la marionnette produit cette erreur: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. j'ai essayé d'ajouter un utilisateur, puis ça dit Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Des idées?
Dylan Tack du
Je ne suis pas sûr. Cela vaut probablement la peine de demander sur groups.google.com/group/puppet-users
sciurus
1
Je ne sais vraiment pas pourquoi c'est la réponse acceptée: selon Puppet Labs, cela ne fonctionne pas et n'a pas: projects.puppetlabs.com/issues/1917 . OP, cela a-t-il fonctionné pour vous?
Bill Weiss
1
Non, je ne l'ai pas essayé, je m'attendais simplement à ce qu'il se comporte comme il le faisait pour d'autres ressources (par exemple, hôtes, types nagios). On dirait que vous avez raison et cela ne fonctionne pas encore pour les clés ssh
sciurus
1

Sur Puppet Forge, un module a été publié sous la licence Apache, version 2.0 qui offre cette capacité.

Il s'appuie cependant sur Puppet concat au lieu de modèles.

https://github.com/nightfly19/puppet-ssh_keys/tree/master/manifests

Au lieu de passer un tableau de clés en tant que paramètre, vous définissez des entrées distinctes pour chaque clé.

Approche différente de celle de Mikko, mais même résultat net.

Rodney
la source
forge.puppetlabs.com/nightfly/ssh_keys est le lien Puppet Forge.
Rodney