Связка ключей и управление секретами

Рейтинг: 64.6% · 12 голосов
Подробный курс по macOS для разработчиков и админов: архитектура и Apple Silicon, терминал и zsh, Homebrew и пакеты, launchd и автоматизация, APFS и Time Machine, безопасность (SIP, Gatekeeper, TCC, FileVault), сеть, логи и диагностика, MDM и DDM, контейнеры и виртуализация, восстановление. По официальной документации Apple, актуально на 2026 (macOS 26 Tahoe).
Ответить
Аватара пользователя
Artem_MacAdmin
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Связка ключей и управление секретами

Сообщение Artem_MacAdmin »

Оглавление курса (47)
  1. Что такое macOS: Unix под капотом и место в 2026
  2. Архитектура macOS: XNU, тома и Signed System Volume
  3. Apple Silicon: ARM, Rosetta 2 и отличия от Intel
  4. Установка, обновление и восстановление macOS
  5. Finder, рабочий стол и продуктивность
  6. Системные настройки и их управление из CLI (defaults)
  7. Пользователи и группы: учётные записи и управление
  8. Терминал и zsh: командная строка macOS
  9. CLI на macOS: BSD-команды и отличия от Linux
  10. Настройка zsh: .zshrc, prompt, плагины
  11. Файловая система и права: POSIX, ACL, атрибуты, флаги
  12. Homebrew: пакетный менеджер для macOS
  13. Homebrew глубже: tap, Brewfile, services, обслуживание
  14. Другие пакеты: MacPorts, mas, Nix и App Store
  15. Установка приложений: .app, .dmg, .pkg и Gatekeeper
  16. Управление приложениями и их данные
  17. launchd и launchctl: система запуска macOS
  18. Свои службы и периодические задачи на launchd
  19. Автоматизация: Shortcuts, AppleScript и osascript
  20. Конфигурация как код: defaults, plist и профили
  21. APFS: снапшоты, клоны, контейнеры и шифрование
  22. Управление дисками: diskutil, образы и форматирование
  23. Time Machine и резервное копирование
  24. Внешние диски, форматы и сетевые тома
  25. Модель безопасности macOS: SIP и целостность системы
  26. Gatekeeper, нотаризация и защита от вредоносов
  27. Приватность и TCC: разрешения на доступ
  28. FileVault: полнодисковое шифрование
  29. Связка ключей и управление секретами (вы здесь)
  30. Сетевой экран и защита сети
  31. Сеть в macOS: настройка и инструменты
  32. Диагностика сети на Mac
  33. Общий доступ: SSH, экран, файлы, удалённое управление
  34. Процессы и ресурсы: мониторинг производительности
  35. Логи macOS: unified logging и диагностика
  36. Производительность и энергия: powermetrics, диагностика
  37. Энергия, сон и обслуживание системы
  38. Профили конфигурации и основы MDM
  39. Управление парком Mac: MDM, DDM и zero-touch (2026)
  40. Среда разработчика на Mac: Xcode CLT, git, версии
  41. Контейнеры на Mac: Docker Desktop, OrbStack, Apple container
  42. Виртуализация: Virtualization.framework, UTM, Linux и Windows
  43. Режимы загрузки и восстановление (Apple Silicon)
  44. Сброс, NVRAM, Safe Mode и сброс настроек
  45. Траблшутинг macOS: дерево решений по симптомам
  46. Место на диске и обслуживание системы
  47. Сквозной проект: настройка Mac как у профи + куда расти
Ты хардкодишь пароль от базы прямо в .env, токен GitHub лежит в открытом виде в ~/.netrc, а API-ключ облака ты уже трижды коммитил в репозиторий и трижды отзывал. Знакомо. На macOS для этого есть штатное шифрованное хранилище - связка ключей (keychain mac), и из терминала к нему ходит утилита security. Разобравшись с ней, ты перестанешь держать секреты в открытом виде, научишь скрипты тянуть пароли из защищённого хранилища, поймёшь разницу между локальной и iCloud-связкой, и заодно осилишь passkey - беспарольную аутентификацию, которая в 2026-м стала нормой.

Этот урок - про механику. Не "где галочка в настройках", а как устроено хранилище, что реально шифруется, кто и когда тебя спросит пароль, и где разложены грабли.

