Дерево страниц

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 20 Следующий »

Статья не для публикации.

Обновление 2020-0826

Клиент ALD:

Создание мандатных домашних каталогов пропатченной самбой порождается командой
mount //ald.aldd.le/alduser /ald_home/alduser -o user=alduser,sec=krb5i,rw,setuids,perm,soft,iocharset=utf8,nosharesock,cruid=2501,vers=1.0
где 2501 - это UID alduser-а (кстати, сейчас уже можно просто имя юзера писать).

Эта команда вызывается на PAM-этапе session pam_ald.so (в etc/pam.d/common-session), файл src/modules/ald-cfg-smbc/ALDCfgSmbc.cpp, DoMountCIFSUserHome(), где для монтирования просто вызывается system() cо сформированной нужной строкой команды.

Выполнение этой команды (от sudo) из командной строки имеет аналогичный эффект.
Ключевым является параметр vers=1.0, без него backdoor не срабатывает.
При этом билет Керберос для авторизации берётся из файлов вида /tmp/krb5cc_2501_*, которые создаются при логинах юзера (и почему-то остаются доступны при неудачно завершившемся входе).

Дефолтные параметры, которые прописаны в ALD, видимо их можно убрать:
rw (mount)
perm (cifs.mount)
soft (cifs.mount)


Клиент FreeIPA:
Аналог команды ALD выглядит так:
1.
sudo kinit ipauser01
sudo mount //ipa0.ipadomain0.ru/homes /mnt -o user=ipauser01,sec=krb5i,rw,setuids,perm,soft,iocharset=utf8,nosharesock,cruid=ipauser01,vers=1.0

Для того, чтобы заработало сочетание параметров sec=krb5i и vers=1.0 необходимо в конфигурацию сервера samba добавить параметр "server signing = required" и перезапустить сервер samba (перезапустить необходимо даже если используется хранение параметров в samba-registry):

This controls whether the client is allowed or required to use SMB1 and SMB2 signing. Possible values are default, auto, mandatory and disabled.
By default, and when smb signing is set to default, smb signing is required when server role is active directory domain controller and disabled otherwise.
When set to auto, SMB1 signing is offered, but not enforced. When set to mandatory, SMB1 signing is required and if set to disabled, SMB signing is not offered either.
For the SMB2 protocol, by design, signing cannot be disabled. In the case where SMB2 is negotiated, if this parameter is set to disabled, it will be treated as auto. Setting it to mandatory will still require SMB2 clients to use signing.

Команда не выполняется, так не может найти билет Керберос для ipauser01 (ищет KEYRING:persistent:UID:UID, а полученный от имени sudo билет лежит в KEYRING:persistent:0:0)

2.
cruid=ipauser01 заменить на cruid=0
sudo kinit ipauser01
sudo mount //ipa0.ipadomain0.ru/homes /mnt -o user=ipauser01,sec=krb5i,rw,setuids,perm,soft,iocharset=utf8,nosharesock,cruid=0,vers=1.0

Монтирование выполняется при условии, что уже существует /home/ipauser01/ (домашний каталог пользователя), backdoor срабатывает, и, если метка ненулевая, то создаёт мандатные пользовательские подкаталоги. При этом подкаталоги создаются только при условии, что вызванная шара самбы - специальная шара homes (в ALD для этого используется каталог /ald_export_home).


Парсек написан для работы на локальной машине, и он работает от имени суперпользователя игнорируя все мандатные ограничения. В том числе - выполяет монтирование мандатных домашних каталогов находясь на нулевом уровне конфиденциальности. При подключении через сеть ему приходится работать от имени пользвателя, и вступают в силу мандатные ограничения, не позволяющие работать с конфиденциальной информацией. В результате Парсек просто не видит разделяемых каталогов с ненулевой конфиденциальностью.

Для того, чтобы изложенное в статье работало - нужен патч Парсека, чтобы монтирование каталога выполнялось на мандатном уровне сессии. Так как в конце выпонения этапа session модуль pam_parsec_mac в любом случае выставляет мандатную метку пользователя. Эту метку можно выставить в два этапа: сначала поднать уровень конфиденциальности, оставив высокий уровень целостности, а проверив/создав каталоги пользователя - полностью присвоить мандатную метку пользователя. Патч: 

