Menggunakan Wayang untuk menghapus kunci SSH yang tidak diizinkan secara eksplisit

12

Saya menggunakan boneka untuk mendistribusikan kunci SSH, seperti:

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

File ~ / .ssh / authorized_keys pada akhirnya berisi campuran kunci dari beberapa kelas, yang merupakan hasil yang diinginkan. Namun, jika kunci ditambahkan secara manual ke $ HOME / .ssh / Authorized_key, Puppet akan membiarkannya di tempatnya. Apakah ada cara untuk selalu menghapus kunci apa pun yang belum secara eksplisit didefinisikan dalam manifes?

Saya punya boneka versi 2.7.1.

Dylan Tack
sumber
Saya sedang berpikir tentang menggunakan sumber daya yang diekspor untuk mendapatkan salinan semua file berwenang_keys saya ke lokasi pusat. Kemudian saya dapat menjalankan skrip untuk menemukan kunci yang tidak biasa, dan menambahkannya ke wayang atau menambahkan sumber daya untuk menghapusnya.
Zoredache

Jawaban:

13

Alih-alih menggunakan ssh_authorized_keysumber daya, saya memutuskan untuk mendefinisikan authorized_keyssumber daya, yang mengambil daftar semua kunci SSH untuk satu pengguna. Definisinya terlihat seperti ini:

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 mengambil semua kunci yang diperlukan sebagai daftar. The authorized_keys.erbTemplate terlihat seperti ini:

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

Pemakaian

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

Menambahkan kunci SSH secara kondisional (misalnya di kelas yang berbeda) juga mudah, terima kasih kepada +>operator Wayang :

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

Dengan metode ini, pengguna tidak akan pernah memiliki kunci yang tidak ditentukan secara eksplisit dalam konfigurasi Wayang. Untaian kunci digunakan dalam otor_keys sebagaimana adanya, sehingga menambahkan opsi dan pembatasan sepele.

Saya akan senang mendengar jika orang lain telah menggunakan metode ini dengan sukses!

Mikko
sumber
3

Anda harus dapat melakukan ini menggunakan metatype sumber daya . MISALNYA

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

Pengaturan noop => true,mencegah penghapusan terjadi. Sebagai gantinya, boneka akan melaporkan apa yang akan dihapus. Jika itu yang Anda inginkan, hapus pernyataan noop .

Sintaks yang ideal untuk melakukan operasi pada sumber daya yang tidak dikelola sedang dibahas .

EDIT: Seperti yang disebutkan dalam komentar, jawaban ini tidak berfungsi.

sciurus
sumber
Ini terdengar seperti apa yang saya cari. Ketika saya menambahkan baris ini, boneka menghasilkan kesalahan ini: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. Saya mencoba menambahkan pengguna, dan kemudian berkata Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Ada ide?
Dylan Tack
Saya tidak yakin. Mungkin patut ditanyakan di groups.google.com/group/puppet-users
sciurus
1
Saya benar-benar tidak jelas mengapa ini adalah jawaban yang diterima: sesuai dengan Puppet Labs, ini tidak berfungsi dan belum: projects.puppetlabs.com/issues/1917 . OP, apakah itu bekerja untuk Anda?
Bill Weiss
1
Tidak, saya tidak mencobanya, saya hanya berharap untuk berperilaku seperti itu untuk sumber daya lainnya (mis. Host, tipe nagios). Sepertinya Anda benar dan itu tidak berfungsi untuk kunci ssh yet- projects.puppetlabs.com/issues/1581
sciurus
1

On Puppet Forge, sebuah modul telah diterbitkan di bawah Lisensi Apache, Versi 2.0 yang menawarkan kemampuan ini.

Itu bergantung pada boneka Wayat bukan template.

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

Alih-alih meneruskan array kunci sebagai parameter, Anda menentukan entri terpisah untuk setiap kunci.

Berbeda pendekatan dari Mikko, tapi hasil bersihnya sama.

Rodney
sumber
forge.puppetlabs.com/nightfly/ssh_keys adalah tautan Puppet Forge.
Rodney