ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Evgeny Sinelnikov <sin@altlinux.org>
To: ALT Linux Team development discussions <devel@lists.altlinux.org>
Subject: [devel] PAM-политики (модуль sss и служба sssd)
Date: Sat, 17 Jun 2017 12:22:46 +0400
Message-ID: <CAK42-GqyXjCpK6DytmNpSV+oiUL96A-9wFstKjYV8XJ3xnkM3g@mail.gmail.com> (raw)

Здравствуйте,

хочу продолжить тему PAM-политик на примере модуля sss и службы sssd.
Общий взгляд на эту тему я уже приводил:
https://lists.altlinux.org/pipermail/devel/2017-June/202807.html

Теперь хотелось бы оттолкнуться от задачи и решить её в частном случае
для sssd. Вот, что мы имеем сейчас:

#%PAM-1.0
auth            required        pam_env.so
auth            [success=ignore default=1]      pam_localuser.so
auth            [success=done default=ignore]   pam_tcb.so shadow fork
prefix=$2y$ count=8 nullok
auth            requisite       pam_succeed_if.so uid >= 500 quiet
auth            required        pam_sss.so

account         [success=ignore default=1]      pam_localuser.so
account         [success=done default=ignore]   pam_tcb.so shadow fork
account         requisite       pam_succeed_if.so uid >= 500 quiet
account         required        pam_sss.so

password        [success=ignore default=2]      pam_localuser.so
password        required        pam_passwdqc.so config=/etc/passwdqc.conf
password        [success=done 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_sss.so

session         [success=ignore default=1]      pam_localuser.so
session         [success=2 default=ignore]      pam_tcb.so
session         requisite       pam_succeed_if.so uid >= 500 quiet
session         required        pam_sss.so
session         required        pam_mktemp.so
session         required        pam_mkhomedir.so silent
session         required        pam_limits.so

Вот, что я предложил, в первом приближении:

#%PAM-1.0
auth            required        pam_env.so
auth            [success=ignore default=1]      pam_localuser.so
auth            [success=done default=ignore]   pam_tcb.so shadow fork
prefix=$2y$ count=8 nullok
auth            requisite       pam_succeed_if.so uid >= 500 quiet
auth            required        pam_sss.so

account         [success=ignore default=1]      pam_localuser.so
account         [success=done default=ignore]   pam_tcb.so shadow fork
account         requisite       pam_succeed_if.so uid >= 500 quiet
account         required        pam_sss.so

password        [success=ignore default=2]      pam_localuser.so
password        required        pam_passwdqc.so config=/etc/passwdqc.conf
password        [success=done 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_sss.so

session         [success=ignore default=1]      pam_localuser.so
session         [success=2 default=ignore]      pam_tcb.so
session         requisite       pam_succeed_if.so uid >= 500 quiet
session         required        pam_sss.so
session         required        pam_mktemp.so
session         required        pam_mkhomedir.so silent
session         required        pam_limits.so

А вот как это устроено в CentOS 7.3

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        [default=1 success=ok] pam_localuser.so
auth        [success=done ignore=ignore default=die] pam_unix.so
nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass
local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok
try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in
crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

Давайте разбираться. Что мы можем, чего хотим и какие политики для этого строим.

1) Во-первых, мы не хотим путаться меджу локальными и глобальными
пользователями. Для этого мы применяем модуль pam_localuser.so. Если
пользователь имеется в /etc/passwd, то он считается локальным. Для
негибридного домена (о гибридном домене см. следующий разбор
PAM-политики krb5) этого достаточно.

Но как быть в случае конфликта? А никак. Или, точнее, как в NT -
обращаться по тому или иному допустимому полному имени пользователя
включающего имя домена.

Но вот, что меня смутило (и это надо проверить). В CentOS, в отличии
от моего варианта локальные политики учётных записей применяются
(секция account, модуль pam_unix.so) применяются для всех
пользователей, без разбора. И в этом есть своя логика. Здесб нужно
разобраться что у нас c tcb на этот счёт? Также делаем?

Ещё один момент PAM-политики учётных записей (account) - это
применение политик глобальных учётных записей только для несистемных
локальных пользователей, даже если их uid'ы забиты в LDAP. Это
интересный, не очевидный момент. Думаю стоит перенять.

2) Во-вторых, политика смены пароля у них (то есть в CentOS) к
путанице приводит. Это видно из логики настроек секции password и на
практике подтверждается. Если пользователь локальный вводит
неправильный текущий пароль, то ему предлагается ввести глобальный
пароль:
[mastersin@server ~]$ passwd
Changing password for user mastersin.
Changing password for mastersin.
(current) UNIX password:
Current Password:
passwd: Authentication token manipulation error
[mastersin@server ~]$ id
uid=1000(mastersin) gid=1000(mastersin) groups=1000(mastersin)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Очевидно, что это не логично и так мы делать не будем.

