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

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

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

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

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

Обновление 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 почему-то несовместимы:
mount error(524): Unknown error 524
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)


2.
Если sec=krb5i заменить на sec=krb5:
sudo kinit ipauser01
sudo mount //ipa0.ipadomain0.ru/homes /mnt -o user=ipauser01,sec=krb5,rw,setuids,perm,soft,iocharset=utf8,nosharesock,cruid=ipauser01,vers=1.0
Команда не выполняется, так не может найти билет Керберос для ipauser01 (ищет KEYRING:persistent:UID:UID, а полученный от имени sudo билет лежит в KEYRING:persistent:0:0)

3.
cruid=ipauser01 заменить на cruid=0
sudo kinit ipauser01
sudo mount //ipa0.ipadomain0.ru/homes /mnt -o user=ipauser01,sec=krb5,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] параметры:

client 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

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

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

Далее в примерах предполагается, что конфигурация 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. только в ОС СН:
    1. это должен быть каталог с низким уровнем целостности, иначе запись в него из сетевого подключения будет невозможна.
    2. каталог должен иметь метку конфиденциальности не ниже максимально допустимой для пользователя;

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

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

Далее возможны два варианта:

  1. Заранее создать в каталоге пользователя все возможные для него варианты домашних каталогов для всех допустимых сочетаний атрибутов конфиденциальности (неудобно, но безопасно). При этом, так как при входе в любую сессию независимо от её метки конфиденциальности Парсек проверяет и создаёт пользовательский каталог с нулевой меткой конфиденциальности, этот каталог также в обязательном порядке должен быть создан заранее:

    sudo mkdir /home/.pdp/ipauser/l0i0c0x0t0x0
    sudo chown ipauser:ipauser /home/.pdp/ipauser/l0i0c0x0t0x0
    sudo pdpl-file 0:0:0 /home/.pdp/ipauser/l0i0c0x0t0x0

  2. Изменить настройки ОС, принятые по умолчанию, и использовать параметр ядра parsec.ccnr_relax, что позволит Парсеку, действуя от имени пользователя, самостоятельно создавать каталоги с нужными метками конфиденциальности (не превышающими метку конфиденциальности каталога пользователя) при сетевом подключении. Это более удобно, но несколько снижает защищённость системы.

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

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

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

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

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=krb5,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=krb5,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:

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 [success=2 default=ignore] pam_localuser.so
session required pam_parsec_mac.so unshare_root_only
session optional pam_mount.so
session required pam_parsec_mac.so

  • Нет меток