การใช้ Puppet เพื่อลบคีย์ SSH ที่ไม่ได้รับอนุญาตอย่างชัดเจน


12

ฉันใช้หุ่นกระบอกเพื่อแจกจ่ายกุญแจ SSH เช่น:

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

ไฟล์ ~ / .ssh / authorized_keys ลงท้ายด้วยการผสมผสานของคีย์จากหลายคลาสซึ่งเป็นผลลัพธ์ที่ต้องการ อย่างไรก็ตามหากมีการเพิ่มรหัสลงใน $ HOME / .ssh / authorized_keys ด้วยตนเองหุ่นก็จะปล่อยให้มันอยู่กับที่ มีวิธีลบคีย์ที่ไม่ได้กำหนดไว้อย่างชัดแจ้งในรายการหรือไม่?

ฉันมีหุ่นกระบอกรุ่น 2.7.1


ฉันกำลังคิดที่จะใช้ทรัพยากรที่ส่งออกเพื่อรับสำเนาไฟล์ผู้มีอำนาจทั้งหมดของฉันลงในตำแหน่งศูนย์กลาง จากนั้นฉันสามารถเรียกใช้สคริปต์เพื่อค้นหาคีย์ที่ผิดปกติและเพิ่มลงในหุ่นเชิดหรือเพิ่มทรัพยากรเพื่อลบออก
Zoredache

คำตอบ:



13

แทนที่จะใช้ssh_authorized_keyทรัพยากรฉันตัดสินใจกำหนดauthorized_keysทรัพยากรซึ่งรับรายการคีย์ SSH ทั้งหมดสำหรับผู้ใช้รายเดียว นิยามมีลักษณะดังนี้:

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_keysพารามิเตอร์ใช้คีย์ที่จำเป็นทั้งหมดเป็นรายการ authorized_keys.erbแม่แบบลักษณะเช่นนี้:

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

การใช้

user {'mikko':
    ...
}
authorized_keys {'mikko':
    sshkeys => [
        'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ mikko@domain.tld',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
    ],
}

การเพิ่มคีย์ SSH แบบมีเงื่อนไข (เช่นในคลาสที่แตกต่างกัน) นั้นเป็นเรื่องง่ายด้วย+>ตัวดำเนินการของ Puppet :

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

ด้วยวิธีนี้ผู้ใช้จะไม่มีคีย์ที่ไม่ได้ระบุไว้อย่างชัดเจนในการกำหนดค่าหุ่นกระบอก สตริงคีย์ถูกใช้ใน authorized_keys เหมือนเดิมดังนั้นการเพิ่มตัวเลือกและข้อ จำกัด จึงเป็นเรื่องเล็กน้อย

ฉันยินดีที่จะได้ยินว่าคนอื่นใช้วิธีนี้ได้สำเร็จหรือไม่!


3

คุณควรจะสามารถทำเช่นนี้โดยใช้ทรัพยากร metatype เช่น

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

การตั้งค่าnoop => true,ป้องกันไม่ให้เกิดการลบ หุ่นเชิดจะรายงานสิ่งที่จะถูกลบออกแทน หากเป็นสิ่งที่คุณต้องการลบคำสั่งnoop

ไวยากรณ์ที่เหมาะสำหรับการดำเนินการเกี่ยวกับทรัพยากรที่ไม่มีการจัดการคือภายใต้การสนทนา

แก้ไข: ตามที่ระบุไว้ในความคิดเห็นคำตอบนี้ไม่ทำงาน


เสียงเหมือนสิ่งที่ฉันกำลังมองหา เมื่อฉันเพิ่มบรรทัดนี้หุ่นผลิตข้อผิดพลาดนี้ ฉันพยายามเพิ่มผู้ใช้และจากนั้นก็กล่าวว่าpuppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user ความคิดใด ๆ
Dylan Tack

ฉันไม่แน่ใจ. อาจเป็นสิ่งที่ควรค่าแก่การสอบถามgroups.google.com/group/puppet-users
sciurus

1
ฉันไม่ชัดเจนจริงๆว่าทำไมนี้เป็นคำตอบที่ได้รับการยอมรับ: เป็นต่อหุ่น Labs นี้ไม่ได้ทำงานและไม่ได้: projects.puppetlabs.com/issues/1917 OP มันเหมาะกับคุณไหม?
Bill Weiss

1
ไม่ฉันไม่ได้ลองฉันคาดหวังว่ามันจะทำตัวเหมือนทำเพื่อทรัพยากรอื่น ๆ (เช่นโฮสต์ประเภท nagios) ดูเหมือนว่าคุณพูดถูกและไม่สามารถใช้งานคีย์ ssh ได้
sciurus

1

ใน Puppet Forge โมดูลได้รับการเผยแพร่ภายใต้ Apache License รุ่น 2.0 ที่มีความสามารถนี้

มันต้องอาศัย Puppet concat แทนแม่แบบ

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

แทนที่จะส่งอาร์เรย์ของคีย์เป็นพารามิเตอร์ให้คุณกำหนดรายการแยกต่างหากสำหรับแต่ละคีย์

วิธีการที่แตกต่างจากของ Mikko แต่ผลลัพธ์เดียวกัน


forge.puppetlabs.com/nightfly/ssh_keys เป็นลิงค์ Puppet Forge
ร็อดนีย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.