- Вопрос или проблема
- Ответ или решение
- Как запускать контейнеры Docker от имени пользователя домена Active Directory (SSSD) и решать проблему "недоступен пользователь"
- 1. Понимание проблемы
- 2. Проверка конфигурации SSSD
- 3. Проверка настроек Docker
- 4. Настройка PAM для использования с Docker
- 5. Предотвращение дополнительных проблем с правами
- 6. Тестирование и отладка
- Заключение
Вопрос или проблема
Я запускаю несколько Samba-общих папок на выделенной машине с Debian 9.6, присоединенной к AD-домену (Zentyal с SMB 4).
Я использую довольно простую установку SSSD, которая до сих пор идеально подходит для наших нужд.
Я хочу настроить Ambar так, чтобы различные пользователи домена могли искать документы на указанных Samba-общих папках. Однако я хочу, чтобы Ambar сканировал только “публичные” документы и ничего из частных/”управленческих” папок.
Я изменил файл docker-compose.yml так, чтобы Docker запускал контейнеры от имени пользователя crawler, но когда я выполняю docker-compose up -d
, я получаю следующую ошибку:
ERROR: for Shared-folder Cannot start service Shared-folder: linux spec user: unable to find user crawler: no matching entries in passwd file
Редактирование файла /etc/passwd
вручную здесь не помогает. Я все еще получаю ту же ошибку.
Вот как выглядит соответствующая конфигурация docker-compose.yml:
Shared-folder:
depends_on:
serviceapi:
condition: service_healthy
image: ambar/ambar-local-crawler
restart: always
networks:
- internal_network
expose:
- "8082"
environment:
- name=Shared-folder
- ignoreExtensions=.{exe,dll,rar,s,so}
- apiUrl=http://serviceapi:8081
user: crawler
volumes:
- /shared/Shared-folder:/usr/data
Обратите внимание, что если я уберу строку user: crawler
, все будет работать, как ожидается (и root
сканирует все мои документы).
Вот мой файл /etc/sssd/sssd.conf
:
[sssd]
services = nss, pam
config_file_version = 2
domains = MY.COMPANY.COM
[domain/MY.COMPANY.COM]
id_provider = ad
access_provider = ad
ad_gpo_map_interactive = +cron
dyndns_update_ptr=false
# Используйте это, если пользователи входят в систему в /.
# Этот пример указывает /home/DOMAIN-FQDN/user как $HOME. Используйте с pam_mkhomedir.so
override_homedir = /home/%u
ldap_idmap_autorid_compat = True
А вот мой /etc/pam.d/common-session
:
#
# /etc/pam.d/common-session - модули сессий, общие для всех служб
#
# Этот файл включается из других конфигурационных файлов PAM, специфичных для служб,
# и должен содержать список модулей, которые определяют задачи для выполнения
# в начале и в конце сессий *любого* типа (как интерактивных, так и
# неинтерактивных).
#
# Начиная с pam 1.0.1-6, этот файл по умолчанию управляется pam-auth-update.
# Чтобы воспользоваться этим, рекомендуется настраивать любые
# локальные модули либо до, либо после блока по умолчанию, и использовать
# pam-auth-update для управления выбором других модулей. См.
# pam-auth-update(8) для получения подробностей.
# вот модули по пакету (блок "Основной")
session [default=1] pam_permit.so
# вот резервный вариант, если ни один модуль не сработал
session requisite pam_deny.so
# подготовьте стек с положительным значением возврата, если такового еще нет;
# это позволяет нам не возвращать ошибку просто потому, что ничего не устанавливает код успеха,
# поскольку модули выше просто будут перескакивать
session required pam_permit.so
# и вот еще модули по пакету (блок "Дополнительный")
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0066
session optional pam_winbind.so
session optional pam_sss.so
session optional pam_systemd.so
# конец конфигурации pam-auth-update
Пожалуйста, дайте мне знать, если какие-либо конфигурации могут быть полезны! Я полагаю, что smb.conf
не так уж важен в этом случае, и что может быть какой-то способ сказать Docker просто доверять PAM?
Конфигурация домена в sssd.conf
не содержит use_fully_qualified_names = False
. Без этого от вас могут ожидать использование полных квалифицированных имен (например, [email protected]
). Это не строго необходимо для решения вашей проблемы, но я нахожу это полезным, если машина ссылается только на один домен. В альтернативном варианте:
-
Вы можете попробовать указать полное квалифицированное имя для пользователя в
docker-compose.yaml
(т.е.user: [email protected]
). Я не пробовал это, поэтому не могу подтвердить, что это сработает, как ожидается. -
Вы можете использовать uid пользователя вместо имени. Это метод, который я использую, поэтому могу подтвердить, что он работает нормально. Вы можете получить uid, выполнив
id <username>
(убедившись, что используете формат, соответствующий вашей настройкеuse_fully_qualified_names
).
В любом случае, если вы не можете получить uid вашего пользователя, выполнив id <username>
, то ваша проблема, скорее всего, заключается в настройке SSSD, а не в конфигурации докера.
Ответ или решение
Как запускать контейнеры Docker от имени пользователя домена Active Directory (SSSD) и решать проблему "недоступен пользователь"
Ваша задача заключается в запуске контейнеров Docker на системе Debian 9.6, подключенной к домену Active Directory с использованием SSSD. При этом вы столкнулись с ошибкой, сообщающей, что пользователь crawler
не найден в системе. В этой статье мы подробно рассмотрим шаги, необходимые для решения данной проблемы.
1. Понимание проблемы
Ошибка, с которой вы столкнулись:
ERROR: for Shared-folder Cannot start service Shared-folder: linux spec user: unable to find user crawler: no matching entries in passwd file
говорит о том, что Docker не может найти пользователя crawler
в системе. Это может быть связано с тем, как SSSD управляет пользователями, а также с конфигурацией Docker.
2. Проверка конфигурации SSSD
Ваш файл конфигурации /etc/sssd/sssd.conf
выглядит хорошо, но стоит обратил внимание на несколько моментов:
- Убедитесь, что сервис SSSD запущен:
systemctl status sssd
- Проверка наличия пользователя:
Запустите следующую команду, заменив crawler
на актуальное имя пользователя:
id crawler
Если пользователь не отображается, проверьте, правильно ли настроены id_provider
и access_provider
в sssd.conf
. Убедитесь, что ваш сервер DNS правильно указывает на контроллер домена.
3. Проверка настроек Docker
Когда вы указываете пользователя для запуска контейнера Docker, удалите строчку user: crawler
и протестируйте работу с полными именами пользователей (при установленной опции use_fully_qualified_names = True
). Это можно сделать, указав полное имя пользователя:
user: "MY.COMPANY.COM\\crawler"
Либо вы можете указать UID пользователя вместо его имени. Получите UID с помощью команды:
id crawler
И затем укажите его в вашем docker-compose.yml
:
user: "1001" # замените 1001 на фактический UID
4. Настройка PAM для использования с Docker
Docker может не всегда правильно взаимодействовать с PAM и SSSD. Вы можете изменить /etc/pam.d/common-session
для обеспечения совместимости с PAM и SSSD, добавив следующее:
session optional pam_sss.so
После изменения не забудьте перезапустить сервис SSSD:
systemctl restart sssd
5. Предотвращение дополнительных проблем с правами
Вам также следует учесть, что контейнер Docker может не иметь доступа к определённым ресурсам из-за проблем с правами. Убедитесь, что пользователю crawler
предоставлены необходимые права на доступ к общим папкам.
6. Тестирование и отладка
После выполнения вышеописанных шагов попробуйте снова запустить контейнеры с помощью:
docker-compose up -d
Если ошибка по-прежнему возникает, пересмотрите логи SSSD для дополнительной информации:
journalctl -u sssd
Логи могут дать дополнительный контекст о причинах проблемы.
Заключение
Следуя этим шагам, вы сможете настроить запуск Docker-контейнеров от имени доменного пользователя Active Directory с использованием SSSD, а также устранить проблемы, связанные с отсутствием пользователя. Если вы все еще сталкиваетесь с проблемами, рекомендуется обратиться за помощью в сообщество, связанную с Active Directory или PAM, а также рассмотреть возможность использования Docker в другом окружении или с другими настройками.