У меня есть четыре правила PAM
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=0
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=0
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=0`
, которые необходимо добавить в файлы PAM /etc/pam.d/system-auth-ac
и /etc/pam.d/password-auth-ac
, но с соблюдением следующих условий:
1), если запись PAM ужедоступно, но с другим значением deny
или unlock_time
, его необходимо сбросить на значения deny=5
и unlock_time=0
соответственно;
2), если правило PAM вообще не доступно во всем файлезатем эта запись должна быть вставлена над первой / начальной auth
записью правила в файле.
Я пробовал использовать следующий код:
files = [
"/etc/pam.d/system-auth-ac",
"/etc/pam.d/password-auth-ac"
]
rules = [
"auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=0",
"auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=0",
"auth [success=1 default=bad] pam_unix.so",
"auth required pam_faillock.so preauth audit silent deny=5 unlock_time=0"
]
for file in files:
for rule in rules:
flag = 0
regexrule = re.sub(r'([\[\]])', r'\\\1', rule)
grepRule = re.sub(r'deny=5', 'deny=.*', regexrule)
params = subprocess.Popen("egrep \'%s\' %s"%(regexrule, file), stdout=subprocess.PIPE, shell=True).communicate()[0].split("\n")
if len(params) == 1:
for pamd in fileinput.FileInput(file, 'inplace=1'):
if re.match(r'auth\s+required\s+pam_tally2.so', pamd):
continue
if re.match(grepRule, pamd) and not flag:
pamd = rule
flag = 1
elif pamd.startswith("auth") and not flag:
pamd = rule + "\n" + pamd
flag = 1
print pamd.strip()
Он вставляет повторяющиеся записи PAM, когда любойзначения параметра отличается от указанного мной (вместо замены значений).
Также приведенный выше код является беспорядком, и я хочу получить элегантное решение проблемы.