Мы в Beeline Cloud развиваем площадку для обмена опытом между ИТ-специалистами — «вАЙТИ». Делимся техническими материалами, которые могут быть полезны хабражителям: как перекинуть два терабайта данных между дата-центрами за шесть часов, как перевести почту на локальный сервер Postfix, а также — какие SQL-запросы могли бы помочь Остапу Бендеру найти заветные стулья... (и другие материалы).

Разработка программного обеспечения
Правила логирования в DevSecOps. Материал о том, как вести логи с точки зрения DevSecOps. Автор разбирает ошибки, с которыми сталкиваются DevOps-инженеры и программисты в контексте разработки ПО. Например, он объясняет, что понимают под нейтрализацией входных данных в логах [подразумевает удаление или маскировку паролей и личных данных], и к чему может привести нарушение этого подхода.
Так, если юзернейм автоматически пишется в логи при регистрации, специальные символы в никнейме могут стать потенциальной уязвимостью. Один из способов обезопасить инфраструктуру — использовать метод sanitize(), который нормализует выходные данные и приведет их к формату в соответствии с заданными политиками.
Автор также рассматривает другие распространенные ошибки: а) неполное ведение журналов, затрудняющее поиск уязвимостей, б) отсутствие учета критической информации о безопасности, способное привести к проблемам с регулятором. Для каждой ситуации предложены рекомендации — с кодом и пояснениями.
Многопоточность. Снизу вверх. ОС. Эта статья — часть цикла, посвященного работе потоков на разных уровнях абстракции, начиная с ядра операционной системы (ОС). Первый материал представлял собой введение для начинающих разработчиков о том, как процессоры реализуют многопоточность. Вторая часть посвящена разбору более продвинутых понятий. Её автор — специалист по коммерческой разработке на .NET — рассказывает, что происходит под капотом ОС, когда пользователь запускает приложение [рассматриваемый материал может пригодиться на собеседованиях].
Статья затрагивает вопросы, связанные с доступом к общим данным и примитивами синхронизации потоков: lock, mutex, semaphore. Можно прочитать о том, какие задачи решает планировщик в ОС и какие он использует алгоритмы для распределения ресурсов. Это может быть обычная очередь или механизм Round Robin, когда каждому потоку выделяется квант времени, и все они выполняются по кругу. В материале также описаны этапы переключения контекста: от сохранения текущего состояния до загрузки нового.
Введение в аспектно-ориентированное программирование. В этой парадигме функциональность приложения делится на специальные модули, называемые аспектами. В статье автор на примере задачи с логированием показывает, как написать собственный аспект, следуя принципам АОП: как работать с перехватами и ключевыми словами, применяемыми к методам внутри аспекта (@Before, @After, @Around). Например, ключевое слово @Before говорит о том, что аспект будет применен перед вызовом оригинального метода. Также автор приводит собственный пример аспекта @RestLogging. Все методы, помеченные этой аннотацией, будут покрыты логами, причём с отображением времени выполнения (чтобы упростить профилирование ПО).
Пишем приложение на C#-стеке. Это — руководство по разработке собственного таск-трекера. Cтек: ASP.NET Core, Blazor, RavenDB и Garnet. Весь процесс поделен на этапы с короткими инструкциями и справками. Так, один из этапов посвящен разработке бэкенда с применением классов ToDoItem и ToDoRepository, а также абстракции для генерации объектов-сессии IDocumentStore. Обновление сущностей реализуется по идентификатору через вызов SaveChanges (или же с помощью метода Patch). В аналогичном же ключе автор разбирает последующие этапы разработки — про настройку кэша с использованием библиотеки StackExchange.Redi и объединение его с логикой репозитория. Дополнительно автор предлагает рекомендации по первичной настройке СУБД, проектированию интерфейса — всё со скриншотами. Код проекта также выложен на GitHub.
Хранилища и базы данных
Обновляем витрины данных в ClickHouse по партициям. Тимлид команды дата-аналитиков eLama делится опытом: как компания переходила с Google BigQuery на ClickHouse и с какими проблемами столкнулась. Одна из сложностей была связана с процессом обновления кэша витрин. Google BigQuery выполнял эту операцию за одну итерацию, в то время как ClickHouse проводит её в два этапа, вставляя строки в асинхронном режиме. Второй сценарий сложен тем, что существует вероятность обращения к таблице до завершения вставки — и тогда она будет содержать неактуальные данные. Автор рассказывает, как он и его коллеги решали эту проблему, используя частичные обновления таблиц по партициям. Последовательность действий включала установку необходимых фильтров, запись нового представления в буферную таблицу и замену старой партиции в кэше витрины на свежевычисленную. Благодаря такому подходу программистам удалось сэкономить время и вычислительные ресурсы.
Тестируем витрины данных. Другой материал от команды eLama. Описаны два сценария: доработка существующей витрины и проектирование новой. Статья делает акцент на необходимости проверки количества строк в неизменяемых фрагментах витрины и в исходной витрине — их число должно совпадать. Найти лишние строки, которые должны были отфильтроваться можно с помощью запроса EXCEPT DISTINCT. А вот ситуация с пропуском строк в выборке более сложная, так как здесь нужно уже редактировать сам код, ведь фильтры работают некорректно. Для каждого случая приведены примеры запросов. В конце — краткая выжимка с алгоритмом действий.

