惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog
博客园 - 聂微东
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
月光博客
月光博客
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
MyScale Blog
MyScale Blog
Cloudbric
Cloudbric
T
Threatpost
Scott Helme
Scott Helme
N
News | PayPal Newsroom
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
V2EX - 技术
V2EX - 技术
罗磊的独立博客
Attack and Defense Labs
Attack and Defense Labs
IT之家
IT之家
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Docker
V
V2EX
T
Troy Hunt's Blog
Forbes - Security
Forbes - Security
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
Last Week in AI
Last Week in AI
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
P
Proofpoint News Feed
Recorded Future
Recorded Future
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
O
OpenAI News
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Что такое Apple Declarative Device Management?
Ильдар Бигашев · 2026-06-24 · via Все публикации подряд на Хабре

Средний

8 мин

284

Привет! Я Ильдар Бигашев, Product Owner Ринго.

В рамках WWDC 2026, а если быть точнее, то в ролике What’s new in managing Apple devices, инженер Device Management team, Cyrus Daboo, заявляет о том, что "Declarative Device Management уже здесь" и используется в продакшене для управления парками корпоративных устройств Apple по всему миру.

Что касается классического MDM, то ранее компания Apple уже обозначала некоторые команды MDM как Deprecated, например, ScheduleOSUpdate, которая отвечает за установку обновлений macOS. Информацию об этой команде уже не найти на сайте Apple Developer | Device Management , но она все еще присутствует в репозитории Device management schema data for MDM на Github Apple. В следующей macOS 27 Golden Gate эта команда точно не будет работать, и без функционала DDM установить обновления "тихо и незаметно" не получится. В системе пока еще присутствует терминальная команда softwareupdate, но там есть нюансы, о которых можно прочитать в одной из статей, опубликованной в корпоративном блоге Ринго на Хабре.

В этой статье мы попытаемся разобраться, что такое DDM, его преимуществах перед MDM и почему переход на DDM – это вопрос времени.

Первое упоминание о DDM

Впервые Apple рассказала о DDM как новом подходе к управлению своими устройствами на WWDC 2021, но, как это часто бывает с новыми технологиями, внедряемыми яблочной компанией (вспомним тот же Secure Token), документации было немного, а потестировать было не на чем, так как вендоры MDM- и UEM-решений еще не внедрили этот функционал в свои продукты.

В чем заключаются преимущества DDM?

Если кратко, то можно обозначить следующие тезисы:

  • DDM позволяет избежать проблем, которые могут возникнуть при работе с профилями MDM (файлы XML с расширением .mobileconfig);

  • DDM добавляет новые возможности для управления устройствами Apple или совершенствует старые;

  • DDM снижает нагрузку на серверы MDM.

Проблемы с профилями MDM и улучшения DDM

Основная проблема связана с тем, что профиль будет установлен только будучи доставленным на управляемое устройств. Соответственно, если профиль не был доставлен по какой-либо причине, или уже в процессе установки профиля, который требует связи с сервером MDM, возникли проблемы с сетевым доступом, то такой профиль установлен не будет и его потребуется отправить на устройство повторно, что не заложено в протокол MDM "из коробки".

Также логика работы профилей зачастую приводит к так называемому "user friction", и применение некоторых критических конфигураций может пойти не по плану. Например, legacy-политика паролей, доставленная через профиль MDM, может предложить пользователям обновить пароль, но позволяет им отклонить этот запрос, оставляя устройство не соответствующим требованиям. Таким образом, отсутствие принудительного применения обновлений программного обеспечения является одной из причин существования таких инструментов, как Nudge, которые создают дополнительное давление на пользователей, чтобы те устанавливали обновления и соблюдали политики.

Эта несогласованность связана с тем, как именно macOS обрабатывает профили MDM, а не с тем, как работает ваше MDM-решение. Вендор тут ни при чем.

DDM решает эти проблемы, применяя конфигурации на системном уровне, обеспечивая соответствие без необходимости многократной отправки команд с сервера. Конкретный пример того, как DDM обрабатывает политики паролей, можно будет увидеть далее в этой статье.

Нагрузка на ваши серверы MDM

DDM далеко не всесилен: новый функционал добавляется Apple постепенно, а старый удаляется, но это определенно шаг вперед в управлении парком корпоративных устройств. DDM использует конфигурации, которые применяются на устройствах автономно и не требуют постоянного контроля со стороны сервера MDM. Если у устройства изменяется статус, то оно само свяжется с сервером MDM и передаст всю необходимую дельту. Какая именно информация передается серверу, можно посмотреть здесь.

Что из себя представляют конфигурации DDM в общих словах?

