{"id":25180986,"url":"https://github.com/vmagamedov/security-framework","last_synced_at":"2026-01-18T17:00:56.823Z","repository":{"id":73542395,"uuid":"302919388","full_name":"vmagamedov/security-framework","owner":"vmagamedov","description":"Step-by-step personal cybersecurity guide","archived":false,"fork":false,"pushed_at":"2021-01-15T21:09:28.000Z","size":42,"stargazers_count":17,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-04T05:23:16.180Z","etag":null,"topics":["2fa","fido2","security","yubikey"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vmagamedov.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-10T14:25:58.000Z","updated_at":"2024-11-04T10:12:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"2f98d94e-a930-4040-907e-0dd06cc72b31","html_url":"https://github.com/vmagamedov/security-framework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vmagamedov/security-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmagamedov%2Fsecurity-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmagamedov%2Fsecurity-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmagamedov%2Fsecurity-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmagamedov%2Fsecurity-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vmagamedov","download_url":"https://codeload.github.com/vmagamedov/security-framework/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmagamedov%2Fsecurity-framework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28543495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T14:59:57.589Z","status":"ssl_error","status_checked_at":"2026-01-18T14:59:46.540Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2fa","fido2","security","yubikey"],"created_at":"2025-02-09T16:38:17.056Z","updated_at":"2026-01-18T17:00:56.799Z","avatar_url":"https://github.com/vmagamedov.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"Security Framework\n==================\n\nСуществует множество статей о том, как решить одну определённую задачу,\nно нет готового комплексного решения чтобы покрыть большинство проблем.\nПоэтому данный проект и называется фреймворком, выбор тут не предполагается,\nтолько конкретные решения. Этот фреймворк можно использовать как пошаговую\nинструкцию.\n\nНадо ли оно мне? Все люди обладают инерцией мышления, трудно менять устоявшиеся\nпривычки, но когда-то появится что терять, а методы защиты будут на прежнем\nнизком уровне. Также, многие люди склонны недооценивать свою значимость и\nразмеры создаваемой уязвимости. Например, скомпрометировав себя вы\nкомпрометируете и своего работодателя. Делая свой вклад в Open Source вы\nподвергаете опасности всех тех людей, которые пользуются вашим кодом.\n\n.. contents::\n  Содержание:\n\nНам понадобится\n~~~~~~~~~~~~~~~\n\n- `Google Authenticator`_ - бесплатный аутентификатор для телефона\n- `1Password`_ - менеджер паролей, $2.99 в месяц\n- `YubiKey 5-series`_ - аппаратный ключ безопасности, требуется два таких,\n  от $45 каждый\n\nЧто такое YubiKey?\n\n.. figure:: assets/keys.jpg\n\n  Source https://itsfoss.com/yubikey-5c-nfc/\n\nЭто аппаратный ключ безопасности от компании Yubico. В первую\nочередь он предназначен для двухфакторной аутентификации которая предельно\nтолерантна к фишингу. Чтобы вы понимали насколько это крутое устройство, сразу\nскажу что мы будем генерировать приватный SSH ключ прямо внутри YubiKey, этот\nприватный ключ там и будет храниться всё время, и никак его оттуда прочитать\nили скопировать физически невозможно, а чтобы воспользоваться этим SSH ключом\nвам понадобится сам аппаратный ключ и знание PIN кода, который защищен от\nперебора самим ключом.\n\nYubiKey - это не единственный вариант подобных ключей, есть ещё Titan от Google,\nThesis и несколько других производителей. Все они реализуют открытые стандарты,\nпоэтому они взаимозаменяемые. Разница в том, какой функционал они предоставляют\nи какие стандарты поддерживают. Для двухфакторной аутентификации актуальным\nстандартом является FIDO2. YubiKey дополнительно поддерживает ещё стандарты\nPIV и OpenPGP. Нам интересен стандарт PIV, работа с ним будет описана далее.\nСтоит ещё заметить что у YubiKey нет внутри батареек и движущихся частей, их\nконструкция максимально надёжна и долговечна.\n\nУ компании Yubico есть очень много вариантов ключей, можно запутаться.\nАктуальными являются ключи 5-й серии, можно сказать что они умеют всё. Но, если\nвам ключ нужен только для двухфакторной аутентификации, то можно сэкономить\nи приобрести ключи `YubiKey Security Key`_ (с поддержкой FIDO2 стандарта).\n\nАппаратных ключа безопасности надо два, как и в случае с ключами от машины\nвсегда должен быть второй запасной ключ. Потерять ключ безопасности можно вместе\nс телефоном, и тогда вам точно понадобится запасной второй ключ безопасности.\n\nПример. У меня ноутбук только с USB-C портами и есть переходник на USB-A, а\nтакже стационарный компьютер со всеми возможными портами. Я выбрал себе\n`YubiKey 5C NFC`_ как основной и `YubiKey 5 NFC`_ как запасной ключ.\n\nОбщая картина\n~~~~~~~~~~~~~\n\nПолезно визуально представлять себе такую иерархию, в которой видно на чём\nоснована безопасность каждого из сервисов. Чем проще эта конфигурация - тем\nлучше.\n\n.. code-block:: text\n\n  YubiKey \u0026\u0026 Authenticator\n  ├─ 1Password\n  │  ├─ Apple\n  │  ├─ Google\n  │  ├─ Bank\n  │  └─ ...\n  └─ SSH\n     └─ Git\n\nВ данной конфигурации вся наша безопасность основана на аппаратных ключах\nYubiKey и на приложении-аутентификаторе. А также на нас самих: мы отвечаем\nза то, что ответственно храним пароли в своей памяти. Если на данном уровне\nчто-то не так, то и всё остальное будет под сомнением.\n\nПароли\n~~~~~~\n\nНе существует одного простого правила по составлению паролей. Правила меняются\nв зависимости от задачи. Основные критерии:\n\n- надо ли пароль запомнить\n- есть ли защита от перебора паролей\n\nСамое главное: пароли не должны повторяться и не должно быть возможности\nих подобрать зная что-то о вас, например, вашу дату рождения, ваших\nродственников и друзей, ваши увлечения.\n\nMaster пароль к менеджеру паролей\n---------------------------------\n\nПринято считать, что пароли из букв, цифр и символов - это самые сильные пароли.\nНа самом деле эти требования часто приводят к плохим паролям, люди плохо умеют\nпридумывать случайные пароли, т.к. их трудно запомнить.\n\nНа сайте 1Password есть полезная информация на эту тему:\n\n- https://blog.1password.com/how-long-should-my-passwords-be/\n- https://support.1password.com/strong-master-password/\n\nЕсли коротко, выбирайте для Master пароля значение из нескольких слов, например:\n\n.. code-block:: text\n\n  glazing-quetzal-big-bold-pullback\n\nДанный пароль был сгенерирован тут:\nhttps://1password.com/password-generator/?type=memorable.\nЕго легко запомнить, легко произносить, легко вводить слепым набором на\nклавиатуре. И главное он на множество порядков сложнее для перебора чем ваш\nтекущий пароль из букв, цифр и специальных символов.\n\nСекретный ключ\n++++++++++++++\n\n1Password для входа с нового устройства требует не только Master пароль, но и\nсекретный ключ: https://support.1password.com/secret-key-security/. Эта\nдополнительная степень защиты кардинально усиливает защиту ваших данных, но и\nсоздаёт некоторые неудобства. Если Master пароль можно запомнить, то секретный\nключ размером в 34 символа требуется где-то хранить. Отключить эту возможность\nнельзя, даже если вы используете двухфакторную аутентификацию.\n\nСекретный ключ создаётся во время регистрации в 1Password, вам будет предложено\nскачать 1Password Emergency Kit в виде PDF-файла, в котором будет сам секретный\nключ и QR-код для быстрой настройки приложения. 1Password предлагает хранить\nего в распечатанном виде или на специальной флешке где-то в сейфе. В этом и\nзаключается неудобство.\n\nСправедливости ради следует уточнить, что в случае когда вы теряете телефон, но\nу вас ещё есть с собой ноутбук, то секретный ключ вы сможете прочитать с\nноутбука. Главное чтобы под рукой оставалось одно из аутентифицированных\nустройств.\n\nНо т.к. мы будем использовать ключи YubiKey, мы можем использовать их как\nхранилище данных. Как этим воспользоваться будет описано далее:\n`Секретный ключ к менеджеру паролей`_.\n\nПароль к телефону и к компьютеру\n--------------------------------\n\nСовременные телефоны и компьютеры Apple снабжены аппаратным хранилищем\nперсональной информации (Secure Enclave), это хранилище не даст возможности\nперебирать ваш пароль сколько угодно раз. Но к составлению хорошего пароля всё\nравно следует отнестись очень серьёзно.\n\nНапример, мало кто осознаёт что Apple позволяет совершать некоторые действия\nсвязанные с вашим Apple ID не спрашивая при этом пароль от Apple ID,\nдостаточно будет ввести пароль от телефона/компьютера. Таким образом плохой\nпароль от телефона/компьютера сведёт на нет хороший пароль от Apple ID.\n\nТут наверное стоит повторить ещё раз: пароли не должны повторяться и не должно\nбыть возможности их подобрать зная что-то о вас, например, вашу дату рождения,\nваших родственников и друзей, ваши увлечения.\n\n- для пароля от устройства можно воспользоваться тем же методом, что и для\n  Master пароля к менеджеру паролей\n- iPhone позволяет установить пароль любой сложности, а не только код из 6 цифр\n- сложность пароля лучше увеличивать за счёт его длины, а не за счёт\n  использования специальных символов:\n\n  * на компьютере руки лучше помнят где расположены буквы на клавиатуре, чем\n    где расположены специальные символы. При слепом наборе ввод буквенного\n    пароля будет быстрее и с меньшим количеством ошибок, это даст возможность\n    увеличить длину пароля\n  * на телефоне ввод специальных символов требует нажатия двух кнопок - кнопки\n    ``123`` и кнопки специального символа, это сильно замедляет ввод пароля\n\n2FA или MFA\n~~~~~~~~~~~\n\nВиды второго фактора, отсортированные по уровню защиты:\n\n- телефон (низкий уровень защиты)\n- пуш-нотификации\n- аутентификатор\n- аппаратный ключ безопасности (высокий уровень защиты)\n- биометрический аппаратный ключ безопасности\n\nРазные сервисы предоставляют разный уровень поддержки двухфакторной\nаутентификации. Где-то можно использовать только телефонный номер, где-то\nможно использовать все возможные способы. Далее будет описан идеальный вариант\nсервиса, который поддерживает и аутентификаторы и аппаратные ключи безопасности\n(Google, 1Password, GitHub). Для остальных сервисов:\n\n- выбирайте наилучший уровень защиты (см. список выше)\n- когда нет возможности настроить более одного вида второго фактора\n  аутентификации, **обязательно сохраняйте коды восстановления** доступа в\n  менеджере паролей\n\nТелефонный номер\n----------------\n\nСкорее всего у вас уже был настроен номер вашего телефона как второй фактор\nаутентификации на некоторых сервисах. После настройки приложения-аутентификатора\nи двух аппаратных YubiKey ключей, телефонный номер как второй фактор\nаутентификации стоит отключить. Иначе это станет самым слабым звеном, которое\nсведёт на нет пользу от аппаратных ключей безопасности.\n\nАутентификатор\n--------------\n\nПриложение-аутентификатор по уровню безопасности хуже чем аппаратные\nключи безопасности, оно не предотвращает фишинговые атаки, поэтому пользоваться\nим в ежедневной практике не стоит. Нам аутентификатор нужен как ещё один\nвид второго фактора для большей избыточности, и многие сервисы потребуют у вас\nсначала зарегистрировать аутентификатор как второй фактор, и только потом\nпоявится возможность зарегистрировать ваши ключи безопасности. Так в нашей\nконфигурации будет 3 вида второго фактора аутентификации: одно\nприложение-аутентификатор и два аппаратных ключа безопасности.\n\nВторой фактор должен быть физически изолирован от первого фактора - пары\nлогин-пароль, не передаваться по сети, быть физически в единственном экземпляре\nи на одном устройстве. Ваше физическое устройство - телефон - это и есть ваш\nвторой фактор, а приложение-аутентификатор - это лишь деталь реализации.\n\nМногие дополнительные функции у приложений-аутентификаторов созданы\nпо причине того, что эти приложения являются единственным вторым фактором для\nмногих пользователей, и терять его нежелательно. Но к нам это не относится, нам\nне страшно потерять телефон, мы к этому готовимся. И поэтому нам нужен\nмаксимально простой и безопасный аутентификатор.\n\n`Google Authenticator`_ - это как раз максимально простой и безопасный\nаутентификатор, в котором нет ни одной лишней функции. Бэкапы, например, там\nотсутствуют by design, так безопаснее.\n\n**Важно** безопасно включать двухфакторную аутентификацию. Нежелательно включать\nдвухфакторную аутентификацию только с одним видом второго фактора. Например, вы\nуже скачали себе приложение-аутентификатор, но заказанные аппаратные ключи вы\nещё не получили. В таком случае лучше подождать пока вы получите ключи\nбезопасности, и только потом настраивать двухфакторную аутентификацию сразу на\nтри вида второго фактора. Приложение-аутентификатор - это всего лишь приложение,\nего можно случайно удалить, внутри приложения можно случайно удалить данные\nкакого-то сервиса, приложение может перестать корректно работать после\nобновления операционной системы телефона, телефон может прийти в негодность по\nсамым разным причинам и его опять же можно потерять.\n\nYubiKey FIDO2\n-------------\n\nFIDO2 - это новый стандарт, который призван окончательно решить проблему с\nфишингом. В ходе реализации этого стандарта появился W3C стандарт WebAuthn и\nнаконец-то весь пазл сошелся. Именно благодаря WebAuthn у нас появляется\nвозможность пользоваться аппаратным ключом безопасности практически в любом\nбраузере и на любой платформе.\n\nНичего настраивать в телефоне и на компьютере обычно не надо, всё должно\nработать из коробки:\n\n- вставляете ключ в компьютер\n- регистрируете его в учётной записи сервиса\n- при входе в сервис:\n\n  * на телефоне прикладываете ключ к телефону (NFC)\n  * на компьютере требуется прикоснуться пальцем к ключу (ключ в USB разъёме)\n\nАппаратные ключи безопасности могут работать со следующими интерфейсами:\n\n- USB (в том числе и через Lightning разъём)\n- NFC\n- BLE (Bluetooth)\n\nФайл-ключ\n~~~~~~~~~\n\nДанный вид ключей возможно используется для вашей электронной цифровой подписи\n(ЭЦП) или для доступа к вашему аккаунту через систему клиент-банк. Обычно такие\nключи защищены паролем, но они не защищены от метода перебора паролей. Поэтому\nдополнительные меры защиты нам не помешают.\n\nМенеджер паролей 1Password_ позволяет вам безопасно хранить данные в\nзашифрованном виде в облачном хранилище. Даже когда файлы будут загружены из\nоблака на ваш компьютер, они всё ещё будут зашифрованы. Файлы на диске будут\nрасшифрованы только на то время, когда ваше хранилище паролей разблокировано\nMaster паролем. Когда хранилище блокируется, расшифрованный файл автоматически\nудаляется с вашей файловой системы.\n\nЭто не самая лучшая защита, но лучше чем хранить файл-ключ на Dropbox или на\nдругом облачном диске. Для большей защиты не стоит использовать ключи в виде\nфайла, а использовать аппаратные ключи. Эти ключи по принципу действия очень\nпохожи на ключи YubiKey, но протоколы там другие.\n\nSSH и Git\n~~~~~~~~~\n\nОбычно приватные ключи у людей хранятся на диске, к ним имеет доступ сам\nпользователь системы и root. Дополнительно можно зашифровать ключ и доступ к\nключу будет только через пароль. Ещё можно зашифровать диск, и загрузить систему\nможно будет тоже только через пароль.\n\nМинусы:\n\n- доступ к приватному ключу всё ещё теоретически возможен, его можно легко\n  скопировать, привилегированного доступа к системе (sudo) для этого не нужно\n- пароль к приватному ключу можно подобрать методом перебора\n- шифрование диска не даёт 100% гарантии того, что данные нельзя будет\n  прочитать, есть успешные примеры атак, где получалось получить доступ к данным\n  на компьютере с аппаратным шифрованием данных на диске\n\nYubiKey PIV\n-----------\n\nНаиболее безопасным способом будет использование аппаратных ключей\nбезопасности. Приватный ключ можно сгенерировать прямо внутри YubiKey\nсредствами самого ключа, откуда его уже будет невозможно физически прочитать.\nЧтобы воспользоваться этим приватным ключом вам понадобится физический доступ к\nключу и ввод PIN кода ключа. Можно ещё настроить так, чтобы ключ требовал\nдополнительно физическое прикосновение пальцем. В отличие от пароля к SSH ключу,\nу вас будет всего 3 попытки ввести PIN код, после чего ключ будет заблокирован,\nт.е. подобрать PIN код методом перебора невозможно, за это отвечает сам\nаппаратный ключ, а не какая-то программа на вашем компьютере.\n\nYubiKey для SSH доступа поддерживает два стандарта: OpenPGP и PIV. Первый\nстандарт подразумевает использование GnuPG, что сложно, ещё раз сложно и может\nпривести к ошибкам. PIV стандарт - это стандарт для смарт-карт, разработанный\nNIST для использования в гос. органах США. Оба эти стандарта позволяют\nиспользовать YubiKey и для аутентификации, и для шифрования, и для подписывания\nданных. Мы будем использовать простой и понятный PIV стандарт.\n\nНастройка PIV\n-------------\n\nДля работы с ключами нам потребуется консольная программа `YubiKey Manager`_:\n\n.. code-block:: console\n\n  $ brew install ykman\n  $ ykman --version\n  YubiKey Manager (ykman) version: 3.1.1\n  Libraries:\n      libykpers 1.20.0\n      libusb 1.0.23\n\nВставляем ключ в USB разъём и проверяем:\n\n.. code-block:: console\n\n  $ ykman info\n  Device type: YubiKey 5C NFC\n  Serial number: XXXXXXXX\n  Firmware version: 5.2.7\n  Form factor: Keychain (USB-C)\n  Enabled USB interfaces: OTP+FIDO+CCID\n  NFC interface is enabled.\n\n  Applications  USB     NFC\n  OTP           Enabled Enabled\n  FIDO U2F      Enabled Enabled\n  OpenPGP       Enabled Enabled\n  PIV           Enabled Enabled\n  OATH          Enabled Enabled\n  FIDO2         Enabled Enabled\n\nДля начала нам понадобится сменить заводские коды ключа: PIN, PUK и Management\nKey. Все коды мы будем генерировать случайным образом и хранить в менеджере\nпаролей, это нормально так как:\n\n- доступ к менеджеру паролей возможен и в офлайне\n- для доступа к менеджеру паролей на новом устройстве мы можем воспользоваться\n  всё тем же YubiKey ключом как вторым фактором аутентификации и PIN код для\n  этого не требуется, PIN код нужен только для PIV функционала\n\nТак что хранить коды в менеджере паролей - это довольно практично и безопасно,\nвсё остаётся под контролем. Со временем PIN код мы будем знать наизусть,\nостальными кодами мы будем пользоваться сильно реже.\n\nПосле 3-х неудачных попыток ввести неправильный PIN код PIV функционал будет\nзаблокирован, потребуется PUK код для сброса PIN кода.\n\nПосле 3-х неудачных попыток ввести неправильный PUK код PIV функционал будет\nокончательно заблокирован и потребуется сделать сброс всего PIV функционал до\nзаводских настроек. Все данные в PIV функционале будут потеряны, надо будет\nзаново произвести данную настройку ключа. Остальная часть ключа никак не\nпострадает.\n\nПодробности:\n\n- https://developers.yubico.com/PIV/Guides/Device_setup.html\n- https://developers.yubico.com/yubikey-piv-manager/PIN_and_Management_Key.html\n\nPIN код\n+++++++\n\nYubiKey поддерживает от 6 до 8 цифро-буквенных символов, но для совместимости\nс другими системами рекомендуется использовать только цифры. Генерируем\nслучайные 6 цифр в менеджере паролей и меняем PIN код:\n\n.. code-block:: console\n\n  $ ykman piv change-pin --pin 123456\n                               ^^^^^^- текущий заводской PIN код\n  Enter your new PIN:\n  Repeat for confirmation:\n  New PIN set.\n\nДанный код нам стоит запомнить, но на первое время его можно также сохранить и в\nменеджере паролей.\n\nPUK код\n+++++++\n\nТе же условия что и для PIN кода. Генерируем случайные 8 цифр в менеджере\nпаролей и меняем PUK код:\n\n.. code-block:: console\n\n  $ ykman piv change-puk --puk 12345678\n                               ^^^^^^^^- текущий заводской PUK код\n  Enter your new PUK:\n  Repeat for confirmation:\n  New PUK set.\n\nСохраняем сгенерированный PUK код в менеджере паролей.\n\nManagement Key\n++++++++++++++\n\nЭтот код имеет размер 24 байта, в отличие от PIN и PUK кодов, этот код не\nзащищен от перебора ключей, поэтому тут особо важно сгенерировать код случайным\nобразом, YubiKey Manager умеет сам это делать:\n\n.. code-block:: console\n\n  $ ykman piv change-management-key --generate\n  Enter PIN:\n  Generated management key: 010203040506070801020304050607080102030405060708\n                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nСохраняем сгенерированный ключ управления в менеджере паролей.\n\nГенерация SSH ключа\n-------------------\n\n.. code-block:: console\n\n  $ ykman piv info\n  PIV version: 5.2.7\n  PIN tries remaining: 3\n  CHUID:  **********\n  CCC:    **********\n\nYubiKey имеет множество слотов для хранения ключей, вот тут их полный список:\nhttps://developers.yubico.com/PIV/Introduction/Certificate_slots.html\n\nДля аутентификации предназначен слот ``9a``:\n\n.. code-block:: console\n\n  $ ykman piv generate-key --algorithm ECCP384 9a public.pem\n  Enter a management key [blank to use default key]:\n\nPIV стандарт пока не поддерживает ключи RSA размером более 2048, вместо этого\nесть ECCP256 и ECCP384 - аналоги по сложности RSA 3072 и RSA 7680\nсоответственно, по мнению NSA.\n\nГенерируем сертификат и импортируем его обратно в ключ:\n\n.. code-block:: console\n\n  $ ykman piv generate-certificate -s \"/CN=SSH key/\" 9a public.pem\n  Enter PIN:\n  Enter a management key [blank to use default key]:\n\nПосле генерации и импорта сертификата в ключ про файл ``public.pem`` можете не\nпереживать и удалить его, он нам больше не понадобится, его всегда можно будет\nдостать обратно из ключа.\n\nПроверяем:\n\n.. code-block:: console\n\n  $ ykman piv info\n  PIV version: 5.2.7\n  PIN tries remaining: 3\n  CHUID:  **********\n  CCC:    **********\n  Slot 9a:\n          Algorithm:      ECCP384\n          Subject DN:     CN=/CN=SSH key/\n          Issuer DN:      CN=/CN=SSH key/\n          Serial:         **********\n          Fingerprint:    **********\n          Not before:     2020-01-01 23:59:59\n          Not after:      2021-01-01 23:59:59\n\nВремя действия сертификата на SSH доступ не влияет.\n\nНастройка SSH клиента\n---------------------\n\nВзаимодействие сторонних систем с аппаратными ключами происходит по специальному\nAPI, описанному в стандарте PKCS#11. Есть две актуальные реализации этого API:\nпроект OpenSC_ и разработанная компанией Yubico библиотека ``ykcs11``, мы будем\nиспользовать второй вариант, который идёт в комплекте с `Yubico PIV-Tool`_:\n\n.. code-block:: console\n\n  $ brew install yubico-piv-tool\n  $ yubico-piv-tool --version\n  yubico-piv-tool 2.1.1\n  $ ls -l /usr/local/lib/libykcs11.dylib\n  lrwxr-xr-x  1 user  admin  51 Oct 14 14:27 /usr/local/lib/libykcs11.dylib -\u003e ../Cellar/yubico-piv-tool/2.1.1/lib/libykcs11.dylib\n\nПроверяем видит ли SSH наши ключи:\n\n.. code-block:: console\n\n  $ ssh -V\n  OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\n  $ ssh-keygen -D /usr/local/lib/libykcs11.dylib -e\n  ecdsa-sha2-nistp384 ********** Public key for PIV Authentication\n  ssh-rsa ********** Public key for PIV Attestation\n\nВ списке должно быть два ключа:\n\n- ``ecdsa-sha2-nistp384`` - это сгенерированный нами ключ в слоте ``9a``\n- ``ssh-rsa`` - это ключ слота ``f9``, который предназначен для аттестации, он\n  там находится с завода, с его помощью можно убедиться в том, что ключи во всех\n  остальных слотах были сгенерированы безопасно внутри аппаратного ключа,\n  а не были импортированы в аппаратный ключ извне\n\nЕсли вы тут видите только ключ аттестации, то скорее всего ваша версия OpenSSH\nне поддерживает ключи ECCP384. Тут либо прийдётся использовать RSA2048 ключи,\nлибо обновить версию OpenSSH:\n\n.. code-block:: console\n\n  $ brew install openssh\n\nЕсли SSH корректно считывает наш ключ, то можно скопировать строчку\n``ecdsa-sha2-nistp384 **********`` в настройки GitHub и в настройки SSH сервера\n- файл ``~/.ssh/authorized_keys``.\n\nДля того чтобы ``ssh`` работал с нашим аппаратным ключом, минимальный конфиг\nSSH клиента должен выглядеть так:\n\n.. code-block:: console\n\n  $ cat ~/.ssh/config\n  Host *\n    PKCS11Provider /usr/local/lib/libykcs11.dylib\n\nПроверяем:\n\n.. code-block:: console\n\n  $ ssh -T git@github.com\n  Enter PIN for 'YubiKey PIV #XXXXXXXX':\n  Hi vmagamedov! You've successfully authenticated, but GitHub does not provide shell access.\n\nSSH агент\n---------\n\nTL;DR: Пользоваться SSH агентом совместно с аппаратными ключами безопасности\nне рекомендуется.\n\nВозможно вы ранее уже пользовались SSH агентом, чтобы каждый раз не вводить\nслово-пароль к приватному ключу. SSH агент также умеет работать с провайдером\nPKCS#11:\n\n.. code-block:: console\n\n  $ eval \"$(ssh-agent -P '/usr/lib/*,/usr/local/lib/*,/usr/local/Cellar/yubico-piv-tool/*')\"\n  Agent pid 78254\n  $ ssh-add -s /usr/local/Cellar/yubico-piv-tool/2.1.1/lib/libykcs11.dylib\n  Enter passphrase for PKCS#11:\n  Card added: /usr/local/Cellar/yubico-piv-tool/2.1.1/lib/libykcs11.dylib\n  $ ssh-add -L\n  ecdsa-sha2-nistp384 ********** Public key for PIV Authentication\n  ssh-rsa ********** Public key for PIV Attestation\n\nВ Linux всё должно быть немного проще, если ``libykcs11`` будет установлена\nв ``/usr/lib`` или ``/usr/local/lib`` - по-умолчанию SSH агент разрешает\nподгружать библиотеки только из этих мест.\n\nНо опять же пользоваться SSH агентом не рекомендуется:\n\n- недопонимание того как работает SSH агент может само по себе создать\n  уязвимость\n- SSH агент наиболее актуален когда у вас SSH ключи со сложными паролями; но\n  когда у вас аппаратный ключ с простым для запоминания и ввода PIN кодом,\n  который защищён от перебора, то необходимость в агенте практически отпадает\n\nКогда надо создать SSH соединение через bastion/jumpbox сервер,\nто ``ForwardAgent`` считается плохой практикой, существует более безопасная\nальтернатива - ``ProxyJump``. Так что от SSH агента пользы мало, а рисков много.\n\n.. _yubikey-secret-key:\n\nСекретный ключ к менеджеру паролей\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPIV стандарт (см. `YubiKey PIV`_) позволяет хранить дополнительные данные\nна самом ключе, например, отпечатки пальцев и снимок сетчатки глаза. Данные\nхранятся в специальных слотах в определённом формате данных - BER-TLV. Тут\nописаны все поддерживаемые слоты:\nhttps://developers.yubico.com/yubico-piv-tool/Actions/read_write_objects.html.\n`YubiKey Manager`_ позволяет читать и записывать в эти слоты данные в виде\nпоследовательности байт. Придерживаться BER-TLV формата нас пока никто не\nобязывает и мы можем хранить в слотах любые данные. Главное выбирать для этого\nподходящие по размеру и применению слоты.\n\nДля хранения секретного ключа я выбрал пустующий слот подходящего размера\n``0x5fc109`` - Printed Information. Данный слот предназначен для хранения\nданных, которые печатаются на пропуске (имя, фамилия и т.д.), чтобы их потом\nможно было сверить и выявить несоответствие.\n\nЕщё важным требованием является то, что доступ на чтение к слоту должен быть\nзащищен PIN кодом, не все слоты обладают данной защитой.\n\nСкопируйте значение секретного ключа в буфер обмена и запишите его в выбранный\nслот:\n\n.. code-block:: console\n\n  $ pbpaste | ykman piv write-object 0x5fc109 -\n  Enter a management key [blank to use default key]:\n  $ ykman piv read-object 0x5fc109\n  Enter PIN:\n  A3-XXXXXX-XXXXXX-XXXXX-XXXXX-XXXXX-XXXXX\n\nДанные на диске\n~~~~~~~~~~~~~~~\n\nЕсли у вас Mac с чипом T2, то ваш диск шифруется автоматически, даже если\nвыключен FileVault. Ключ шифрования хранится внутри чипа T2 и без именно этого\nчипа расшифровать диск невозможно. Но всё равно следует включить FileVault,\nникого влияния на скорость работы вашего компьютера это не создаст.\n\nЕсли FileVault выключен, то при запуске системы диск будет автоматически\nразблокирован, диск будет расшифровываться автоматически на аппаратном уровне,\nоперационная система загрузится, без пароля вы не зайдёте в систему, однако\nесть вероятность воспользоваться уязвимостями системы и всё же прочитать данные\nс разблокированного диска.\n\nЕсли FileVault включен, то операционная система даже не начнёт свою загрузку\nпока вы не введёте пароль, это самый безопасный способ, защита на аппаратном\nуровне. Шифрование на аппаратном уровне также исключает возможность перебора\nпаролей, защита от перебора реализуется чипом T2, а не операционной системой.\n\nSoftware способы шифрования требуют сложного пароля, иначе пароль можно\nбудет подобрать методом перебора. Хранить такой пароль в менеджере паролей\nне получится, т.к. пароль нужно ввести ещё до загрузки операционной системы.\nПоэтому аппаратные способы шифрования имеют значимое преимущество.\n\nПодробности:\nhttps://www.apple.com/euro/mac/shared/docs/Apple_T2_Security_Chip_Overview.pdf\n\nДополнительные материалы\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n- https://github.com/drduh/YubiKey-Guide\n- https://github.com/drduh/macOS-Security-and-Privacy-Guide\n\n.. _Google Authenticator: https://apps.apple.com/us/app/google-authenticator/id388497605\n.. _1Password: https://1password.com\n.. _YubiKey 5-series: https://www.yubico.com/products/yubikey-5-overview/\n.. _YubiKey 5 NFC: https://www.yubico.com/product/yubikey-5-nfc/\n.. _YubiKey 5C NFC: https://www.yubico.com/product/yubikey-5c-nfc/\n.. _YubiKey Security Key: https://www.yubico.com/product/security-key-nfc-by-yubico/\n.. _YubiKey Manager: https://developers.yubico.com/yubikey-manager/\n.. _Yubico PIV-Tool: https://developers.yubico.com/yubico-piv-tool/\n.. _OpenSC: https://github.com/OpenSC/OpenSC\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvmagamedov%2Fsecurity-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvmagamedov%2Fsecurity-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvmagamedov%2Fsecurity-framework/lists"}