Bug 33163

Summary: Смена Kerberos-пароля для pam_krb5
Product: Sisyphus Reporter: Evgeny Sinelnikov <sin>
Component: pam-configAssignee: Evgeny Sinelnikov <sin>
Status: ASSIGNED --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: aen, cas, ekorneechev, iv, ldv, nbr, placeholder, vaa
Version: unstable   
Hardware: all   
OS: Linux   

Description Evgeny Sinelnikov 2017-02-22 13:34:26 MSK
При текущих настройках, по-умолчанию, вместо kerberos-пароля изменяется локальный. Команда passwd сразу запрашивает локальный пароль и, если задать локальный пароль неверно, то следом запрашивается Kerberos-пароль. Если Kerberos-пароль указать верно, что изменяется только локальный пароль.

Поведение аналогично как для control system-auth krb5, так и для control system-auth krb5_ccreds.

[sin@tor src]$ passwd
Changing password for sin.
Enter current password: 
Current Kerberos password: 

You can now choose the new password or passphrase.

A valid password should be a mix of upper and lower case letters,
digits, and other characters.  You can use an 8 character long
password with characters from at least 3 of these 4 classes, or
a 7 character long password containing characters from all the
classes.  An upper case letter that begins the password and a
digit that ends it do not count towards the number of character
classes used.

A passphrase should be of at least 3 words, 11 to 40 characters
long, and contain enough different characters.

Alternatively, if no one else can see your terminal now, you can
pick this as your password: "Fasten3anchor7brisk".

Enter new password: 
Re-type new password: 
passwd: all authentication tokens updated successfully.

[sin@tor src]$ passwd
Enter current password: 
Current Kerberos password: 


Частично проблема решается вот таким исправлением /etc/pam.d/system-auth-krb5:
diff --git a/pam-config/system-auth-krb5 b/pam-config/system-auth-krb5
index f52bf8e..b883eed 100644
--- a/pam-config/system-auth-krb5
+++ b/pam-config/system-auth-krb5
@@ -10,9 +10,9 @@ account               required        pam_krb5.so
 account                required        pam_permit.so
 
 password       required        pam_passwdqc.so config=/etc/passwdqc.conf
-password       [success=2 default=ignore]      pam_tcb.so use_authtok shadow fork prefix=$2y$ count=8 nullok write_to=tcb
 password       requisite       pam_succeed_if.so uid >= 500 quiet
 password       required        pam_krb5.so use_authtok
+password       [success=2 default=ignore]      pam_tcb.so use_authtok shadow fork prefix=$2y$ count=8 nullok write_to=tcb
 
 session                [success=2 default=ignore]      pam_tcb.so
 session                requisite       pam_succeed_if.so uid >= 500 quiet


При этом сначала запрашивается Kerberos-пароль, а локальный пароль можно задать любой.

[sin@tor ~]$ sudo tail /var/log/secure -f
...
^Z
[1]+  Stopped                 sudo tail /var/log/secure -f
[sin@tor ~]$ bg
[1]+ sudo tail /var/log/secure -f &
[sin@tor ~]$ sudo tail /var/log/messages -f
...
^Z
[2]+  Stopped                 sudo tail /var/log/messages -f
[sin@tor ~]$ bg
[2]+ sudo tail /var/log/messages -f &

[sin@tor ~]$ passwd
Current Kerberos password: 
Changing password for sin.
Enter current password: 

You can now choose the new password or passphrase.

A valid password should be a mix of upper and lower case letters,
digits, and other characters.  You can use an 8 character long
password with characters from at least 3 of these 4 classes, or
a 7 character long password containing characters from all the
classes.  An upper case letter that begins the password and a
digit that ends it do not count towards the number of character
classes used.

A passphrase should be of at least 3 words, 11 to 40 characters
long, and contain enough different characters.

Alternatively, if no one else can see your terminal now, you can
pick this as your password: "grand*Herd_Knee".

Enter new password: Feb 22 13:53:53 tor passwd[5302]: pam_tcb(passwd:chauthtok): Authentication failed for sin from sin(uid=500), for password management

Re-type new password: 
Feb 22 13:54:09 tor passwd[5302]: pam_krb5(passwd:chauthtok): user sin changed Kerberos password
Feb 22 13:54:09 tor passwd[5302]: pam_tcb(passwd:chauthtok): Password for sin changed by sin(uid=500)
Feb 22 13:54:09 tor passwd[5302]: PAM bad jump in stack
passwd: Permission denied.

Лог сервера, при этом чист:
фев 22 13:53:33 base.darkmastersin.net krb5kdc[2803](info): AS_REQ (6 etypes {18 17 16 23 25 26}) 2a02:2698:7020:2::19: ISSUE: authtime 1487757213, etypes {rep=23 tkt=23 ses=23}, sin@DARKMASTERSIN.NET for kadmin/changepw@DARKMASTERSIN.NET
фев 22 13:54:09 base.darkmastersin.net kadmind[20267](Notice): chpw request from 2a02:2698:7020:2::19%99 for sin@DARKMASTERSIN.NET: success
Comment 1 Evgeny Sinelnikov 2017-02-23 15:27:18 MSK
Внёс исправления, Kerberos-пароль меняется.
Поправил UI-утилиты userpasswd.

