Статья удалена
Вода по теме безопасности
Цифровая гигиена достаточно скучная тема для среднего потребителя контента, но все же привыкли мыть руки после 2020 года, так и в случае с digital-пространством эта рутина должна стать обыденностью.
Многие люди, когда в беседе могут быть упомянуты утечки данных или подтверждения того, что коммерческие корпорации, вроде Google, Apple, Microsoft, etc., используют ваши персональные данные в своих целях, могут сказать, мол, да пускай, мне скрывать нечего. Но, когда упоминаешь, что эти компании знают, что вы едите, какие покупки совершаете чаще всего, по каким сайтам передвигаетесь в течении дня, кто ваш круг общения, какие финансовые транзации совершаете, номера ваших карт, ваши адреса и многие другие чувствительные данные, которые мы тоннами передаём добровольно, меняя личное удобство и комфорт на свои данные — собеседник на секунду округляет глаза, но потом махает рукой, со словами “да и пофиг”, теряя интерес к диалогу.
Для тех же, кому сохранность своих данных важнее, чем комфорт, в цикле статей я поделюсь способами хотя бы немного отодвинуть от себя надоедливого большого брата, которые я нашел для себя. Совсем отказаться от многих вещей сейчас не получится да и не захочется, но так мы хотя бы увеличим шансы не остаться с носом. В этой заметке мы будем разбираться, как нам отказаться от сервисов хранения паролей при этом не потерять в удобстве.
Как мои аккаунты могут быть взломаны
Существует множество способов взлома учетных записей, какие-то из них уже устарели и не дадут никаких результатов, какие-то слишком медленные и тоже не особо результативны, а какие-то маловероятны, но могут давать 100% результат.
Перечислять все способы бессмысленно, потому что кроме брутфорса в лоб или социальной инженерии существует как раз один из таких маловероятных, но эффективных методов — дамп базы данных с логинами и паролями. В случае утечки злоумышленник получает ваши пароли в хешированном виде, а если разработчик сервиса еще и не очень порядочный или попросту глуповатый человек, то пароли могли хранить в открытом виде.
Возникнет резонный вопрос — ну получил вот злоумышленник мой пароль и что? У меня двухфакторная авторизация по SMS или приложение для генирации кодов, типа Google Authenticator. И это не гарантирует 100% защиты, и вот почему. SMS как второй фактор вообще не лучшая идея, но. А в случае утери доступа к Google-аккаунту вы потеряете еще и доступ к приложению с кодами.
Почему важно иметь разные пароли
Первый эшелон защиты — один пароль для одного сервиса. Если вы пользуетесь 1-5 сервисами, то пароли еще можно запомнить, но будем реалистами. Тем более лучше всего попросту генерировать и составлять из различных последовательностей свой уникальный пароль, который будет обезличен и у злоумышленника не будет возможность попросту отождествляя ваш аккаунт с вами методом тыка угадать ваш Fluffy19-CaT2022.
Перед нами встаёт задача как-то оперативно управлять нашими паролями, при необходимости изменять их и запоминать, потому что сгенерировав новый пароль вида Asd7_634--sc(324)? вы его помните ровно 0 секунд.
Как вариант, вы заходите начать использовать различные сервисы для хранения ваших паролей, ведь они гарантируют сохранность и приватность ваших данных, например iCloud, Google/Firefox/Any_browser хранилки. Но спешу вас предостеречь, что эти сервисы не могут вам гарантировать на 100% сохранность ваших данных, они не будут вам гарантировать перманентный доступ до ваших паролей в любое время и в любой момент вы можете попросту потерять все свои данные по прихоти владельца сервиса.
Как будем хранить пароли
Первым делом мы унесем все ключи шифрования и связки логин-пароль на локальный сервер, что бы только вы были ответственны за сохранность этих данных. Хранить пароли в. txt файлике очень плохая идея, потому что мы получаем ровно туже самую картину, что в случае утери файла с вашими паролями злоумышленник имеет все нужные ему данные для входа, потому что пароли были в открытом виде.
Первым шагом было бы логично предположить — шифровать пароли, хешировать или еще как-то прятать данные от глаз.
Вторым шагом — спрятать пары логин-пароль вообще в целом от простого доступа, но что бы это было локально, на вашем компьютере или смартфоне, что бы никто, кроме вас, не управлял этим файлом.
Выход из ситуации простой — менеджер паролей Pass и локальный Git-сервер.
Pass — лучший менеджер паролей
Для своих целей мы будем использовать open-source менеджер Pass.
Цитата с сайта:
Управление паролями должно быть простым и соответствовать философии Unix. С pass, каждый пароль живет внутри gpg зашифрованный файл, имя файла которого является названием веб-сайта или ресурса, для которого требуется пароль. Эти зашифрованные файлы могут быть организованы в значимые иерархии папок, скопированы с компьютера на компьютер и, в общем, управляться с помощью стандартных утилит управления файлами командной строки.
passwordstore. org
По сути Pass это bash скрипт, который использует для шифрования GnuPG.
Создаем ключи шифрования
Будет преложен алгоритм шифрования:
Выбираем RSA, вводим 1.
Далее нам предлагают ввести длину ключа:
Вводим 4096.
Далее нас спрашивают о сроке жизни ключа, я указал бессрочный (0):
Следом нас просят ввести реальное имя и почту (можно вводить вообще любые данные, главное, чтобы вы их помнили сами), и дополнительный пароль для доступа к ключам.
Что бы внести больше рандомизации в генерацию ключей, нас попросят нажимать всякие кнопки и двигать курсором:
Делаем это и получаем свои ключи:
Чтобы удостовериться, что наши ключи созданы, вводим:
Показать все публичные и приватные ключи:
Так как gpg использует ассиметричное шифрование, то публичные ключи позволяют нам зашифровать данные, а приватные ключи позволяют нам расшифровать данные.
Через gpg можно зашифровать любой файл, который будет невозможно прочесть без приватных ключей. Но нам нужно шифровать только пароли, так что поиграемся с этим как-нибудь в другой раз.
Учимся пользоваться Pass
Инициализируем хранилище паролей, указав идентификатор наших ключей:
Добавим свой первый пароль:
Вводим дважды пароль и всё, наш первый пароль сохранен в зашифрованном хранилище.
Его можно посмотреть, набрав:
Нас попросят ввести пароль для доступа к ключам, после этого ваш пароль будет отображен.
Если набрать просто pass, то мы получим список имен паролей, например:
Вот весь список команд:
Мы также можем хранить не только лишь пароль, но и связки login-password и различную другую информацию, для этого добавляем ключ -m
Если я не хочу выводить куда-либо пароль, а просто хочу поместить его в буфер обмена, я сделаю вот так:
Перенос паролей и ключей на другие устройства
Эти пароли можно загружать даже в git-репозиторий, потому что они зашифрованы и ключи есть только у вас, но если вы не хотите выгружать их куда-то в сеть, скармливая их тем же Microsoft, тогда вам скорее всего захочится бекапить время от времени эти пароли куда-то на флешку или синхронизировать из с вашим смартфоном.
Для этого нужно нужно сначала сделать экспорт ключей, потому что без них это бесполезные файлы.
Экспорт и импорт ключей
Публичный ключ, где email@mail. com ваш идентификатор, который вы указывали с именем:
Приватный ключ:
Синхронизация с мобильными устройствами
Тут есть 3 пути:
- Свой git-сервер в своей локальной сети, доступ к которому будет под VPN (тогда вам не придется орендовать IP у провайдера);
- Свой git-сервер где-нибудь у Digital Ocean или Selectel, например;
- Приватный репозиторий на gitlab.
Думаю очевидно, что варианты идут по нисходящей в отношении приватности, но каждый из вариантов способен обеспечить достаточный уровень надежности, ключи шифрования только у вас, а загружать в git вы будете зашифрованные файлы.
Попробуем идти от простого к сложному, начнем с приватного репозитория + passforios для телефона.
Синхронизация через GitLab
Первым делом заводим аккаунт, генерируем ssh-ключ, включаем двухфакторную авторизацию и вот это вот всё.
С регистрацией у вас не должно возникать проблем, поговорим только о генерации ssh-ключей для доступа по ssh:
Прокидываем ключи в агент:
Копируем публичный ключ:
Наш аккаунт готов, создаем приватный репозиторий тут, выбираем тип в поле Visibility Level private.
Теперь у нас есть приватный репозиторий и можно инициализировать локальный репозиторий, попутно сославшись на внешний. Все инстукции есть на странице созданного репозитория, нас интересует следующее:
Ознакомились, проворачиваем следующую штуку:
Наши зашифрованные пароли лежат в закрытом репозитории. Отлично! Теперь пора синхронизироваться с телефоном. Я покажу это на примере iOS и приложение passforios. Устанавливаем его.
Будьте внимательны, на третей строке, где мы добавляем ссылку на удаленный репозиторий, вам нужно указать своё имя пользователя и имя репозитория.
Добавляем ключи шифрования в приложение Pass на iOS. Для этого следуем инструкциям на скриншоте:
На последнем скриншоте есть инструкция по экспорту sub-key. Подобное мы делали выше, но там мы экспортировали сами ключи, а здесь будут использоваться саб-ключи. Продублирую этот текст сюда, что бы было проще скопировать и экспортировать.
Теперь эти ключи переносим на свой смартфон любым удобным способом (только не через мессенеджеры!). Я, например, перекидывал ключи через свой локальный ftp сервер. Вы можете перекинуть через NAS, если у вас есть, поднять ftp или samba-шару сделать. Короче, перенесите как угодно, только не через внешние сервисы.
Конфигурируем git-репозиторий, для этого следуем инструкции на скриншоте:
На этом шаге нам требуется указать ssh-ключ, и ссылку на репозиторий. Ключ для репозитория я советую сгенерировать еще один, конкретно для вашего приложения и добавить его на gitlab. Как генерировать ключ для репозитория и добавлять его мы обсуждали выше в п. 1.
Когда вы добавите ssh-ключ и укажите ссылку на репозиторий посто нажимайте Clone и проверяйте. Всё должно работать и репозитории синхронизируются.
Свой Git-сервер на DigitalOcean
Все готово, мы молодцы! Теперь мы можешь углубиться и синхронизироваться через личный git-сервер, который захостим, например, на Digital Ocean. Принцип настройки самой синхронизации останется таким же, только адрес репозитория будет другим. О том, как поднять свой личный gitlab сервер есть отличная статья от самих Digital Ocean, лучше и понятнее этих ребят я не напишу, так что позволю себе просто сослаться на них.
Внимание! для GitLab заявлены требования в минимум 4Гб оперативной памяти на сервере, так что имейте это ввиду, когда будете поднимать дроплет. Ценник получается слегка кусачий, так что держите эту информацию в голове.
Но мы будем поднимать свой Gitea-сервер, а не Gitlab. Он гораздо менее прожорливый и нам хватит даже самого хилого сервера за 4-6 долларов в месяц, что бы хостить свой большой ресурс с репозиториями.
Упомяну, сли будете пользоваться услугами Digital Ocean не забывайте про мою реферальную ссылку!
DigitalOcean предлагает реферальную программу, сделка будет честной, вам $100-$200 на 2 месяца, мне $25. За это время вы успеете попрактиковаться с облачными тулами, может быть решите разместить там свой проект. При регистрации вас попросят внести $6 на свой депозит, чтобы подтвердить, что вы реальный пользователь. Это цена дроплета на месяц.
Реферальная ссылка: тык!
Регистрироваться по моей ссылке вовсе не обязательно. Этот текст не реклама и не промо. Как вариант вы можете использовать любой другой хостинг, который удобен или выгоден вам, но если у вас есть потребность отблагодарить меня за этот текст, то вы можете сделать это так, ну и получите себе бонус на 2 месяца.
Что ж, у нас есть на выбор 2 пути -- поднять чистый дроплет или же использовать готовый. Я подниму пустой, потому что я туда еще и VPN поставлю, о котором поговорим в отдельной заметке.
Настройки безопасности на DigitalOcean
После регистрации вам станет доступна панель управления. Настроим безопасный доступ до наших серверов посредством добавления SSH-ключа. Проходим в Settings ⇨ Security ⇨ Add SSH key
Генерируем ssh-ключи
В моём примере я указываю абсолютный путь до ключа и называю его test, потому что у меня уже были сгенерированы id_rsa ключи (так они называются по умолчанию).
Копируем весь ключ и вставляем в нужное поле.
Ключ добавлен. Теперь мы можем подключаться к серверу по ssh.
Создаем дроплет и производим базовую натсройку
Переходим к созданию непосредственно нашего сервера. В DigitalOcean эти серверы принято называть дроплет (droplet, англ.: капля). Следуем в Droplets ⇨ Create ⇨ Droplets.
Теперь просто следуем моим скриншотам. Нам требуется:
- Choose an image: Ubuntu 20.04 (или новее, но LTS)
- Choose a plan: Basic (за $5-$6)
- Choose a datacenter region: Frankfurt (или ближайший к вам)
- Authentication: SSH keys (установлено по умолчанию, если нет — выбираем руками сами)
- Choose a hostname: wireguard (можно любое, это ни на что не влияет)
- Кликаем Create Droplet
Создастся ваш новый дроплет (может пару секунд придется подождать), копируем его IP-адрес, и идем в терминал (можно использовать терминал прям там, указано зеленой стрелочкой)
Я же в моём случае подключусь через терминал по ssh. Это не принципиально, как удобнее, так и делайте. Если вы будете подключаться через ssh из терминала, то это будет выглядить вот так:
Где вместо <server_IP_address> надо подставить IP-адрес вашего дроплета. Его можно скопировать у дроплета в, кхм… списке дроплетов.
Установим на сервере необходимые инструменты, такие как Docker, docker-compose.
Необязательный шаг: если установится docker-compose ниже 1.27 (проверить можно через docker-compose -v), то надо будет поставить его из исходников, это делается не сложно:
Удалим предыдущую установку
Смотрим в репозитории последний релиз, нам нужен только его версия. Актуальная версия 2.17.2, скачаем ее:
Проверим версию docker-compose -v, должна быть 2.17.2.
Далее нам нужно создать директорию, где будет храниться файл настройки наших контейнеров docker-compose. yml:
И создаем сам файл настройки:
Если мы хотим использовать свой домен с https
Вставляем туда эту настройку и корректируем под себя:
В строку ROOT_URL нужно вписать либо домен, либо IP-адрес сервера.
В настройке extra_hosts указываете домен и IP-адрес сервера.
Чтобы сохраниться в vim и выйти из него, введите :wq.
Давайте разберемся, что тут у нас в конфигурации.
Compose будет запускать 4 контейнера:
- Nginx: web-сервер, обратный прокси
- Cerbot: ssl сертефикаты от Let’s Encrypt, что бы работал https
- Gitea: наш гитхаб, только дома
- PostgreSQL: база данных
Nginx нам нужен, что бы разруливать движение трафика между контейнерами и предоставлять HTTPS-соединение.
Cerbot генерирует нам сертификаты, которые нужны для HTTPS, без них просто так не заведется. Сертификаты бесплатно выдает Let’s Encrypt. Походите по ссылкам и ознакомьтесь со всем этим.
Gitea и PostgreSQL это наш git-сервис, как gitlab или github, только владельцем будете вы и никто не сможет управлять вашими файлами и репозиториями.
Конфиг для контейнеров есть, теперь нам нужно сгенерировать сами сертификаты и сложить их в папочку к Gitea.
Cerbot спросит ваш домен и ваш email, все вводим, со всем соглашаемся.
Далее закинем эти сертификаты в папку с Gitea, так как мы в настройке указали, где их искать:
Создадим теперь конфигурацию для Nginx:
И закидываеум туда эту конфигурацию:
Сохраняем и выходим: :wq
Теперь все готово для первого старта:
Переходим в адресной строке по адресу server_IP>:3000 и производим первичную настройку, выбрав базу данных PostgreSQL и внизу вводите админские данные для учетной записи.
Если вам требуется мягко и правильно положить ваши контейнеры, и не поучать ошибку от Nginx, что порт 433 уже занят, нужно сделать так:
Если вы все же получаете эту ошибку, проверьте, кто у вас использует этот порт и прибейте этот процесс:
Если мы хотим поднять просто git-сервис без свистоплясок и домена
Этот вариант сильно проще и его же мы будем использовать при настройке на Orange Pi.
Наш docker-compose. yml будет выглядить следующим образом:
И все, больше никаких манипуляций не требуется.
Запускаем контейнеры и настраиваемся:
Ну а теперь проделываем всё, что делали в пункте Синхронизация через GitLab, только репозиторий создаем теперь в нашем gitea-сервисе и в настройках passforios будем использовать адрес нашего репозитория.
Экста-уровень, свой git-сервер на Orange Pi под VPN
Ух, ну а теперь начинается достаточно дрочная часть, потому что Orange Pi PC Plus, которая стоит 1-2 тысячи рублей, этот тот еще кусок… приключений и веселья.
Многие хотя бы раз слышали про Raspberry Pi, это крутые одноплатные компьютеры с процессорами на arm архитектуре. Это малютки всем хороши, но всегда есть какое-то но, и здесь их больше, чем меньше:
- Цена. Эти штуки до недавнего стояли вменяемые 3-6-8 тысяч рублей, за разного толка конфигурацию, но сейчас цены совсем кусачие, это нам не подходит;
- Закрытый исходный код. В интернете достаточно примеров бекдоров, которые есть в ПО этих плат.
- Температуры у старших моделей. Не знаю, стоит ли в целом выносить это в минусы, так как это в целом проблема мощных одноплатников, но пусть будет.
На рынке существует много альтернатив, но мы остановимся на open-source Orange Pi и для игрулек я себе взял чуть ли не самую дохлую Orange Pi PC Plus на 1Gb RAM и Quad-Core ARM Cortex-A7 1.296GHz. Встала она мне с корпусом, радиаторами, куллером, двумя блоками питания и флешкой 10 класса на 16Gb за 1 тысячу рублей.
Если сравнить её с Raspberry Pi, то, ну, очевидно, она проиграет во всем, а самое главное, что у Raspberry Pi огромное комьюнити и вы легко нагуглите любую проблему с пошаговым гайдом к решению, а вот с OrPi придется знатно так забуриться в гик-сноб-нёрд форумы и попытаться угадать мелодию с двух нот.
Подготавливаем flash-карту
Первым делом идём сюда и определяемся с дистрибутивом. Скажу сразу, что Armbian развивается лучше всех, но мне очень лень пробовать что-то другое, так что я возьму Ubuntu Server. К сожалению там ubuntu server 16.04, но, как говориться, это open-source, ешь, что дают. Для нас это не станет проблемой, мы обновимся до 20.04 без особых проблем далее.
Далее просто извлекаем удобным для вас способом образ из архива, например вот так:
Нам нужно подготовить флешку к записи, флешка должна быть отформатирована в FAT, для того, чтобы нам можно было создать загрузочный диск. Это можно сделать через GParted, если вы на Linux-системе или же через HP USB Disk Storage Format Tool если вы на MS Windows.
Далее нам нужно залить операционную систему на подготовленную flash-карту. Для этого можно использовать любое удобное для вас ПО, будь то dd, Unetbootin, Rufus.
Давайте разберем способ через dd, потому что в остальных случаях все интуитивно понятно:
Узнаем имя нашей USB-flash карточки: lsblk или fdisk -l
Ищем нашу флешку по объему, моя на 16Gb, и имя у него /dev/sdb, ваша также будет /dev/sdb или /dev/sdc.
Далее нам необходимо размонтировать том и отформатировать флешку:
Теперь заливаем образ на флешку, образ лежит ~/Downloads/OrPi_ubuntu_1604.iso:
Это займет какое-то время, после окончания процесса ваша флешка готова к использованию в Orange Pi.
Первый старт
Мы залили на флешку образ, вставили карточку в плату, подключили питание, клавиатуру и монитор, что дальше?
Дальше стоит произвести некоторые манипуляции, после которых можно будет отключить от платы монитор и клавиатуру и закинуть её куда-нибудь подальше в пыльный угол, но до этого войдем в систему: login — root, password — orangepi.
Далее можно попробовать обновиться, но лучше сразу исправить пару проблем, о которых ниже.
Исправляем проблемы с доступной памятью flash-карты
Забегая вперед вы 100% столкнетесь с двумя распространенными проблемами:
- Недоступность всего объема памяти флеш-карты для /;
- Маленький объем в /boot.
Про первый пункт даже в самой документации есть, не знаю, почему это не исправили спустя столько лет, штош… open-source moment.
Расширяем доступный объем для файловой системы: для нас учтивые разработчики положили скрипт, который нам нужно просто запустить из под root.
Если же вы держите flash-карточку в руках, то можно расширить раздел прям через GParted. Мы тем более вернемся к нему снова в решении следующей проблемы.
Расширяем объем /boot
Ооо, я с этим просидел в поисковике не один час, а решение было очевидное. Суть проблемы:
- Есть раздел /boot, у которого выделено 10-15Mb, это очень мало и мы не сможем обновиться;
- Раздел /boot отформатирован как FAT16, а GParted использует внешний модуль из другой библиотеки для форматирования и там (проблема существует с 16 года) до сих пор не добавлена возможность расширить или как-то работать с разделами < 256Mb. Open-souce moment.
Мы выйдем из положения просто:
- Копируем все из папки /boot куда-нибудь себе на компьютер;
- Форматируем раздел в ext4;
- Расширяем его до 512Mb, предварительно откусив это место от раздела /;
- Форматируем расширенный раздел в FAT16;
- Заливаем обратно файлы в /boot, которые мы копировали к себе в п. 1.
Отлично! Мы только что починили две проблемы, которые не дали бы нам обновляться в будущем, но осталось еще несколько…
Исправляем проблему с уходом в сон
У нашей игрушки есть самая бесячая проблема -- включается скринсейвер и плата будто бы засыпает. Такие манипуляции ни к чему не приведут:
Все это из-за того, что из коробки у нас устаноновлены иксы (x11-core). Удаляем все это:
Минус еще одна проблема. Теперь можно обновляться до 20.04: sudo do-release-upgrade. На все соглашаемся, все подтверждаем.
После всех действий можно откидывать все лишние шнурки от платы и подключаться к ней через ssh, выясняем IP-адрес сервера в админке вашего роутера или прям на месте: ifconfig | grep 192.168*
Показываем сервер наружу через VPN
Вот тут я уже рассказывал, как нам можно поднять VPN, через который мы
соберем устройства в приватной сети. Нам останется только добавить новый Peer для нашего сервера и настроить сам сервер.
Возможно через некоторое время я напишу в блог сюда новую статью с обновлениями, но пока воспользуйтесь старой.
По этой инструкции генерируем ключи и добавляем Peer на сервере, затем перезагружаем службу. Я добавлял Peer с IP 10.0.0.10, что бы мне проще было запомнить, так что дальше я буду использовать в примере этот адрес.
Дальше переходим на наш OrPi сервер и там устанавливаем wireguard-tools:
Создаем файл конфигурации /etc/wireguard/wg0.conf и вставляем в него это (поменяв ip-внешнего сервера и ключи на свои):
Все готово, подключиться к VPN: wg-quick up wg0, отключиться от VPN: wg-quick down wg0.
Добавим в cron задачу, что бы после рестарта включался VPN crontab -e и добавляем в конец файла следующее:
Сохраняемся. Вы великолепны! Теперь вы можете подключиться к своему серверу не из локальной сети.
Устанавливаем Gitea
Устанавливать мы будем не из контейнера, а как службу (с контейнерами я просидел целый вечер, в надежде побороть ошибки, связанные с разными архитектурами, но ничего не вышло).
Скачиваем бинарник:
Создадим все нужные директории:
Создадим пользователя, от которого будет запускаться сервис:
Скопируем бинарник в глобальную папку:
Теперь создадим файл службы:
И закинем туда конфигурацию:
Включаем нашу службу:
Всё! Теперь идем по вашему локальному (192.168.*. *:3000) или внешнему адресу VPN (10.0.0.10:3000), производим первичную настройку (в этом варианте я выбрал в качестве базы данных SqlLite) и все. Вы подняли свой git-сервис на своей локальной машине, который доступен только из под вашего VPN и локальной сети маршрутизатора.
Оставьте, пожалуйста, обратную связь в комментариях, это мой первый пост на DTF. Задавайте свои вопросы и указывайте на мои ошибки, давайте учиться вместе!
Спасибо вам за внимание, увидимся в следующих заметках!