Das Entfernen von SSH-Schlüsseln mit Puppet ist nicht ausdrücklich erlaubt

12

Ich benutze Puppet, um SSH-Schlüssel zu verteilen:

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

Die Datei ~ / .ssh / authorized_keys enthält schließlich eine Mischung von Schlüsseln aus mehreren Klassen. Dies ist das gewünschte Ergebnis. Wenn jedoch ein Schlüssel manuell zu $ ​​HOME / .ssh / authorized_keys hinzugefügt wird, belässt Puppet ihn an Ort und Stelle. Gibt es eine Möglichkeit, Schlüssel, die nicht explizit in einem Manifest definiert wurden, immer zu entfernen?

Ich habe Puppet Version 2.7.1.

Dylan Tack
quelle
Ich dachte darüber nach, exportierte Ressourcen zu verwenden, um eine Kopie aller meiner authorized_keys-Dateien an einem zentralen Ort abzurufen. Dann könnte ich Skripte ausführen, um ungewöhnliche Schlüssel zu finden, und sie entweder zur Marionette hinzufügen oder eine Ressource hinzufügen, um sie zu entfernen.
Zoredache

Antworten:

13

Anstatt ssh_authorized_keyRessourcen zu verwenden, habe ich beschlossen, eine authorized_keysRessource zu definieren , die eine Liste aller SSH-Schlüssel für einen einzelnen Benutzer enthält. Das Define sieht so aus:

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_keysParameter nimmt alle notwendigen Schlüssel als Liste. Die authorized_keys.erbVorlage sieht folgendermaßen aus:

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

Verwendung

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

Das bedingte Hinzufügen von SSH-Schlüsseln (zum Beispiel in verschiedenen Klassen) ist dank des Puppet- +>Operators ebenfalls einfach :

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

Mit dieser Methode hat der Benutzer niemals Schlüssel, die in der Puppet-Konfiguration nicht explizit angegeben sind. Die Schlüsselzeichenfolge wird unverändert in authorized_keys verwendet, sodass das Hinzufügen von Optionen und Einschränkungen trivial ist.

Ich würde mich freuen zu hören, wenn andere diese Methode erfolgreich angewendet haben!

Mikko
quelle
3

Sie sollten in der Lage sein, dies unter Verwendung des Ressourcen- Metatyps zu tun . Z.B

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

Die Einstellung noop => true,verhindert das Entfernen. Stattdessen meldet Marionette, was entfernt werden würde. Wenn es das ist, was Sie wollen, entfernen Sie die noop- Anweisung.

Die ideale Syntax für die Ausführung von Vorgängen mit nicht verwalteten Ressourcen wird derzeit diskutiert .

EDIT: Wie in den Kommentaren erwähnt, funktioniert diese Antwort nicht.

Sciurus
quelle
Das klingt wie genau das, wonach ich suche. Wenn ich diese Zeile hinzufüge, erzeugt puppet diesen Fehler: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. Ich habe versucht, einen Benutzer hinzuzufügen, und dann heißt es Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Irgendwelche Ideen?
Dylan Tack
Ich bin mir nicht sicher. Es lohnt sich wahrscheinlich, auf groups.google.com/group/puppet-users
sciurus
1
Mir ist wirklich unklar, warum dies die akzeptierte Antwort ist: Laut Puppet Labs funktioniert dies nicht und hat nicht funktioniert: projects.puppetlabs.com/issues/1917 . OP, hat es bei Ihnen geklappt?
Bill Weiss
1
Nein, ich habe es nicht ausprobiert. Ich habe nur erwartet, dass es sich so verhält wie bei anderen Ressourcen (z. B. Hosts, Nagios-Typen). Sieht aus wie Sie sind Recht , und es funktioniert nicht für SSH - Schlüssel yet- projects.puppetlabs.com/issues/1581
sciurus
1

Auf Puppet Forge wurde ein Modul unter der Apache-Lizenz, Version 2.0, veröffentlicht, das diese Fähigkeit bietet.

Es basiert jedoch auf Puppet concat anstelle von Vorlagen.

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

Anstatt ein Array von Schlüsseln als Parameter zu übergeben, definieren Sie separate Einträge für jeden Schlüssel.

Anderer Ansatz als bei Mikko, aber gleiches Nettoergebnis.

Rodney
quelle
forge.puppetlabs.com/nightfly/ssh_keys ist der Puppet Forge-Link.
Rodney