Läksy w48: Oman Puppet modulin toteuttaminen

Harjoitustehtävän aiheena oli oman Puppet modulin toteuttaminen. Moduli toteutettiin edellisen harjoitustehtävän suunnitelman mukaisesti. Toteutettua Puppet modulia voidaan käyttää Linux käyttöjärjestelmän käyttäjienhallinnan perustehtäviin suorittamiseen orjakoneilla. Modulia voidaan myös helposti laajentaa erilaisten käyttötarpeiden mukaisesti.

Harjoitusympäristö

Harjoitusta suoritettiin 4.12. – 5.12.2012 opiskelijan kotona käyttäen 1 henkilökohtaista tietokonetta ja 1 Haaga-Helian TIKO-kannettavaa. Internet-yhteytenä oli Elisa Oyj:n tarjoama VDSL tyyppinen 100/10 mbit kiinteä laajakaistayhteys. Harjoituksessa käytettiin Lenovo R60 kannettavaa tietokonetta ja sen kiintolevylle asennettua Xubuntu 12.04  32-bittistä Linux käyttöjärjestelmää. Haaga-Helian TIKO-kannettavan käyttöjärjestelmä ladattiin Xubuntu versio 12.04 32-bittinen Linux live-cd:ltä. Tietokoneen kiintolevylle asennettua käyttöjärjestelmää ei käytetty harjoitustehtävän suorittamiseen. Tietokoneet olivat kytkettyinä VDSL modeemin reitittimeen ja ne olivat samassa lähiverkossa 192.168.100.0/24.

Lenovo R60 kokoonpano:

  • Suoritin: Intel Core 2 Duo T56000 @1.83 Ghz
  • Keskusmuisti: 4 Gt DDR2
  • Kiintolevy: 100 Gt SATA150 54000rpm
  • Käyttöjärjestelmä: Xubuntu versio 12.04 32-bittinen

Haaga-Helian TIKO-kannettava HP EliteBook 2560p kokoonpano:

  • Suoritin:Intel Core i5-2450M @2.50GHz
  • Keskusmuisti: 8 Gt DDR3
  • Kiintolevy: 500 Gt SATA300 7200rpm
  • Käyttöjärjestelmä: Windows 7 Professional 64-bittinen

Puppet palvelinautomaatio järjestelmän asentaminen

Aloitin harjoitustehtävän tekemisen päivittämällä Ubuntun pakettivarastot komennolla:

$sudo apt-get update

Pakettivarastojen päivitys kesti muutamia sekunteja.

Asensin Puppet järjestelmän komennolla:

$sudo apt-get install puppet

Testasin asennuksen ajamalla komennon puppet komentoriviltä:

$puppet

Komento antoi tulosteen:

See 'puppet help' for help on available puppet subcommands

Totesin puppet asennuksen onnistuneen.

Oman Puppet modulin toteutus

Toteutin oman Puppet modulin, jolla voidaan suorittaa Linux käyttöjärjestelmän käyttäjähallinnan perustehtäviä Puppet Agent koneilla. Modulin ominaisuuksiin kuuluvat uusien käyttäjien luominen, käyttäjäprofiilin tiedostojen ja hakemiston hallinta,  käyttäjien salasanojen ylläpitäminen sekä käyttäjäprofiileihin kopioitavien oletustiedostojen syöttämisen /etc/skel hakemistoon. Puppet modulini perustuu  määriteltyjen tyyppien hyödyntämiseen käyttäjähallinnan tehtävien suorittamiseksi. Modulissa ei ole init.pp lähtökohtaa ja kaikki modulin osat toimivat itsenäisesti.

Puppet modulini nimi on usermgt.  Modulin rakenne /etc/puppet/modules hakemistossa Puppet Master koneella on seuraavanlainen:


xubuntu@xubuntu:/etc/puppet/modules/usermgt$ tree
.
├── files  
|   ├── bash_aliases
|   └── profile
├── lib
│   └── puppet
│       └── parser
│           └── functions
│               └── hashpw.rb
└── manifests
    ├── change_password.pp
    ├── create_user.pp
    ├── remove_user.pp
    └── setup_etcskel.pp

