Отладка плагина авторизации с XCode
Этот technote описывает, как можно использовать основанную на SSH функцию отладки XCode для удаленной отладки плагина авторизации. Это предназначено для разработчиков Mac OS X, разрабатывающих плагин авторизации.
Введение
Средство плагина авторизации позволяет Вам выполнять код во время процесса входа в систему. Вы не можете использовать стандартные методы XCode для отладки плагина авторизации, потому что нет никакого способа выполнить XCode в то время, когда работает плагин. Этот technote описывает, как можно использовать основанную на SSH функцию отладки XCode для удаленной отладки плагина авторизации. Установка является скорее сложной (требуется два компьютера, настраивая вход в систему SSH для корня и совместно используемый каталог сборки), но это хорошо стоит усилия при выполнении большой работы с плагинами авторизации.
Необходимо включить корневую учетную запись и Удаленный вход в систему (SSH), никогда хорошую комбинацию.
Необходимо включить гостевой доступ AFP к исходному коду.
Как только Вы сделаны, отладив, необходимо восстановить компьютеры к их состоянию по умолчанию путем следования инструкциям в Восстановлении Системы.
Начало работы
Для запуска необходимо будет реализовать некоторую базовую конфигурацию компьютеров.
Запустите с двух машин, машины разработки (который выполняет XCode), и целевая машина (который выполняет Ваш плагин авторизации).
В панели Sharing Установок системы назовите машину разработки «Разработкой» и целевой машиной «Target».
Установите инструменты разработчика XCode на обеих машинах.
Совместное использование источника
Для отладки для работы должным образом обеим машинам будет нужен доступ к исходному коду с точно тем же путем.
На машине разработки, помещенной Ваш исходный код на объем кроме корневого объема (если у Вас нет другого объема удобным, можно использовать образ диска). Переименуйте объем к «Источнику».
На разработке машина гарантирует, что Гостевая Учетная запись включена для совместного использования доступа («Позволяют гостям соединяться с совместно используемыми папками» в панели Accounts Установок системы).
На машине разработки, в панели Sharing Установок системы, включают Совместный доступ к файлам по AFP.
В той же панели перетащите «Исходный» объем в Совместно используемые папки, перечисляют и гарантируют, что у Всех есть Доступ только для чтения.
На целевом Подключении использования машины к Серверу в Средстве поиска, чтобы соединиться с машиной разработки как гостевой пользователь и проверить, что можно смонтировать «Исходный» объем и видеть исходный код. Тогда размонтируйте «Исходный» объем.
На целевой машине добавьте, что запись монтирования на Ваш локальный каталог хранит и обновляет утилиту автоматического монтирования, как показано в Перечислении 1.
Перечисление 1 , Добавляющее запись монтирования
$ # Create the mount record $ sudo dscl . -create /Mounts/Development.local.:\\/Source $ sudo dscl . -create /Mounts/Development.local.:\\/Source VFSType url $ sudo dscl . -create /Mounts/Development.local.:\\/Source VFSLinkDir \ /Volumes/Source $ sudo dscl . -create /Mounts/Development.local.:\\/Source VFSOpts \ url==afp://\;AUTH=NO%20USER%20AUTHENT@Development.local./Source $ # Refresh the automounter $ sudo /usr/sbin/automount -c
На целевой машине подтвердите, что автомонтирование работает путем перечисления
/Volumes/Sourceкаталог, как показано в Перечислении 2. Это должно автоматически смонтировать «Исходный» объем на целевой машине. Однако, потому что объем автосмонтирован, он не обнаружится в Средстве поиска.Перечисление 2 , Подтверждающее автомонтирование
$ ls -lh /Volumes/Source total 32 -r--r--r--@ 1 apple wheel 1.0K Jun 26 17:23 Desktop DB -r--r--r--@ 1 apple wheel 2B Jun 26 15:55 Desktop DF drwxrwxrwx@ 7 apple wheel 264B Nov 28 2007 NullAuthPlugin
Включите основанный на ключе SSH для корня
На существующих системах плагин авторизации размещается также SecurityAgent или authorizationhost. Они работают как UID 92 (_securityagent) или UID 0 (root), соответственно. Для отладки их необходимо будет выполнить GDB как корень на целевой машине. Для хранения вещей простыми мы включим корневую учетную запись и затем включим основанную на ключе аутентификацию SSH для той учетной записи.
На целевой машине включите Удаленный вход в систему (SSH) в панели Sharing Установок системы.
На целевой машине, выполненной Утилите Каталога и выбирают, включают пользователю root (выберите Enable Root User в меню Edit).
На машине разработки генерируйте пару ключей SSH как показано Перечислением 3.
Перечисление 3 , Генерирующее пару ключей SSH
$ mkdir -p .ssh $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/apple/.ssh/id_rsa): .ssh/id_rsa-wideopen Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in .ssh/id_rsa-wideopen. Your public key has been saved in .ssh/id_rsa-wideopen.pub. The key fingerprint is: 90:cc:24:66:ef:bf:8e:61:4a:f3:d0:9c:0f:d4:ac:5f apple@Development.local
Скопируйте открытый ключ SSH в корневой каталог пользователя root на целевой машине, как показано Перечислением 4.
Перечисление 4 , Копирующее открытый ключ SSH в корневой каталог пользователя root
$ scp .ssh/id_rsa-wideopen.pub root@Target.local.:
На целевой машине войдите в систему как корень и установите открытый ключ SSH, как показано Перечислением 5.
Перечисление 5 , Устанавливающее открытый ключ SSH
# mkdir -p .ssh # cat id_rsa-wideopen.pub > .ssh/authorized_keys
На машине разработки добавьте ключ SSH к своему ssh-агенту и затем подтвердите, что Вы можете SSH как корень к целевой машине, не требуя пароля (см. Перечисление 6).
Перечисление 6 , Тестирующее установку SSH
$ ssh-add .ssh/id_rsa-wideopen $ ssh root@Target.local. Last login: Thu Jun 26 23:58:23 2008 from Development.local #
Конфигурирование XCode и отладки
Последний шаг должен сконфигурировать XCode и отладить Вашу программу. На этом шаге мы будем использовать Пример кода 'NullAuthPlugin' для приведения конкретного примера относительно включенных шагов. Для запуска Вы, wil должны создать и установить Ваш код и затем сконфигурировать XCode.
На машине разработки загрузите Пример кода 'NullAuthPlugin' и распакуйте его к корневому каталогу Вашего «Исходного» объема.
Откройте проект в XCode и создайте его.
На целевой машине скопируйте созданный плагин в
/Library/Security/SecurityAgentPlugins/, как показано Перечислением 7.Перечисление 7 , Устанавливающее плагин
$ sudo cp -R \ /Volumes/Source/NullAuthPlugin/build/Debug/NullAuthPlugin.bundle \ /Library/Security/SecurityAgentPlugins/
На целевой машине измените
system.login.consoleпрямо в базе данных авторизации (в настоящее время/etc/authorization) вызвать плагин. Запустите путем создания резервного копирования базы данных авторизации, как показано Перечислением 8.Перечисление 8 Поддерживая базу данных авторизации
$ sudo cp /etc/authorization /etc/authorization-orig
Тогда отредактируйте файл (использующий Ваш любимый текстовый редактор), чтобы добавить, что механизм представляет «NullAuthPlugin:WaitForDebugger» в виде строки после строки механизма «HomeDirMechanism:status». Подтвердите свое изменение с помощью команды, показанной в Перечислении 9.
Проверка перечисления 9 модификация базы данных авторизации
$ grep -A 2 HomeDirMechanism /etc/authorization <string>HomeDirMechanism:login,privileged</string> <string>HomeDirMechanism:status</string> <string>NullAuthPlugin:WaitForDebugger</string> <string>MCXMechanism:login</string>На целевой машине выйдите из системы и затем зарегистрируйте, въезжают задним ходом. Вход в систему должен зависнуть как
NullAuthPluginожидает отладчика для соединения.На машине разработки принесите
NullAuthPluginпроект к передней стороне в XCode и выбирает New Custom Executable из Меню проектов. В получающемся диалоговом окне оставляют Исполнимый набор Поля имени «Исполнимой программе» и вводят «/system/library/coreservices/securityagent.app/contents/macos/securityagent» в Исполнимое Поле трактов. Тогда нажмите Finish.На вкладке Debugging окна Executable Info проверьте флажок «Debug executable remotely via SSH». Войдите «root@Target .local». в «Подключение к»: поле. И снимите флажок с флажком «Start executable after starting the debugger». Окно должно теперь быть похожим на рисунок 1.