*** pam_mac.c.old       2020-08-12 15:56:29.411358560 +0300
--- pam_mac.c   2020-08-18 17:06:54.619453502 +0300
--- 1526,1549 ----
        }
  
        /* bind cuurent session's dir to home*/
+ 
+     T("Setting intermediate mac label");
+     PDPL_T *bind_mac_set=pdpl_dup(md->label);
+     if( !bind_mac_set)
+             T("Session label is NULL");
+     else {
+         pdpl_set_ilev(bind_mac_set,pdp_get_max_ilev());
+         if( pdp_set_current( bind_mac_set))
+             T("Can not set mac");
+         pdpl_put(bind_mac_set);
+     }
        if( !(session_home=pdplugm_make_session_dir(homes_root,md->user,MACDIR,md->label,md->uid,md->gid,HOME_MODE)) )
        {
                L(pamh,LOG_ERR,"Error making home dir %m");
                return PAM_SYSTEM_ERR;
        }
  
!       T("Home dir is %s. Export environment variable MACDIR", session_home);
        if( set_env(pamh,ENV_MACDIR,session_home) ) return PAM_SYSTEM_ERR;
  
        if( bind_dir(session_home,md->home,0,md) )
*

Pam_mount после pam_parsec_mac работает на нужном мандатном уровне потому, что pam_parsec_mac после завершения этапа session присваивает сессии мандатную метку пользователя.

Как работает ALD:

  • ald-parsec проверяет параметры пользователя, и, если у него задан удалённый  домашний каталог, выставляет переменную окружение PDP_HOME
  • pam_parsec_mac, обнаружив переменную окружения PDP_HOME выполняет проверку доступа к указанному в этой переменной каталогу, при которой вызывается backdoor в sаmba, от имени рута создающий эти каталоги
  • pam_parsec_mас монтирует локальные каталоги обычным образом, ничего не зная про монтирование сетевых каталогов
  • pam_parsec_mac оставляет после себя мандатную метку на процессе
  • вызываемый после pam_parsec_mac модуль pam_ald наследует мандатную метку, и перемонтирует каталоги на сетевые

ToDo:

Подключение работает только с устаревшей версией протокола (vers=1) (см. BT-8434). При этом возможно использование только протокола без подписи пакетов (sec=krb5), более защищённый вариант с подписью пакетов (sec=krb5i) несовместим с vers=1.

Проверить этот способ с ALD - вроде должно работать без pam_ald
Проверить этот способ с NFS - тоже должен работать


Выполняя действия, описанные в этой статье, следует помнить, что предоставление доступа к серверу через сетевые подключения неизбежно снижает защищённость этого сервера.


При работе с конфиденциальными данными в обязательном порядке следует настроить ограничения на файловом сервере: установить в конфигурации samba в секции [global] параметры:

server max protocol = NT1
use socket MAC label = YES

Так как стандарт передачи данных по сети не поддерживает передачу меток целостности работа с примонтированными каталогами возможна только на нулевом уровне целостности. Домашние каталоги при этом должны иметь нулевой уровень целостности.

Монтирование домашнего каталога с ненулевым уровнем целостности пользователем с ненулевым уровнем целостности ведёт к краху системы.

Во избежание аварийных ситуаций следует запретить использовать ненулевые уровни целостности тем пользователям, которым позволено удалённо монтировать свои домашние каталоги.

Данная статья применима к:

  • ОС ОН Орёл 2.12
  • ОС СН Смоленск 1.6
  • ОС СН Ленинград 8.1

Описание стенда

  • Сервер FreeIPA + Samba. Порядок установки и настройки см. Samba + FreeIPA аутентификация пользователей Samba в Kerberos.
    В промышленной эксплуатации службу samba рекомендуется размещать на отдельном сервере. Порядок настройки отдельной службы на отдельном сервере см. также в статье Samba + FreeIPA аутентификация пользователей Samba в Kerberos.

  • Параметры сервера FreeIPA + Samba, используемые далее:
    • имя сервера ipa0.ipadomain/ru;
    • администратор домена admin;
    • пользователь домена с возможностью входа с ненулевой меткой конфиденциальности - ipauser;
  • Компьютер - клиент FreeIPA. Инструкцию по вводу компьютера в домен см. с статье FreeIPA.

