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

12

Estou usando o fantoche para distribuir as chaves SSH, assim:

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

O arquivo ~ / .ssh / authorized_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 / authorized_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.

    
por Dylan Tack 27.09.2011 / 20:12

4 respostas

4

A partir do Puppet 3.6, agora é possível limpar chaves autorizadas SSH não gerenciadas por meio do tipo user . Por exemplo,

user { 'nick':
  ensure         => present,
  purge_ssh_keys => true,
}
    
por 26.05.2014 / 19:15
13

Em vez de usar ssh_authorized_key resources, decidi definir um recurso authorized_keys , que recebe 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");
    }
}
O parâmetro

$ssh_keys usa todas as chaves necessárias como uma lista. O modelo authorized_keys.erb tem esta aparência:

# 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]',
    ],
}

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

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

Com este método, o usuário nunca terá chaves que não sejam explicitamente especificadas na configuração do Puppet. A string de chave é usada em authorized_keys exatamente como é, portanto, adicionar opções e restrições é trivial.

Eu ficaria feliz em saber se outros usuários usaram esse método com sucesso!

    
por 28.09.2011 / 10:33
3

Você deve conseguir fazer isso usando o metatipo resources . E.G.

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

A definição de noop => true, impede que a remoção ocorra. Em vez disso, o fantoche relatará 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 é em discussão .

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

    
por 27.09.2011 / 21:22
1

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

No entanto, ele conta com a concatenação Puppet, em vez de modelos.

link

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

Diferente abordagem de Mikko, mas mesmo resultado líquido.

    
por 24.02.2014 / 20:15

Tags