$ ssh girar task ls
#178548 BUILDING #1 [locked] sisyphus pam-config.git=1.7.1-alt1 userpasswd.git=0.3.0-alt1%ubt
Comment 2 Dmitry V. Levin 2017-02-23 17:11:59 MSK
(In reply to comment #1)
> Внёс исправления, Kerberos-пароль меняется.
> Поправил UI-утилиты userpasswd.
> 
> $ ssh girar task ls
> #178548 BUILDING #1 [locked] sisyphus pam-config.git=1.7.1-alt1

Это изменение неправильное.

Вы поставили
password       requisite       pam_succeed_if.so uid >= 500 quiet
перед pam_krb5.so и pam_tcb.so, следовательно, для uid < 0 будет FAIL.

Вы перенесли
password       [success=2 default=ignore]
в конец стека, это как вообще?
Comment 3 Dmitry V. Levin 2017-02-24 01:29:26 MSK
(In reply to comment #1)
> userpasswd.git=0.3.0-alt1%ubt

А зачем fdatasync? Неужели вы пишете в блочное устройство?

Странно, что userpasswd вообще потребовались такие значительные изменения.

Понятно, что у каждого модуля аутентификации свой prompt, но почему возникла необходимость менять конечный автомат, непонятно.
Comment 4 Evgeny Sinelnikov 2017-02-24 15:05:23 MSK
> Вы поставили
> password       requisite       pam_succeed_if.so uid >= 500 quiet
> перед pam_krb5.so и pam_tcb.so, следовательно, для uid < 0 будет FAIL.
> 
> Вы перенесли
> password       [success=2 default=ignore]
> в конец стека, это как вообще?

Да, тут нужно разобраться и поправить. [success=2 default=ignore] в конце - что-то странное.

Вообще, зачем применять такую связку?
 password       required        pam_passwdqc.so config=/etc/passwdqc.conf
 password       [success=2 default=ignore]      pam_tcb.so use_authtok shadow
fork prefix=$2y$ count=8 nullok write_to=tcb
 password       requisite       pam_succeed_if.so uid >= 500 quiet
 password       required        pam_krb5.so use_authtok

Весь её смысл в том, что если Kerberos-пароль изменён успешно, то заменить,
заодно, и локальный пароль... Но нужно ли так делать???

Я бы, вообще, убрал такое поведение и добавил утилиты passwd.local в таком
виде:
# ln -s passwd /usr/bin/passwd.local
# cp /etc/pam.d/passwd /etc/pam.d/passwd.local

# cat /etc/pam.d/passwd.local
#%PAM-1.0
auth            include         system-auth-local
account         include         system-auth-local
password        include         system-auth-local
session         required        pam_deny.so

$ ls -l /usr/bin/passwd.local 
lrwxrwxrwx 1 root root 6 фев 24 15:20 /usr/bin/passwd.local -> passwd

А в userpasswd добавил опцию -l/--local. Как вам такая идея?


> А зачем fdatasync? Неужели вы пишете в блочное устройство?

Были рейсы на уровне вычитывания, создалось впечатление, что это их исправило.

> Странно, что userpasswd вообще потребовались такие значительные изменения.

Ну, если всё виснет из-за того, что вместо одного запроса на пароль, приходит два, то как быть иначе? Второй запрос на текущий пароль в автомате не предусмотрен.
Comment 5 Dmitry V. Levin 2017-02-25 02:17:44 MSK
(In reply to comment #4)
> > Вы поставили
> > password       requisite       pam_succeed_if.so uid >= 500 quiet
> > перед pam_krb5.so и pam_tcb.so, следовательно, для uid < 0 будет FAIL.
> > 
> > Вы перенесли
> > password       [success=2 default=ignore]
> > в конец стека, это как вообще?
> 
> Да, тут нужно разобраться и поправить. [success=2 default=ignore] в конце -
> что-то странное.
> 
> Вообще, зачем применять такую связку?
>  password       required        pam_passwdqc.so config=/etc/passwdqc.conf
>  password       [success=2 default=ignore]      pam_tcb.so use_authtok shadow
> fork prefix=$2y$ count=8 nullok write_to=tcb
>  password       requisite       pam_succeed_if.so uid >= 500 quiet
>  password       required        pam_krb5.so use_authtok
> 
> Весь её смысл в том, что если Kerberos-пароль изменён успешно, то заменить,
> заодно, и локальный пароль... Но нужно ли так делать???

Тут написано другое: сперва поменять локальный пароль с помощью pam_tcb, а если это не получилось и uid >= 500, то поменять нелокальный пароль с помощью pam_krb5.  Странно если это не работает.

> > Странно, что userpasswd вообще потребовались такие значительные изменения.
> 
> Ну, если всё виснет из-за того, что вместо одного запроса на пароль, приходит
> два, то как быть иначе? Второй запрос на текущий пароль в автомате не
> предусмотрен.

По идее, не должно приходить два разных запроса на пароль, зачем?
Где-то что-то не так, если это происходит.
Comment 6 Evgeny Sinelnikov 2017-02-25 14:03:02 MSK
> > Весь её смысл в том, что если Kerberos-пароль изменён успешно, то заменить,
> > заодно, и локальный пароль... Но нужно ли так делать???
> 
> Тут написано другое: сперва поменять локальный пароль с помощью pam_tcb, а
> если это не получилось и uid >= 500, то поменять нелокальный пароль с помощью
> pam_krb5.  Странно если это не работает.

Ну, так не пойдёт. А если я, вообще, не хочу менять локальный пароль? И, при этом, пароли совпадают? Это какое-то странное непредсказуемое поведение.

К тому же... "если это не получилось и uid >= 500", то проверяется глобальный пароль, а изменяется, всё равно локальный. Я думаю так получается, потому что модуль pam_tcb стоит первым в связке на последующую операцию, после проверки пароля. Это, конечно, пока догадка, но она согласуется с практикой. Поэтому ничего странного в этом нет - каждый этап операции смены пароля (проверка текущего и ввод нового паролей) проходит всю цепочку модулей заново.

> > > Странно, что userpasswd вообще потребовались такие значительные изменения.
> > 
> > Ну, если всё виснет из-за того, что вместо одного запроса на пароль,
> > приходит два, то как быть иначе? Второй запрос на текущий пароль в
> > автомате не предусмотрен.
> 
> По идее, не должно приходить два разных запроса на пароль, зачем?
> Где-то что-то не так, если это происходит.

Ну, оно так, при текущих настройках для всех модулей - pam_krb5, pam_sss, pam_winbind. Так что проблема именно в настройках.

Давайте, в деталях разбирём текующую настройку смены глобального пароля для модуля pam_krb5.

 password       required        pam_passwdqc.so config=/etc/passwdqc.conf
 password       [success=2 default=ignore]      pam_tcb.so use_authtok shadow
fork prefix=$2y$ count=8 nullok write_to=tcb
 password       requisite       pam_succeed_if.so uid >= 500 quiet
 password       required        pam_krb5.so use_authtok

Шаг первый - модуль required pam_passwdqc.so - локальная проверка на качество пароля. Применяется, как локальная политика на данном узле, но для глобального пароля. Сомнительный вариант, если на других узлах политика ослаблена (можно сменить на другом узле). Кроме того, политика перекрывает политику глобального сервиса (у KDC есть свои настройки на качество пароля). Например, похожесть нового пароля на предыдущие.

Шаг второй - в нём основная странность. Попытка проверки локального пароля и последующая смена локального же пароля, если проверка прошла удачно (два последующих модуля, при этом, вообще, пропускаются). Для чего это, вообще, надо, если задача сменить глобальный пароль?

Шаг третий - проверка uid'a. Если текущий локальный пароль не подошёл, то выполняется попытка проверки текущего пароля осуществляется только для пользователей с uid'ов больше или равных 500.

Шаг четвертый - выполняется проверка глобального пароля. При этом дальнейшая смена пароля, все равно, выполняется локально.

Насколько я понял важен порядок следования модулей (плюс флаг use_authtok, конечно). Если модуль pam_krb5 поставить перед модулем pam_tcb, то глобальный пароль меняется. При этом, сначала запрашивается Kerberos-пароль, а потом локальный.
Comment 7 Evgeny Sinelnikov 2017-03-02 09:08:56 MSK
Я попытался поменять порядок.

Сначала попробовал так:
password        [success=ok default=2]  pam_succeed_if.so uid >= 500 quiet
password        sufficient      pam_krb5.so use_authtok
password        required        pam_passwdqc.so config=/etc/passwdqc.conf
password        sufficient      pam_tcb.so use_authtok shadow fork prefix=$2y$ count=8 nullok write_to=tcb
password        required        pam_deny.so

[sin@tor pam-config]$ passwd 
Current Kerberos password:
....
Enter new password: 
Re-type new password: 
passwd: all authentication tokens updated successfully.
[sin@tor pam-config]$ kinit
Password for sin@DARKMASTERSIN.NET: 
kinit: Password incorrect while getting initial credentials

Kerberos-пароль не поменялся.

Потом попробовал так (убрал use_authtok для pam_krb5.so):
password        [success=ok default=2]  pam_succeed_if.so uid >= 500 quiet
password        sufficient      pam_krb5.so
password        required        pam_passwdqc.so config=/etc/passwdqc.conf
password        sufficient      pam_tcb.so use_authtok shadow fork prefix=$2y$ count=8 nullok write_to=tcb
password        required        pam_deny.so

[sin@tor pam-config]$ passwd
Current Kerberos password: 
Enter new Kerberos password: 
Retype new Kerberos password: 
passwd: all authentication tokens updated successfully.
[sin@tor pam-config]$ kinit
Password for sin@DARKMASTERSIN.NET: 

Kerberos-Пароль поменялся. При этом (без use_authok) Kerberos-пароль запрашивается снова, когда отрабатывает локальный:

[sin@tor pam-config]$ passwd
Current Kerberos password: 
Changing password for sin.
Enter current password: 
Current Kerberos password:
...