6 directories, 7 files

Kuvaus modulin tiedostoista:

Tiedostonimi Lyhyt kuvaus tiedostosta ja sen käyttötarkoituksesta
bash_aliases Bash komentotulkin aliases määritykset, jotka kopioidaan orjakoneen tiedostoon /etc/skel/.bash_aliases
profile profile tiedosto, joka kopioidaan orjakoneen käyttäjän kotihakemistoon tiedostoon .profile
hashpw.rb Omatekoinen Ruby funktio hashpw, joka generoi selväkielisestä salasanasta SHA-512 tiivisteen, joka on sopii Linux käyttöjärjestelmän salasanatiivisteeksi
create_user.pp Määritelty tyyppi usermgt::create_user, jolla luodaan käyttäjä orjakoneelle uusi käyttäjä
setup_etcskel.pp Luokka usermgt::setup_etcskel, jolla kopioidaan käyttäjän oletusasetustiedostot orjakoneen /etc/skel hakemistoon
change_password.pp Määritelty tyyppi usermgt::change_password, jolla vaihdetaan orjakoneen käyttäjän salasana. Uusi salasana voidaan antaa joko selväkielisenä tai SHA-512 tiivisteenä
remove_user.pp Määritelty tyyppi usermgt::remove_user, jolla poistetaan orjakoneen käyttäjä. Samalla voidaan poistaa myös käyttäjän kotihakemisto.

Tiedoston files/bash_aliases sisältö, joka on lainattu Advanced Bash-Scripting Guide dokumentin osasta Appendix M Sample .bashrc and .bash_profile Files:


alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# -> Prevents accidentally clobbering files.
alias mkdir='mkdir -p'

alias h='history'
alias j='jobs -l'
alias which='type -a'
alias ..='cd ..'

Tiedoston files/profile sisältö, johon on lisätty umask 077 eli käyttäjän luomat tiedostoihin annetaan oikeudet vain käyttäjälle itselleen:


# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.

umask 077

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Tiedoston lib/puppet/parser/functions/hashpw.rb sisältö. Salasanatiivisteen generointi koodi on lainattu Jude Pereiran ja Felipe Ortegan  julkaisemista esimerkkikoodeista:

module Puppet::Parser::Functions
  newfunction(:hashpw, :type => :rvalue) do |args|
    passwd = args[0]
    hashtype = '$6$'
    salt = rand(36**8).to_s(36)
    hash = passwd.crypt(hashtype + salt)
  end 
end

Tiedoston manifests/create_user.pp sisältö:


define usermgt::create_user($username = $title,$shell = '/bin/bash',$passwordtype = 'cleartext',$password, $secure_homedir=false) {

    if $passwordtype == 'cleartext' {
        $shadowpw = hashpw($password)
    }
    elsif $passwordtype == 'hash' {
        $shadowpw = $password
    }

    user { $username:
      ensure     => present,
      gid        => $username,
      shell      => $shell,
      password   => $shadowpw,
      home       => "/home/${username}",
      managehome => true,
      require    => Group["$username"],
    }

    group { "$username":
        ensure    => present,
        allowdupe => false,
    }

    if $secure_homedir == true {

          file { "/home/${username}":
               ensure  => directory,
                owner   => $home_owner,
                group   => $home_group,
                mode    => 700, 
                recurse => true,
                replace => true,
                force   => true,
                require   => User["${username}"],
          }

         file { "/home/${username}/.profile":
               mode => 700,
               owner   => $username,
               group   => $username,      
               source  => "puppet:///modules/usermgt/profile",
               require => File["/home/${username}"],
         }

    }
}

Tiedoston manifests/setup_etcskel.pp sisältö:

class usermgt::setup_etcskel {

    file { "/etc/skel/.bash_aliases":
        mode => 0700,
        owner   => root,
        group   => root,
        source => ["puppet:///modules/usermgt/bash_aliases"],
    }
}

