Samba, GID, UID и AD

Несоответствие локальных GID/UID в Samba доменным

Проверено в Ubuntu 20.04, Samba 4.11.6

Особенности настройки и начальные данные:

Работа с локальной БД Samba. Формат БД файл «tdb» (Samba Trivial Database).

Сервер Samba является членом домена ActiveDirectory.

Если в файле конфигурации Samba: /etc/samba/smb.conf указана база хранения «tdb»

# grep idmap config /etc/samba/smb.conf
idmap config * :backend = tdb

то после полной переустановки Samba данная база будет полностью обновлена и появится новое соответствие между локальными UID/GID и доменными SID.

Чтобы этого избежать необходимо делать резервные копии конфигурационных файлов (/etc/samba/) и файлов баз данных (/var/lib/samba).

Для восстановления соответствия между UID/GID и SID достаточно восстановить из бэкапа «/var/lib/samba/winbindd_idmap.tdb», очистить кэш, перезапустить Samba и Winbind:

# cp /backup/winbindd_idmap.tdb /var/lib/samba/winbindd_idmap.tdb
# net cache flush && getent passwd && getent group
# systemctl stop winbind && systemctl restart smbd && systemctl start winbind

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

Возможна ситуация когда по какой-то причине у определённой группы или пользователя меняется локальный UID/GID. Чтобы не переназначать права на файлы и папки для нового UID/GID можно отредактировать БД Samba. Например, было такое соответствие между названием группы, её GID и SID:

  • доменная группа: domain users
  • локальный GID: 10513
  • доменный SID: S-1-5-21-910613079-1236758810-3408709132-513

В результате сбоя работы БД Samba появилось новое соответствие:

  • доменная группа: domain users
  • локальный GID: 10006
  • доменный SID: S-1-5-21-910613079-1236758810-3408709132-513

Т.е. изменился GID и все доменные пользователи потеряли доступ к расшаренной папке:

# ls -ld /mnt/samba/fileshare/Temp/
drwxrwx--- 19 root 10006 4096 Sep 28 15:10 /mnt/samba/fileshare/Temp/

Диагностика

Для диагностики этой неисправности необходимо убедиться, что контроллер домена доступен:

# smbcontrol winbind onlinestatus
PID 771241: global:Online BUILTIN:Online FILESERVER:Online DOMAIN-NAME:Online
#
# wbinfo --online-status
BUILTIN : active connection
FILESERVER : active connection
DOMAIN-NAME : active connection
#
# wbinfo -t
checking the trust secret for domain DOMAIN-NAME via RPC calls succeeded

wbinfo -u и wbinfo —g — выведут список доменных пользователей и групп
getent passwd и getent group — выведут список всех пользователей и групп (локальные + доменные)

Если вышеперечисленные команды отработали корректно, то контроллер домена доступен.

Правка БД tdb, утилита tdbtool

Проверяем текущие значении GID, SID, имя группы:

# wbinfo --group-info="domain users" 
domain users:x:10006:
#
# wbinfo --gid-to-sid=10006
S-1-5-21-910613079-1236758810-3408709132-513

Далее переходим в папку с tdb файлами и редактируем БД. Необходимо обратно поменять соответствие GID для данного SID на 10513.
Для удобства чтения БД её можно сдампить и открыть в текстовом редакторе:

# tdbdump winbindd_idmap.tdb > winbindd_idmap.txt

Для редактирования БД используется утилита «tdbtool». Чтобы вернуть БД к правильному виду необходимо:

  1. сделать резервную копию winbindd_idmap.tdb
  2. поменять значение для ключа «S-1-5-21-910613079-1236758810-3408709132-513» на «GID 10513»
    т.к. БД имеет две записи — прямое SID-GID и обратное GID-SID преобразование — то необходимо обновить оба ключа
  3. удалить старый ключ «GID 10006»
  4. создать новый ключ «GID 10513» со значением «S-1-5-21-910613079-1236758810-3408709132-513»

