Инфраструктура сертификата построена на доверие. Если вы доверяете неправильно, все падает. К сожалению, мы разработчики все равно делаем это все время. Йоло.
Замечательное количество разработчиков и практик разработчиков DEV поощряет или требует, чтобы вы доверяли глобально довериемую власть сертификата (CA), которые они предоставляют или генерируют локально. Если вы сделаете это, никто с доступом к ключу для этого CA может переписать любой трафик HTTPS между вами и чем-либо, и принять практически полный контроль над вашим интернет-трафиком.
Нам не нужно это делать. Эти инструменты могут легко работать без установленного глобально установленного CAS, и они открывают вас до ненужных рисков, не делая этого. Мы можем сделать лучше.
Кто это делает?
Много разных инструментов dev, на пару разных причин.
Во-первых, есть выбор инструментов, которые генерируют HTTPS CAS & Services для локальных серверов разработки и доверяют им для вас глобально и автоматически. Это позволяет вам легко запустить локальный сервер HTTPS на имя хоста, где Certs не доступны иначе, как localhost
или другие локальные имена хостов ( My-Docker-Container: 8080
). Это часто полезно, потому что все больше и больше веб-функций ограничены только HTTPS.
Инструменты, делающие это, включают в себя:
- Mkcert — Инструмент CLI на базе GO, который генерирует CA, а затем автоматически доверяет ей везде, рекомендуется для установки HTTPS со всем от Asp.net к Python Отказ
$ mkcert -install Created a new local CA at "/Users/filippo/Library/Application Support/mkcert" 💥 The local CA is now installed in the system trust store! ⚡️ The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊
- Devcert — Модуль NPM, который создает самооценку CA и автоматически доверяет этому CA в глобальном масштабе в клавише ОС и во всех браузерах он находит.
- GATSBY — Статическая структура сайта. Бег GATSBY с
--https
Сгенерирует CA, пригласите вас для своего пароля, а затем доверяйте ему автоматически и глобально, в вашем магазине System Cert, так и в каждом магазине браузера он может найти. - Create-raction-app — Официальный набор инструментов для настройки проектов приложений React One-Page. К их кредиту, они явно не говорят вам, чтобы доверять систему сертификации, но они не говорят вам, что вместо этого делать, и Интернет полон руководства рассказывая вам, как доверять это по всему миру.
- Генератор-офис — Популярный шаблон для строительства надстройки MS Office. Создает и предлагает установить системный корневой CA для локальных HTTPS Development, без малейшего предупреждения о том, что это значит.
В дополнение к локальному HTTPS-серверам также есть мир инструментов отладки HTTPS, в аналогичном пространстве для HTTP Toolkit сам. Эти инструменты позволяют вам перехватывать, проверять и переписать трафик HTTPS между клиентом и сервером для тестирования, отладки и прототипирования. Обычно они перехватывают трафик HTTPS от всей вашей системы, и требуют/настоятельно рекомендуют вам доверять свои сертификаты CA в глобальном масштабе.
Там есть множество примеров этого, от Fiddler на окнах, до Чарльз на Mac или Бурпсуйте (Java, Cross Platform), все следуют по этой же модели.
Несколько из этих инструментов серверов и отладки признают, что это риски, присущие этому (хотя они делают это в любом случае). Предупреждения предоставлены:
Mkcert:
Предупреждение : файл rootca-key.pem, который MKCERT автоматически генерирует, дает полную мощность для перехвата безопасных запросов с вашей машины. Не разделяйте это.
Devcert:
Это раскрывает потенциальную атаку на вашем локальной машине: если кто-то другой может использовать полномочий сертификата Devcert для генерации сертификатов, и если они могут перехватить/манипулировать вашим сетевым трафиком, они могли бы теоретически осиливать некоторые веб-сайты, и ваш браузер не будет отображать никаких предупреждений (Потому что это доверяет Органу Девартта).
Burp Suite:
Если вы устанавливаете доверенный корневой сертификат в вашем браузере, то злоумышленник, который имеет закрытый ключ для этого сертификата, может умереть в среднем ваши соединения SSL без очевидного обнаружения, даже если вы не используете перехватывающий прокси. Чтобы защитить от этого, BURP генерирует уникальный сертификат CA для каждой установки, а закрытый ключ для этого сертификата хранится на вашем компьютере, в определенном пользователе местоположение. Если ненадежные люди могут прочитать локальные данные на вашем компьютере, вы не хотите устанавливать сертификат CAR BURP.
Если бы только мы могли бы избежать этих предупреждений как-то и сделать что-то безопасное вместо …
Что возможно могло пойти не так?
Делать это, но показ предупреждений не правильный выбор. Во-первых, потому что это редко необходимо вообще (мы доберемся до этого), но в основном потому, что никто не читает предупреждения. Молча создавая новые риски на вашей машине, а затем размахивая опасениями к «Ну, мы предупредили вас» — это прикосновение грубое. Мы должны поощрять нашим пользователям делать безопасную вещь по умолчанию, насколько это возможно.
В зависимости от пункта, оба PreaCt-Cli & WebPack-Dev-Server поддерживают автоматические локальные HTTPS, чтобы пользователи могли легко использовать HTTPS на месте, доверяя их сертификатам CA. В 2017 году это было обнаружил Mike North, что оба проекта использовали совместный CA по умолчанию CA, ключ и сертификат HTTPS был опубликован как часть инструмента.
Любой, кто доверял сертификатам из любого инструмента до июня 2017 года, и не слышал об этом, теперь доверяет скомпрометированным CA, что означает, что они на 100% доверяют гораздому желанию, чтобы прислать им что-нибудь, пока не истечет. Для WebPack-Dev-Server, что CA CERT действителен до 2026 года, через 10 лет после его выпущенного. Упс
Трудно получить точные номера о том, сколько пользователей это затронуло, но пакет WebPack-Dev-Server был установлен 27 миллионов раз, прежде чем исправить это было выпущено, поэтому даже с консервативными оценками это было очень плохо.
Чтобы цитировать раскрытие Майка:
В результате этой уязвимости злоумышленник может очень легко и надежно подслушивать, а подвесной трафик HTTPS по всем доменам, необнаружившись. По сути, HTTPS полностью скомпрометирован, и данные больше никаких данных не являются секретными или безопасными.
Это произошло потому, что закрытый ключ был общим и полностью публичным. Все инструменты выше генерируют свежие сертификаты и ключи CA на каждом машине разработчика, поэтому они не сразу уязвимы для этой конкретной проблемы. Они избегают худшего случая, но это показывает, что произойдет, если ключевые ключи пользователей подвергаются воздействию, и только потому, что мы исправили худший случай, который не делает этот риск уйти.
На самом деле, в некоторых способах он еще хуже с 2017 года, с новым Подписано HTTP Exchanges особенность (живи в Chrome 73). В прошлом злоупотребление доверенным сертификатом CA потребует от вас перехватить трафик HTTPS машины к целевому домену. В настоящее время вы можете создавать подписанные биржи HTTP из домена X, используя открытую CA, затем хостим этот обмен на свой собственный домен Y. Лоб, посещающий и довериющуюся к CA, будет относиться к этому как реальному трафику от X. Теперь домен Y теперь может запустить JS в пункте js в домене X, или отравлять его кэш в INJECT код позже. Двигайтесь атаками, нет перехвата трафика.
И тогда есть все остальное в вашей системе, которая доверяет вашим установленным сертификатам CA. Я бы не был удивлен, если это сработало, чтобы победить проверку подписания кода, атаковать много автоматических процессов обновлений приложения и сделать вас уязвимыми во многих других местах. Вы можете быть слишком доверчивым.
Что шансы?
После того, как у вас есть сертификат CA, как это установлено, вся безопасность на основе сертификата на вашем компьютере становится контингентным, условным для того, чтобы закрыть закрытый ключ этого секрета CA. Это легче сказать, чем сделать, особенно учитывая, что многие пользователи не знают о рисках, где ключ хранится или даже что он существует.
Чтобы использовать CA, как этот локально, вам вообще нужен частный ключ CA в читаемый пользовательский файл, чтобы вы могли использовать его (или вам нужно запустить ваши инструменты DEV в качестве root, что приносит забавные новые риски). Это означает, что у вас есть читаемый пользовательский файл на вашем компьютере, который является катастрофическим риском безопасности, если он когда-либо выставлен.
Если кто-нибудь когда-либо получал доступ к вашей машине, если вы случайно совершаете этот файл в проект, если вы вернетесь к неправильному месту, или если мошенническое приложение на вашем компьютере тихо читает его, у вас сейчас огромная и невидимая проблема.
Как отрасль, мы тратим много усилий в других местах, избегая рода риска. Мы защищаем паролем наших SSH-ключей, мы соли и хеш-пароли в базах данных, и мы шифровали базу данных нашего менеджера паролей на диске. Вы не хотите «если вы можете прочитать это, у вас есть мой компьютер», читаемый пользовательский файл на вашем компьютере. Вы определенно Не хочу инструменты для создания одного для вас и спокойно и автоматически хранить его где-то.
Быть справедливым, в чехле HTTPS DEVSERVER возможно иметь ключ CA, который только для чтения для корневища, а также кэширует читаемые пользователем сертификаты и ключи для каждого домена. Затем инструмент должен подсказать права Sudo/Admin для начальной настройки для каждого домена, а когда истекает сертификаты. Это определенно помогает, но только для серверов; Это не практично для отладчиков, где вы можете поговорить со многими доменами непредсказуемо.
Даже для серверов это не идеально: только корнево-читаемый не означает «100% безопасность навсегда», каждый ключ каждого в домене все еще должен быть читаемым для пользователя, поэтому остается уязвимым, а ваши инструменты DEV должны предлагать вам через интервалы Для авторизации, когда ваши сертификаты истекают, что либо не очень хорошо (и потенциально открывает отверстие UX для других, чтобы украсть корневичный ключ CA).
Это приводит меня к одному из последствий всего этого беспорядка: потому что освежающий глобальный CAS сложно, управление глобальным CAS гораздо проще с долгоживаемыми сертификатами, что делает вещи еще хуже, если они когда-либо выставлены. Ваши инструменты DEV не нужны сертификаты, которые за последние 10 лет.
Даже если ключ CA никогда не выставлен, по крайней мере, вы даете случайные инструменты разработчика, вы только что загрузили разрешение на проверку и переписать все, что вы когда-либо видели и делаете в Интернете в будущее. Что стоит звучать страшно — как мы видели с WebPack & PreaCt-CLi, авторы Great DEV не обязательно являются экспертами безопасности.
Принципиально проблема здесь заключается в том, что глобально устанавливает сертификаты CA для местных инструментов развития Принцип наименее привилегии . Никто не использует эти инструменты, предназначенные для переопределения их долгосрочного определения доверия для всего Интернета, но это то, что они делают. Вместо этого мы должны доверять эти инструменты для проверки трафика к конкретным доменам, которые мы заботимся о том, чтобы клиент, который мы используем, в то время как мы используем инструмент.
К счастью, мы можем сделать именно это.
Как это может работать лучше?
Для 99% случаев вам не нужно доверять эти сертификаты CA в глобальном масштабе. При запуске HTTPS-сервера вам нужно только доверять его в своем HTTP-клиенте, в то время как сервер работает, и только для этого домена. При отладке клиента вам нужно только доверять сертификату в этом клиенте, во время этого сеанса отладки.
Мы можем и должны сделать именно это. Реальный только аргумент против этого я видел, что это сложно, но это действительно не правда, даже прежде чем сравнивать это с сложностью автоматически повышения привилегий и глобально установки сертификатов для каждого возможного браузера и ОС.
Например, поговорим о браузерах. Если вы используете локальный сервер HTTPS для разработки, это, вероятно, ваш клиент выбора. Временно доверять CA в Chrome для этого процесса CHROME, не затрагивая другие или будущие процессы Chrome, и, не доверяя ничему, что в системе, вам нужно:
- Получите отпечаток сертификата.
- Легко сделать во многом инструментов и библиотек, из openssl cli к узел
- Начните Chrome с
Hignore-сертификат - ошибки-spki-list = $ отпечаток пальца
Это не так сложно. Та же опция также работает из коробки для других браузеров на основе хрома, от края до смелых.
Firefox не имеет одного варианта для доверия к этому сертификату, но вы можете создать новый профиль Firefox, доверяйте ему вручную (или автоматически используя Certutil
), а затем используйте этот профиль только тогда, когда вам это нужно. Установка этого и выбора профиля является автоматически, и на самом деле Devcert & Mkcert уже выполняют большую часть настройки (но против вашего глобального профиля пользователя).
Для клиентов без браузера HTTPS также есть хорошие варианты. В большинстве случаев доверие сертификата может быть настроено только с переменной среды. Это означает, что вы можете установить эту переменную в сценарии, который вы используете, чтобы запустить свои тесты или запускать свой клиент, и вы закончите.
Для начала, для всего, что использует OpenSSL по умолчанию, вы можете установить SSL_CERT_FILE
Переменная среды, чтобы указать на путь сертификата. Это охватывает много приложений и популярных инструментов из коробки, от Curl для APT-Get, особенно в том числе, включая большинство кода, работающих в Ruby, Python, PHP и других подобных языках.
Есть несколько других особых случаев, в зависимости от того, что вы строите. Node.js игнорирует эту переменную, но предоставляет свою Node_extra_ca_certs
Env var, который работает аналогично. Несколько других конкретных библиотек нуждаются в их собственной конфигурации, например, популярные запросы Python Library ( requests_ca_bundle
) и LWP Perl ( perl_lwp_ssl_ca_file
). Для Java вам нужно построить Truststore для вашего приложения, которое включает в себя сертификат, что означает работает одна команда Отказ
Хотя это не тривиально, было бы трудно объединить его в пакет нулевого конфигурации, который сделал это без усилий. Для любого из этих языков очень возможно временно доверять данному сертификату для эффективного трафика HTTPS без глобальных побочных эффектов или долгосрочного риска.
В последний шаг мы также сможем ограничить силу самих сертификатов CA. Поддержка для Имя ограничения Расширение сертификата быстро растет Отказ Это позволяет создать CA, который доверяет только подписать сертификаты для сертификатов в белкеренном диапазоне доменов, поэтому доверие к CA не означает, что дает им пустой чек на весь интернет.
Благодаря таким улучшениям, в 99% случаев, мы можем напрямую доверять сертификату только тогда, когда и где нам это нужно, из браузеров, чтобы вернуть код в сценарии оболочки в инструменты CLI. Просто не нужно глобально довериться властям сертификата только для использования простых инструментов DEV.
Что нам делать?
Хорошо, так это происходит, это плохо, и это ненужно. Как мы это исправить?
- Инструменты, которые устанавливают локальный сервер HTTPS по всему миру, довериющуюся к CA, должен отбросить это и вместо этого добавлять команды для начать браузеры, которые доверяют сертификату напрямую и поощряют пользователей использовать это вместо этого по умолчанию.
- Автоматизированные тесты и сценарии, которые разговаривают с локальными серверами HTTPS, не должны требовать установки глобальных сертификатов, но вместо этого следует доверять сертификатам, просто настроив их клиентов и только во время теста.
- Отладчики HTTPS должны взять под контроль клиентов, которые они заботятся о том, и впрыскивают настройки непосредственно в них, а не требуют глобального доверия и перехватывания всего трафика со всей системы.
- Любая строительная логика, которая решает, какие сертификаты доверием доверие должны включать эвакуацию люка, как указано выше, а не только доверяет хранилище ОС и должен внедрять ограничения имени.
- Инструменты должны стремиться сгенерировать сертификаты CA с ограничениями имени и короткие жизненные жизни. Для многих случаев использования вы могли бы даже пойти дальше, и генерировать свежий CA для каждой сессии.
- Разработчики (и все остальные) должны прекратить доверять и установить сертификаты CA, во всем мире, без действительно очень потрясающей причина, по которой они полностью понимают.
Флаг Звучит неплохо?
Конечно, большая часть того, почему я пишу, это моя работа в http Toolkit, решая точно такую же проблему. HTTP Toolkit Это отладчик HTTPS с открытым исходным кодом, который имеет инструменты для перехвата трафика от одного клиента, путем введения настроек прокси и доверительные сертификаты только там, где они необходимы, выполняют именно выше. С этим вы поймаете и переписывайте только трафик, в котором вы заинтересованы, у вас нет никаких проблем с глобальными довериями, о которых мы говорили здесь, и вам никогда не нужно ничего давать никаких дополнительных разрешений.
Эта реализация это все Открытый исходный код Так что, если вы заинтересованы или работаете над чем-то похожим, тогда посмотрите, как HTTP Toolkit запускает Chrome с перехватом или все Env vars он использует перехватить произвольные команды CLI .
Есть какие-нибудь мысли на этом? Связаться в твиттере или по электронной почте Отказ
Первоначально опубликовано Блог HTTP Toolkit
Оригинал: «https://dev.to/pimterry/global-developer-cas-considered-harmful-3a9i»