Игродельство

Чего-то зачесалось у меня в старые игрушки поиграть. Но быстрый поиск показал, что фиг вам там. Либо надо ставить эмуляторы и искать образы, либо идти и платить непонятно за что с каким качеством (у меня до сих пор в голове свежи воспоминания, как угробили pac-man, mario и boulder dash).

Ну если оно не получается, то почему бы не взять и не написать самому? В тех играх не ни графики, ни звука, ни работ на 100500 мульонов денег. А интерес-то тот же …

В общем, отряхнул я руки и за пол-дня написал первую игру: Пинг-Понг.

Получилась простая и тупая до безобразия игрушка. Но по-прежнему захватывает и дальше 20 я уйти не смог 🙂

Брать тут https://github.com/kiltum/games/tree/master/pingpong

Пароли – наше все!

Давным давно, аж 5 лет назад, я уже задавался темой хранения паролей. Тогда я выбрал платный 1Password и до недавнего времени был полностью доволен.

За 5 лет изменилось довольно многое и к примеру тот 1Password уже не купить: нынче всё по подписке, за каждый чих требуют денег. Да и требования к хранению паролей лично у меня изменились. Немного, но значительно.

Во-первых, я больше не хочу верить. Все маркетинговые слова про “улучшенную защиту”, “aes-256”, “PBKDF2” и “SHA256” остаются словами до тех пор, пока не будет доказательств. Нет, в реальности это может быть и так, но проверить нечем.

Во-вторых, я не хочу больше отдавать контроль над моими паролями кому-то еще. Со старой версией 1Password все хорошо: она позволяет хранить пароли в iCloud, Dropbox или любом каталоге по выбору. Нынешняя, как и остальные, предлагают хранить пароли непонятно где и не понятно как защищенными. Специально сейчас прошелся по сайтам 1Password, Dashline, Lastpass, Roboform и прочим, все тот же набор маркетингового буллшита и никаких доказательств. А возможность доступа к паролям из браузера вообще считают за достоинство …

И наконец, я хочу халявы. Не то, что бы денег жалко, но садиться на иглу “платите нам $10 в месяц” не охота

По своей старой привычке “а оно надо?” я посмотрел профиль использования своих данных. Чаще всего мне надо использовать различные ключи к облачным сервисам. Вот эти вот все GCP_PROJECT, AWS_ACCESS_KEY_ID, pem файлы для ssh и так далее. А вот пароли как пароли у меня используются довольно редко. Ну раз, ну два в день. Лицензии и прочие подобные ключи я вообще использую раз в месяц, когда переустанавливаю все в рамках DRP.

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

Довольно специфичные условия, не так ли? Но нет предела совершенству!

Первым делом я пошел смотреть на KeePass. За прошедшие 5 лет он никуда не делся, все такой же монстр с кучей свистелок и перделок. И все так же хочет кучу всего, потому что и может практически все. Можно, не если честно, не вставляет.

Затем поиск вывел меня на довольно новый менеджер паролей Bitwarden. В нем все, как я люблю: у него открытый код и абсолютно прозрачная модель монетизации. За $10 в год можно получить абсолютно все, что необходимо от менеджера паролей в настоящее время. Более того, можно поставить свой собственный сервер и все клиенты будут синхронизироваться с ним, а не с сервером компании.

Попутно обнаружилась совершенно шикарная вещь: у битвардена есть консольный клиент. Выглядит это так (пароли все равно поменял)

[kiltum@mbook ~]$ bw unlock
? Master password: [hidden]
Your vault is now unlocked!

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="WgOBidzNy5wybOFgJ8t9MB3gHN2ZQww1ux0ovrbmaA0N21xRS0rrwlBofi8sp6bKe1+HmYaybCgIQnZxGqzkWB=="
> $env:BW_SESSION="WgOBidzNy5wybOFgJ8t9MB3gHN2ZQww1ux0ovrbmaA0N21xRS0rrwlBofi8sp6bKe1+HmYaybCgIQnZxGqzkWB=="

You can also pass the session key to any command with the `--session` option. ex:
$ bw list items --session WgOBidzNy5wybOFgJ8t9MB3gHN2ZQww1ux0ovrbmaA0N21xRS0rrwlBofi8sp6bKe1+HmYaybCgIQnZxGqzkWB==