Как перенести XML в базу данных. Иногда XML-файлы используют в качестве полноценного хранилища данных. Автор статьи столкнулся с подобной реализацией на практике. Файл служил базой данных в программном обеспечении для конфигурации приборов с протоколом Modbus RTU. Программисту была поставлена задача — перенести содержимое XML в новую БД. И в материале он делится своим решением. Так, автор сформировал пять таблиц: device (номер, тип, название прибора и идентификатор Modbus), menu (номер и имя), registers_from_xml, items и id_xml. Он также добавил табличный редактор, вычисляемые регистры и настраиваемые формулы расчёта. Исходники можно найти в этом файле в облачном хранилище.
Реляционные базы данных в книге «Двенадцать стульев»: как устроен архив Коробейникова. Статья для начинающих знакомство с реляционными базами данных. Вот только их принцип работы разобран на примере из известной книги. Автор использует описание системы учета данных об имуществе, конфискованном у бывших дворян после революции, чтобы спроектировать её в SQL. Строятся четыре таблицы: прошлые владельцы, изъятые предметы, кому досталась мебель и ордера на конфискованные предметы интерьера. Автор также приводит примеры SQL-запросов, которые могли бы сэкономить Остапу Бендеру время на поиск заветных стульев. В принципе, желающие могут поэкспериментировать с запросами, ведь демоархив выложен в открытый доступ.
Как перенести 2 ТБ данных из одного дата-центра в другой. DevOps-инженеру поставили задачу: перенести данные между кластерами двух разных ЦОД. Первое хранилище занимало 2 ТБ, второе — 10 ТБ, а общий объём документов равнялся 500 млн. Автор рассказывает, как он подошел к проблеме. Сперва он провел оценку времени бэкапа, и, по его словам, она получилась «безрадостной», в то время как заказчик мог остановить работу БД максимум на шесть часов. В итоге автор реализовал «самопальное» решение в условиях стека с Kafka, ZooKeeper и Mongo.
ИБ и аутентификация
Аутентификация с использованием асимметричной криптографии. Разбор задачи по организации аутентификации в ASP.NET Core с помощью JWT (JSON Web Token) и RSA. Эта статья — пример практического кейса с введением в тему, разбором терминов и концепций (например, различий асимметричного и симметричного шифрования). Автор пишет проект на ASP.NET Core, позволяющий верифицировать токены, используя пару «приватный — публичный ключ». Далее он описывает более продвинутый подход с кастомным обработчиком и динамическим получением ключа из базы данных. В конце материала автор предлагает пару вариантов для хранения секретов.
Динамическое добавление провайдеров аутентификации OpenID Connect в ASP.NET Core. Этот лонгрид появился на свет, поскольку, по словам автора, найти какие-либо тематические материалы проблематично. В статье: зачем нужны Implicit, Authentication и Hybrid Flow в OpenID Connect и как подключить аутентификацию через множество провайдеров к приложению на ASP.NET Core. Вторая половина материала посвящена мультитенантности, организации хранения провайдеров в БД, реализации аутентификации и не только. Результат — приложение, код которого также доступен.
Как гарантировать безопасность конфиденциальной информации. Подборка рекомендаций по защите данных, в которой на примерах разобраны наиболее неудачные решения. Начинающие DevSecOps-специалисты могут узнать, как безопасно логировать конфиденциальные данные с помощью маскировки всего ключа или его части, как реализовать хранение учётных данных в переменных окружения вместо подхода с жестко закодированными паролями и так далее. Также можно почитать о том, что такое недостаточная энтропия в DevSecOps и какую информацию в сообщениях об ошибках стоит ограничивать.

