Articolo 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/ |
[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:
- None Found
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.
Thanks! very good articles
http://linuxbasiccommand.blogspot.com
The Foreman is a good puppet “management” project:
http://theforeman.org/projects/foreman/wiki/Features