Mar 192011
 

puppetArticolo originale scritto da:

By Ikuya Yamada and Yoshiyasu Takefuji

Introduzione

Quando un ambiente server viene creata utilizzando software di virtualizzazione o un servizio di cloud, il numero di server tende ad aumentare rapidamente. L’installazione del software e la configurazione sono necessari ogni volta che viene creato un server. Inoltre, la sincronizzazione delle configurazioni dei server richiede uno sforzo ulteriore, come la scrittura di script di shell.

In questo articolo verrà descritto come costruire automaticamente un ambiente server utilizzando un software relativamente nuovo chiamato Puppet. Anche se questo strumento viene utilizzato in genere per la gestione delle infrastrutture server su larga scala (come ad esempio un centro dati o un servizio Web con un numero elevato di utenti), può anche essere utilizzato per gestire un piccolo numero di server. Tuttavia, Puppet è uno strumento di nuova concezione, e la documentazione esistente e gli articoli su Puppet sono ancora un po’ superficiali.


Qui, vi mostreremo esempi semplici che è possibile utilizzare per configurare le impostazioni comuni dei server utilizzando puppet senza alcuna difficoltà. Utilizzando Puppet, è possibile creare un nuovo server istantaneamente inserendo solo pochi comandi. Puppet sincronizzerà periodicamente le configurazioni dei server creati.

Si noti che sarà particolarmente utile configurare e mantenere impostazioni di sicurezza , come ad esempio sudo, sshd , e iptables . In questo articolo, abbiamo descritto alcune delle nostre impostazioni di sicurezza originali e semplici ma potenti che sono state effettivamente utilizzate nel nostro ambiente server.

Abbiamo provato tutti gli esempi con la versione 5 del sistema operativo CentOS. Tuttavia, è possibile applicare le tecniche descritte ad altre distribuzioni Linux ed altri sistemi operativi.

Installazione di Puppet

Puppet adotta una architettura server-client. Ogni client comunica periodicamente con uno (o più) server master e sincronizza la configurazione (ogni mezz’ora di default). Quindi, in primo luogo è necessario preparare almeno due istanze di puppet: uno sarà il server burattinaio (puppet-master) e gli altri saranno i servers Puppet client.

Ora, procediamo con l’installazione di Puppet. Fedora EPEL fornisce il pacchetto Puppet per Yum. Se i vostri server non hanno il repository EPEL, installarlo prima di procedere:

$ sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

Quindi, installare il pacchetto del Puppet-server sul server master che gestisce gli altri server e Puppet sui server client.

Sul master server:

$ sudo yum -y install puppet-server
$ sudo chkconfig puppetmaster on
$ sudo service puppetmaster start

Sui client servers:

$ sudo yum -y install puppet
$ sudo chkconfig puppet on
$ sudo service puppet start

Inoltre, se il server master è posto dietro un firewall e si desidera utilizzare Puppet su server che sono al di fuori del firewall, è necessario aprire la porta TCP 8140.

Una breve introduzione a Puppet

In Puppet, tutte le configurazioni sono descritti come risorse . Le risorse possono essere file , pacchetti software , servizi erogati da server, ecc, ad esempio, il seguente file rappresenta una risorsa molto semplice /etc/passwd file che è di proprietà di root ed ha permessi per ‘644 ‘:

file { '/etc/passwd':
    owner   => root,
    mode    => 644,
}

La seguente configurazione installa il pacchetto openssh-server , abilita il servizio sshd di default, e assicura che sshd sia in esecuzione:

package { 'openssh-server':
    ensure => installed,
}

service { 'sshd':
    enable  => true,
    ensure  => running,
    require => Package['openssh-server'],
}

Ora, proviamo ad applicare queste configurazioni ai vostri server. In Puppet, site.pp è un file speciale che è incluso di default. Se la configurazione del server non è complessa, potrebbe essere vantaggioso scrivere tutte le impostazioni di configurazione in questo file. Per fare ciò, incollate il codice mostrato sopra in /etc/puppet/manifests/site.pp.

file { '/etc/passwd':
    owner   => root,
    mode    => 644,
}

package { 'openssh-server':
    ensure => installed,
}

service { 'sshd':
    enable  => true,
    ensure  => running,
    require => Package['openssh-server'],
}

Successivamente, è necessario registrarsi e collegare il server client al server master.
per fare questo eseguire il seguente comando sul server client:

$ sudo puppetd --test --waitforcert 30 --server MASTER_SERVER_ADDRESS

Ed eseguite il comando seguente sul server master:

$ sudo puppetca --list
(YOUR CLIENT_SERVER_ADDRESS IS DISPLAYED HERE)
$ sudo puppetca --sign CLIENT_SERVER_ADDRESS

Poi, di nuovo collegarsi in console sul client server, si noterà che tutte le voci di configurazione di cui sopra sono state applicate automaticamente da Puppet.
Inoltre, sarà necessario aggiungere il seguente parametro alla /etc/puppet/puppet.conf , al fine di specificare l’indirizzo del server master ai client.

[main]
    server = MASTER_SERVER_ADDRESS

Ora, Puppet sincronizzerà automaticamente le configurazioni del server ogni 30 minuti. È possibile verificarlo in
/var/log/messages:

$ sudo tail /var/log/messages

Esempi di Configuratione

In questa sezione, forniremo alcuni esempi di configurazione di base. Se si desidera utilizzarli, vi invitiamo a incollarli nel site.pp.

Aggiungere utenti amministrativi

Puppet fornisce una risorsa utente che ci permette di gestire gli account utente. La configurazione seguente aggiunge l’utente admin al tuo server:

