Несоответствие локальных 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». Чтобы вернуть БД к правильному виду необходимо:
- сделать резервную копию winbindd_idmap.tdb
- поменять значение для ключа «S-1-5-21-910613079-1236758810-3408709132-513» на «GID 10513»
т.к. БД имеет две записи — прямое SID-GID и обратное GID-SID преобразование — то необходимо обновить оба ключа - удалить старый ключ «GID 10006»
- создать новый ключ «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