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

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

Описание проблемы

При последовательном выполнении следующих условий:

нарушается вход доменных пользователей в консольную и графическую сессию. Проблема вызвана устранением неточностей в работе алгоритма сопоставления идентификаторов пользователей/групп Astra Linux (UID/GID) и доменных пользователей/групп Windows (SID). Параметры сопоставления по умолчанию задаются в конфигурационном файле службы samba /etc/samba/smb.conf в секции [global] и имеют следующий вид:

idmap config * : range = 3000-7999
idmap config * : backend = tdb
idmap config <имя_рабочей_группы_или_домена> : range = 10000-299999
idmap config <имя_рабочей_группы_или_домена> : backend = rid

Для сопоставления идентификаторов исходно используется первый диапазон идентификаторов (3000-7999) а после установки обновления 1.7.2 используется второй диапазон (10000-299999).

Устранение проблемы

Далее предполагается, что:

  • Обновление БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) установлено;
  • Настройки выполняются в сессии администратора с правами суперпользователя (администратора с высоким уровнем целостности при работе с включенным МКЦ) или в сценарии, выполняющемся от имени такого администратора;
  • Для удобства имя пользователя, для которого выполняются настройки сохранено в переменной окружения user:

    user=<имя_пользователя>

Для устранения проблемы:

  1. Желательно временно запретить вход пользователей, для чего создать файл /run/nologin (или /etc/nologin):

    После создания любого из файлов /run/nologin или /etc/nologin вход будет запрещен всем пользователям, включая администраторов. Запрет будет действовать до удаления файлов. При перезагрузке файлы будут удалены автоматически. Текущая сессия после создания файла будет продолжаться, но, если выйти из сессии не удалив файл, то для следующего входа необходимо будет перезагрузить компьютер.

    Команда для создания файла:

    sudo touch /run/nologin

  2. Принудительно прекратить сессии пользователя:

    sudo loginctl terminate-user "$user"

  3. Получить старые и новые идентификаторы пользователя. Для дальнейшего использования идентификаторы сохраняются в переменных окружения:
    1. Новый UID:

      new_UID=`getent passwd $user | cut -d: -f3`

    2. Новый GID:

      new_GID=`getent passwd $user | cut -d: -f4`

    3. Ранее применявшийся UID:

      old_UID=$(sudo ls -lnd `getent passwd "$user" | cut -d: -f6`/Desktop | cut -d" " -f 3)

    4. Ранее применявшийся GID

      old_GID=$(sudo ls -lnd `getent passwd "$user" | cut -d: -f6`/Desktop | cut -d" " -f 4)

  4. Опционально: проверить наличие файлов, принадлежащих пользователю и не находящихся в его домашнем каталоге:

    sudo find / -type f,d ! -path "/home/$user/*" ! -path "/proc/*" ! -path "/sys/*" \( -user "$user" -or -group "$user" \) -exec stat {} \;

  5. Далее возможны два варианта: с сохранением ранее применявшихся идентификаторов или с назначением новых:
    1. Вариант 1. Для сохранения ранее применявшихся идентификаторов и ранее использовавшегося алгоритма установления соответствия:
      1. Заменить в атрибутах файловых объектов новые идентификаторы старыми

        sudo find / -type f,d ! -path "/proc/*" -group $new_GID -exec chown :$old_GID {} \;
        sudo find / -type f,d ! -path "/proc/*" -user  $new_UID -exec chown  $old_UID {} \;

      2. Из конфигурационного файла службы samba /etc/samba/smb.conf удалить строки с новым диапазоном идентификаторов. Это строки вида:

        idmap config <имя_рабочей_группы_или_домена> : range = 10000-299999
        idmap config <имя_рабочей_группы_или_домена> : backend = rid

        Для удаления можно использовать команду:

        sudo sed -i "/^\s*idmap\s\+config\s\+[^*]\+/d" /etc/samba/smb.conf

      3. Перезапустить службу samba и связанные с ней службы:

        sudo systemctl restart smbd nmbd winbind

    2. Вариант 2. Для применения новых идентификаторов:

      1. Заменить в атрибутах файловых объектов старые идентификаторы на новые:

        sudo find / -type f,d ! -path "/proc/*" -group $old_GID -exec chown :$new_GID {} \;
        sudo find / -type f,d ! -path "/proc/*" -user  $old_UID -exec chown  $new_UID {} \;
        Внесение изменений в конфигурацию samba при этом не требуется;

  6. Опционально проконтролировать использование старых и новых атрибутов в различных конфигурационных файлах и при необходимости произвести замены идентификаторов в соответствии с выбранным ранее вариантом. Например:

    1. Использование старых идентификаторов в часто применяемых конфигурационных файлах:

      sudo egrep -r "($new_GID|$new_UID|$old_GID|$old_UID)" /etc/parsec /etc/fstab /etc/security/pam_mount.conf.xml /etc/samba/smb.conf

    2. Использование старых идентификаторов в ACL (см. Списки управления доступом к файловым объектам (ACL) в Astra Linux):

      sudo getfacl -Rsnt / | egrep "^(# file|(USER|user|GROUP|group)\s+($new_GID|$new_UID|$old_GID|$old_UID))" | awk '/# file/{file=$0;next} { print $0,file }'

      ACL автоматически присваиваются разделяемым устройствам (приводы оптических дисков, клавиатура, джойстик, мышь мультимедийные устройства и пр., подробнее см. Разделение прав доступа к устройствам CD/DVD). Наличие таких ACL со старыми идентификаторами не критично для работы пользователей.
  7. Если был запрещен вход пользователей, то разрешить вход пользователей:

    sudo rm /run/nologin