Tiedoston manifests/change_password.pp sisältö:

define usermgt::set_password($username = $title,$passwordtype = 'cleartext',$password) {

    if $passwordtype == 'cleartext' {
        $shadowpw = hashpw($password)
    }
    elsif $passwordtype == 'hash' {
        $shadowpw = $password
    }

    user { $username:
      ensure     => present,
      password   => $shadowpw,
      require    => Group["$username"],
    }

    group { "$username":
        ensure    => present,
        allowdupe => false,
    }

}

Tiedoston manifests/remove_user.pp sisältö:

define usermgt::remove_user($username = $title, $remove_home_dir=false) {

    if $remove_home_dir == true {

        file { "/home/${username}":
                ensure  => absent,
                recurse => true,
                force   => true,
        }
    }

    user { $username:
      ensure     => absent,
    }

    group { "$username":
        ensure    => absent,
    }

}

Modulin toiminnan kuvaus

Määritelty tyyppi usermgt::create_user lisää uuden käyttäjän orjakoneelle. Samalla luodaan käyttäjänimeä vastaava ryhmä. Käyttäjän salasana generoidaan selväkielisestä merkkijonosta tai käytetään valmista SHA-512 tiivistettä parametrin password_type mukaisesti. Käyttäjän kotihakemiston ja sen tiedostojen oikeudet voidaan rajoittaa vain käyttäjälle itselleen parametrilla secure_homedir.
Parametrit: name = käyttäjänimi, shell = komentotulkin polku, password_type = cleartext | hash, password = selväkielinen salasana tai SHA-512 tiiviste, secure_homedir= true | false

Omatekoinen funktio hashpw generoi selväkielisestä merkkijonosta salasanojen tallentamiseen Linuxissa yleiseti käytetyn SHA-512 tiivisteen. Parametrit: selväkielinen merkkijono. Palautusarvo: SHA-512 tiiviste merkkijonona

Luokka usermgt::setup_etcskel siirtää Puppet modulin tiedostoresursseista käyttäprofiilin oletustiedostoja orjakoneen /etc/skel hakemistoon. Moduli siirtää tällä hetkellä vain tiedoston .bash_aliases orjakoneelle, mutta siihen voidaan helposti lisätä uusia tiedostoja. Luokalla ei ole parametreja.

Määritelty tyyppi usermgt::change_password vaihtaa käyttäjän salasana orjakoneelle. Käyttäjän uusi salasana generoidaan selväkielisestä merkkijonosta tai käytetään valmista SHA-512 tiivistettä parametrin password_type mukaisesti.
Parametrit: name = käyttäjänimi, password_type = cleartext | hash, password = selväkielinen salasana tai SHA-512 tiiviste

Määritelty tyyppi usermgt::remove_user poistaa käyttäjän orjakoneelle. Samalla poistetaan käyttäjänimeä vastaava ryhmä. Käyttäjän kotihakemiston ja sen tiedostot voidaan samalla poistaa asettamalla parametri remove_homedir.
Parametrit: name = käyttäjänimi, remove_homedir= true | false

Puppet Master/Agent testiympäristön pystyttäminen

Testasin oma moduliani Puppet Master/Agent testiympäristössä, jossa Haaga-Helian TIKO-kannettava oli Puppet Master koneena ja Lenovo R 60 kannettava tietokone oli orjakoneena. Käytin koneiden .local nimiä Avahi palvelun kautta. Puppet Master koneen nimi oli xubuntu.local (IP-osoite 192.168.100.101) ja orjakoneen eino-ThinkPad-R60.local (IP-osoite 192.168.100.100).

Asensin Puppet Master palvelun xubuntu.local koneelle komennolla:

$ sudo apt-get install puppetmaster

Poistin vanhan SSL-sertfikaatin Puppet Master koneelle komennoilla:

$ sudo service puppetmaster stop
$ sudo rm -r /var/lib/puppet/ssl

Muokkasin Puppet Masterin asetuksiin xubuntu.local koneen nimen:

$ sudo nano /etc/puppet/puppet.conf