Что такое связка ключей и зачем она нужна

Связка ключей (Keychain) - это зашифрованная база, где macOS хранит пароли mac, ключи, сертификаты, секретные заметки и токены. Физически это файл-контейнер, а API поверх него (Security.framework) умеет шифровать каждый элемент, навешивать списки доступа (ACL) и спрашивать разрешение, прежде чем отдать секрет приложению.

Ключевой принцип: секрет в связке ключей зашифрован, и расшифровать его можно только при разблокированной связке. А разблокируется она мастер-паролем. Для главной, login-связки этот мастер-пароль по умолчанию равен паролю твоей учётной записи - поэтому при входе в систему она открывается автоматически. Это удобно и это же ловушка: если злоумышленник знает пароль входа, он открывает всю login-связку.

На одной машине связок несколько, и это не дубликаты, а слои с разной зоной ответственности:
  • login keychain - твоя личная связка, файл ~/Library/Keychains/login.keychain-db. Пароли сайтов, токены, заметки. Разблокируется паролем входа.
  • System keychain - /Library/Keychains/System.keychain. Общесистемное: пароли Wi-Fi, сертификаты доверенных центров, машинные ключи. Доступ - через root, элементы видны всем пользователям машины.
  • iCloud Keychain - синхронизируемая через iCloud связка (внутри представлена как com.apple.security.cloudkeychainproxy3 / "Local Items"). Пароли, passkey, коды двухфакторки уезжают на все твои устройства с одним Apple ID, сквозное шифрование.
  • System Roots - read-only связка корневых сертификатов Apple в /System/Library/Keychains. Её ты не редактируешь.
В Tahoe фронтенд для пользовательских паролей - отдельное приложение Пароли (Passwords). Оно показывает пароли, passkey, коды подтверждения и работает поверх iCloud Keychain. Любопытная деталь Tahoe: ключ восстановления FileVault теперь хранится в сквозь-зашифрованной iCloud Keychain и доступен через приложение Пароли - то есть связка ключей стала ещё и точкой восстановления шифрования диска.

Старый GUI Keychain Access (Связка ключей, /System/Applications/Utilities/Keychain Access.app) никуда не делся и остаётся главным инструментом для сертификатов, системной связки и низкоуровневой возни с ACL - того, что новое приложение Пароли не показывает.

Изображение

security: связка ключей из терминала

Весь CLI - это одна утилита security cli mac. Подкоманд десятки, посмотри список:

Код: Выделить всё

security help
security help add-generic-password
Generic password - это "сервис плюс аккаунт плюс секрет", идеально под токены и ключи разработки. Internet password - то же, но с привязкой к протоколу/хосту/порту, его создаёт Safari для сайтов.

Добавим секрет - например, токен доступа:

Код: Выделить всё

security add-generic-password -s "github-token" -a "$USER" -w "ghp_xxxxYYYYzzz" -U
Разбор флагов: -s service (имя сервиса, по нему ищем), -a account (логин/аккаунт), -w password (сам секрет), -U - обновить, если такой элемент уже есть, а не плодить дубль. Если -w опустить, security спросит секрет интерактивно и не засветит его в истории shell - так безопаснее, чем писать пароль в командной строке, где он попадёт в ~/.zsh_history.

Достаём секрет обратно:

Код: Выделить всё

security find-generic-password -s "github-token" -a "$USER" -w
Без -w команда печатает метаданные элемента, а сам пароль - нет:

Код: Выделить всё

keychain: "/Users/dev/Library/Keychains/login.keychain-db"
class: "genp"
attributes:
    "acct"<blob>="dev"
    "svce"<blob>="github-token"
    "mdat"<timedate>=0x32303236...  "20260615101533Z\000"
0x00000007 <blob>="github-token"
Флаг -w говорит "выведи только пароль" - именно его и подставляют в скриптах. Вот честный паттерн для CI/скрипта вместо хардкода:

Код: Выделить всё

TOKEN=$(security find-generic-password -s "github-token" -a "$USER" -w)
curl -H "Authorization: Bearer $TOKEN" https://api.github.com/user
Секрет нигде не лежит в открытом виде - ни в .env, ни в репозитории. В памяти процесса на момент запроса - да, но это нормально.