Общий сценарий

Сценарий, выполняющий указанные выше действия, приведен ниже. Сценарий использует два аргумента: имя пользователя и название варианта действий: old с сохранением идентификаторов, new - c обновлением. Опциональные действия по проверке файловых объектов вне домашнего каталога пользователя в сценарий не включены. Текст сценария:


#!/bin/bash
set -ue

set_new_IDs() {
    sudo find / -type f,d ! -path "/proc/*" -group $old_GID -exec chown :$new_GID {} \;
    sudo find / -type f,d ! -path "/proc/*" -user  $old_UID -exec chown  $new_UID {} \;
}

set_old_IDs(){
    sudo find / -type f,d ! -path "/proc/*" -group $new_GID -exec chown :$old_GID {} \;
    sudo find / -type f,d ! -path "/proc/*" -user  $new_UID -exec chown  $old_UID {} \;
    sudo sed -i "/^\s*idmap\s\+config\s\+[^*]\+/d" /etc/samba/smb.conf
    sudo systemctl restart smbd nmbd winbind
}

if [[ "$#" != "2" ]] ; then
    echo "Использование: $0 <имя_пользователя> <вариант>"
    echo "где <вариант> может быть old или new"
    exit 1
fi
if ! id "$1" ; then
    echo "Пользователь \"$1\" не найден"
    exit 2
fi

user="$1"
case $2 in
    new|old) true ;;
    *) echo "Неизвестный вариант \"$2\""
        exit 3
esac

sudo passwd -l "$user"
sudo loginctl terminate-user "$user" || true

new_UID=`getent passwd $user | cut -d: -f3`
new_GID=`getent passwd $user | cut -d: -f4`

old_UID=$(sudo ls -lnd `getent passwd "$user" | cut -d: -f6`/Desktop | cut -d" " -f 3)
old_GID=$(sudo ls -lnd `getent passwd "$user" | cut -d: -f6`/Desktop | cut -d" " -f 4)

case $2 in
    new) set_new_IDs ;;
    old) set_old_IDs ;;
esac

sudo passwd -u "$user"
echo "Сценарий завершен успешно"
exit 0

  • Нет меток