Настройка сервера

Только для ОС СН

При работе с конфиденциальными данными в обязательном порядке следует настроить ограничения на файловом сервере: установить в конфигурации samba в секции [global] параметры:

client max protocol = NT1
use socket MAC label = YES
server signing = required

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

sudo net conf setparm global "server max protocol" "NT1"
sudo net conf setparm global "use socket MAC label" "Yes"
sudo net conf setparm global "server signing" "required"
Если конфигурация хранится в файле, то внести изменения в файл/

Назависимо от того, где хранится конфигурация (в файле или в реестре) - после изменения указанных параметров перезапустить сервис.
Далее в примерах предполагается, что конфигурация samba находится в реестре samba. Если конфигурация находится в файле необходимо внести указанные изменения в файл конфигурациии перезапустить службу samba.

Создать конфигурации разделяемых ресурсов импортировать их в конфигурацию samba. Создаваемые ресурсы:

  1. Ресурс для монтирования домашних каталогов при работе с нулевой меткой конфиденциальности - ресурс homes (стандарный ресурс samba);
  2. Только для ОС СН. Ресурс для монтирования домашний каталогов при работе с ненулевой меткой конфиденциальности. Имя ресурса может быть произвольным, в примере используется имя pdp_homes. Данный ресурс требуется только для ОС СН.

Конфигурации ресурсов сохраняются в файлах, далее импортируются в конфигурацию samba. Команды:

cat << EOT > homes.txt
[homes]
comment = Home Directories
create mask = 0600
directory mask = 0700
read only = No
valid users = %S
browseable = No
EOT

cat << EOT > pdp_homes.txt
[pdp_homes]
comment = pdp homes share
create mask = 0600
directory mask = 0700
path = /home/.pdp/%U
read only = No
browseable = No
valid users = %U
EOT

sudo net conf import homes.txt homes
sudo net conf import pdp_homes.txt pdp_homes


Эти же действия можно выполнить командами не используя файлы для сохранения данных, например:

sudo net conf addshare "homes" "/home/%U" "writeable=y" "guest_ok=N" "Home Directories"
sudo net conf setparm "homes" "browseable" "No"
sudo net conf setparm "homes" "valid users" "%U"
и т.д.

Настройки пользовательских каталогов для ОС СН

Ресурс pdp_homes будет предоставлять для монтирования путь /home/.pdp/<имя_пользователя"> (параметр path = /home/.pdp/%U в конфигурации). Если такого каталога нет, то с помощью подключения через samba (т.е. действиями со стороны клиентской машины) создать его невозможно, поэтому на момент подключения пользователя пользовательский подкаталог должен быть уже создан. При этом:

  1. каталог должен принадлежать пользователю;
  2. это должен быть каталог с низким уровнем целостности, иначе запись в него из сетевого подключения будет невозможна.
  3. каталог должен иметь метку конфиденциальности не ниже максимально допустимой для пользователя;

Для пользователя ipauser:

sudo mkdir /home/.pdp/ipauser
sudo chown ipauser:ipauser /home/.pdp/ipauser
sudo pdpl-file 3:0:-1:CCNRA /home/.pdp/ipauser

Настройка клиента

Клиент должен быть введён в домен FreeIPA. Инструкцию по вводу компьютера в домен см. с статье FreeIPA.

Далее, в зависимости от задач, можно выбрать один из вариантов настройки:

  1. Монтирование с помощью pam_mount (скорее применимо в ОС ОН, так как предоставляет простой и стандартный способ монтирования);
  2. Монтирование с помощью собственного сценария (скорее применимо в ОС СН, так как позволяет гибко настраивать монтирование каталогов с ненулевыми мандатными метками).

Эти варианты при необходимости могут применяться совместно, дополняя друг друга.


При работе с конфиденциальными данными в ОС СН следует в обязательном порядке использовать параметры монтирования sec=krb5i,vers=1.0

