Автоматизация для бедных. Часть 1 – отсылка почты с шифрованными приложениями

В соответствии с требованиями европейской регулы по защите данных GDPR данные частных лиц не могут передаваться в публичной сети в открытом виде. Это в первую очередь относится к операторам данных. Если необходимо передать информацию третьей стороне, то она должна быть в защищенном виде.
Пришлось помочь одной дружественной фирме. У них обмен данными с партнерами идет по электронной почте, и теперь вся информация, содержащая персональные данные клиента, должна быть зашифрована. Самое простое – пересылка шифрованных архивов ZIP. Несмотря на слабость алгоритмов шифрования ZIP, использование длинных сложных паролей делает атаку перебором малопривлекательной – данные не стоят ресурсов, необходимых для взлома. Но шифровать файлы вручную с правильным ключом (партнеров > 10) – то еще занятие. Уровень ошибок и время, уходящее на вроде простую операцию – неадекватно высокие.
Идея автоматизации очень простая – на сервере документов (Windows Server) делаются папки для каждого партнера, куда сотрудники складывают документы, которые необходимо зашифровать и отослать партнерам, а все автоматические задачи выполняет маленький офисный “сервер” под Linux.

Как поставить и настроить сервер (в данном случае подойдет и старый ноутбук, и Raspberry Pi) написаны тысячи статей разной степени полезности. Поэтому примем, что настроенный сервер у нас есть, дистрибутив Linux – Debian или Ubuntu. Так же у нас есть сторонний SMTP сервер, через который будем отправлять почту.

Задача – периодически заглядывать в папку и, если там что-то есть, зазимовать это “что-то” с паролем и отправить заданному адресату по электронной почте. Так как файловая система удаленная (cifs), мониторить ее события по inotify не получится, придется опрашивать по расписанию.

1. Как подмонтировать файловую систему с Windows Server
Необходимо добавить информацию о новой файловой системе в /etc/fstab:
# Company documents
//172.16.171.10/company /mnt/company cifs credentials=/etc/.credentials 0 0

Раньше тип файловой системы указывался как smbfs, но эти времена прошли.
Файл /etc/.credentials содержит всю информацию для подключения к “шаре” Windows Server:
rat@assistant:~$ sudo cat /etc/.credentials
domain=domainname
username=username
password=userpassword

Пользователь должен иметь права на запись и удаление файлов.

После того, как информация добавлена, подключим новую файловую систему:
rat@assistant:~$ sudo mount -a

Если все настроено правильно, новая файловая система будет доступна:
rat@assistant:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 989M 0 989M 0% /dev
tmpfs 202M 22M 180M 11% /run
/dev/sda5 9.1G 6.2G 2.5G 72% /
tmpfs 1007M 124K 1007M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1007M 0 1007M 0% /sys/fs/cgroup
/dev/sda6 136G 25G 105G 19% /var
tmpfs 202M 8.0K 202M 1% /run/user/1000
//172.16.171.10/company 80G 30G 51G 38% /mnt/company

2. Как настроить компоненты почтовой системы.
Для отправки почты понадобятся mutt и ssmtp.
rat@assistant:~$ sudo apt-get update && sudo apt-get install ssmtp mutt

Mutt – отличный консольный почтовый клиент, а sSMTP – хитрая штука, которая прикидывается полноценным почтовым сервером, но для операций использует ресурсы стороннего сервера (Google, Yandex, etc.). Настраивать еще один почтовый сервер и заботиться о его безопасности в наши планы не входит. Тем более, что наш сервер “assistant” находится далеко за брандмауэром и NAT:
rat@assistant:~$ ifconfig enp1s0
enp1s0 Link encap:Ethernet HWaddr 00:0f:1f:ab:c3:9c
inet addr:192.168.88.3 Bcast:192.168.88.255 Mask:255.255.255.0

sSMTP настраивается тривиально, вся конфигурация в одном файле, обычно /etc/ssmtp/ssmtp.conf. Реверсные алиасы не трогаем.
rat@assistant:~$ sudo cat /etc/ssmtp/ssmtp.conf|grep -v '#'
root=postmaster
rewriteDomain=domainname.lv
FromLineOverride=YES
mailhub=mail.provider.lv:587
AuthUser=robot@domainname.lv
AuthPass=strongpassword