ВАЖНО! В названии ключа и в его значении в конце необходимо добавлять «\00», а для экранирования пробела использовать обратный слеш «\ «.

# tdbtool winbindd_idmap.tdb
# проверяем текущее значение
tdb> show S-1-5-21-910613079-1236758810-3408709132-513\00

key 45 bytes
S-1-5-21-910613079-1236758810-3408709132-513
data 10 bytes
[000] 47 49 44 20 31 30 35 31  33 00                    GID 1051 3

# обновляем значение ключа
tdb> store S-1-5-21-910613079-1236758810-3408709132-513\00 GID\ 10513\00
Storing key:

key 45 bytes
S-1-5-21-910613079-1236758810-3408709132-513
data 10 bytes
[000] 47 49 44 20 31 30 35 31  33 00                    GID 1051 3

# убеждаемся, что значение обновилось
tdb> show S-1-5-21-910613079-1236758810-3408709132-513\00

key 45 bytes
S-1-5-21-910613079-1236758810-3408709132-513
data 10 bytes
[000] 47 49 44 20 31 30 35 31  33 00                    GID 1051 3

# удаляем неверный ключ
tdb> show GID\ 10006\00

key 10 bytes
GID 10006
data 45 bytes
[000] 53 2D 31 2D 35 2D 32 31  2D 39 31 30 36 31 33 30  S-1-5-21 -9106130
[010] 37 39 2D 31 32 33 36 37  35 38 38 31 30 2D 33 34  79-12367 58810-34
[020] 30 38 37 30 39 31 33 32  2D 35 31 33 00           08709132 -513

tdb> delete GID\ 10006\00
tdb> show GID\ 10006\00
fetch failed

# добавляем новый ключ
tdb> store GID\ 10513 S-1-5-21-910613079-1236758810-3408709132-513
Storing key:

key 9 bytes
GID 10513
data 44 bytes
[000] 53 2D 31 2D 35 2D 32 31  2D 39 31 30 36 31 33 30  S-1-5-21 -9106130
[010] 37 39 2D 31 32 33 36 37  35 38 38 31 30 2D 33 34  79-12367 58810-34
[020] 30 38 37 30 39 31 33 32  2D 35 31 33              08709132 -513

tdb> show GID\ 10513

key 9 bytes
GID 10513
data 44 bytes
[000] 53 2D 31 2D 35 2D 32 31  2D 39 31 30 36 31 33 30  S-1-5-21 -9106130
[010] 37 39 2D 31 32 33 36 37  35 38 38 31 30 2D 33 34  79-12367 58810-34
[020] 30 38 37 30 39 31 33 32  2D 35 31 33              08709132 -513

tdb> quit

Теперь у нас верное соответствие GID-SID-имя группы:
было: domain users — 10006 — S-1-5-21-910613079-1236758810-3408709132-513
стало: domain users — 10513 — S-1-5-21-910613079-1236758810-3408709132-513
Теперь необходимо очистить кэш, перезапустить Samba и Winbind:

# net cache flush && getent passwd && getent group
# systemctl stop winbind && systemctl restart smbd && systemctl start winbind

После этого команда ls -l должна корректно отображать GID в имя группы:

# ls -ld /mnt/samba/fileshare/Temp/
drwxrwx--- 19 root domain users 4096 Sep 28 15:10 /mnt/samba/fileshare/Temp/

Утилита dbwrap_tool

Последние версии Samba имеют новую утилиту для работы с tdb файлами: dbwrap_tool. Пример использования:

# dbwrap_tool --persistent winbindd_idmap.tdb fetch S-1-5-21-910613079-1236758810-3408709132-513 string
GID 10006
#
# dbwrap_tool --persistent winbindd_idmap.tdb store S-1-5-21-910613079-1236758810-3408709132-513 string GID\ 10513
#
# dbwrap_tool --persistent winbindd_idmap.tdb fetch S-1-5-21-910613079-1236758810-3408709132-513 string
GID 10513

Источники

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии