Modoboa: ошибка "sudo: not found" при удалении почтового ящика на сервере с RAID

  • Автор темы Автор темы mexan
  • Дата начала Дата начала
Сообщения
202
Реакции
0
При попытке удалить почтовый ящик через веб-интерфейс Modoboa возникает ошибка:
Код:
Ошибка получения места нахождения почтового ящика (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.

Решение
  1. Определяем пользователя, от которого работает Modoboa
    Код:
    ps aux | grep -E '(uwsgi|gunicorn)' | grep -v grep
    В нашем случае это был modoboa (uid=1001).
  2. Проверяем владельца почтовой директории
    Код:
    ls -ld /srv/vmail
    Владелец: vmail:vmail
  3. Создаём правильный файл sudoers
    Код:
    sudo visudo -f /etc/sudoers.d/modoboa
  4. Вставляем следующее содержимое:
    Код:
    # Разрешаем 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 без пароля
  5. Устанавливаем правильные права
    Код:
    sudo chmod 440 /etc/sudoers.d/modoboa
  6. Проверяем синтаксис
    Код:
    sudo visudo -c
  7. Добавляем PATH в конфиг uwsgi
    Код:
    sudo nano /etc/uwsgi/apps-enabled/modoboa_instance.ini
    Добавляем в конец:
    Код:
    env = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  8. Перезапускаем сервисы
    Код:
    sudo systemctl restart modoboa-uwsgi
    sudo systemctl restart nginx
  9. Проверяем работу sudo из-под modoboa
    Код:
    # Входим в сессию modoboa
    sudo su - modoboa -s /bin/bash
    
    # Проверяем права sudo
    sudo -l
    
    # Пробуем выполнить команду от vmail
    sudo -u vmail ls -la /srv/vmail   # должно работать без пароля!
    
    # Выходим
    exit
  10. Финальная проверка в веб-интерфейсе
    Удаляем тестовый ящик — ошибка исчезла!
 
Диагностика, которая мне помогла
Ключевые команды для поиска проблемы:
Код:
# Кто владелец почты?
ls -ld /srv/vmail

# От кого работает uwsgi?
ps aux | grep uwsgi

# Какие правила sudo для modoboa?
sudo -u modoboa sudo -l

# Проверка sudo в неинтерактивном режиме
sudo -u modoboa /usr/bin/sudo -n -u vmail ls -la /srv/vmail
 
Назад
Сверху