- Безопасное открытие приложений на компьютере Mac
- Просмотр настроек безопасности приложений на компьютере Mac
- Открытие приложения с подписью разработчика или подтверждением подлинности
- Если отображается сообщение с предупреждением и не удается установить приложение
- Если ОС macOS обнаруживает вредоносное приложение
- Если вы хотите открыть приложение без подтверждения подлинности или созданное неизвестным разработчиком
- Защита конфиденциальности
- Процесс подписи кода приложений в macOS
- Как подписывать приложения для macOS Catalina 10.15
- Введение
- История вопроса
- Требования
- Двухфакторная аутентификация
- Покупка членства
- Идентификатор приложения
- Пароль приложения
- Xcode и инструменты
- Сертификат
- Подготовка приложения
- Разрешения (Entitlements)
- Подписывание
- Нотаризация
- Прикрепление
Безопасное открытие приложений на компьютере Mac
В ОС macOS используется технология Gatekeeper, которая обеспечивает запуск только доверенного программного обеспечения на компьютере Mac.
Самым безопасным местом для загрузки приложений на компьютер Mac является App Store. Компания Apple проверяет каждое приложение в App Store, прежде чем принять, и подписывает его, чтобы оно не подверглась несанкционированному вмешательству или изменению. Если с приложением возникнет проблема, компания Apple может быстро удалить его из магазина.
Если вы загружаете приложения из Интернета или непосредственно на веб-сайте разработчика и устанавливаете их, ОС macOS продолжает защищать компьютер Mac. Когда вы устанавливаете на компьютер Mac приложения, плагины и установочные пакеты не из App Store, ОС macOS проверяет подпись идентификатора разработчика, чтобы убедиться, что программное обеспечение выпустил идентифицированный разработчик и что оно не изменено. По умолчанию macOS Catalina и более поздние версии также требуют подтверждения подлинности программного обеспечения, чтобы вы могли быть уверены, что программное обеспечение, запущенное на вашем Mac, не содержит известных вредоносных программ. Перед первым открытием загруженного программного обеспечения macOS запрашивает подтверждение, чтобы вы случайно не запустили программное обеспечение, устанавливать которое вы не собирались.
Программное обеспечение без подписи и подтверждения подлинности может оказаться вредоносным. Оно может нанести вред вашему компьютеру Mac или поставить под угрозу вашу конфиденциальную информацию.
Приведенные ниже предупреждения являются лишь примерами, вам может встретиться аналогичное сообщение, не показанное здесь. Будьте осторожны при установке программного обеспечения, для которого компьютер Mac отображает предупреждение.
Просмотр настроек безопасности приложений на компьютере Mac
По умолчанию настройки безопасности и конфиденциальности на компьютере Mac разрешают устанавливать приложения только из магазина App Store и от идентифицированных разработчиков. Для дополнительной безопасности вы можете разрешить устанавливать приложения только из магазина App Store.
В меню «Системные настройки» щелкните «Защита и безопасность» и выберите «Основные». Щелкните значок замка и введите пароль, чтобы внести изменения. Выберите App Store в разделе «Разрешить использование приложений, загруженных из».
Открытие приложения с подписью разработчика или подтверждением подлинности
Если на вашем компьютере Mac настроено разрешение на установку приложений из App Store и от идентифицированных разработчиков, при первом запуске приложения Mac выдаст запрос о том, действительно ли вы хотите его открыть.
Если приложение имеет подтверждение подлинности от Apple, это значит, что компания Apple проверила его на наличие вредоносного ПО и не обнаружила ничего подозрительного.
Если отображается сообщение с предупреждением и не удается установить приложение
Если в настройках Mac вы разрешили устанавливать приложения только из App Store и пытаетесь установить приложение из другого источника, ваш Mac сообщит, что приложение невозможно открыть, потому что оно не было загружено из App Store*.
Если в настройках Mac разрешено открывать приложения из App Store и от идентифицированных разработчиков и вы пытаетесь установить приложение, которое не подписано идентифицированным разработчиком — в macOS Catalina и более поздних версиях дополнительно требуется подтверждение подлинности от Apple, — система также предупредит о том, что приложение невозможно открыть.
Это предупреждение означает, что подлинность приложения не подтверждена и компания Apple не смогла проверить, является ли данное ПО вредоносным.
Возможно, лучше найти обновленное приложение в App Store или другое приложение.
Если ОС macOS обнаруживает вредоносное приложение
Если macOS обнаружит, что программное обеспечение содержит вредоносный код или что авторизация ПО была отозвана по какой-либо причине, система уведомит вас о том, что данное приложение способно повредить ваш компьютер Mac. В таком случае переместите это приложение в корзину и установите флажок «Сообщить в Apple о вредоносном ПО, чтобы защитить других пользователей».
Если вы хотите открыть приложение без подтверждения подлинности или созданное неизвестным разработчиком
Программное обеспечение без подписи и подтверждения подлинности может оказаться вредоносным. Оно может нанести вред вашему компьютеру Mac или поставить под угрозу вашу конфиденциальную информацию. Если вы уверены, что приложение, которое вы хотите установить, из достоверного источника и не содержит несанкционированных изменений, вы можете временно переопределить настройки безопасности компьютера Mac, чтобы открыть его.
Если вы по-прежнему хотите открыть приложение, разработчика которого не удаётся проверить, перейдите в «Системные настройки».*
Затем войдите в раздел «Защита и безопасность». Нажмите кнопку «Все равно открыть» на панели «Основные», чтобы подтвердить желание открыть или установить приложение.
Снова появится предупреждение. Если вы действительно хотите открыть приложение, нажмите «Открыть».
Приложение будет сохранено как исключение из настроек безопасности, и вы сможете открыть его двойным щелчком, как и любое другое авторизованное приложение.
Защита конфиденциальности
ОС macOS была разработана для обеспечения безопасности пользователей и их данных при сохранении конфиденциальности.
Gatekeeper выполняет онлайн-проверки на наличие в приложении известных вредоносных компонентов и отзыв сертификата подписи разработчика. Мы никогда не объединяли данные этих проверок с информацией о пользователях Apple или их устройствах. Мы не используем данные этих проверок, чтобы узнать, какие приложения пользователи запускают или устанавливают на своих устройствах.
Подтверждение подлинности необходимо для проверки наличия в приложении известных вредоносных компонентов. Проверка проводится с использованием зашифрованного соединения, устойчивого к сбоям сервера.
Эти проверки безопасности никогда не включали идентификатор Apple ID пользователя или идентификацию его устройства. Для более надежной защиты конфиденциальности мы прекратили регистрацию IP-адресов, связанных с проверками сертификатов идентификатора разработчика, и гарантируем, что все собранные IP-адреса будут удалены из журналов.
Кроме того, в следующем году мы внесем некоторые изменения в наши проверки безопасности:
- Новый зашифрованный протокол для проверки отзыва сертификата идентификатора разработчика
- Надежная защита от сбоев сервера
- Новая настройка, позволяющая пользователям отказаться от этих средств защиты
* Если вам предложено открыть приложение в Finder и вы действительно хотите открыть его несмотря на предупреждение, нажав и удерживая клавишу Control, щёлкните приложение, после этого выберите «Открыть» в контекстном меню, а затем нажмите «Открыть» в появившемся диалоговом окне. Чтобы открыть приложение, введите имя администратора и пароль.
Информация о продуктах, произведенных не компанией Apple, или о независимых веб-сайтах, неподконтрольных и не тестируемых компанией Apple, не носит рекомендательного или одобрительного характера. Компания Apple не несет никакой ответственности за выбор, функциональность и использование веб-сайтов или продукции сторонних производителей. Компания Apple также не несет ответственности за точность или достоверность данных, размещенных на веб-сайтах сторонних производителей. Обратитесь к поставщику за дополнительной информацией.
Источник
Процесс подписи кода приложений в macOS
Все приложения в App Store подписаны Apple. Подписание помогает убедиться, что приложения не были подделаны или изменены. Apple также подписывает все приложения, поставляемые с устройствами Apple.
Чтобы пройти проверку Gatekeeper с настройками по умолчанию в macOS 10.15 , все приложения, распространяемые не через App Store, должны быть подписаны разработчиком с помощью выпущенного компанией Apple сертификата идентификатора разработчика (и личного ключа) и заверены компанией Apple. Корпоративные приложения также должны быть подписаны выпущенным компанией Apple идентификатором разработчика, чтобы пользователи могли подтвердить целостность приложений.
В macOS подпись кода и заверение не связаны друг с другом. Они могут быть выполнены разными лицами для разных целей. Разработчик подписывает код с помощью своего сертификата, привязанного к уникальному идентификатору (сертификат выпускается компанией Apple). Благодаря проверке подписи пользователь может убедиться, что программное обеспечение разработчика не было изменено с тех пор, как разработчик выпустил и подписал его. Заверение может быть выполнено любым участником цепочки распространения программного обеспечения. Оно доказывает, что Apple получила копию кода для проверки на наличие вредоносного ПО и что известное вредоносное ПО обнаружено не было. Результатом заверения является билет, который хранится на серверах Apple и может быть при желании прикреплен к приложению (кем угодно), что не приведет к аннулированию подписи разработчика.
В соответствии с обязательными средствами контроля доступа (MAC) для получения прав, защищаемых системой, требуется подпись кода. Например, если приложению требуется доступ через брандмауэр, его код должен быть подписан с помощью соответствующего права MAC.
Источник
Как подписывать приложения для macOS Catalina 10.15
[Прим. пер.: переведя вызвавший широкое обсуждение на Хабре пост, я заинтересовался новыми правилами для разработчиков ПО, введёнными компанией Apple. В этой статье рассказывается о личном опыте освоения правил одним из разработчиков игр.]
Введение
В новой версии macOS Apple сделала обязательными некоторые требования к приложениям, которые раньше были рекомендациями: 64-битные исполняемые файлы, подписывание и нотаризация. Не удовлетворяющие этим требованиям приложения больше запускаться не будут.
Это сделано для того, чтобы обезопасить работу пользователей и предотвратить распространение зловредных программ, но в то же время это сильно усложняет жизнь, особенно тем людям, для которых Mac не является основной платформой разработки, но которые тем не менее хотели бы начать или продолжить поддержку Mac.
Особенно актуально это для разработчиков игр, публикующих игры для Mac в Steam. До недавних изменений игры, запущенные из Steam, не нужно было подписывать и подвергать нотаризации, но теперь они должны подчиняться тем же правилам, что и все остальные.
Я только что закончил разбираться с тем, как реализовать соответствие этим требованиям для моей игры Airships: Conquer the Skies. Airships работают на Java, а потому требуют ещё и JVM, но в целом всё остальное будет применимо для большинства разработчиков.
Вот что я узнал о подписывании и нотаризации приложения для Mac, которое не было скомпилировано непосредственно Xcode. Учтите, что информация получена из моих собственных исследований и может быть точной не на 100%. Вопросы и поправки приветствуются.
История вопроса
В этой статье рассматривается подписывание и нотаризация. Получение 64-битного исполняемого файла программы — это уже задача вашего компилятора или среды разработки.
В macOS приложения обычно упаковываются в bundle — папки, содержащие исполняемый файл, а также дополнительные ресурсы и метаданные. Подписывание бандла означает создание криптографичекой контрольной суммы содержимого бандла с последующим созданием криптографической подписи с сертификатом, которые Apple выпускает для разработчика. Подпись — это заявление о том, что вы лично гарантируете правильное поведение приложения. Если содержимое бандла меняется, то меняется контрольная сумма, и подпись перестаёт им соответствовать, предупреждая операционную систему, что в бандл внесены несанкционированные изменения.
Подписывание приложений существовало много лет. Чуть позже приложения также стало необходимо нотаризировать. Нотаризация (notarization) означает, что вы отправляете подписанное приложение Apple, а компания выполняет дополнительные проверки и регистрирует приложение. Если нотаризация завершается успешно, вы «прилепляете» нотаризацию к своему приложению, чтобы офлайн-машины без доступа к Интернету тоже могли убедиться, что приложение прошло нотаризацию.
Это своего рода метафора работы с бумажными документами. Разработчик собирает в бандл все части, из которых состоит приложение. Затем он создаёт список всех элементов бандла (контрольную сумму) и подписывает этот список (цифровой подписью), которую приклеивает к бандлу. Затем он передаёт подписанный бандл нотариусу господину Яблокову, который проверяет, всё ли в порядке с бандлом, а затем регистрирует его. Он даёт разработчику квитанцию, которую тот степлером прикрепляет к бандлу. То есть если разработчик сказал, что приложение безопасно, и господин Яблоков тоже говорит, что оно безопасно, то так скорее всего и есть. А если нехороший человек попробует изменить его содержимое, то список элементов бандла перестанет ему соответствовать, и пользователь будет знать, что использовать его не нужно.
Требования
Что необходимо для подписывания и нотаризации приложения:
- Компьютер Mac, достаточно новый, чтобы на нём можно было запустить Xcode 11, то есть достаточно новый, чтобы запустить macOS 10.14.3. Если вы ещё не установили Xcode, то потребуется 25 ГБ свободного места для установки.
- Если вы пока не являетесь официальным разработчиком Apple, то для членства необходим логин Apple ID и примерно 110 долларов США.
Двухфакторная аутентификация
Если у вас её ещё нет, включите двухфакторную аутентификацию для Apple ID. Это можно сделать с любого i-устройства или с Mac. На Mac перейдите в iCloud control panel настроек System Preferences. В верхней части должна быть панель, предлагающая включить 2FA.
Покупка членства
Выполните вход в https://developer.apple.com/ при помощи своего Apple ID и перейдите во вкладку «Membership». При необходимости купите или обновите Apple Developer Program membership. Учтите, что обработка покупки занимает какое-то время во внутренних системах Apple, поэтому если у вас не получается генерировать сертификаты (см. ниже), выпейте пока чашку чая и успокойтесь.
Идентификатор приложения
Возможно, вам понадобится зарегистрировать ID бандла приложения в бэкенде разработчика. ID бандла можно найти в YourApp.app/Contents/Info.plist. (Открывать бандлы приложений можно, нажав на них правой клавишей мыши и выбрав «Show Package Contents».) Идентификатор должен иметь вид com.yourcompanyname.applicationname, например, у моей игры Airships это com.zarkonnen.airships.
Для регистрации ID выполните вход в https://developer.apple.com/, выберите в левой панели «Certificates, IDs & Profiles», а затем выберите на следующей странице «Identifiers». Затем можно нажать кнопку «+», чтобы добавить идентификатор приложения.
Пароль приложения
Для подписывания из командной строки вам понадобится пароль приложения, поэтому перейдите в https://appleid.apple.com/account/manage и сгенерируйте его.
Xcode и инструменты
Установите Xcode через App Store компьютера Mac. Затем установите также инструменты командной строки Xcode с https://developer.apple.com/download/more. Вам нужны «Command Line Tools for Xcode 11» или той версии Xcode, которую вы используете.
Сертификат
Запустите Xcode, перейдите в Preferences, откройте вкладку Accounts. При необходимости добавьте свой Apple ID к списку аккаунтов. Затем нажмите на кнопку «Manage Certificates. » в нижнем правом углу. Отобразятся имеющиеся у вас сертификаты для подписывания приложений. Вам нужен сертификат «Developer ID Application»; если в списке его нет, то создайте его. Нажмите «Done», а затем «Download» в окне Preferences:Accounts, чтобы скачать сертификаты локально.
Подготовка приложения
Чтобы приложение правильно работало в новой системе, исполняемый файл и библиотеки должны быть 64-битными.
Кроме того, Mac OS выполняет операцию под названием «translocation»: из соображений безопасности перемещает запущенный бандл приложения в случайное место. В случае моего приложения это проявилось тем, что оно не смогло найти файлы данных, расположенные рядом с бандлом приложения. Можно получать исходное расположение бандла приложения, но я решил проблему, просто поместив всё в бандл.
Разрешения (Entitlements)
Это особые разрешения, добавляемые разработчиком вместе с подписью кода, позволяющие подписанным приложениям выполнять определённые действия. Если вы компилируете приложение при помощи Xcode, то он сделает всё самостоятельно; в противном случае вам потребуется создать файл plist, содержащий все нужные вам entitlements. Файлы plist можно создавать при помощи Xcode, а по адресу https://developer.apple.com/documentation/bundleresources/entitlements находится список entitlements.
Для создания нового файла plist с помощью Xcode выберите «New File», а затем в появившемся списке нажмите на «Property List». Добавьте в корневой словарь элементы с названиями entitlements, которые вам нужны; они имеют значения boolean:YES.
В случае моей игры, поскольку она написана на Java, мне понадобились следующие разрешения, чтобы работала JVM: com.apple.security.cs.allow-jit, com.apple.security.cs.allow-unsigned-executable-memory, com.apple.security.cs.disable-executable-page-protection, com.apple.security.cs.disable-library-validation, com.apple.security.cs.allow-dyld-environment-variables. Для пользователя они выглядят пугающе, поэтому если вам они не нужны, то не добавляйте их.
Далее в статье мы будем считать, что вы поместили свои entitlements в файл под названием entitlements.plist.
Подписывание
Это процесс создания цифровой подписи, сообщающей: тот, кто имеет доступ к сертификату подписи, обещает, что данный конкретный бандл приложения надёжен и не зловреден. Любые изменения в бандле приложения (кроме прикрепления подтверждения нотаризации, см. выше) после его подписывания делают подпись недействительной и требуют повторного подписания бандла.
Также это означает, что ваше приложение при работе не должно менять ничего в содержимом бандла приложения, например, не помещать туда кэш.
Каждый исполняемый файл и динамическая библиотека в бандле приложения подписываются отдельно. В некоторых случаях библиотеки уже могут быть подписанными. То есть вежливее и спокойнее всего подписывать бандл, подписав каждый элемент по очереди, а затем подписать весь бандл. Если у какого-то элемента уже есть подпись, то она останется на своём месте.
Грубым, но эффективным способом будет принудительное глубокое подписание, то есть ваша подпись будет применена ко всем элементам бандла приложения, заменив все предыдущие подписи. Именно так мы и поступим, потому что это проще и потому, что предыдущие подписи могут быть недействительными или недостаточно сильными.
Вам понадобится следующая пугающая команда:
codesign -s «Developer ID Application: » —timestamp —options runtime -f —entitlements entitlements.plist —deep YourApp.app
Опция —timestamp означает, что вместе с подписью встраивается действительная метка времени, которая необходима для успешной нотаризации.
Опция —options runtime означает, что подпись включает «hardened runtime», что также необходимо для успешной нотаризации.
Изучить подпись можно командой
codesign -d -vvvv YourApp.app
Также следует запустить приложение, чтобы убедиться, что оно продолжает работать после подписывания.
Если вы хотите подписывать элементы более вежливым образом, то уберите из команды -f и —deep , сначала подпишите все исполняемые файлы и библиотеки внутри приложения, а потом всё приложение.
Нотаризация
Подписав приложение, нужно предоставить его системам Apple для нотаризации, чтобы сказать: «смотрите, я подписал вот эту штуку».
Для этого надо сначала сжать приложение в специальный файл zip с помощью команды ditto:
/usr/bin/ditto -c -k —keepParent YourApp.app YourApp.zip
Простая упаковка приложения в zip при помощи Finder или командной строки не подойдёт.
Затем отправить zip для нотаризации:
xcrun altool —notarize-app —primary-bundle-id » » -u «» -p «» —file YourApp.zip
xcrun altool —notarize-app —primary-bundle-id «com.zarkonnen.airships» -u «dave@hotmail.com» -p «bwnh-pbbt-llpt-xxxx» —file Airships.zip
ID бандла можно найти, заглянув в YourApp.app/Contents/Info.plist. (Открывать бандлы приложений можно, нажав на них правой клавишей мыши и выбрав «Show Package Contents».)
Нотаризация может занять довольно много времени. Обычно это несколько секунд или минут, но иногда может быть и час. Налейте себе ещё чая, или чего покрепче, выбирайте сами. Рано или поздно вы получите нечто подобное:
No errors uploading ‘YourApp.zip’.
RequestUUID = 29926ae6-f551-4d54-b283-e29d6f9b9156
Теперь мы можете использовать следующую команду для проверки состояния переданного бандла:
xcrun altool —notarization-info -u -u «» -p «»
xcrun altool —notarization-info 29926ae6-f551-4d54-b283-e29d6f9b9156 -u «dave@hotmail.com» -p «bwnh-pbbt-llpt-xxxx»
На экран будет выведено нечто подобное:
Повторюсь, подтверждение обычно занимает около 15 минут, но иногда на то же самое приложение требуется несколько часов. Ага, вот так.
Если status имеет значение failure, то посмотрите ошибки, перечисленные по URL файла лога. Если вы получили success, то всё равно взгляните, потому что там могут быть предупреждения, и эти предупреждения вполне могут стать ошибками, когда Apple снова ужесточит свои требования.
Прикрепление
Наконец, «пристеплерим» подтверждение нотаризации к бандлу приложения, чтобы её мог проверять даже Mac без подключения к Интернету. Для этого необходимо выполнить на удивление короткую команду:
xcrun stapler staple «YourApp.app»
Поздравляю, вы подписали и нотаризировали приложение для Mac. Теперь вы можете распространять бандл приложения любым удобным вам способом, если он не будет изменяться в процессе.
Если вы оказались в одной лодке со мной и вам нужно добавить в бандл с приложением JVM, то продолжайте чтение.
Существует несколько вариантов объединения в бандл JVM с Java-приложением. Я бы рекомендовал AppBundler, который является ant task, выполняющим за вас всю работу. Изначально AppBundler можно было скачать с java.net, но благодаря пренебрежению Oracle остальной платформой Java, теперь придётся скачивать последнюю версию с https://github.com/TheInfiniteKind/appbundler.
Там вы можете найти исходники и документацию, но не jar, потому что предполагается, что вы пользуетесь Maven. Если вы не используете Maven, то jar можно взять отсюда: https://jar-download.com/artifacts/com.panayotis/appbundler
Следуйте инструкциям в документации на странице github для настройки бандла. Лично я использую NetBeans, и для решения задачи я вставил в build.xml следующие строки:
Это задача, выполняемая после создания файла jar. Она использует appbundler-1.1.0.jar для создания бандла приложения со встроенной JVM.
Используемый мной JDK можно скачать с https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html. Я выбрал версию 11, потому что она имеет LTS (long-term support), но использует старые лицензионные условия Oracle, в то время как версия 13 имеет странный новый набор лицензионных ограничений.
Также есть более юридически свободные JVM от OpenJDK, но мне не удалось заставить их работать с app bundler.
Примечание: JVM — это «Java Virtual Machine». JRE — это «Java Runtime Environment», которая включает в себя JVM плюс дополнительные элементы, например, Java updater. JDK — это «Java Development Kit», который состоит из JRE плюс вещей, необходимых для написания программ на Java, например, компилятора. До Java 8 JRE была доступна для конечных пользователей отдельно, но с тех пор доступен только JDK, и поэтому мы связываем среду разработки Java с компьютерной игрой.
Вы должны получить возможность глубокой подписи и нотаризации получившегося бандла. В документации к AppBundler есть целая куча дополнительных опций, например, добавление иконки, ассоциации типов файлов и генерация урезанной JVM для приложения.
Источник