2023-01-09 06:33:25 UTC

Предисловие

Жил себе сайт и жил, всем меня устраивал и я совершенно не собирался менять технологический бакграунд, но настал 2022 год, со всем известными событиями.

Что случилось?

Сайт жил в облаке Google, и использовал для своей работы GAE (Google Application Engine), на рантайме Go. Работало все на бесплатном тарифном плане, и практически всегда я укладывался в бесплатные лимиты этого тарифа, за крайне редкими исключениями, за которые иногда снималась копеечка — несколько центов в месяц. Разумеется к моей учетной записи была привязана банковская карта, с которой эти оплаты успешно и проходили.

Где-то до августа 2022 года все прекрасно работало, пока в один прекрасный момент, один из отслеживаемых параметров не превысил бесплатный лимит на 1 цент и на это был выставлен счет, оплатить который, по причине неработоспособности российских банковских карт за рубежом, я естественно не смог.

После выставления очередного счета и невозможности его оплатить, сайт фактически отключили (он стал выдавать 500-ки), стало невозможно даже скачать данные из хранилища, благо была резервная локальная копия  datastore и все удалось спасти.

Искать обходные пути об оплате счета за рубежом я не стал, и было принято решение переезжать либо к российскому облачному провайдеры либо вообще на свой домашний  NAS.

Решение

Никакие облачные провайдеры мне не зашли — надо долго разбираться да и небесплодно все это, поэтому было принято решение переносить все на домашний NAS сервер, который я под это дело специально построил на базе  TrueNAS Scale.

Разумеется, для этого пришлось покупать у провайдера статический IP адрес, прописывать его в DNS зоне в качестве адреса на котором работает сайт. Настройку маршрутизатора, и другие инфраструктуры вещи тоже думаю опустим.

Далее, встал выбор технологии на котором все это будет работать — оставить Golang (с Gin) или выбрать что-то другое, т.к. я теперь не зажат в рамки технологий используемых у облачного провайдера (Google).

В итоге выбор пал на использование Rust — все это будет работать в контейнере, на не самом мощном (хотя и приличном) железе и решение на Rust может обеспечить и меньший размер образа и меньшее потребление памяти и более высокую производительность. Да сложнее разрабатывать, но времени и желания разбираться у меня много.

Технологии

В мире Rust есть несколько frameworks на которых можно строить веб решения — Actix Web, WARP, Axum и другие. Я же выбрал Axum, хотя до этого начинал делать на WARP. В случае с WARP приходится писать много лишнего и также я столкнулся с достаточно странными глюками при большом количестве маршрутов. Что касается Actix, который является более раскрученным продуктом, — мне он показался глючным и достаточно монструозным. Поэтому пока Actix, — веб фреймворк от создателей Tokio — рантайма для асинхронного кода на Rust.

Идем дальше — базы данных. Локального аналога Google Datastore нет (да и не надо), поэтому используем классику — реляционные СУБД. Лично я выбрал Sqlite — не надо возиться с установкой и обслуживанием отдельного сервера, серьезная многопользовательская работа мне тоже ни к чему, нагрузку эта штука может выдержать даже поболее чем некоторые классические СУБД с отдельным сервером, ну и наличие библиотек под все возможные языки тоже имеется. Да у Sqlite всего 4 типа данных, например нет тех же дат, но все это легко обходится не самым большим количеством дополнительного кода, ну а возможностей языка мне вполне хватает.

Безопасность

Раньше основную заботу о безопасности брал на себя Google, теперь же все приходится делать самому. Серьезных данных, которые я мог бы потерять в случае компрометации сайта нет, поэтому меры самые простые:

  1. Контейнер работает не из под root (в TrueNAS Scale все сторонние приложения работают в контейнерах). То есть даже если злоумышленнику удастся сбежать из контейнера в хостовую ОС — много он там ничего не сделает.
  2. Использован distroless образ gcr.io/distroless/cc-debian11, в котором нет даже шелла, т.е. даже в случае наличия уязвимости в коде, шелл код не удастся выполнить по причине отсутствия этого самого шелла (bash и другие) который его запустит.
  3. Из интернета полностью отключено управление внутренней инфраструктурой (ssh, консоль управление TrueNAS Scale, консоль роутера и пр.) — оказывается некоторые так делают — не стоит.
  4. Естественно напрямую наружу мой NAS не торчит — все сделано через пару роутеров (каких — говорить не буду), в которых проброшены только необходимые статические порты и отключено всякое UPnP и удаленное управление из интернета.

Как показала статистика — все это не зря — большая часть посетителей любого сайта роботы, непрерывно сканирующие тебя на наличие различных уязвимостей (в основном на популярных блогоплатформах на базе WordPress, PHP, Python). Например мою главную страницу дергают раз в 10 секунд. Разумеется при наличии этих самых уязвимостей, они моментально будут проэксплуатированы в автоматическом режиме.

Детали

Как всегда, детально все можно посмотреть в исходниках сайта. Работа над ним идет непрерывно, поэтому многое из того что написано выше к моменту прочтения этого поста уже может устареть, но вряд ли очень сильно все это изменится. А если так — будет новый пост :)