Změna priority pam modulu

From DCEwiki
Jump to: navigation, search

Následují příklad řeší situaci, kdy je potřeba prostřednictvím Puppetu změnit řádek v textovém souboru. V tomto konkrétním případě snížení priority pam modulu, který ověřuje heslo přes Kerberos.

Upozornění Konfigurační soubory pro pam moduly nelze upravovat přímo v adresáři /etc/pam.d, neboť jeho obsah se generuje prostřednictvím utility pam-auth-update podle konfiguračních souborů v adresáři /usr/share/pam-configs. Proto musí být součástí konfigurace typ exec, který lze volat po případné změně konfigurace pam modulu.

Jak vypadá obsah konfiguračního souboru pam modulu je v následujícím ukázkovém kódu zřejmé parametru content u typu file, který na straně agenta vytvoří soubor /usr/share/pam-configs/scripts na jehož základě se v pam modulech generuje nastavení, které zajišťuje spuštění skriptů z adresáře /etc/pam-scripts.

Součástí tohoto konfiguračního souboru je parametr Priority, který rozhoduje o pořadí modulů. Jelikož se skript pam_script_ses_open má spouštět až po úspěšné autorizaci uživatele a pam_script_ses_close před odhlášením uživatele, má nastavenu prioritu velmi nízkou (10).

Priorita autorizačních modulů je vyšší:

  • lokální autorizace má výchozí prioritu 256
  • autorizace přes ldap má prioritu 128
  • autorizace přes krb5 má výchozí prioritu 704

Z těchto hodnot je zřejmé, že nejprve se systém pokusí autorizovat před Kerberos, pak přes ldap a nakonec lokálně. Za určitých okolností však může být autorizace přes Kerberos problematická, protože vyžaduje konektivitu přes UDP port. Není-li konektivita přes UDP k dispozici, přejde systém na další autorizační mechanismus až po uplynutí určitého intervalu. Aby uživatel zbytečně nečekal, je proto lepší změnit pořadí autorizačních mechanismů úpravou hodnoty parametru Priority ve výchozím konfiguračním souboru /usr/share/pam-configs/krb5.

Poznámka K úpravě konfiguračního souboru se využívá editor ed, který pracuje přímo s konfiguračním souborem a zároveň se dá dobře skriptovat.
Poznámka
package { [ 'ed', 'libpam-krb5', 'libpam-script' ]:
    ensure => present,
    }

exec {'pam-auth-update':
    path => "/bin:/sbin:/usr/bin:/usr/sbin",
    command => "pam-auth-update"
    }

file {"/usr/share/pam-configs/scripts":
    # Konfigurační skript pro PAM
    ensure => present,
    owner => root,
    group => root,
    mode => 644,
    content => '
Name: Session Script Management
Default: yes
Priority: 10
Session-Interactive-Only: yes
Session-Type: Additional
Session-Final:
        optional	pam_script.so dir=/etc/pam-scripts
',
    notify => Exec['pam-auth-update'],
    require => Package['libpam-scripts'],
    }

exec { "krb5-update":
    path => "/usr/bin:/usr/sbin:/bin:/usr/local/bin:/usr/local/sbin",
    command => "ed /usr/share/pam-configs/krb5 2>/dev/null <<-EOF
/Priority
d
i
Priority: 128
.
w
q
EOF
",
    onlyif => "test 0 -eq $(grep -c 'Priority: 128' /usr/share/pam-configs/krb5)",
    notify => Exec['pam-auth-update'],
    require => Package['ed','libpam-krb5'],
    logoutput => true,
    }

Aby se typ exec nespouštěl při každém průchodu, ale pouze tehdy, nebude-li hodnota Priority jiná než 128, musí být jeho součástí parametr onlyif. Jeho součástí je podmínka, která vrací hodnotu false pouze pokud příkaz grep v uvedeném konfiguračním souboru nenajde řetězec 'Priority: 128'

V případě že se tak stane, dojde k editaci souboru a po ní se postará parametr notify o zavolání příkazu pam-auth-update, který přegeneruje soubory v adresáři /etc/pam.d. Parametr require zajistí, potřebné soubory a utility v systému existovaly ještě aby před spuštěním příkazu k editaci.