Mutt тоже потребует настройки, иначе не получится корректно указывать желаемый адрес отправителя.
Файл настройки находится в каталоге пользователя, от которого будут запускаться скрипты. В данном случае /root/.muttrc
rat@assistant:~$ sudo cat /root/.muttrc
set content_type="text/html"
set realname="CompanyName Accounting"
set from="accounting@domainname.lv"

Первый параметр указывает на формат сообщения. Если форматирование и фирменный стиль не важны, можно оставить plain text, не указывая параметр content_type.

3. Структура каталогов и скрипты запуска.

Рабочие каталоги и файлы конфигурации разместим в /var/transfer/email:
/var/transfer/email/
/var/transfer/email/fetch <- скрипт обработки
/var/transfer/email/message_body <- тело письма
/var/transfer/email/partner1/ <- файлы и конфигурация для партнера
/var/transfer/email/partner1/recipient <- файл с адресом получателя
/var/transfer/email/partner1/.pswd <- понятно
/var/transfer/email/partner1/out/ <- очередь архивов на отсылку
/var/transfer/email/partner1/spool/ <- локальный спулер файлов для архивирования
/var/transfer/email/partner1/backup/ <- архив полученных и отосланных файлов (в основном на время отладки)

В текстовом редакторе создадим содержимое тела письма (простейший HTML):
rat@assistant:~$ sudo vim /var/transfer/email/message_body

Файлы recipient и .pswd содержат адрес получателя и пароль шифрования соответственно.

Скрипт архивирования и отсылки:
rat@assistant:~$ sudo vim /var/transfer/email/fetch
#!/bin/sh

# Find and fetch files for processing over email

# Partner1 #################################
pswd=`cat /var/transfer/email/partner1/.pswd`
rcpt=`cat /var/transfer/email/partner1/recipient`
src='/mnt/company/#encrypted_email_partner1/'
spool='/var/transfer/email/partner1/spool/'
out='/var/transfer/email/partner1/out/'
bkp='/var/transfer/email/partner1/backup/'

# Files only, no subfolders, older than 3 min, ignore hidden files
/usr/bin/find $src -maxdepth 1 -not -path '*/\.*' -mmin +3 -type f -exec mv '{}' $spool \;

# Files should be moved from spool to backup only on successful archiving
if [ "$(ls -A $spool)" ]
then
/usr/bin/zip -j -P $pswd $out/company_transfer_`date +\%Y\%m\%d\%H\%M\%S`.zip $spool/*
if [ $? -eq 0 ]
then
mv $spool/* $bkp
fi
fi

# Archives should be removed from outbox only on successful transfer
if [ "$(ls -A $out)" ]
then
cd $out
for i in `ls -A $out`
do
/usr/bin/mutt -s "CompanyName secure document transfer `date +\%Y\%m\%d\%H\%M`" $rcpt -a "$i" < /var/transfer/email/message_body if [ $? -eq 0 ] then mv $i $bkp fi done fi

Запуск скрипта по расписанию, каждые 5 минут:
rat@assistant:~$ cat /etc/cron.d/securemail
# /etc/cron.d/fetch: crontab entry to deliver files for encryption and sending over email

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*/5 * * * * root test -x /var/transfer/email/fetch && /var/transfer/email/fetch >/dev/null

Если все настроено правильно, файлы будут забираться с сервера, архивироваться с паролем и отсылаться получателю, указанному в файле recipient, с адреса, указанного в .muttrc.

Логгинг добавить по вкусу. Отправку почты на CC, BCC и список адресов смотрим в документации к Mutt.
Хотя, отсылка на список адресов в Mutt выглядит так:
a="address1@mail.com, address2@mail.com"
mutt -s "subject" -a file.pdf -- $a

Про корректные права на каталоги, исполняемые файлы и особо чувствительные данные все и так все знают.

P.S. Скрипты в данной конфигурации работают от root'a, но, так как сторонний контент не выполняется, решение достаточно безопасное. При желании можно создать отдельного пользователя под задачи автоматизации.
P.S.S. Mutt сохраняет отосланные сообщения в файле sent в каталоге того пользователя, от которого работает Mutt. Так что при серьезном потоке сообщений место на диске съедается очень заметно. Отключение сохранения отосланных сообщений в Mutt делается директивой в .muttrc:
set copy=no

2 Comments

[…] Автоматизация для бедных. Часть 1 – отсылка почты с ш… […]

[…] Автоматизация для бедных. Часть 2 – отсылка файлов на SFTP | Записки Плюшевого Крыса on Автоматизация для бедных. Часть 1 – отсылка почты с ш… […]

Leave a comment

Your comment