Обмен паролями через незащищенные каналы

Решил поделиться простым способом как обмениваться сообщениями через незащищенные каналы связи. При этом под незащищенными каналами я имею ввиду не каналы, которые без шифрования и без паролей, хотя и это тоже конечно. А Вообще любое место, в котором сохранение данных вами не контролируется и данные откуда могут попасть куда угодно. 
 
Так что этот способ например хорошо подойдет если нужно побыстрому переслать например пароль или еще какие-то данные для доступов или еще что-то. При этом для админов это работает быстро и удобно, поскольку у всех есть сгенерированные пары ssh ключей и они всегда под рукой. Итак

1. Публичный ssh rsa ключ получателя

Создаем файл с публичным ключом получателя сообщения. Этим ключом сообщение будет зашифровано. Расшифровать сообщение сможет только владелец соответствующего приватного ключа, поэтому необходимо быть на 100% уверенным, что для шифрования используется нужный публичный ключ.
 
$ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQ5GVyTlgZGvlxD2qch4UpzMWXMjGMvDjSAJIxt4k18VdNbh1VjBTJD0F5rQbdFoeTyaxFL/u1iU0C/GpC/4V35yTP5Wtlc32jNpYAKu7xPKnRlClSj3whNIK6DWIeysXqdMB8efQLuWnCQQ/NNN86x4IjqokH2qvW/YDzy8xaYUPxaqqiQJ02UfGV+iQL3hyvqm8C/vLNizigOYBXA1MtkRtkfuhkC1sO04y+5vRHYGY156NXVsR6i6IFEwhJpjdH2pDVSH8GNdQ2ncWPJESuyvSwlTkAudvD8t/XyjDJloR1Lb4Hm/DyW70YmJDLaJgT+JE91le4VRrmrdHDYzOP user' > ~/ssh_public_keys/user
 

2. Шифрование сообщения на стороне отправителя

$ echo 'Plain Text Message' | openssl rsautl -encrypt -oaep -pubin -inkey <(ssh-keygen -e -f ~/ssh_public_keys/user -m PKCS8) | base64 -w0

TuVPM+DFtsNlieOAmsM/mZQbCbzrEAatntcDhu7G2YXXMUoVONJDLLOQcADpkzHxaOiGFOJvoPr2KZarg6725F0wf7Y0b0fj5vgrMXU0ykEC0J6zmo4hUclxc55jMLdw5goG7oAWL0aq7GO6Eg1KtuGRCkMAZug5+pX4MHYfpnWHuBK8kcZ9TCN4F4hClDXfiab9dH9nEnddewja68eGBrfBB6EPCt0LbyF916EVODkZo7I4Zk/B4wqMZ2v3QAuel3ZmsxtZNW+hQXAn/bwpkUtezKHS2Z5om8yoTCRBmALD4imhPYRcBCI3UqgV2+91Ss6YYkSX/cfZe6xQmfg1Rg==
 
Полученное зашифрованное сообщение преобразовано в текстовую форму, пригодную для передачи через текстовые мессенджеры.
 

3. Расшифровка сообщения на стороне получателя

 
$ echo 'TuVPM+DFtsNlieOAmsM/mZQbCbzrEAatntcDhu7G2YXXMUoVONJDLLOQcADpkzHxaOiGFOJvoPr2KZarg6725F0wf7Y0b0fj5vgrMXU0ykEC0J6zmo4hUclxc55jMLdw5goG7oAWL0aq7GO6Eg1KtuGRCkMAZug5+pX4MHYfpnWHuBK8kcZ9TCN4F4hClDXfiab9dH9nEnddewja68eGBrfBB6EPCt0LbyF916EVODkZo7I4Zk/B4wqMZ2v3QAuel3ZmsxtZNW+hQXAn/bwpkUtezKHS2Z5om8yoTCRBmALD4imhPYRcBCI3UqgV2+91Ss6YYkSX/cfZe6xQmfg1Rg==' | base64 --decode | openssl rsautl -decrypt -oaep -inkey ~/.ssh/id_rsa
 
Вот в общем и все, посылаем получившуюся строчку получателю через почту или мессенджер и его сможет расшифровать только обладатель приватного ключа. В текущей ситуации, когда многие работают удаленно и в распределенных командах, бывает полезно переслать пароль побыстрому или еще какие-то данные, которые в открытом виде слать совсем не хочется.
 