Удаление и поиск интернет-пароля:

Код: Выделить всё

security delete-generic-password -s "github-token" -a "$USER"
security find-internet-password -s "example.com" -r "htps" -w
Параметр -r у internet-password - это четырёхсимвольный код протокола: "htps" для HTTPS, "http" для HTTP, "ftp " (с пробелом). Кодов много, но HTTPS-вариант нужен чаще всего.

Управление самой связкой:

Код: Выделить всё

security list-keychains
security default-keychain
security lock-keychain
security unlock-keychain
security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain-db
set-keychain-settings -t задаёт таймаут автоблокировки в секундах, -l - блокировать при засыпании. После lock-keychain любое чтение секрета снова потребует пароль - это полезно для рабочих станций в опенспейсе.

ACL, Touch ID и доступ приложений

Самое непонятное в связке - почему иногда выскакивает "приложение хочет получить доступ к связке ключей, введите пароль", а иногда нет. Отвечает за это ACL (список контроля доступа) у каждого элемента. В ACL записано, какие приложения имеют право читать секрет без запроса пароля.

Когда ты создаёшь элемент через security без -T, доверенным становится сам бинарь security - то есть скрипты будут читать без вопросов, а вот Safari или другое приложение спросит. Флаг -T задаёт конкретное приложение, которому разрешено:

Код: Выделить всё

security add-generic-password -s "db-prod" -a "app" -w 'S3cr3t' \
  -T /usr/bin/security -T /opt/homebrew/bin/myapp
Пустой список -T (если вообще убрать доверенных) означает "всегда спрашивать пароль" - максимально строго. Это видно и в GUI: в Связке ключей открой элемент, вкладка Контроль доступа - там список приложений и переключатель "Подтверждать перед разрешением доступа".

Теперь про Touch ID. Важно честно понимать границу: штатная утилита security НЕ умеет защищать элемент биометрией. Touch ID к связке прикручивается только через программный API (LocalAuthentication, kSecAccessControlTouchIDAny) - это про приложения, которые сами кладут секрет в Secure Enclave и требуют отпечаток на чтение. Из коробки в CLI этого нет, и если видишь сторонние утилиты "Touch ID for keychain" - они написаны как раз поверх этого API, а не поверх флагов security. Не выдумывай несуществующий security --touchid, его нет.

Зато Touch ID реально работает для разблокировки самой связки и для sudo. А секреты внутри защищены в первую очередь шифрованием связки и её ACL.

Сертификаты, доверие и passkey

Связка ключей хранит не только пароли, но и сертификаты с приватными ключами. Типичный сценарий разработчика - локальный самоподписанный CA для dev-окружения. Импорт и просмотр:

Код: Выделить всё

security import dev-ca.p12 -k ~/Library/Keychains/login.keychain-db -P 'passphrase'
security find-certificate -a -c "My Dev CA" -p
security export -t certs -f pemseq -o all-certs.pem
import кладёт сертификат и ключ в связку, -p у find-certificate выводит в PEM, export выгружает. Чтобы система доверяла своему CA, его добавляют в доверенные:

Код: Выделить всё

sudo security add-trusted-cert -d -r trustRoot \
  -k /Library/Keychains/System.keychain dev-ca.pem
Здесь -d - доверие на уровне всей системы (admin domain), -r trustRoot - считать корнем доверия, -k - в какую связку. Важная грабля 2026 года: Apple закрутила гайки, и тихо форсировать доверие из CLI без запроса админ-пароля больше нельзя - для полностью бесшумной установки доверенного сертификата на парк машин используют конфигурационный профиль через MDM, а не security в скрипте. Для своей личной машины add-trusted-cert с sudo и подтверждением работает.

Passkey (passkey, беспарольная аутентификация) - это асимметричная пара ключей вместо пароля. Приватный ключ не покидает устройство (точнее, синхронизируется только через сквозь-зашифрованную iCloud Keychain), на сервер уходит лишь публичный, а вход подтверждается биометрией - Touch ID или Face ID. Фишинг по passkey невозможен в принципе: ключ привязан к домену, поддельный сайт не получит подпись. В Tahoe passkey живут в приложении Пароли и требуют включённой iCloud Keychain - без неё локально на Mac их не создать. Управляешь ими через приложение Пароли (Пароли -> выбрать запись -> там же passkey и коды подтверждения), а не через security - CLI passkey не редактирует.

