Menggunakan Wayang untuk menghapus kunci SSH yang tidak diizinkan secara eksplisit


12

Saya menggunakan boneka untuk mendistribusikan kunci SSH, seperti:

ssh_authorized_key { "alice@foo.com":
   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.


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 mikko@domain.tld',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
    ],
}

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 mikko@somewhere-else.tld'
}

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!


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.