Защита Samba (SMB) в Linux

В современном мире для хранения собственных данных многие отдают предпочтение облачным сервисам типа DropBox или ЯндексДиск. Но бывают случаи, когда хочется иметь больше места и не платить практически ничего. Для этого разумно использовать собственное хранилище. Готовые NAS решения стоят относительно дорого, но и имеют собственные плюсы типа Raid массивов и компактного размера.

Но мы будем делать свой! Нужен лишь белый внешний адрес.

Дальше вы сможете прочитать основные этапы настройки и возможно поделиться своими идеями в комментариях.

В качестве системы мы будем использовать RaspberryPi 3 со 100Мб интерфейсом. Можно озаботиться покупкой последней модели, она идет уже с 1Гб интерфейсом. Накопителем будет 2 Тб жесткий диск от WD, например Green и внешний бокс для него.

Процесс установки довольно прост, скачиваете последний образ с сайта, можно Lite версию. Любой программой записи образов на носитель записываете образ на МикроСД и его же на HDD. Когда образ будет записан на оба носителя в раздел BOOT там и там кладете пустой файл с именем SSH или ssh для включения ssh соответственно.

Далее в разделе BOOT на МикроСД редактируете файл /boot/cmdline.txt, заменив в нем в месте root информацию так, чтобы все содержимое файла выглядело так: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait. Это заставит малину грузиться с HDD, в результате чего вы получите полноценный сервер, работающий на HDD и не зависящий от МикроСД, с кучей места и тп привилегиями. Учтите, если вы будете использовать 2.5 жесткий диск, то озаботьтесь мощным адаптером для малины, либо дополнительным питанием через второй адаптер для него.

После всех этих действий вы должны получить доступ к системе по SSH, узнав адрес системы в DHCP binding на своем маршрутизаторе.

До начала настройки системы штатными средствами raspi-config вы не сможете расширить систему на весь HDD, тк он настроен на работу только с картами памяти. Но это очень легко исправляется путем выполнения этих 4 команд:

cp /usr/bin/raspi-config ~

sed -i ‘s/mmcblk0p/sda/’ ~/raspi-config

sed -i ‘s/mmcblk0/sda/’ ~/raspi-config

sudo ~/raspi-config

Затем запускаете raspi-config и штатными средствами расширяете (expand) систему на весь HDD. Малина ругнется, попросится перезагрузиться и после этого начнет процесс расширения, наблюдать за которым вы сможете командой df -h. Для диска в 2Тб он занял около 3 минут.

Далее вы выполняете все необходимые настройки типа имени малины, таймзоны и тп.

Устанавливаем samba путем apt-get install samba из su режима. В домашней папке пользователя Pi создаете папку Share c владельцем chown pi:pi. Затем идем в nano /etc/samba/smb.conf и закидываем в него этот конфиг:

[global]

security = user
encrypt passwords = true
map to guest = bad user
guest account = nobody
load printers = No
veto files = /._*/.DS_Store/.Spotlight-V100/.TemporaryItems/Thumbs.db
delete veto files = yes
log file = /var/log/samba/samba-%I.log
log level = 0 auth:2
max log size = 1024

[Pi]
comment = internal Files
browseable = yes
path = /home/pi/Share
writeable = Yes
create mask = 0777
directory mask = 0777
public = yes
read only = no
guest ok = no
force user = pi

Настройки понятны по контексту. Перезапускаем сервис samba путем двух команд service smbd restart и service nmbd restart и проверяем доступ к ней с другой машины.

Тут начинается самое интересное — мы хотим защитить сервер от злоумышленников и переборщиков паролей. Для этих целей я решил использовать простой скрипт и iptables. Он смотрит логи на наличие неверных аутентификаций и при их обнаружении ip адрес источника трафика полностью блокируется до следующей перезагрузки сервера. Это мне показалось логичным, т.к. если злоумышленник потеряет доступ к вашему серверу он больше не будет пытаться к нему подключиться и забудет о вас. Поэтому хранить бесконечно долго его адрес в блокированных смысла нет, достаточно пары недель-месяцев блокировки. В случае, если он снова попробует подобрать пароль он снова будет заблокирован. Тем самым мы динамично будем ловить попытки подбора и заносить адреса в блокированные. Ниже прилагаю скрипт. Учтите, что он работает только с тем режимом логирования, который настроен в конфигурации smb.conf, т.к. при этой настройке лог не захламляется, но в то же время пишет статусы успешных и неуспешных попыток соединений. Вот сам скрипт:

!/bin/bash

cd /home/pi/ban
grep -r user /var/log/samba/ | grep FAILED | sed ‘s/.log:.*//g’ | cut -c 22- | sort | uniq > kandidate
cat kandidate | while read address
do
bil=iptables -n -v -L INPUT | grep $address
if [ «$bil» ]
then
echo EST
else
iptables -A INPUT -s $address -j DROP
fi
sleep 1
done

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

Вот что он делает — переходит в свою папку, ищет в папке /var/log/samba в файлах строки, содержащие user, обрезает их, чтобы остался только ip адрес, сортирует по порядку и оставляет уникальные строки, чтобы не дублировались адреса. После он их кладет в файл kandidate. Потом он перебирает его построчно, берет один адрес, смотрит его наличие в межсетевом экране и если он есть, ничего не делает. Если его нет, то добавляет в него.

Добавляете его в crontab -e: MAILTO=»» и «*/10 * * * * /home/pi/ban/sambaban» следующей строкой. Это заставит скрипт выполняться каждые 10 минут.

Так же вы можете смотреть, кто подключается к вам, анализируя логи командой: «grep -r user /var/log/samba/».

После этого вы на вашем роутере пробразываете порты 137-139 и 445. Теперь, имея белый внешний адрес вы сможете подключиться к своему облачному хранилищу.