База публичных ключей 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

Лучше использовать разные ключи для разных хостов.

Ништяки

База ключей доступна по этому адресу

Сервак, адаптированный для работы с этой базой тут

Пользуйтесь на здоровье :)