База публичных ключей GitHub и SSH сервер, который знает о вас всё
Ради этой статьи я начал вести блог. Из-за неё всё и началось. Перед тем, как начать читать, зайдите сюда:
ssh whoami.shanginn.ru
Это безвредно :)
Публичные ключи и GitHub
Знаете ли вы, что все ваши публичные ключи, подключенные к GitHub’у доступны всем? Мои, например, лежат здесь https://github.com/shanginn.keys. Здорово правда?
Очень здорово! А что ещё более здоровское?! СОБРАТЬ ИХ ВСЕ!
Я не первый, кому эта идея пришла в голову. Ben Cox собрал такую базу ещё в далёком 2015 году, но (редиска такая) не опубликовал нигде эту базу.
Пришлось заняться этим самостоятельно.
Собираемся с силами
Собравшись с ними, я написал тулзу которая этим и занимается.
Написана на питоне и работает через API гитхаба. Но github позволяет делать только 5000 запросов в час. Чтобы получить ключи, нужно делать 2 запроса: 1 на пользователя, второй на ключи.
На первое время меня это устраивало. За 10 минут запарсить 2.5к юзеров, подождать 50 минут и снова.
Но потом я решил посмотреть сколько там на гитхабе пользователей. Их оказалось около 17000000…
Простыми вычислениями получаем 17000000 / 2500 = 6800 часов
. 283 дня непрерывной работы скрипта.
Он бы кстати как раз примерно сейчас закончил работу, если бы я так всё и оставил.
Но невозможно столько ждать, мне же нужно сейчас.
Брать числом
Чтобы обойти ограничение, я зарегал 10 юзеров и распаралелил задачу между ними. Первое время всё было ок, но потом github меня попалил и удалил ботов :(
Дальше в бой пошло более тупое решение: запросы через веб. Их никто не отслеживает. Через них дело пошло значительно быстрее - сколько пропускная способность позволит.
Этот код был слишком уродливым, поэтому я его не опубликовал, если кому надо - пишите
Примерно через 2-3 месяца у меня была готова база ключей. Но зачем спросите вы?
Публичные ключи и SSH
Теперь самое интересное. При подключении к SSH серверу, вы шлёте все свои публичные ключи один за одним, пока сервер не примет какой-нибудь из них. Кто-нибудь может воспользоваться этим и записать все публичные ключи себе.
А при наличии базы ключей можно и поискать по ней подключающегося :)
Кто там?
Мопед не мой, сразу скажу, оригинальная идея принадлежит Filo Sottile, у которого я и скомуниздил сервер.
Но не базы ключей, не какого-нибудь внятного туториала я не нашел, поэтому пришлось допиливать напильником и разбираться.
Если вы ещё не зашли, то зайдите сейчас.
ssh whoami.shanginn.ru
Сервер просто пробежиться по базе публичных ключей и поищет там те, которые есть у вас.
Есть ещё проверка на SSH agent forwarding, X11 forwarding и CVE-2016-0777. Никакого криминала.
Никого нет.
Чтобы обезопастить себя от такого, пропишите это в /etc/ssh/ssh_config
Host *
PubkeyAuthentication no
IdentitiesOnly yes
А потом укажите, какие именно ключи должны использоваться для какого хоста в
~/.ssh/config
Host example.com
PubkeyAuthentication yes
IdentityFile ~/.ssh/id_rsa
# IdentitiesOnly yes # Enable ssh-agent (PKCS11 etc.) keys
Лучше использовать разные ключи для разных хостов.
Ништяки
База ключей доступна по этому адресу
Сервак, адаптированный для работы с этой базой тут
Пользуйтесь на здоровье :)