В основе DDM лежат декларации — файлы конфигураций, описывающие желаемое состояние устройства. В отличие от профилей MDM, файлов XML с расширением .mobileconfig, в формате Property List, профили DDM используют формат JSON. Переход к JSON соответствует современным стандартам данных, делая профили DDM более универсальными и простыми для интеграции в существующие рабочие процессы.

Ключевые различия между конфигурациями MDM и DDM заключаются в том, что профили MDM придерживаются статической модели: они определяют настройки и полагаются на сервер MDM для их применения на устройствах. Если что-то меняется с точки зрения конфигурации, то серверу необходимо снова отправить обновленную конфигурацию.

Конфигурации DDM, с другой стороны, используют так называемый декларативный подход, вот что это значит:

  • возможность применить конфигурацию автономно, без связи с сервером MDM;

  • устройства самостоятельно проверяют Compliance и отчитываются об этом серверу MDM без опроса со стороны последнего;

  • более современный подход к передаче данных: в формате JSON вместо XML.

Основные концепты DDM

  • Status Channel

  • Declarations

Status Channel

Для включения DDM требуется отправить на устройство специальную команду. При успешной обработке команды на устройстве включается функционал DDM без возможности отключения. Status — это то, что отправляет устройство на сервер для предоставления данных об устройстве. Это может быть:

  • общая информация об устройстве (UDID, версия OS, статус FileVault);

  • версия клиента DDM и поддерживаемые типы Features и Declarations;

  • статус установленных Declarations.

Данные о Status могут быть присланы полностью или по частям в рамках нескольких запросов. Отправка статуса устройством может быть запрошена сервером через команду MDM или отправлена устройством самостоятельно, при изменении данных на устройстве.

Declarations

Declarations — это "состояние", к которому сервер пытается привести устройство. Работает примерно также, как и с профилями MDM, но с некоторыми улучшениями. У каждой декларации есть тип (например, "com.apple.configuration.passcode.settings"), идентификатор и токен. Declarations делятся на несколько типов.

Configuration

Основная declaration (декларация), которая может содержать настройки для устройства, требования к паролям, настройки обновления OS, установку приложений и т.д.

Пример декларации настройки паролей:

{ "Type": "com.apple.configuration.passcode.settings", "Identifier": "EB13EE2B-5D63-4EBA-810F-5B81D07F5017", "ServerToken": "E180CA9A-F089-4FA3-BBDF-94CC159C4AE8", "Payload": { "RequireComplexPasscode": true, "MinimumLength": 10, "MinimumComplexCharacters": 1, "MaximumFailedAttempts": 11, "MaximumGracePeriodInMinutes": 1, "MaximumInactivityInMinutes": 15 } }

Политики паролей служат отличным примером различий между профилями MDM и декларациями DDM. В случае с профилями MDM применение политики паролей зависит от сервера MDM, который отправляет настройки на устройства в файлах .mobileconfig. Однако пользователи могут просто закрыть запрос на смену пароля, оставляя устройства не соответствующими требованиям. Это ограничение связано с тем, как macOS обрабатывает профили.

В DDM настройки паролей применяются на уровне системы. Устройства автономно применяют требуемые конфигурации и сообщают о своем статусе обратно в MDM. Настройки в DDM включают:

  • RequirePasscode: требует от пользователей установить пароль на устройстве;

  • RequireComplexPasscode: требует использования сложных паролей без повторяющихся или последовательных символов (например, "123" или "ABC") и содержащих как минимум один небуквенно-цифровой символ;

  • MinimumLength: определяет минимальное количество символов в пароле;

  • MaximumFailedAttempts: ограничивает количество неудачных попыток входа до блокировки устройства;

  • MaximumGracePeriodInMinutes: контролирует, как долго пользователи могут ждать, прежде чем устройство заблокируется после пробуждения;

  • MaximumInactivityInMinutes: блокирует устройство после периода бездействия.

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

Кстати, с помощью Configuration-декларации можно устанавливать профили и MDM. Это работает следующим образом: на устройство отправляется конфигурация, и в момент ее активации профиль будет загружаться по URL и устанавливаться на устройство.

https://github.com/apple/device-management/blob/release/declarative/declarations/configurations/legacy.yaml.
https://support.apple.com/en-ca/guide/deployment/device-management-updates-depd638aa061/1/web/1.0#dep823b439a0

Assets

Представляют собой вспомогательные данные, необходимые для конфигураций. Существует два основных варианта использования ресурсов:

  • большие объёмы данных: крупный элемент данных, например: изображение, шрифт;

  • личные данные: специфичная информация о пользователе, например, имя, адрес электронной почты, пароли для учётных записей или сертификаты.

Определенные типы Configuration-деклараций предоставляют возможность связать Asset-декларацию через идентификатор Asset-декларации. Одна Asset-декларация может использоваться во многих конфигурациях. Asset-декларация должна содержать поле HTTPS URL, по которому устройство сможет скачать данные Asset, а также данные аутентификации и метаданные (ContentType, Hash-SHA-256, Size).