Вы можете сказать, для подобных вещей есть GPG ключи и в общем все это и все уже давно придумано. Но не у всех они подключены и настроены, а вот что касается админов, то у них всегда под рукой есть rsa ключи для доступа по ssh.
 
Ну и не забывайте, что пароли писать на бумажках нельзя 🙂 

Как получить wildcard ssl сертификат от letsencrypt

Совсем недавно letsencrypt добавил возможность получения ssl-сертификатов wildcard типа для доменов. До этого, все сертификаты от letsencrypt выдавались только для доменов и поддоменов, что могло быть довольно хлопотно несмотря на удобство работы с certbot по обновлению и поддержке всего этого хозяйства. А поскольку получить сертификат от letsencrypt можно совершенно бесплатно, без регистраций и смс, то это поднимает важность этого момента на небывалый уровень.

Итак, Как получить wildcard ssl сертификат от letsencrypt?

Во первых стандартный certbot, выписывал все сертификаты до этого не умеет пока выписывать wildcard сертификаты, так что нужно качать новый.

wget https://dl.eff.org/certbot-auto
chmod 0755 certbot-auto

Теперь можно запускать самого бота

./certbot-auto certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns -d *.domain.com

Бот начнет задавать вопросы. Поскольку выбрана опция preferred-challenges dns он попросит создать для домена соответствующую TXT запись в DNS


Please deploy a DNS TXT record under the name
_acme-challenge.domain.com with the following value:

99EjBy71F_RWab8pepBc499GCHPAx1EVCd6pqLDlI3s

Before continuing, verify the record is deployed.
——————————————————————————-
Press Enter to Continue

Это средство для валидации того, что вы действительно являетесь владельцем указанного вами домена. Прописываем нужную запись в ДНС. Проверяем, что с сервера она видна по запросу

dig _acme-challenge.domain.com IN TXT

Если все нормально то жмем enter и едем дальше. Бот убеждается, что нужные записи в ДНС появились и выписывает вам сертификат. Вот так все очень просто.
Посмотреть список сертификатов можно следующей коммандой


./certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

——————————————————————————-
Found the following certs:
Certificate Name: domain.com-0001
Domains: *.domain.com domain.com
Expiry Date: 2018-06-16 17:01:40+00:00 (VALID: 71 days)
Certificate Path: /etc/letsencrypt/live/domain.com-0001/fullchain.pem
Private Key Path: /etc/letsencrypt/live/domain.com-0001/privkey.pem
——————————————————————————-

Особенностью беплатных сертификатов от letsencrypt является, то что они выдаются на 3 месяца, так что надо почаще следить за актуальностью установленных сертификатов.
По необходимости можно поставить бота в крон чтобы он обновлял сертификаты автоматом. Бот также умеет прописывать ныжные блоки в конфиги для распространенных веб-серверов, apache и nginx. В общем очень удобная и полезная в наше время штука. Желаю вам освоить ее и пользоваться с удовольствием.

Как сделать шифрованный раздел на файле

Итак, на одном сервере мне понадобилось побыстрому сделать отдельный шифрованный раздел, возникла вдруг такая потребность. Переразбивать диски и как-то править разделы совсем не хотелось, поэтому решил сделать шифрованный раздел на файле.

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

Итак как сделать шифрованный раздел на файле?

Все процедуры я описываю для системы Ubuntu Server LTS 16.04.

Для этой операции нам понадобиться установить несколько пакетов

apt update && apt install cryptsetup

Смотрим на каком разделе есть достаточно места под наши цели и создаем там файл нужного размера

cd /home && fallocate -l 8G data.img

Форматируем его как шифрованный раздел, при этом программа предупредит о том что все данные будут утеряны и попросит ввести ‘YES’. А также попросит ввести вас пароль. Вводим пароль 2 раза и сохраняем его в какое-нибудь безопасное место, например в keepass.

cryptsetup -y luksFormat /home/data.img

Теперь выделенный файл отформатирован под шифрованный раздел, но в системе еще не виден. Для этого его надо промапить как устройство. При этом будет запрошен пароль, который использовался шагом выше.

