Utilizzo di Puppet per rimuovere le chiavi SSH non esplicitamente consentite


12

Sto usando le marionette per distribuire le chiavi SSH, in questo modo:

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

Il file ~ / .ssh / authorized_keys finisce per contenere una combinazione di chiavi di più classi, che è il risultato desiderato. Tuttavia, se una chiave viene aggiunta manualmente a $ HOME / .ssh / authorized_keys, Puppet la lascerà in posizione. C'è un modo per rimuovere sempre qualsiasi chiave che non è stata definita in modo esplicito in un manifest?

Ho la versione fantoccio 2.7.1.


Stavo pensando di utilizzare le risorse esportate per ottenere una copia di tutti i miei file authorized_keys in una posizione centrale. Quindi ho potuto eseguire gli script per trovare chiavi insolite e aggiungerli al pupazzo o aggiungere una risorsa per rimuoverli.
Zoredache,

Risposte:



13

Invece di utilizzare le ssh_authorized_keyrisorse, ho deciso di definire una authorized_keysrisorsa, che accetta un elenco di tutte le chiavi SSH per un singolo utente. La definizione si presenta così:

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_keysIl parametro accetta tutte le chiavi necessarie come elenco. Il authorized_keys.erbmodello è simile al seguente:

# 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',
    ],
}

L'aggiunta di chiavi SSH in modo condizionale (ad esempio in diverse classi) è anche facile, grazie all'operatore Puppet +>:

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

Con questo metodo, l'utente non avrà mai chiavi che non sono esplicitamente specificate nella configurazione Puppet. La stringa di chiavi viene utilizzata in authorized_keys così com'è, quindi aggiungere opzioni e restrizioni è banale.

Sarei felice di sapere se altri hanno usato con successo questo metodo!


3

Dovresti essere in grado di farlo utilizzando il metatipo di risorse . PER ESEMPIO

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

L'impostazione noop => true,impedisce la rimozione. Invece, fantoccio segnalerà cosa verrebbe rimosso. Se è quello che vuoi, rimuovi l' istruzione noop .

È in discussione la sintassi ideale per eseguire operazioni su risorse non gestite .

EDIT: come menzionato nei commenti, questa risposta non funziona.


Sembra proprio quello che sto cercando. Quando aggiungo questa linea, il pupazzo produce questo errore: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. ho provato ad aggiungere un utente e poi dice Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Qualche idea?
Dylan Tack,

Non ne sono sicuro. Probabilmente vale la pena chiedere su groups.google.com/group/puppet-users
sciurus

1
Non sono davvero chiaro perché questa sia la risposta accettata: come per Puppet Labs, questo non funziona e non ha: progetti.puppetlabs.com/issues/1917 . OP, ha funzionato per te?
Bill Weiss,

1
No, non l'ho provato, mi aspettavo solo che si comportasse come per altre risorse (ad esempio host, tipi di nagios). Sembra che tu abbia ragione e non funziona ancora con le chiavi ssh- projects.puppetlabs.com/issues/1581
sciurus

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.