it-консалтинг и аутсорсинг
что мы делаем контакты блог

High Sierra и расширения ядра

kirilka 17.10.2017

Итак, одна из новинок High Sierra – это некий SKEL (Secure Kernel Extension Loading), он же UAKEL (User Approved Kernel Extension Loading).

Что это такое и почему это важно для системных администраторов?
Кратко, – новый механизм предназначен для защиты системы (и в конечном счете пользователя и его данных).
Он может слегка усложнить установку ряда приложений в компаниях, так как многие компании все еще не используют MDM (а зря).

UAKEL добавился к набору других инструментов безопасности, встроенных в систему – SIP (System Integrity Protection), Gatekeeper, XProtect и MRT.
Вот что о нем рассказывает Apple (я даю ссылку на русскую документацию, но на момент написания она еще не переведена).


Как это работает?
При установке расширений ядра, они не заработают сами по себе, а потребуют участия пользователя.
При обычной установке ПО об этом будет честно сообщено пользователю (как на картинке выше).
Как правило, обычный пользователь просто кликнет в этом сообщении на ОК, не прочитав его. Соответственно ПО или какой-то его функционал не будет работать, оборудование не будет видеться и т.д.. А пользователь будет недоумевать и/или негодовать.

Если же пользователь внимательно прочитает сообщение на экране, он откроет System Preferences (Системные настройки) / Security (Защита и безопасность) и щелкнет по появившейся кнопке Allow в нижней части экрана.

Кнопка тут же исчезнет. Так как нам платят за объем в статьи в килобайтах, я проиллюстрирую этот момент:

Все очень просто. И, как мы видим, для этого вовсе не нужны админские права.
Это сообщение (System software from developer was blocked from loading) и кнопка Allow будут показываться в контрольной панели в течение 30 минут или при следущей попытке загрузить это расширение ядра, например в течение 30 минут после загрузки Мака. Если вы так и не нажмете Allow за эти полчаса, они исчезнут (до следующей перезагрузки).

Важно отметить, что это не касается расширений, которые уже стояли на Маке при обновлении до macOS High Sierra. То что работало – продолжить работать (если само ПО совместимо с 10.13, конечно).
И это не касается обновления (замены) уже установленных расширений. То есть, если вы обновили драйверы ATTO, то кликать нигде не придется.

Что же тут страшного?
Страшного нет ничего, но возможно, что это будет неудобного господам админам. Представьте, что вы поддерживаете школу и вам нужно установить ПО для виртуализации на 400 Макбуков. Или вы устанавливаете в архитектурной студии драйвер Wacom на пятьдесят Маков, что мы и делаем на наших картинках. Или у вас видеопроизводство, вы используете Fiber-Channel карты ATTO и вам нужно установить для них драйверы.
Во всех этих случаях расширения ядра (kext), которые при установке ПО вами тем или иным способом (например, с помощью munki или хотя бы Apple Remote Desktop) окажутся в /Library/Extensions просто-напросто не заработают. ПО будет установлено. Компьютер перезагрузится. Кнопка Allow сиротливо повисит 30 минут молча в System Preferences. А пользователь будет просто недоумевать и/или негодовать.

Что делать?
Есть несколько вариантов. Во-первых, мы можем тем или иным способом пробежаться по 400 Макам и нажать Allow.
Во-вторых, мы можем проинструктировать пользователей.
В-третьих, если Мак введен в MDM, этот механизм отключается (“видимо у меня есть админы и они знают, что делают” думает Мак). Кстати, в ближайших обновлениях High Sierra планируется добавить функционал для управления списком разрешенных расширений ядра с помощью MDM.
В-четвертых, мы можем отключить этот механизм.
Для отключения UAKEL, как и в случае с отключением SIP, нужно загрузиться с раздела восстановления и использовать команду spctl (System Protection control).

Теперь заглянем чуть-чуть под капот.
Во-первых, кое-какая информация есть на developer.apple.com.
Когда пользователь разрешает расширению ядра работать, нажимая на кнопочку Allow, информация об этом добавляется в базу sqlite /var/db/SystemPolicyConfiguration/KextPolicy
Мы можем посмотреть в базе на TeamID (идентификаторы разработчика).

Кроме того, мы можем заранее разрешить нужные TeamID.
Это можно сделать в терминале при загрузке в режим восстановления используя ту же spctl. Добавим идентификатор Wacom:

spctl kext-consent add EG27766DY7

Изменения будут записаны в NVRAM и мы можем их посмотреть с помощью команды nvram.
Я не буду перезагружаться, чтобы добавить идентификатор, а затем сделать снимок экрана и напишу пример по памяти:

pixie:~ kirilka$ nvram -p
…
csr-data  <dict><key>kext-allowed-teams</key><array><string>EG27766DY7
</string></array></dict>%00
…

Слабое место – эти настройки будут сброшены при сбросе NVRAM (знаменитое “показать Маку козу” – Command-Option-P-R).

Почему Apple добавили такую защиту? Ведь нам неизвестны malware в виде расширений ядра. Но это нам они неизвестны…
А кроме того, магистральное направление движения Apple указывает на то, что…
Ладно, магистральное направление – это вопрос для долгого чаепития, а впереди у нас еще зима с ее длинными темными вечерами.