3) Во-третьих, настройка сессии. в CentOS она в включает в себя
дополнительные модули. Думаю у нас keyutils стоит включить вот так
(ну, так же, как systemd - если имеется в наличии):
-session     optional      pam_keyinit.so revoke

В CentOS имеется также весьма неожиданное правило, по которому для
службы crond, пропускается установка pam_unix сеанса, но не сеанса
pam_sss:
session     [success=1 default=ignore] pam_succeed_if.so service in
crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

Получается вот такой гибрид, который я попытался с ходу проверить и отладить:

#%PAM-1.0
auth            required        pam_env.so
auth            [success=ignore default=1]      pam_localuser.so
auth            sufficient      pam_tcb.so shadow fork prefix=$2y$
count=8 nullok
auth            requisite       pam_succeed_if.so uid >= 500 quiet
auth            required        pam_sss.so

account         required      pam_tcb.so shadow fork
account         sufficient    pam_localuser.so
account         sufficient    pam_succeed_if.so uid < 500 quiet
account         [default=bad success=ok user_unknown=ignore] pam_sss.so
account         required      pam_permit.so

password        [success=ignore default=2]      pam_localuser.so
password        required     pam_passwdqc.so config=/etc/passwdqc.conf
password        [success=done default=bad]   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_sss.so

-session        optional      pam_keyinit.so revoke
-session        optional      pam_systemd.so
session         [success=ignore default=1]      pam_localuser.so
session         [success=2 default=ignore]      pam_tcb.so
session         requisite       pam_succeed_if.so uid >= 500 quiet
session         required        pam_sss.so
session         required        pam_mktemp.so
session         required        pam_mkhomedir.so silent
session         required        pam_limits.so

Выяснилось, что tcb модуль для глобальных пользователей не отрабатывает:
[vagrant@client ~]$ su - administrator
Password:
su: Insufficient credentials to access authentication data

Также выяснилось, что сеанс tcb всё равно вытается применится для
глобального пользователя:
WARNING: could not close session
        Permission denied

Итого, исправленный вариант, который я сейчас отлаживаю выглдядит
следующим образом:

#%PAM-1.0
auth            required        pam_env.so
auth            [success=ignore default=1]      pam_localuser.so
auth            [success=done default=bad]      pam_tcb.so shadow fork
prefix=$2y$ count=8 nullok
auth            requisite       pam_succeed_if.so uid >= 500 quiet
auth            required        pam_sss.so

account         [success=ignore default=1]      pam_localuser.so
account         [success=done default=bad]      pam_tcb.so shadow fork
account         sufficient      pam_succeed_if.so uid < 500 quiet
account         [default=bad success=ok user_unknown=ignore]    pam_sss.so
account         required        pam_permit.so

password        [success=ignore default=2]      pam_localuser.so
password        required        pam_passwdqc.so config=/etc/passwdqc.conf
password        [success=done default=bad]      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_sss.so

-session        optional        pam_keyinit.so revoke
-session        optional        pam_systemd.so
session         [success=1 default=ignore]      pam_localuser.so
session         [success=1 default=1]   pam_sss.so
session         optional        pam_tcb.so
session         required        pam_mktemp.so
session         required        pam_mkhomedir.so silent
session         required        pam_limits.so

Логин работает, смена пароля отрабатывает, глобальные и локальные
политики не смешиваются. В таком же виде нужно обработать
system-auth-use_first_pass-sss для не интерактивных приложений.
Например, sshd сам принимает по сети пароль и программно передаёт его
в стек PAM.


-- 
Sin (Sinelnikov Evgeny)

             reply	other threads:[~2017-06-17  8:22 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-17  8:22 Evgeny Sinelnikov [this message]
2017-06-17 10:38 ` Evgeny Sinelnikov
2017-06-19 10:00   ` Evgeny Sinelnikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAK42-GqyXjCpK6DytmNpSV+oiUL96A-9wFstKjYV8XJ3xnkM3g@mail.gmail.com \
    --to=sin@altlinux.org \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git