cryptsetup luksOpen /home/data.img data_decrypt

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

mkfs.ext4 -j /dev/mapper/data_decrypt

Файловая система есть теперь диск можно подмонтировать

mkdir /data && mount /dev/mapper/data_decrypt /data

 

Вот и все диск доступен для записи туда можно складывать данные. В случае необходимости, его можно отмонтировать, закрыть и скопировать на другой сервер или переносной диск. Или вообще держать как временное хранилище для важных данных, которые не хочется таскать с собой. При этом LUKS поддерживает до 8 слотов для хранения паролей на один раздел, что позволяет организовать доступ разным людям с возможностью разграничения доступа данным на шифрованном диске.

Главное не забывать что при ребуте или закрытии диска, процедуру по открытию нужно повторять снова, также как и монтирование.

Вот в общем и все что я хотел рассказать по данному вопросу.

 

Хорошие источники про ansible

Ansible – незаменимый помошник для DevOps. Для изучения ansible использовал несколько хороших книжек, где хорошо разбирается как это все работает под капотом и описаны разные best practice. Помогли систематизаровать знания и не наделать лишних ошибок при освоении этого замечательного инструмента. А также придти к собственному пониманию как удобно и комфортно использовать ansible для разных задач. Довольно занимательно просматривать книги и знакомиться с мнениями других людей на счет использования ansible после того как сам набираешься опыта и понимания как тебе самому приятнее и удобнее ео использовать.

Тем, кто осваевает этот инструмент, однозначно нужно хотя бы бегло прочитать эти хорошие источники про ansible, чтобы понять большую часть возможностей которые предлагает ansible для управления инфраструктурой. Конечно не стоит забывать про документацию но там, как и в любой документации, можно найти не все, здесь же представлен живой опыт.

learning ansible ebook
ansible-for-devops
ansible configuration management 2nd edition
ansible playbook essentials
ansible-_up_and_running

Сборка openssh с поддержкой авторизации через LDAP

На прошлых выходных вышла новая версия дистрибутива Debian 8 (Jessie), нового там много, поэтому впереди довольно много обновлений систем предстоит. В связи с этим решил заранее собрать версию ssh сервера, которая у меня используется в разных местах – она умеет работать с пользователями из LDAP. В этой статье я коснусь только самого процесса сборки, сам процесс настройки системы под подобную авторизацию я как-нибудь опишу позже. А сейчас о том как быстро и безболезненно пропатчить openssh-server на Debian 8 с патчем LPK.

Сам патч разработан давно в рамках LPK progect – http://code.google.com/p/openssh-lpk/ , есть несколько форков и продолжений этого патча под разные версии openssh. Я воспользовался одним из этих форков для предыдущего патча на Debian 7, когда пришло время я взял его же. Скачать его можно по ссылке https://github.com/takkeybook/openssh-lpk. Небольшую сложность, которая заключается в том что он для openssh-6.6p1 не так сложно обойти. Итак, предполагается что у вас уже есть среда с Debian 8 где вы будете проводить сбору. Выкачиваем исходники:

cd /usr/src ; apt-get source openssh-server

Скачиваем патч:

git clone https://github.com/takkeybook/openssh-lpk.git

Переименуем его для удобства и положим к остальным патчам для пакета:

cp openssh-lpk-6.6p1-0.3.14.patch /usr/src/openssh-6.7p1/debian/patches/openssh-lpk-6.7p1-0.3.14.patch

Добавляем в /usr/src/openssh-6.7p1/debian/patches/series этот патч

В самом патче меняем все упоминания 6.6p1 на 6.7p1. После этого пушим изменения о новых патчах

cd /usr/src/openssh-6.7p1/ ; quilt push ; quilt refresh

Доставляем необходимые пакеты для сборки если они не были установлены до этого:

apt-get build-dep openssh-server

Прописываем изменения в changelog чтобы у вас получился новый пакет с изменениями. Для этого воспользуемся утилиткой dch.

dch -i

Пишем, что-нибудь про изменения которые были внесены чтобы не забыть, например

Add LPK patch for working with LDAP

Теперь можно собирать пакет:

dpkg-buildpackage -us -uc

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