Как мне настроить Procmail для запуска сценария из темы электронной почты

Я настраиваю веб-сайт, который позволяет пользователям заполнять форму, которая отправляет электронное письмо на сервер. Тема письма создается как серверный сценарий, который я хотел бы запустить в командной строке сервера, чтобы автоматизировать процесс. В настоящее время команды выполняются вручную, я копирую отформатированную тему и запускаю ее в Терминале. Может кто-то указать мне верное направление? Я прочитал несколько сообщений на Procmail, но они все еще не понимают, как они применимы к моим текущим потребностям.

Вот что я хочу настроить. Тема электронного письма с транзакцией будет выглядеть примерно так: «cloudron clone --app store --backup latest - location site». Сервер просто берет тему как есть и запускает ее как сценарий. Сервер настроен на выполнение сценариев такого рода. Надеюсь, это понятнее.

0
задан 1 May 2017 в 12:58
1 ответ

Если заголовок Subject содержит команду, которую вы хотите запустить, вы подвергаете себя уязвимости, связанной с выполнением произвольного кода, если кто-то может узнать или угадать, как выглядит ваша электронная почта. Но что-то вроде этого:

:0
* ^From www@your\.server\.example\.net
* ^X-Secret-Header: pA$$w0rd!\?
| formail -czxSubject: | sh

Чем больше условий и более конкретных условий вы можете поставить для защиты, тем меньше риск того, что это может быть использовано. Я бы все еще очень не решался поставить это на рабочий сервер. Если вы можете поставить условие, чтобы разрешить только несколько очень специфических команд (no rm , no cat , no ls , no cp , нет sh или su или sudo очевидно), затем мммогут быть.

Вот вариант, который позволяет использовать только одну конкретную команду:

:0
* ^Subject: adduser \/[a-z0-9_]+
| sqlite3 -d users -u db -e "insert into table users (name) with value ($MATCH)"

(Мой синтаксис SQL, вероятно, нестандартен; извините.)

Вот ваш пример из обновленного вопроса:

:0
* ^Subject: \/cloudron clone --app store --backup latest —location [a-z0-9]+
| $MATCH </dev/null

... или, возможно, лучше с точки зрения безопасности, чтобы разрешить только параметр указано:

:0
* ^Subject: cloudron clone \/[a-z0-9]+
| cloudron clone --app store --backup latest --location "$MATCH" </dev/null

Эти примеры демонстрируют, как захватить что-то в MATCH с помощью специального оператора регулярного выражения \ / , и мы довольно причудливо перенаправляем входящее сообщение в команду, которая просто игнорирует его стандарт input (мы в основном запускаем его для побочных эффектов). Это случайно заставит Procmail считать сообщение доставленным; добавьте флаг c , чтобы избежать этого (: 0c ).

Многие примеры Procmail допускают произвольные пробелы после Subject: двоеточие и т. д., но поскольку эти сообщения предположительно будут сгенерированы машиной, что здесь излишне усложняется.

Это не будет правильно работать с заголовками, закодированными в MIME RFC2047 ; если вам это нужно, вам нужно будет добавить этап декодирования (однострочный Perl?)

0
ответ дан 5 December 2019 в 08:17

Теги

Похожие вопросы