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

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

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

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

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

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

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

нарушается вход доменных пользователей в консольную и графическую сессию. Проблема вызвана устранением неточностей в работе алгоритма сопоставления идентификаторов пользователей/групп 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. Временно запретить вход пользователя:

    sudo passwd -l "$user"

  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 passwd -u "$user"

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

Сценарий, выполняющий указанные выше действия, приведен ниже. Сценарий использует два аргумента: имя пользователя и название варианта действий: 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

  • Нет меток