Как только все устанавливается, можно использовать следующие шаги для фактической отладки кода.
В XCode выберите Debugger из меню Run, чтобы показать окно отладки, затем выбрать Console из меню Run для показа консоли.
В XCode выберите Debug из меню Run. Эта консоль теперь покажет Вам состояние GDB, работающего как корень на целевой машине!
В консоли присоедините к
SecurityAgentкак показано в Перечислении 10.Присоединение перечисления 10 к SecurityAgent
(gdb) attach SecurityAgent Attaching to program: `/System/Library/CoreServices/SecurityAgent.app/Contents/MacOS/SecurityAgent', process 263. Reading symbols for shared libraries ...[…]... done 0x920dd806 in __sigsuspend_nocancel () […]
В XCode можно теперь использовать окно отладки для отладки плагина авторизации, поскольку Вы были бы любой другой код.
Уф! Это был долгий путь, но я полагаю, что результат стоит усилия.
Пена, промывка, повторяется
Неизбежно Ваши усилия по отладке будут вести для кодирования изменений, и это требует, чтобы Вы переустановили свой плагин авторизации и отладили новую версию. Это удивительно просто.
В XCode на машине разработки остановите отладчик.
Внесите свои изменения кода и восстановите свой проект.
На целевой машине переустановите плагин путем повторения команды в Перечислении 7.
На целевой машине выйдите из системы и затем зарегистрируйте, въезжают задним ходом. Вход в систему должен зависнуть как
NullAuthPluginожидает отладчика для соединения.Выполните шаги от предыдущего раздела для запуска отладчика.
Восстановление Вашей системы
Как только Вы сделаны, отладив Вас, должен восстановить Ваши компьютеры к разумному состоянию. В этом разделе описываются необходимые шаги.
На целевой машине удалите ссылку на свой плагин авторизации от
system.login.consoleпрямо в базе данных авторизации (/etc/authorization). Можно сделать это путем восстановления базы данных от резервного копирования, которое Вы сделали ранее, как показано в Перечислении 11.Перечисление 11 , Восстанавливающее базу данных авторизации от Вашего резервного копирования
$ sudo cp /etc/authorization-orig /etc/authorization
На целевой машине удалите свой плагин авторизации из
/Library/Security/SecurityAgentPlugins/каталог.На целевой машине удалите открытый ключ SSH для пользователя root. Войдите в систему как корень и затем выполните команду в Перечислении 12.
Перечисление 12 , Удаляющее открытый ключ SSH
# rm .ssh/authorized_keys
На целевой машине отключите вход в систему SSH (Удаленный вход в систему в панели Sharing Установок системы).
На целевой машине отключите пользователя root (в Утилите Каталога).
На целевой машине удалите запись монтирования из своего локального хранилища каталога, как показано в Перечислении 13.
Перечисление 13 Удаляет запись монтирования
$ # Delete the mount record $ sudo dscl . -delete /Mounts/Development.local.:\\/Source $ # Refresh the automounter $ sudo /usr/sbin/automount -c
Перезапустите целевую машину.
На машине разработки, выход XCode.
На машине разработки удалите «Исходный» объем из списка Совместно используемых папок (в панели Sharing Установок системы).
На машине разработки отключите Совместный доступ к файлам по AFP (в панели Sharing Установок системы).
На машине разработки восстановите Гостевую Учетную запись к своему предпочтительному состоянию (в панели Accounts Установок системы).
Перезапустите машину разработки.
На каждой разработке и целевых машинах, восстановите имя компьютера к его предыдущему значению (в панели Sharing Установок системы).
Дополнительные материалы для чтения
История версии документа
| Дата | Примечания |
|---|---|
| 08.09.2008 | Новый документ, что учебное руководство о том, как использовать XCode для отладки плагина авторизации. |