Port knocking — ваш турникет на межсетевом экране. Статья от преподавателя СПбПУ с 24-летним опытом в ИТ. В ней сочетается как доступная теория о «простукивании портов», так и пример реализации «турникета» на межсетевом экране с помощью службы knockd. Автор даёт инструкции по настройке, описывает основные опции, а ещё показывает два сценария применения. В первом knockd должна будет получить специальную последовательность по конкретным портам, а затем открыть подключение по SSH (и после тайм-аута запретить новые соединения). Во втором сценарии похожая конфигурация, однако в ней не будет cmd_timeout.
Администрирование
Как перевести корпоративную почту с Google на собственный сервер Postfix. Ведущий системный администратор делится профессиональным опытом: как относительно быстро и безболезненно перевести корпоративную почту с G Suite на Postfix. Этот материал посвящён техническим деталям и пошаговому разбору консольных команд и файлов конфигурации. Есть про настройку серверов IMAP и POP3 и контент-фильтров, работу с квотами для почты и открытие внешнего доступа к электронному ящику. Также автор делится персональными рекомендациями — например, предлагает с осторожностью подходить к сгенерированным SSL-сертификатам.
Мониторим активность на диске с помощью inotify-tools. Обзор возможностей инструментария inotify-tools, позволяющего отслеживать использование директорий в ОС (как пользователями, так и приложениями). Автор начинает с описания утилит Inotifywatch для ожидания событий, Inotifywait для сбора метрик по этим событиям, а также рассказывает про основные команды. Дополнительно автор приводит кейсы: как использовать ту или иную утилиту, способ собрать контейнер с inotify-tools. Механизм работы утилит показан на примере Soffice — CLI-инструмента для LibreOffice.
Chroot: запуск существующего приложения в песочнице. Материал-практикум из серии статей по работе с Chroot, в котором автор поэтапно описывает процесс развёртки командного интерпретатора /bin/sh в этой среде. Каждый шаг дополнен краткими пояснениями и примерами кода. В целом пост компактный, рассчитанный на освоение базовых принципов работы с Chroot, а также сопутствующих вопросов. Рассказано про размещение библиотек, проверку работы в изолированном окружении и так далее. Каждый шаг дополнен краткими пояснениями и примерами кода.
Как создать оптимальную сеть для Kubernetes: критерии выбора. Обзор инструментов и плагинов Kubernetes: Calico, Flannel, Weave Net, Cilium и Istio. Автор не пытается определить лучшее решение, а скорее объясняет, какие инфраструктурные факторы (производительность, масштаб кластеров, функциональность и прочие) необходимо учитывать при выборе. В конце статьи даны советы — кому и почему подойдут те или иные решения. К примеру, автор считает, что в кластерах с более чем пятьюдесятью узлами стоит выбирать более гибкие и масштабируемые решения — в частности, eBPF в Cilium позволяет работать с большой нагрузкой.
Beeline Cloud — secure cloud provider. Разрабатываем облачные решения, чтобы вы предоставляли клиентам лучшие сервисы.
Дополнительное чтение в нашем блоге на Хабре: