Usando o Puppet para remover chaves SSH não permitidas explicitamente

12

Estou usando o fantoche para distribuir chaves SSH, assim:

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

O arquivo ~ / .ssh / allowed_keys acaba contendo uma mistura de chaves de várias classes, que é o resultado desejado. No entanto, se uma chave for adicionada manualmente a $ HOME / .ssh / allowed_keys, o Puppet a deixará no lugar. Existe uma maneira de sempre remover qualquer chave que não tenha sido explicitamente definida em um manifesto?

Eu tenho a versão fantoche 2.7.1.

Dylan Tack
fonte
Eu estava pensando em usar os recursos exportados para obter uma cópia de todos os meus arquivos allowed_keys em um local central. Então eu poderia executar scripts para encontrar chaves incomuns e adicioná-las ao fantoche ou adicionar um recurso para removê-las.
Zoredache

Respostas:

13

Em vez de usar ssh_authorized_keyrecursos, decidi definir um authorized_keysrecurso, que leva uma lista de todas as chaves SSH para um único usuário. A definição é assim:

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_keysO parâmetro usa todas as chaves necessárias como uma lista. O authorized_keys.erbmodelo fica assim:

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

Uso

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

Adicionar chaves SSH condicionalmente (por exemplo, em diferentes classes) também é fácil, graças ao +>operador do Puppet :

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

Com esse método, o usuário nunca terá chaves que não estão especificadas explicitamente na configuração do Puppet. A cadeia de teclas é usada em chaves_autorizadas assim como é, portanto, adicionar opções e restrições é trivial.

Ficaria feliz em saber se outras pessoas usaram esse método com sucesso!

Mikko
fonte
3

Você deve conseguir fazer isso usando o metatipo de recursos . POR EXEMPLO

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

A configuração noop => true,impede que a remoção ocorra. Em vez disso, o fantoche informará o que seria removido. Se for o que você deseja, remova a instrução noop .

A sintaxe ideal para executar operações em recursos não gerenciados está em discussão .

EDIT: Como mencionado nos comentários, esta resposta não funciona.

sciurus
fonte
Isso soa exatamente como o que estou procurando. Quando adiciono esta linha, o fantoche produz este erro: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. tentei adicionar um usuário e, em seguida, ele diz Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user . Alguma ideia?
Dylan Tack
Não tenho certeza. É provavelmente vale a pena perguntar sobre groups.google.com/group/puppet-users
sciurus
1
Não sei muito bem por que essa é a resposta aceita: de acordo com o Puppet Labs, isso não funciona e não funciona: projects.puppetlabs.com/issues/1917 . OP, funcionou para você?
Bill Weiss
1
Não, eu não tentei, apenas esperava que ele se comportasse como em outros recursos (por exemplo, hosts, tipos nagios). Parece que você está certo e ele não funciona para as chaves SSH ainda- projects.puppetlabs.com/issues/1581
sciurus
1

No Puppet Forge, um módulo foi publicado sob a Licença Apache, versão 2.0, que oferece essa capacidade.

Depende do Puppet concat em vez de modelos.

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

Em vez de passar uma matriz de chaves como parâmetro, você define entradas separadas para cada chave.

Abordagem diferente da de Mikko, mas mesmo resultado líquido.

Rodney
fonte
forge.puppetlabs.com/nightfly/ssh_keys é o link do Puppet Forge.
Rodney