# Add "admin" account
user { 'admin':
    home       => '/home/admin',   # home directory is /home/admin
    managehome => true,            # manage the home directory by Puppet
    groups     => ['wheel'],       # the user belongs to wheel group
    password   => 'PASSWORD_HASH', # hashed password text
}

PASSWORD_HASH è un hash della password di base, simile a quello utilizzati nella /etc/shadow . È possibile generarlo manualmente utilizzando i seguenti comandi:

$ sudo yum -y install ircd-ratbox-mkpasswd
$ /usr/bin/ircd-mkpasswd -m -s 'SALT' -p 'PASSWORD'

[ La creazione Standard crypt(3) di password è disponibile anche senza installare nessun pacchetto aggiuntivo; lanciando, e.g. perl -wle ‘print crypt “PASSWORD”, “SALT”‘ o python -c ‘import crypt; print(crypt.crypt(“PASSWORD”, “SALT”))’ ne genererà una. — Ben ]

sudo

La seguente configurazione installa il pacchetto sudo e modifica sudoers utilizzando augeas per consentire agli utenti appartenenti al gruppo wheel di utilizzare sudo :

# Installa il pacchetto sudo
package { 'sudo':
    ensure => installed, # Si assicura che sudo  sia installato
}

# Consentire agli utenti appartenenti al gruppo wheel di utilizzare sudo
augeas { 'sudowheel':
    context => '/files/etc/sudoers', # target file is /etc/sudoers
    changes => [
        # allow wheel users to use sudo
        'set spec[user = "%wheel"]/user %wheel',
        'set spec[user = "%wheel"]/host_group/host ALL',
        'set spec[user = "%wheel"]/host_group/command ALL',
        'set spec[user = "%wheel"]/host_group/command/runas_user ALL',
    ]
}

SSH

Questa configurazione consente di installare e utilizzare sshd sui server. Si cambia anche sshd_config per negare il login di root ed agli account con password vuote.

# Installa openssh-server 
package { 'openssh-server':
    ensure => installed,
}

# Abilita il servizio sshd 
service { 'sshd':
    enable  => true,                      # Esegue sshd all'avvio
    ensure  => running,                   # Assicura che sshd sia up
    require => Package['openssh-server'], # require openssh-server before applying this config
}

# Cambia la configurazione di sshd
augeas { 'sshd_config':
    context => '/files/etc/ssh/sshd_config', # target file is /etc/ssh/sshd_config
    notify  => Service['sshd'],              # restart sshd after applying this config
    changes => [
        # deny root logins and logins with empty passwords
        'set PermitRootLogin no',
        'set PermitEmptyPasswords no',
    ],
}

iptables

Per configurare iptables utilizzando Puppet, è necessario installare un modulo esterno chiamato puppet-iptables . È necessario scaricarlo e installarlo da GitHub.

$ cd /tmp
$ wget --no-check-certificate "https://github.com/kbarber/puppet-iptables/tarball/master"
$ tar xvzf kbarber-puppet-iptables-1.2.0-2-g9deddbb.tar.gz
$ sudo mkdir -p /etc/puppet/modules
$ sudo mv kbarber-puppet-iptables-9deddbb /etc/puppet/modules/

Inoltre, è necessario aggiungere i seguenti parametri alla vostra /etc/puppet/puppet.conf sia sul server master che sul server client:

[main]
    libdir = /var/lib/puppet/lib

[puppetd]
    pluginsync=true
    plugindest=/var/lib/puppet/lib

Ora, è possibile utilizzare la risorsa iptables . La seguente è una configurazione del firewall di base che accetta solo i pacchetti su connessioni già esistenti, quelli di localhost e da LAN, e quelli che vengono via SSH.

# Consente i pacchetti che appartengono o collegati a una connessione esistente
iptables { 'allow established, related':
    state => ['ESTABLISHED', 'RELATED'],
    proto => 'all',
    jump  => 'ACCEPT',
}

# Permette tutti i pacchetti da localhost
iptables { 'allow localhost':
    source => '127.0.0.1',
    proto  => 'all',
    jump   => 'ACCEPT',
}

# Permette tutti i pacchetti da LAN
iptables { 'allow LAN':
    source => '192.168.0.0/16',
    proto  => 'all',
    jump   => 'ACCEPT',
}

# Permette tutti i pacchetti SSH
iptables { 'allow ssh':
    proto => 'tcp',
    dport => 22,
    jump  => 'ACCEPT',
}

# Scarta tutti i pacchetti in entrata di default
iptables { 'drop incoming packets':
    chain => 'INPUT',
    proto => 'all',
    jump  => 'DROP',
}

Ulteriori informazioni

Se siete interessati a Puppet e volete imparare ulteriori cose su di esso, si può fare riferimento alla   documentazione ufficiale , ed alla Introduzione a Puppet sono entrambi un buon punto di partenza.

Copyright © 2011, Ikuya Yamada and Yoshiyasu Takefuji. Released under the Open Publication License unless otherwise noted in the body of the article.
Published in Issue 183 of Linux Gazette

[amazon_enhanced asin=”1430210591″ price=”All” background_color=”332610″ link_color=”FFFFFF” text_color=”D4CE99″ /]

[amazon_enhanced asin=”B001FOPV90″ price=”All” background_color=”332610″ link_color=”FFFFFF” text_color=”D4CE99″ /]

Popular Posts:

Flattr this!

  3 Responses to “Automatizzare l’amministrazione di server virtuali utilizzando Puppet”

  1. Most of this could be done with cobbler. I try to do as much as possible on cobbler then everything else falls on puppet and func…just an opinion.

  2. The Foreman is a good puppet “management” project:

    http://theforeman.org/projects/foreman/wiki/Features

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*