Я делаю небольшое приложение, которое удаляет файлы журнала. Я использую экземпляр NSTask, который запускает rm и srm (безопасный rm) для удаления файлов.
Я хочу иметь возможность удалять файлы в:
- / Library / Logs
- ~ / Library / Logs
Проблема заключается в том, что у учетной записи пользователя нет прав доступа к некоторым файлам в папке системной библиотеки, таким как подпапка журналов Adobe и другие. Например, только «системный» пользователь (группа?) Имеет права доступа к папке журналов Adobe и ее содержимому, а текущий пользователь даже не имеет записи в разрешениях, отображаемых в окне «Информация» для папки. .
Что я хочу сделать, чтобы точно:
- Получение прав администратора.
- Сохраните пароль в связке ключей, чтобы приложению не приходилось каждый раз раздражать пользователя. (Является ли хранение пароля плохой идеей? Возможно ли это?)
- Удалите файл, какими бы ни были разрешения для файла.
Я использую NSTask, потому что он предлагает уведомления о завершении задачи, получении текста от самой задачи и т. Д. Нужно ли мне использовать что-то еще? Если да, то как я могу реплицировать уведомления о завершении NSTask и дескриптор выходного файла при запуске rm и srm с правами администратора?
Я ищу самый безопасный способ справиться с ситуацией. то есть я не хочу, чтобы мое приложение стало дверью для атак на повышение привилегий.
Я посмотрел Руководство по программированию служб авторизации, но не уверен, какой случай подходит. Сначала я подумал, что AuthorizationExecuteWithPrivileges
будет хорошей идеей, но после прочтения этой темы, похоже, что этот метод не рекомендуется по соображениям безопасности.
Подробный ответ будет приветствоваться. Я уверен, что некоторым из вас уже приходилось делать что-то подобное, и у них есть какой-то код и знания, которыми можно поделиться.
Заранее спасибо!
Обновление:
Теперь я могу сделать диалоговое окно аутентификации всплывающим и получить привилегии, например:
OSStatus status;
AuthorizationRef authRef;
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
AuthorizationRights authRights;
AuthorizationItem authItems[1];
authItems[0].name = kAuthorizationRightExecute;
authRights.count = sizeof(authItems) / sizeof(authItems[0]);
authRights.items = authItems;
AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed;
status = AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL);
Судя по всему, метод «Факторизованного приложения» выглядит наиболее подходящим. Дело в том, что мне rm уже кажется внешним помощником . Я не уверен, что мне предложили альтернативу setuid в документации. Могу ли я установить бит setuid для rm и запустить его, используя метод NSTask, который я уже реализовал? Это будет означать, что мне не нужно будет создавать свой собственный вспомогательный инструмент. Может ли кто-нибудь уточнить эту тему?
Я также посмотрел на образец BetterAuthorizationS, который предлагается в качестве более безопасной и недавней альтернативы битовому методу setuid, но нашел его чрезвычайно сложным для такого простого поведения. Есть подсказки?
Заранее спасибо за любую помощь!