- Code: Select all
Ошибка получения места нахождения почтового ящика (b'/bin/sh: 1: sudo: not found\n')
При этом создание и редактирование ящиков работает нормально. В логах ничего не видно, а ручное выполнение команд от пользователя
vmail через sudo работает без проблем.Причина
- Modoboa использует uwsgi, который работает от системного пользователя
modoboa, а не отwww-data. - В sudoers не были прописаны права для пользователя
modoboaна выполнение команд от имениvmail. - Даже когда правила были добавлены, они не работали из-за:
- Ограничений
secure_pathв sudo (переопределял PATH) - Слишком узкого списка разрешённых команд (Modoboa выполняет не только
rm, но и другие команды для определения местоположения ящика)
- Ограничений
- В результате
modoboaне мог выполнить нужные команды без пароля, а в неинтерактивном окружении uwsgi это приводило к ошибкеsudo: not found.
Решение
- Определяем пользователя, от которого работает Modoboa
- Code: Select all
ps aux | grep -E '(uwsgi|gunicorn)' | grep -v grep
(uid=1001). - Проверяем владельца почтовой директории
- Code: Select all
ls -ld /srv/vmail
vmail:vmail - Создаём правильный файл sudoers
- Code: Select all
sudo visudo -f /etc/sudoers.d/modoboa
- Вставляем следующее содержимое:
- Code: Select all
# Разрешаем modoboa выполнять любые команды от vmail без пароля
Defaults:modoboa !requiretty
Defaults:modoboa !secure_path
Defaults:modoboa env_keep += "PATH"
modoboa ALL=(vmail) NOPASSWD: ALL
Пояснения:!requiretty— отключает требование терминала (важно для неинтерактивных вызовов)!secure_path— отключает переопределение PATH (чтобы sudo видел команды в окружении uwsgi)env_keep += "PATH"— сохраняет PATH из окруженияmodoboa ALL=(vmail) NOPASSWD: ALL— разрешает любые команды от vmail без пароля
- Устанавливаем правильные права
- Code: Select all
sudo chmod 440 /etc/sudoers.d/modoboa
- Проверяем синтаксис
- Code: Select all
sudo visudo -c
- Добавляем PATH в конфиг uwsgi
- Code: Select all
sudo nano /etc/uwsgi/apps-enabled/modoboa_instance.ini
- Code: Select all
env = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- Перезапускаем сервисы
- Code: Select all
sudo systemctl restart modoboa-uwsgi
sudo systemctl restart nginx
- Проверяем работу sudo из-под modoboa
- Code: Select all
# Входим в сессию modoboa
sudo su - modoboa -s /bin/bash
# Проверяем права sudo
sudo -l
# Пробуем выполнить команду от vmail
sudo -u vmail ls -la /srv/vmail # должно работать без пароля!
# Выходим
exit
- Финальная проверка в веб-интерфейсе
Удаляем тестовый ящик — ошибка исчезла!