Пример декларации вспомогательных данных:

{ "Type": "com.apple.asset.data", "Identifier": "EB13EE2B-5D63-4EBA-810F-5B81D07F5017", "ServerToken": "E180CA9A-F089-4FA3-BBDF-94CC159C4AE8", "Payload": { "Reference": { "DataURL": "https://example.com/asset-data/data/test.txt", "ContentType": "text/plain" }, "Authentication": { "Type": "MDM" } } }

Пример декларации для сертификата:

{ "Type": "com.apple.asset.credential.certificate", "Identifier": "EB13EE2B-5D63-4EBA-810F-5B81D07F5017", "ServerToken": "E180CA9A-F089-4FA3-BBDF-94CC159C4AE8", "Payload": { "Reference": { "DataURL": "https://example.com/asset-data/certificates/cert.pem", "ContentType": "application/pem" } } }

Activation

Вид деклараций, которые указывают логику, как и когда Configuration-декларации должны применяться к устройству.

Activation-декларация обязательно содержит список идентификаторов Configuration-деклараций.

Устройство будет пытаться атомарно применять все декларации из списка, то есть применит либо все конфигурации вместе, либо ни одной, если одна из них применится с ошибкой.

Activation-декларация может содержать Predicate-строку, из которой устройство будет понимать, стоит ли активировать связанные Configuration декларации или нет.

При несоответствии данных устройства связанные Configuration-декларации не будут применены, но могут быть применены в будущем, если данные устройства изменятся. При отсутствии Predicate-строки, Activation-декларация считается активной всегда. Несколько Activation-деклараций могут содержать один и тот же идентификатор Configuration-декларации. Если хотя бы одна Activation-декларация активна для Configuration-декларации, то последняя будет применена к устройству. Если для Configuration-декларации нет хотя бы одной связанной Activation-декларации, Configuration-декларация не будет применена к устройству.

Пример Activation-декларации:

{ "Type": "com.apple.activation.simple", "Identifier": "04BECEFA-47B9-4F2E-8040-246509A52409", "ServerToken": "CBE396A0-637B-438D-9F0C-EA912A5BB587", "Payload": { "Predicate": "@status(device.model.family) == 'AppleTV'", "StandardConfigurations": [ "892853C1-DDD1-4562-84B9-1591A76AD42B", "DCF869F1-09B7-4EC2-83B5-073F6FE94597" ] } }

Management

Декларация, которая содержит метаданные об организации и поддерживаемые возможности сервера. Пример декларации информации об организации:

{ "Type": "com.apple.management.organization-info", "Identifier": "EB13EE2B-5D63-4EBA-810F-5B81D07F5017", "ServerToken": "E180CA9A-F089-4FA3-BBDF-94CC159C4AE8", "Payload": { "Name": "Example, Inc.", "Email": "admin@example.com", "URL": "https://site.example.com/support" } }

Доставка деклараций

Механизм получения деклараций DDM для устройства подразумевает два способа получения данных: общий список всех типов деклараций с сокращенными данными и получение декларации по идентификатору с расширенным списком полей.

Пример ответа общего списка деклараций:

{ "DeclarationsToken": "EB13EE2B-5D63-4EBA-810F-5B81D07F5017", "Declarations": { "Activations": [ { "Identifier": "...", "ServerToken": "..." }, { "Identifier": "...", "ServerToken": "..." }, ], "Assets": [ { "Identifier": "...", "ServerToken": "..." } ], "Configurations": [ { "Identifier": "...", "ServerToken": "..." }, { "Identifier": "...", "ServerToken": "..." }, { "Identifier": "...", "ServerToken": "..." }, { "Identifier": "...", "ServerToken": "..." }, ], "Management": [ { "Identifier": "...", "ServerToken": "..." }, ] } }

Как с этим работать?

В самых общих словах для начала работы с DDM потребуется сделать следующее:

  • включить поддержку DDM на устройствах;

  • отправить на устройства все необходимые Configuration-деклараций и Asset-деклараций;

  • активировать их с помощью Activation-деклараций,

При этом устройства по прежнему будут поддерживать доставку и применение профилей MDM.

Конечно же, это должно поддерживаться вашим вендором MDM, так как для работы с DDM требуется поддержка на стороне сервера MDM. Уровень поддержки у разных вендоров реализован по-разному, не все возможности внедрены на 100%, и не везде это выглядит одинаково.

Но так или иначе, переход на DDM – это вопрос времени.

Мы в Ринго прекрасно понимаем это и планируем выпустить поддержку DDM уже в этом году.

Следите за новостями в нашем Telegram-канале и блоге!