Типичные грабли
  • Пароль секрета в командной строке через -w 'mysecret' уходит в историю shell. Опускай -w и вводи интерактивно, либо чисти историю.
  • После смены пароля учётки login-связка может остаться со старым мастер-паролем и сыпать запросами. Лечится в GUI: Связка ключей -> Правка -> Сменить пароль для связки, либо security set-keychain-password.
  • find-generic-password без -w печатает метаданные, но не пароль. Забыл -w - решил, что секрета нет. Он есть.
  • Путаешь login и iCloud-связку. Элементы из "Local Items"/iCloud не лежат в login.keychain-db, security их видит ограниченно - управляй ими через приложение Пароли.
  • Ждёшь, что security защитит секрет по Touch ID. Не защитит - это API-история, а не флаг CLI.
  • add-trusted-cert в скрипте "молча" больше не сработает на свежих macOS - готовь профиль/MDM для парка.
Мини-лаба

Повтори руками, 10 минут:
  • Создай секрет: security add-generic-password -s "lab-secret" -a "$USER" -U и введи значение интерактивно (без -w).
  • Прочитай метаданные без -w, затем с -w. Сравни вывод.
  • Подставь секрет в команду: echo "Secret is: $(security find-generic-password -s lab-secret -a "$USER" -w)".
  • Заблокируй связку: security lock-keychain, снова прочитай секрет - получи запрос пароля. Разблокируй: security unlock-keychain.
  • Открой Связку ключей.app, найди lab-secret, посмотри вкладку Контроль доступа.
  • Удали: security delete-generic-password -s "lab-secret" -a "$USER".
Контрольные вопросы
  • Чем login keychain отличается от System keychain по расположению файла и по тому, кто его разблокирует?
  • Зачем при чтении секрета через find-generic-password нужен флаг -w и что выводится без него?
  • Почему security сам по себе не умеет защищать элемент по Touch ID и где биометрия к связке всё же подключается?
  • Что требуется для создания passkey на Mac в Tahoe и почему passkey устойчив к фишингу?
Итог

Связка ключей - штатное шифрованное хранилище секретов macOS, а security - твой ключ к нему из терминала. Держи токены и ключи разработки в login-связке и тяни их в скрипты через find-generic-password -w вместо хардкода в открытых файлах. Понимай слои: login (личное), System (машинное, root), iCloud (синхронизация, passkey, приложение Пароли). Помни границы CLI: Touch ID и passkey живут в API и приложении Пароли, а не во флагах security, а бесшумная установка доверенных сертификатов на парк - через MDM. Этого хватит, чтобы перестать раскидывать секреты по .env и навести порядок в хранилище.

Источники: ss64.com/mac/security.html, support.apple.com/guide/passwords, support.apple.com/guide/keychain-access, support.apple.com/guide/deployment, developer.apple.com.
👍3 ❤️3 🔥1 😄 🤔1
Аватара пользователя
linuxpro
Сообщения: 1
Зарегистрирован: 03 июн 2026, 01:48

Re: Связка ключей и управление секретами

Сообщение linuxpro »

Наконец дошло почему скрипт читает токен без запроса пароля а Safari спрашивает - дело в ACL и флаге -T. Спасибо, перестал держать ключи в .env
👍1 ❤️ 🔥1 😄 🤔2
Аватара пользователя
mjk1108
Сообщения: 1
Зарегистрирован: 03 июн 2026, 10:55

Re: Связка ключей и управление секретами

Сообщение mjk1108 »

А правда что security не умеет Touch ID на конкретный элемент? Думал есть флаг, искал полдня. Получается только через приложение которое само в Secure Enclave кладёт?
👍1 ❤️2 🔥 😄 🤔
Ответить
← Предыдущая глава
FileVault: полнодисковое шифрование
Следующая глава →
Сетевой экран и защита сети

Все главы курса «macOS для профи: администрирование, терминал и Homebrew»

Поделиться темой: ✈ Telegram VK
Похожие запросы: Шифрование диска на Mac

Вернуться в «macOS для профи: администрирование, терминал и Homebrew»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя