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

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

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

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

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

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

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

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

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).

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

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

  • Настройки выполняются в сессии администратора с правами суперпользователя (администратора с высоким уровнем целостности при работе с включенным МКЦ) или в сценарии, выполняющемся от имени такого администратора;
  • Для удобства имя пользователя, для которого выполняются настройки сохранено в переменной окружения user:

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

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

  1. Временно запретить вход пользователя:

    sudo passwd -l "$user"

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

    sudo loginctl terminate-user "$user"

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

      new_UID=`sudo -u "$user" id -u`

    2. Новый GID:

      new_GID=`sudo -u "$user" id -g`

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

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

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

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

  4. Далее возможны два варианта: с сохранением ранее применявшихся идентификаторов или с назначением новых:
    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

    1. Вариант 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 при этом не требуется;

  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. Разрешить вход пользователя:

    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=`sudo -u "$user" id -u`
new_GID=`sudo -u "$user" id -g`
old_UID=$(ls -lnd `getent passwd "$user" | cut -d: -f6` | cut -d" " -f 3)
old_GID=$(ls -lnd `getent passwd "$user" | cut -d: -f6` | cut -d" " -f 4)

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

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 || true
sudo passwd -u "$user"
echo "Сценарий завершен успешно"
exit 0

  • Нет меток