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
- 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
- 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