Używanie Puppet do usuwania kluczy SSH jest niedozwolone

12

Używam marionetki do dystrybucji kluczy SSH, tak jak:

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

Plik ~ / .ssh / Author_keys ostatecznie zawiera mieszankę kluczy z wielu klas, co jest pożądanym rezultatem. Jednak jeśli klucz zostanie ręcznie dodany do $ HOME / .ssh / uprawnione_ klucze, Puppet pozostawi go na swoim miejscu. Czy istnieje sposób na zawsze usunięcie dowolnego klucza, który nie został wyraźnie zdefiniowany w manifeście?

Mam wersję marionetkową 2.7.1.

Dylan Tack
źródło
Myślałem o użyciu wyeksportowanych zasobów, aby uzyskać kopię wszystkich moich plików autoryzowanych_kluczy w centralnej lokalizacji. Następnie mógłbym uruchomić skrypty, aby znaleźć nietypowe klucze i dodać je do marionetki lub zasób, aby je usunąć.
Zoredache

Odpowiedzi:

13

Zamiast korzystać z ssh_authorized_keyzasobów, postanowiłem zdefiniować authorized_keyszasób, który pobiera listę wszystkich kluczy SSH dla jednego użytkownika. Definicja wygląda następująco:

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_keysparametr przyjmuje wszystkie niezbędne klucze jako listę. authorized_keys.erbSzablon wygląda tak:

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

Stosowanie

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

Warunkowe dodawanie kluczy SSH (na przykład w różnych klasach) jest również łatwe dzięki +>operatorowi Puppet :

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

Dzięki tej metodzie użytkownik nigdy nie będzie miał kluczy, które nie są wyraźnie określone w konfiguracji Puppet. Ciąg kluczy jest używany w uprawnionych kluczach tak, jak jest, więc dodawanie opcji i ograniczeń jest banalne.

Z przyjemnością usłyszę, czy inni z powodzeniem zastosowali tę metodę!

Mikko
źródło
3

Powinieneś być w stanie to zrobić za pomocą metatype zasobów . NA PRZYKŁAD

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

Ustawienie noop => true,uniemożliwia usunięcie. Zamiast tego marionetka zgłosi to, co zostanie usunięte. Jeśli tego chcesz, usuń instrukcję noop .

Dyskutowana jest idealna składnia do wykonywania operacji na niezarządzanych zasobach .

EDYCJA: Jak wspomniano w komentarzach, ta odpowiedź nie działa.

Sciurus
źródło
Brzmi jak to, czego szukam. Kiedy dodam ten wiersz, marionetka generuje ten błąd: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. próbowałem dodać użytkownika, a potem mówi Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Jakieś pomysły?
Dylan Tack,
Nie jestem pewny. Prawdopodobnie warto zapytać na groups.google.com/group/puppet-users
sciurus
1
Naprawdę nie jestem pewien, dlaczego jest to akceptowana odpowiedź: według Puppet Labs to nie działa i nie działa: projects.puppetlabs.com/issues/1917 . OP, czy to zadziałało dla ciebie?
Bill Weiss,
1
Nie, nie próbowałem tego, po prostu spodziewałem się, że będzie się zachowywać tak samo, jak w przypadku innych zasobów (np. Hostów, typów nagios). Wygląda na to, że masz rację i to jeszcze nie działa dla kluczy ssh- projects.puppetlabs.com/issues/1581
sciurus
1

Na Puppet Forge opublikowano moduł na licencji Apache, wersja 2.0, który oferuje tę możliwość.

Jednak opiera się na concat Puppet zamiast szablonów.

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

Zamiast przekazywania tablicy kluczy jako parametru definiujesz osobne wpisy dla każdego klucza.

Inne podejście niż Mikko, ale taki sam wynik netto.

Rodney
źródło
forge.puppetlabs.com/nightfly/ssh_keys to link Puppet Forge.
Rodney