Mountování uživatelských adresářů v prostředí diskless overlay

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Původně bylo připojení uživatelských adresářů realizováno tím nejjednodušším možným způsobem - připojením celého adresáře s domovskými adresáři. To sebou ovšem přinášelo rizika a problémy:

  • zdlouhavé vylistování adresáře /home na klientské stanici
  • potencionální možnost vykradení domovského adresáře jiným uživatelem

Nyní to funguje takto:

  1. Uživatel se na klientské stanici ověří a PAM spustí skript, který založí domovský adresář uživatele jako tzv. mountpoint a pak se do něj pokusí namountovat vzdálený domovský adresář uživatele.
  2. Pokud se mu to nepodaří, tak s největší pravděpodobností proto, že tento domovský adresář na vzdáleném NFS serveru zatím neexistuje. Proto se skript k tomuto NFS serveru přihlásí přes ssh na uživatele nfshomecreator. Proces login ovšem u tohoto uživatele nespouští shell, jako by tomu bylo obvyklé u běžných uživatelů, ale skript. Ten zpracuje parametry předané přes ssh klienta a na jejich základě ve sdíleném adresáři příslušný domovský adresář založí.
  3. Skript na bezdiskové stanici se potom pokusí zopakovat připojení domovského adresáře.
  4. Pokud se mu to ani potom nepodaří, přihlášení normálně pokračuje, pouze s tím rozdílem, že je domovský adresář uživatele součástí překrytého disku, který je pouze v paměti klientské stanice. Tudíž po restartu zase nenávratně zmizí! Z tohoto důvodu PAM skript v takovém případě vygeneruje soubor s upozorněním, že jde pouze o dočasný adresář.

Ačkoliv jde v zásadě o velmi jednoduché řešení, vyžaduje koordinaci skriptu a konfigurace bezdiskové stanice s nastavením na NFS serveru. Z tohoto hlediska je velmi výhodné, jsou-li obě strany spravovány přes Puppet

Založení uživatele nfshomecreator na straně NFS serveru

Pokud postupujeme manuálně, tak uživatele nfshomecreator založíme následující sekvencí příkazů:

Poznámka
NFS (DATASERVER) :~# adduser --system --home /etc/pam-scripts --shell /etc/pam-scripts/createhome.sh --ingroup nogroup nfshomecreator
NFS (DATASERVER) :~# addgroup nfshomecreator users
NFS (DATASERVER) :~# passwd nfshomecreator
...

Založení uživatele nfshomecreator přes puppet

Poznámka
	user { 'nfshomecreator':
		ensure => present,
		uid => 90,
		gid => 'nogroup',
		groups => 'users',
		home => '/etc/pam-scripts',
		managehome => true,
		shell => '/etc/pam-scripts/createhome.sh',
		password => '$7$MxShiP62$tWawoL7u39iwUi9fEQWe5JDgGW9eBHp2T94QR4dmHCckQpeAxD4SilExyZ2v1jfYa9qbtLo/ztW8KvnAzTxC./',
		}
	}

Poznámky

  • Pokud je kód pro založení uživatele nfshomecreator součástí univerzálního modulu pro zakládání uživatelů, je vhodné ho umístit do podmínky, tak aby se vytvořil pouze na stroji k tomu určeném
  • Ač by se nastavení hesla (v kódu puppetu parametr password) z hlediska fungování mohl jevit zbytečný, protože se klient vůči serveru autorizuje klíčem, ssh server ho vyžaduje. Pokud může jako NFS server fungovat více strojů, tak nezáleží jaké heslo tento uživatel na nich má, ale musí ho mít.

Skript createhome.sh uživatele nfshomecreator

V parametrem atributu shell je místo obvyklého shellu cesta k shellovému skriptu, který se stará o vlastní vytvoření adresáře. Tento skript je umístěn v domovském adresáři uživatele nfshomecreator a má následující obsah:

Poznámka
#!/bin/bash

TEMPORARY="$2"
NFSUSER="${TEMPORARY%%\ *}"
NFSDIR="${TEMPORARY#$NFSUSER\ }"

if [ -d "$NFSDIR" ]; then
    if [ "$(grep "^$NFSDIR[[:blank:]]" /etc/exports)" != "" ]; then
        if [ ! -d "$NFSDIR/$NFSUSER" ]; then
            mkdir "$NFSDIR/$NFSUSER"
            chmod -c 775 "$NFSDIR/$NFSUSER"
            chgrp -c users "$NFSDIR/$NFSUSER"
        fi
    fi
fi

Jeho volání z disklessové stanice pak vypadá takto:

Poznámka
stroj (diskless) :~# ssh nfshomecreator@NFS newusername /path_to_directory_with_homes

Skript převezme parametry od ssh klienta:

newusername
Uživatelské jméno pro příslušný domovský adresář
/path_to_directory_with_homes
Cesta do adresáře s domovskými adresáři

Aby to fungovalo, musí být adresář /path_to_directory_with_homes nasdílený přes NFS, patřit uživateli root a být ve skupině nogroup (stejné jakou má uživatel nfshomecreator). Pro každého jiného uživatele musí mít nastaveno pouze právo spouštění - bez toho by se totiž, po namountování adresáře na disklessové stanici, do něj uživatel nedostal.

Poznámka
NFS (DATASERVER) :~# chown root.nogroup /path_to_directory_with_homes
NFS (DATASERVER) :~# chmod 731 /path_to_directory_with_homes

V případě tohoto skriptu je opět vhodné využít puppet, a vytvořit pro NFS modul, tak aby nebylo nutné skript, ani soubor /etc/exports kopírovat a příslušná práva řešit ručně. Oceníte to obzvláště v situaci, kdy jako NFS server může fungovat více strojů.

Poznámka
class nfs (
    $type = client,
    )   {
    case $type {
        'server': {
            package {'nfs-kernel-server':
                ensure => present,
            }
            case $hostname {
                'nfs1', 'nfs2', 'nfs3' : {
                    exec {"exportfs":
                        command => "/usr/sbin/exportfs -r",
                        refreshonly => true,
                        require => Package['nfs-kernel-server'],
                    }
                    file {"/etc/exports":
                        ensure => present,
                        owner => root,
                        group => root,
                        mode => 644,
                        source => "puppet:///modules/nfs/exports.source",
                        notify => Exec['exportfs'],
                    }
                    # Vytvoření adresářové struktury uživatele nfshomecreator
                    file {["/etc/pam-scripts", "/etc/pam-scripts/.ssh"]:
                        ensure => directory,
                        owner => nfshomecreator,
                        group => nogroup,
                        mode => 110,
                    }
                    # Nakopírování veřejného klíče uživatele root z disklessu
                    file {"/etc/pam-scripts/.ssh/authorized_keys":
                        ensure => present,
                        owner => nfshomecreator,
                        group => nogroup,
                        mode => 640,
                        source => "puppet:///modules/nfs/nfshomecreator.key",
                        require => File["/etc/pam-scripts/.ssh"],
                    }
                    # Nakopírování skriptu pro založení domovského adresáře
                    file {"/etc/pam-scripts/createhome.sh":
                        ensure => present,
                        owner => nfshomecreator,
                        group => root,
                        mode => 500,
                        source => "puppet:///modules/nfs/createhome.source",
                        require => File["/etc/pam-scripts"],
                    }
                }
            }
        }
        'client': {
            notify {"Instaluji nfs-common": }
            package {'nfs-common':
                ensure => present,
            }
        }
        default: {
            notify {"Modul pro NFS nemá nakonfigurován žádný typ $type": }
        }
    }
}

Součástí modulu v adresáři ./files jsou tyto soubory:

exports.source
seznam adresářů publikovaných přes NFS
createhome.source
skript pro zakládání adresářů
nfshomecreator.key
veřejný ssh klíč uživatele root z disklessu
Poznámka Adresář /path_to_directory_with_homes musí mít v souboru /etc/exports nastaven atribut root_squash, který zabraňuje jeho namountování.