[samba] Релиз gpupdate 0.6.0

Evgeny Sinelnikov sin на altlinux.org
Вс Май 17 03:58:47 MSK 2020


сб, 16 мая 2020 г. в 01:47, Mikhail Novosyolov <m.novosyolov на rosalinux.ru>:
>
> 16.05.2020 00:05, Mikhail Novosyolov пишет:
> > 15.05.2020 23:08, Igor Chudov пишет:
> >> Добрый день, коллеги.
> >>
> >> Рады представить Вам новый релиз пакета gpupdate ( https://github.com/altlinux/gpupdate ) - ПО для применения групповых политик. Пакеты для тестирования можно забрать из карманов: 241549 (для p9) или 241548 (для Sisyphus). Несложная пользовательская инструкция находится по адресу: https://www.altlinux.org/Групповые_политики
> >>
> >> В новом релизе появились следующие изменения:
> >>
> >> * Появился разбор файла Drives.xml и автоматическая настройка autofs для монтирования Samba shares с авторизацией по Kerberos.
> > А как вы решаете проблему, что для монтирования cifs с авторизацией по krb5 mount.cifs нужно передать KRB5CCACHE пользователя, который получил билет керберос, но билет керберос он получит уже после входа в систему через DM, когда как autofs начнет работать раньше?
> >
> > В шаблоне написано:
> > {{ drv.dir }}    -fstype=cifs,cruid=$AUTOFS_UID,sec=krb5    :{{ drv.path }}
> >
> > Но откуда mount.cifs, вызываемый autofs-ом, должен взять KRB5CCACHE?
>
> Вроде бы устанавливаемый вами параметр cruid работает так:
>
> - autofs передает cruid=UID_пользователя в mount.cifs
> - mount.cifs вызывает ядро, ядро вызывает cifs.upcall
> - cifs.upcall ищет переменную KR5CCACHE в /proc/<pid>/environ родительского процесса (и не находит ее)
> - cifs.upcall сбрасывает привелегии, делая setuid(cruid)
> - cifs.upcall просит librkb5 выдать ему ccache
>
> Таким образом, в любом случае в момент срабатывания autofs должен быть ccache krb5, т.е. пользователь должен залогиниться.
>
> Вы сами запускаете kinit, хотя kinit() обычно делается PAM-модулями, это перестраховка?

Да, если машина "в домене", то kinit отрабатывает автоматически.
Локальный пользователь может сделать себе kinit. Если у него будет
доступ к каталогу, где выполнено монтирование, то ключи будут взяты из
его кеша.


> И при этом из PAM вызывается генератор правил autofs, перезапускающий autofs.service из PAM? Но вижу, что kinit запускается при работе не от root, а значит не из PAM...
>
> А что будет, если другой пользователь первым попытается получить доступ к такой точке монтирования autofs? Она, скорее всего, успешно примонтируется с krb5cc другого пользователя, а как дальше будут разрулены права доступа к ней?

admin на gp ~ $ mount | grep sin
/etc/auto.master.gpupdate.d/S-1-5-21-1609667327-4120075585-2415302043-1110.conf
on /home/DOMAIN.ALT/sin/net type autofs
(rw,relatime,fd=11,pgrp=14013,timeout=120,minproto=5,maxproto=5,indirect,pipe_ino=1716868)

Всё правильно. Точка монтирования экслюзивно принадлежит пользователю
и поэтому располагается у него в домашнем каталоге.

Можно предусмотреть и другой вариант - использовать /var/run/net/$USERNAME/
Возможно, это стоит сделать настраиваемым. Тут момент простой - искать
шару у себя в каталоге проще.

______________________

Кроме того, обращаю ваше внимание на опцию multiuser. В наших
дистрибутивах всё уже давно готово к использованию:

Если подключить скриптовый /etc/auto.smb в точку монтирования /net
(всё из пакета autofs, респект майнтейнеру):
# echo "/net        /etc/auto.smb    -t 120" >>/etc/auto.master

demo ~ # grep multiuser /etc/auto.smb
        opts="$opts,multiuser,cruid=$AUTOFS_UID,sec=krb5"
demo ~ # mkdir /net
demo ~ # grep smb /etc/auto.master
/net        /etc/auto.smb    -t 120
demo ~ # service autofs restart
demo ~ # mount | grep smb
/etc/auto.smb on /net type autofs
(rw,relatime,fd=17,pgrp=7168,timeout=120,minproto=5,maxproto=5,indirect,pipe_ino=61461)

То доступ от пользователя будет работать автоматически через путь
/net/$HOST/$SHARE (броузинг тоже может, но это отдельная песня с
протоколом SMB1):

sin на demo ~ $ ls /net
sin на demo ~ $ ls /net/dc0
netlogon  sysvol
sin на demo ~ $ ls /net/dc0/sysvol/
domain  domain.alt
sin на demo ~ $ mount | grep smb
/etc/auto.smb on /net type autofs
(rw,relatime,fd=17,pgrp=7168,timeout=120,minproto=5,maxproto=5,indirect,pipe_ino=61461)
/etc/auto.smb on /net/dc0/netlogon type autofs
(rw,relatime,fd=17,pgrp=7168,timeout=120,minproto=5,maxproto=5,offset,pipe_ino=61461)
/etc/auto.smb on /net/dc0/sysvol type autofs
(rw,relatime,fd=17,pgrp=7168,timeout=120,minproto=5,maxproto=5,offset,pipe_ino=61461)

А вот для другого пользователя (от рута, конечно, не спасёт), если у
него нет своих ключей, доступ будет ограничен:

vagrant на demo ~ $ ls /net/dc0/sysvol
ls: невозможно получить доступ к '/net/dc0/sysvol': Отказано в доступе
vagrant на demo ~ $ klist
klist: Credentials cache keyring 'persistent:500:500' not found

Если же получить ключи, то другой пользователь зайдёт в тот же
каталог, но у же со своими ключами:

vagrant на demo ~ $ kinit administrator
Password for administrator на DOMAIN.ALT:
Warning: Your password will expire in 30 days on Ср 17 июн 2020 03:11:33
vagrant на demo ~ $ klist
Ticket cache: KEYRING:persistent:500:500
Default principal: administrator на DOMAIN.ALT

Valid starting       Expires              Service principal
17.05.2020 04:47:43  17.05.2020 14:47:43  krbtgt/DOMAIN.ALT на DOMAIN.ALT
    renew until 24.05.2020 04:47:34
vagrant на demo ~ $ ls /net/dc0/sysvol
domain  domain.alt
vagrant на demo ~ $ klist
Ticket cache: KEYRING:persistent:500:500
Default principal: administrator на DOMAIN.ALT

Valid starting       Expires              Service principal
17.05.2020 04:47:48  17.05.2020 14:47:43  cifs/dc0 на DOMAIN.ALT
    renew until 24.05.2020 04:47:34
17.05.2020 04:47:48  17.05.2020 14:47:43  cifs/dc0@
    renew until 24.05.2020 04:47:34
17.05.2020 04:47:43  17.05.2020 14:47:43  krbtgt/DOMAIN.ALT на DOMAIN.ALT
    renew until 24.05.2020 04:47:34

______________________

> Необычный подход вместо pam_mount.

Честно говоря, pam_mount ужасен. Требовать перелогина в случае
временного сбоя сети - это не то, что ожидается.

Вообще, и этот вариант не идеален. Я смотрю в сторону реализации
аналога udisks2 только для общих сетевых каталогов. Но это потребует
убойной части кода на C. К тому же, уже реализовано множество
абстракций, вроде gvfs. Конкретно в gvfs уже всё отрабатывает, но
работает через fuse:
gvfsd-fuse on /run/user/822801110/gvfs type fuse.gvfsd-fuse
(rw,nosuid,nodev,relatime,user_id=822801110,group_id=822800513)
sin на demo Рабочий стол $ ls /run/user/822801110/gvfs/
'smb-share:server=dc0,share=sysvol'  'smb-share:server=dc1,share=sysvol'

Для этой задачи сначала нужно провести плоноценный анализ существующих
решений. А вот текущая реализация через autofs уже вполне подходит для
повседневной практики.


--
Sin (Sinelnikov Evgeny)


Подробная информация о списке рассылки Samba