Если конфиденциальные данные не используются то в ОС СН и в ОС ОН рекомендуется использовать параметр sec=krb5i без уточнения версии.


Использование модуля pam_mount

Установка пакетов

Набор пакетов, необходимых для монтирования домашних каталогов можно установить командой:

sudo apt install cifs-utils libpam-mount
Настройка модуля pam_mount

В конфигурации модуля pam_mount (файл /etc/security/pam_mount.conf.xml) задать параметры подключаемых сетевых ресурсов. Примеры конфигурации (только часть, непосредственно относящаяся к ресурсам):

Ресурс homes - монтирование домашних каталогов
<volume 
fstype="cifs"
server="ipa0.ipadomain.ru"
path="%(USER)"
mountpoint="/home/%(USER)"
options="user=%(USER),cruid=%(USER),nosharesock,sec=krb5i,vers=1.0"
/>
Для ОС СН - ресурс pdp_homes для монтирования домашних каталогов с ненулевой меткой конфиденциальности
<volume 
fstype="cifs"
server="ipa0.ipadomain.ru"
path="pdp_homes"
mountpoint="/home/.pdp/%(USER)"
options="user=%(USER),cruid=%(USER),uid=%(USERUID),gid=%(USERGID),nosharesock,sec=krb5i,vers=1.0"
/>

Дополнительно разрешить использование применяемых параметров, например:

<mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,uid,gid,nosharesock,vers" />

Если не срабатывает автоматическое размонтирование каталогов при выходе из сессии, то использовать задержку размонтирования (wait, миллисекунды) или параметры hup="yes", term="yes" или  kill="yes" для передачи сигналов завершения "зависшим" процессам:

<logout wait="0" hup="no" term="no" kill="yes" />

Настройка pam-стека в ОС ОН

В ОС ОН можно использовать стандартную настройку. 
Опционально перед вызовом pam_mount в файле /etc/pam.d/common-session можно  добавить запрет вызова pam_mount для локальных пользователей:

session [success=1 default=ignore] pam_localuser.so
session optional pam_mount.so

Настройка pam-стека в ОС СН

Удалить (закомментировать) вызов модуля pam_mount в файле /etc/pam.d/common-session:

sudo sed -i "s/\(session[[:space:]]\+optional[[:space:]]\+pam_mount.so\)/#\1/" /etc/pam.d/common-session
В файлах /etc/pam.d/login и /etc/pam.d/fly-dm вызов модуля session required pam_parsec_mac заменить на:
session required pam_parsec_mac.so
session [success=1 default=ignore] pam_localuser.so
session optional pam_mount.so

Использование собственных сценариев монтирования

Вызывать собственные сценарии монтирования можно с помощью модуля pam_exec. Например, для ОС СН сценарий, монтирующий домашний пользовательский каталог, имеющий ненулевую мандатную метку, соответствующую мандатной метке пользовательской сессии непосредственно в локальный домашний каталог пользователя:

/etc/pam.d/pdp_home.sh
#!/bin/bash
home=/home/.pdp/$PAM_USER
label="l`pdp-id -l`i`pdp-id -i`c`pdp-id -c`t0x0"
echo "Begin mounting PDP_HOME for user \"$PAM_USER\" with label \"$label\""
mount //ipa0.ipadomain0.ru/pdp_homes $home -o user=$PAM_USER,sec=krb5i,rw,setuids,perm,soft,iocharset=utf8,nosharesock,cruid=$PAM_USER,vers=1.0
mount --bind $home/$label /home/$PAM_USER

Так же, как вызов pam_mount в примерах выше, сценарий должен вызываться после вызова pam-модуля session pam_parsec_mac. Приняв, что сценарий размещён в исполняемом файле /etc/pam.d/pdp_home.sh, его вызов в pam-стеке может выглядеть так:

session required pam_parsec_mac.so
session [success=1 default=ignore] pam_localuser.so
session optional pam_exec.so debug log=/dev/tty /etc/pam.d/pdp_home.sh

Где debug - необязательный параметр включения отладки, а log=/dev/tty - необязательный параметр вывода на терминал (также может быть полезен для отладки).


  • Нет меток