Lisäsin [master] lohkon sisään rivin:

dns_alt_names = puppet, xubuntu.local, puppet.xubuntu.local

Käynnistin Puppet Master palvelun uudelleen komennolla:

$ sudo service puppetmaster start

Tarkistin uuden SSL-sertifikaatin komennoilla:

xubuntu$ sudo ls /var/lib/puppet/ssl/certs/
ca.pem	xubuntu.pem
xubuntugt$ sudo openssl x509 -in /var/lib/puppet/ssl/certs/xubuntu.pem  -text | grep -i dns
DNS:puppet, DNS:puppet.xubuntu.local, DNS:xubuntu, DNS:xubuntu.local

Asensin Puppetin orjakoneelle komennolla:

$ sudo apt-get install puppetmaster

Muokkasin Puppetin asetuksiin Puppet Master koneen xubuntu.local nimen:

$ sudo nano /etc/puppet/puppet.conf

Lisäsin [agent] lohkon sisään rivin:

server = xubuntu.local

Muokkasin Puppetin oletusasetuksia tiedostossa /etc/default/puppet.conf:

$ sudo nano /etc/default/puppet.conf

Muutin seuraavan rivin:

START=yes

Käynnistin Puppet palvelun uudelleen orjakoneella komennolla:

$ sudo service puppet restart

Allekirjoitin orjakoneen sertifikaatin Puppet Master koneella komennoilla:

xubuntu@xubuntu:/etc/puppet/modules/usermgt$ sudo puppet cert --list
  "eino-thinkpad-r60" (51:92:00:89:8B:2D:B7:1C:27:97:0F:43:F6:99:66:CB)
xubuntu@xubuntu:/etc/puppet/modules/usermgt$ sudo puppet cert --sign eino-thinkpad-r60
notice: Signed certificate request for eino-thinkpad-r60
notice: Removing file Puppet::SSL::CertificateRequest eino-thinkpad-r60 at '/var/lib/puppet/ssl/ca/requests/eino-thinkpad-r60.pem'

Oman modulin testaaminen orjakoneella käyttäen nodes.pp konfiguraatiota

Loin Puppet Master koneelle tiedostot /etc/puppet/manifests/site.pp ja /etc/puppet/manifests/nodes.pp, joilla orjakoneella ajettavat asetukset määritellään.

Tiedoston /etc/puppet/manifests/site.pp sisältö:

import "nodes"

Tiedoston /etc/puppet/manifests/nodes.pp sisältö:

node default {

}

node manageusers {

        require usermgt::setup_etcskel
}

node 'eino-thinkpad-r60' inherits manageusers {

       usermgt::create_user{"testuser1":
            password => 'x0WaR2Id5Ows',
            secure_homedir => true,
       }

}

Tiedostossa nodes.pp luotiin orjakoneella eino-thinkpad-r60.local uusi käyttäjä testuser1, jolle määriteltiin salasana sekä kotihakemiston tiedosto-oikeudet rajoitettiin vain käyttäjälle itselleen. Lisäksi orjakoneen /etc/skel hakemistoon siirrettiin tiedosto .bash_aliases, joka kopioituu automaattisesti kaikille orjakoneella luotaville käyttäjille.

Käynnistin Puppet palvelun uudelleen orjakoneella komennolla:


$ sudo service puppet restart
* Restarting puppet agent                                               [ OK ] 

Tutkin orjakoneen /home kansion sisältöä komennolla:


$ ls -l /home/ | grep testuser
drwx------  2 testuser1 testuser1 4096 joulu  5 23:47 testuser1

Puppet moduli oli onnistuneesti luonut käyttäjän testuser1 ja kotihakemiston. Tutkin käyttäjän testuser1 kotihakemiston sisältöä komennolla:


