Sử dụng Puppet để xóa các khóa SSH không được phép rõ ràng


12

Tôi đang sử dụng con rối để phân phối các khóa SSH, như vậy:

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

Tệp ~ / .ssh / ủy quyền_key kết thúc có chứa một hỗn hợp các khóa từ nhiều lớp, đó là kết quả mong muốn. Tuy nhiên, nếu một khóa được thêm thủ công vào $ HOME / .ssh / ủy quyền, thì Puppet sẽ giữ nguyên vị trí. Có cách nào để luôn loại bỏ bất kỳ khóa nào chưa được xác định rõ ràng trong một bảng kê khai không?

Tôi có phiên bản con rối 2.7.1.


Tôi đã suy nghĩ về việc sử dụng tài nguyên xuất khẩu để có được một bản sao của tất cả các tệp ủy quyền của tôi vào một vị trí trung tâm. Sau đó, tôi có thể chạy các tập lệnh để tìm các khóa bất thường và thêm chúng vào con rối hoặc thêm tài nguyên để xóa chúng.
Zoredache

Câu trả lời:



13

Thay vì sử dụng ssh_authorized_keytài nguyên, tôi quyết định xác định một authorized_keystài nguyên, trong đó có một danh sách tất cả các khóa SSH cho một người dùng. Định nghĩa trông như thế này:

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_keystham số lấy tất cả các khóa cần thiết làm danh sách. Các authorized_keys.erbmẫu trông như thế này:

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

Sử dụng

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

Thêm khóa SSH một cách có điều kiện (ví dụ trong các lớp khác nhau) cũng dễ dàng, nhờ +>toán tử của Puppet :

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

Với phương pháp này, người dùng sẽ không bao giờ có các khóa không được chỉ định rõ ràng trong cấu hình Con rối. Chuỗi khóa được sử dụng trong ủy quyền như chính nó, vì vậy việc thêm các tùy chọn và hạn chế là không đáng kể.

Tôi sẽ rất vui khi biết người khác đã sử dụng phương pháp này thành công!


3

Bạn sẽ có thể làm điều này bằng cách sử dụng siêu dữ liệu tài nguyên . VÍ DỤ

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

Cài đặt noop => true,ngăn chặn việc loại bỏ diễn ra. Thay vào đó, con rối sẽ báo cáo những gì sẽ được gỡ bỏ. Nếu đó là những gì bạn muốn, loại bỏ tuyên bố noop .

Cú pháp lý tưởng để thực hiện các hoạt động trên các tài nguyên không được quản lý đang được thảo luận .

EDIT: Như đã đề cập trong các ý kiến, câu trả lời này không hoạt động.


Âm thanh này giống như những gì tôi đang tìm kiếm. Khi tôi thêm dòng này, con rối tạo ra lỗi này: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. Tôi đã thử thêm một người dùng và sau đó nó nói Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Có ý kiến ​​gì không?
Dylan Tack

Tôi không chắc. Có lẽ bạn nên hỏi về nhóm.google.com/group/puppet
sciurus

1
Tôi thực sự không rõ tại sao đây là câu trả lời được chấp nhận: theo Puppet Labs, điều này không hoạt động và không: dự án.puppetlabs.com /issues / 1917 . OP, nó đã làm việc cho bạn?
Bill Weiss

1
Không, tôi đã không thử nó, tôi chỉ mong nó hoạt động giống như các tài nguyên khác (ví dụ: máy chủ lưu trữ, các loại nagios). Có vẻ như bạn đúng và nó không hoạt động đối với các khóa ssh chưa- dự
án.puppetlabs.com /issues / 1581

1

Trên Puppet Forge, một mô-đun đã được xuất bản theo Giấy phép Apache, Phiên bản 2.0 cung cấp khả năng này.

Nó dựa vào Puppet concat thay vì các mẫu.

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

Thay vì chuyển một mảng các khóa làm tham số, bạn xác định các mục riêng cho từng khóa.

Cách tiếp cận khác với Mikko, nhưng kết quả ròng giống nhau.


forge.puppetlabs.com/nightfly/ssh_keys là liên kết Puppet Forge.
Rodney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.