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에 수동으로 추가되면 Puppet은 그대로 둡니다. 매니페스트에 명시 적으로 정의되지 않은 키를 항상 제거하는 방법이 있습니까?

꼭두각시 버전 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',
    ],
}

Puppet의 +>연산자 덕분에 조건부로 (예를 들어 다른 클래스에서) SSH 키를 추가하는 것도 쉽습니다 .

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

이 방법을 사용하면 사용자는 꼭두각시 구성에 명시 적으로 지정되지 않은 키를 가질 수 없습니다. authorized_keys에서 키 문자열은 그대로 사용되므로 옵션과 제한을 추가하는 것은 쉽지 않습니다.

다른 사람들이이 방법을 성공적으로 사용했다면 기뻐할 것입니다!


3

resources 메타 타입을 사용하여이를 수행 할 수 있어야합니다 . EG

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
청서 속

1
이것이 왜 대답이 맞는지 잘 모르겠습니다 .Puppet Labs에 따르면, 이것이 작동하지 않고 작동하지 않습니다 : projects.puppetlabs.com/issues/1917 . OP, 효과가 있었나요?
Bill Weiss

1
아니요, 시도하지 않았습니다. 다른 리소스 (예 : 호스트, nagios 유형)와 마찬가지로 동작 할 것으로 예상했습니다. 당신 같은 외모 맞아요과 수행 SSH 키 미처위한하지 작업 projects.puppetlabs.com/issues/1581
청서 속

1

Puppet Forge에서이 기능을 제공하는 Apache 라이센스 버전 2.0으로 모듈이 공개되었습니다.

그러나 템플릿 대신 Puppet concat을 사용합니다.

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

키 배열을 매개 변수로 전달하는 대신 각 키에 대해 별도의 항목을 정의합니다.

Mikko와는 다른 접근법이지만 동일한 결과입니다.


forge.puppetlabs.com/nightfly/ssh_keys 는 Puppet Forge 링크입니다.
Rodney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.