$ sudo ls -lA /home/testuser1
total 24
-rwx------ 1 testuser1 testuser1  195 joulu  4 22:21 .bash_aliases
-rwx------ 1 testuser1 testuser1  220 huhti  3  2012 .bash_logout
-rwx------ 1 testuser1 testuser1 3486 huhti  3  2012 .bashrc
-rwx------ 1 testuser1 testuser1  674 joulu  5 23:47 .profile
-rwx------ 1 testuser1 testuser1 1601 helmi  4  2012 .Xdefaults
-rwx------ 1 testuser1 testuser1   14 marra 19  2011 .xscreensaver

Käyttäjän testuser1 tiedostojen oikeudet oli määritelty Puppet modulin mukaan, niin että vain käyttäjälle oli täydet oikeudet tiedostoihin. Tutkin tiedoston /home/testuser1/.bash_aliases sisältöä komennolla:


$ sudo cat /home/testuser1/.bash_aliases
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# -> Prevents accidentally clobbering files.
alias mkdir='mkdir -p'

alias h='history'
alias j='jobs -l'
alias which='type -a'
alias ..='cd ..'

Tiedoston .bash_aliases sisältö oli Puppet modulin määritysten mukainen. Testasin myös SSH kirjautumista käyttäjänä testuser1 komennolla:


$ ssh testuser1@localhost
testuser1@localhost's password: 
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-31-generic i686)

 * Documentation:  https://help.ubuntu.com/

155 packages can be updated.
74 updates are security updates.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

testuser1@eino-ThinkPad-R60:~$ 

Käyttäjänä testuser1 kirjautuminen onnistui Puppetilla määritellyllä salasanalla. Totesin Puppet modulin toimivan kuten oli suunniteltu.

Lähteet

Cooper, M. 2012. Advanced Bash-Scripting Guide. Appendix M. Sample .bashrc and .bash_profile Files.
http://tldp.org/LDP/abs/html/sample-bashrc.html

Finninday.net 2011. Zero to puppet in one day. Puppet master configs.
http://finninday.net/wiki/index.php/Zero_to_puppet_in_one_day#Puppet_master_configs

Karvinen, Tero 2012a. Linux keskitetty hallinta ICT4TN011-2 kurssin kotisivu.
http://terokarvinen.com/2012/aikataulu-linuxin-keskitetty-hallinta-ict4tn011-2-puppet

Karvinen, Tero 2012b. PuppetMaster on Ubuntu 12.04.
http://terokarvinen.com/2012/puppetmaster-on-ubuntu-12-04

Liimatta, Eino 2012. Läksy w45: Muotit, parametrisoidut luokat ja määritellyt tyypit.
http://eliimatt.wordpress.com/2012/11/15/laksy-w45-muotit-parametrisoidut-luokat-ja-maaritellyt-tyypit

Ortega, Felipe 2012. [Puppet Users] rand losing its randomness after using fqdn_rand.
https://groups.google.com/forum/#!msg/puppet-users/kc_KJwLwHvo/FjokplF1IuoJ

Pereira, Jude 2012. Use Ruby to Generate your Shadow Password.
http://judepereira.com/blog/use-ruby-to-generate-your-shadow-password/

Sobral, Daniel 2010. Module dcsobral/users. Puppet Forge.
http://forge.puppetlabs.com/dcsobral/users

About

Tätä dokumenttia saa kopioida ja muokata GNU General Public License (versio 2 tai uudempi) mukaisesti.
http://www.gnu.org/licenses/gpl.html
Pohjana Tero Karvisen Linux-kurssi, www.iki.fi/karvinen

About these ads

Avainsanat: , , , ,

Yksi vastaus kohteelle “Läksy w48: Oman Puppet modulin toteuttaminen”

  1. Läksy w49: Oman Puppet modulin julkaiseminen « eliimatt sanoo:

    [...] Raportteja ja harjoitustehtäviä Haaga-Helia AMK kursseista « Läksy w48: Oman Puppet modulin toteuttaminen [...]

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

You are commenting using your WordPress.com account. Log Out / Muuta )

Twitter-kuva

You are commenting using your Twitter account. Log Out / Muuta )

Facebook-kuva

You are commenting using your Facebook account. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s


Seuraa

Get every new post delivered to your Inbox.