[kiltum@mbook ~]$ bw list items --session WgOBidzNy5wybOFgJ8t9MB3gHN2ZQww1ux0ovrbmaA0N21xRS0rrwlBofi8sp6bKe1+HmYaybCgIQnZxGqzkWB==
[{"object":"item","id":"de683640-15ca-4dc0-98ec-a95400951086","organizationId":null,"folderId":null,"type":1,"name":"kiltum.livejournal.com","notes":null,"favorite":false,"login":{"uris":[{"match":null,"uri":"https://kiltum.livejournal.com/"}],"username":"kiltum","password":"passwordwasdeleted","totp":null,"passwordRevisionDate":null},"revisionDate":"2018-09-07T09:02:43.6466667Z"},{"object":"item","id":"161cff1e-eeaf-4091-8c0f-a954009ee2ab","organizationId":null,"folderId":null,"type":1,"name":"www.facebook.com","notes":null,"favorite":false,"login":{"uris":[{"match":null,"uri":"https://www.facebook.com/"}],"username":"multik@multik.org","password":"herewaspassword","totp":null,"passwordRevisionDate":null},"revisionDate":"2018-09-07T09:38:29.0466667Z"}]

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

Но после небольшой дискуссии в #unix.ru мне было предложено посмотреть на Pass. Поначалу я попробовал и весь расплевался. Этот менеджер паролей … ну в общем, он совершенно перпендикулярен всем остальным. В нем все не так и не туда. И вообще он какой-то кривой. Да, кривой и точка!

Но так как больше других менеджеров не находилось, решил оставить и попользоваться всеми тремя менеджерами (1password, bitwarden и pass) одновременно. Создавать новые пароли, ключи и токены, перемещаться между машинами и вообще пытаться вести обычную жизнь DevOps/SRE/SysAdmin/CTO/чебурашки.

Практически сразу выяснилось, что pass это просто развесистый bash скрипт, который в своей работе использует gpg и git. В теории это означает, что pass будет работать на всех платформах где есть эти программы. В реальности я его попробовал только под OS X и Linux

Что в итоге я получил?

Во-первых, мне больше не надо верить. Для шифрования используется gpg из дистрибутива с моим личным ключем. Каждая запись – это зашифрованный gpg файл. При желании можно взять и достать вручную.

$ gpg aws_prod.gpg 
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: encrypted with 4096-bit RSA key, ID B2698444DC05C50F, created 2017-09-11
      "Viacheslav Kaloshin "

Во-вторых, использование git на своем сервере снимает все вопросы про “кто еще получает доступ до моих данных”. Как и полную историю всех изменений с самого начала. Никаких “30 последних изменений”. Хранится всё.

$ git log|head -5
commit 8ab2f5fae8bf9a8b48dc97df908343c25a1745c1
Author: Viacheslav Kaloshin 
Date:   Mon Sep 24 15:41:37 2018 +0300

    Rename cs/ed_aws_qa to cs/ed/aws_qa.

И наконец, эта опенсорс, халява и возможность поправить и сделать по-своему.

Описывать, как устанавливать pass смысла нет: это и так прекрасно расписано на официальном сайте. Более того, на новых машинах можно просто склонировать репозиторий в ~/.password-store и на этом вся установка будет завершена.

И наконец, то, что мне больше всего понравилось.

Безопасное переключение между окружениями. В данном случае AWS, но этот же механизм работает с GCE, Azure и любым другим софтом, хранящим ключи в переменных окружения.

$ pass show cs/ed/aws_qa
AWS_ACCESS_KEY_ID=BKIAIELZCTWSJ7FECP4Z
...
$ pass show cs/ed/aws_prod 
AWS_ACCESS_KEY_ID=BKIAIN56RKIABTBHJXTW
...
$ export  `pass show cs/ed/aws_qa`
$ set|grep AWS_ACC
AWS_ACCESS_KEY_ID=BKIAIELZCTWSJ7FECP4Z
$ export  `pass show cs/ed/aws_qa`
$ set|grep AWS_ACC
AWS_ACCESS_KEY_ID=BKIAIN56RKIABTBHJXTW

Замена конструкции ssh -i key.pem user@hostname

$ pass show cs/qapem
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAw4AMstljzZRxvqNIO/ZsXnkCMm8O+FXuuTGqzII2ysH5fz8Q3pLZmKVXfz+7
....
eNK7UAHXBLGciXfFjlYlvZaLci93wtY4reWCgmsCmNx98WBMZUmF0R1VCjU/DYleIpMtNBY=
-----END RSA PRIVATE KEY-----
$ pass show cs/qapem| ssh-add -
Identity added: (stdin) ((stdin))
$ ssh user@hostname

В чем главный плюс? На машине ничего не остается в открытом виде. И стоит закрыть сессию, как все доступы магическим образом исчезнут. Никаких больше “оберегайте свой .aws от чужих глаз и прочее”.

В чем главный минус? На каждое изменение надо звать pass git push и не забывать при переходе на другую машину делать pass git pull. Но для любого современного разработчика это совершенно привычные действия, поэтому и минус-то не большой.