Назад | Перейти на главную страницу

Настройка PAM с Augeas

Я пытаюсь использовать Augeas для настройки файлов в моем каталоге /etc/pam.d при установке Ubuntu 14.04 по умолчанию. Моя цель - найти все узлы, у которых есть аргумент nullok или nullok_secure, и удалить эти аргументы из конфигурации. В конечном итоге это будет реализовано Puppet, но в настоящее время я работаю над настройкой с помощью augtool на локальном компьютере.

Из всего, что я прочитал, следующие выражения ДОЛЖНЫ давать мне узлы с nullok и nullok_secure:

augtool print /files/etc/pam.d/*/*/argument[../argument = 'nullok']
augtool print /files/etc/pam.d/*/*/argument[../argument = 'nullok_secure']

Или поочередно:

augtool print /files/etc/pam.d/*/*/argument[. = 'nullok']
augtool print /files/etc/pam.d/*/*/argument[. = 'nullok_secure']

К сожалению, это меня ни к чему не приводит, и я даже не могу понять, почему. Это augtool print из известных мне файлов имеет аргумент (с удаленными комментариями для краткости):

/files/etc/pam.d/common-auth
/files/etc/pam.d/common-auth/1
/files/etc/pam.d/common-auth/1/type = "auth"
/files/etc/pam.d/common-auth/1/control = "[success=2 default=ignore]"
/files/etc/pam.d/common-auth/1/module = "pam_unix.so"
/files/etc/pam.d/common-auth/1/argument = "nullok_secure"
/files/etc/pam.d/common-auth/2
/files/etc/pam.d/common-auth/2/type = "auth"
/files/etc/pam.d/common-auth/2/control = "[success=1 default=ignore]"
/files/etc/pam.d/common-auth/2/module = "pam_lsass.so"
/files/etc/pam.d/common-auth/2/argument = "try_first_pass"
/files/etc/pam.d/common-auth/3
/files/etc/pam.d/common-auth/3/type = "auth"
/files/etc/pam.d/common-auth/3/control = "requisite"
/files/etc/pam.d/common-auth/3/module = "pam_deny.so"
/files/etc/pam.d/common-auth/4
/files/etc/pam.d/common-auth/4/type = "auth"
/files/etc/pam.d/common-auth/4/control = "required"
/files/etc/pam.d/common-auth/4/module = "pam_permit.so"
/files/etc/pam.d/common-auth/5
/files/etc/pam.d/common-auth/5/type = "auth"
/files/etc/pam.d/common-auth/5/control = "optional"
/files/etc/pam.d/common-auth/5/module = "pam_cap.so"

Что мне здесь не хватает? Разве эти команды не должны давать мне узлы, которые я ищу?

Во-первых, два перечисленных вами выражения не являются строго эквивалентными.

/files/etc/pam.d/*/*/argument[../argument = 'nullok']

выбирает argument узлы 2 уровня под /files/etc/pam.d которые имеют argument родственный узел (или они сами) со значением, установленным на nullok, в то время как

/files/etc/pam.d/*/*/argument[. = 'nullok']

выбирает argument узлы 2 уровня под /files/etc/pam.d со значением, установленным на nullok (но не их братьев и сестер, если таковые имеются).

Теперь проблема в том, что argument узлы, которые вы пытаетесь сопоставить, на самом деле 3 уровни ниже /files/etc/pam.d, а не 2, поэтому вам понадобится другой уровень /*.

Самый простой способ избежать подсчета уровней - сопоставить на любом уровне, используя // вместо:

/files/etc/pam.d//argument[.='nullok']

Тем не менее, я не знаю, что вы планируете с этим делать, но вы, возможно, захотите узнать, что есть Провайдер Puppet на базе Augeas для управления записями PAM, что может быть намного проще, чем повторная реализация собственного решения.

Поработав с некоторыми вещами в IRC-комнате Augeas, оказалось, что моя проблема была просто синтаксической ошибкой. При использовании "augtool print" напрямую (без перехода в приглашение augtool>) пути должны быть заключены в кавычки. Смысл,

augtool print /files/etc/pam.d/*/*/argument[. = 'nullok_secure']

Не получится, но:

augtool print '/files/etc/pam.d/*/*/argument[. = "nullok_secure"]'

Дает правильные результаты. Кроме того, если вы зайдете в командную строку augtool, команда будет работать правильно, даже без кавычек:

$ augtool
augtool> print /files/etc/pam.d/*/*/argument[. = 'nullok_secure']