Как отключить систему защиты целостности системы (SIP) AKA «без рута» в macOs [OS X]

157

Apple представила защиту целостности системы , также известную как «без корневых», с OS X 10.11, El Capitan. Я понимаю, что это шаг к общей защите от вредоносных программ, но как разработчик мне нужен доступ на запись к некоторым файлам, которые он блокирует.

Как отключить эту защиту?

bdnchr
источник
2
Несмотря на то, что вы можете исправить все аспекты SIP, для этого есть множество записей - помните, что, подвергая риску систему, вы создаете компоненты, которые могут не работать на компьютере вашего клиента, где включен SIP, и пользователи не примут его отключение.
Мотти Шнеор
5
@Motti Shneor - Тем не менее, в некоторых случаях от этого нужно отказаться, просто чтобы иметь право на запись для установки некоторых SDK в целях разработки. Это не потребует от клиента того же.
defaultNINJA
Я пришел из истории Unix, пытаясь понять логику отсутствия root: это потому, что компьютер, скорее всего, будет однопользовательским, все будет установлено в домашнем каталоге пользователя, так что нет необходимости связываться с системным каталогом такой как / usr / share / vim /.
Кемин Чжоу

Ответы:

148

Документация Apple включает в себя отключение SIP, О защите целостности системы на вашем Mac и Настройка защиты целостности системы .

В статье на lifehacker.com перечислены эти шаги:

  1. Перезагрузите Mac в режиме восстановления, перезагрузив компьютер и удерживая кнопку Command+, Rпока на экране не появится логотип Apple.
  2. Нажмите Утилиты> Терминал.
  3. В окне терминала введите csrutil disableи нажмите Enter.
  4. Перезагрузите ваш Mac.

Вы можете проверить, ограничен ли файл или папка, введя эту lsкоманду, используя заглавную O (а не ноль 0), чтобы изменить флаг длинного листинга:

ls -lO /System /usr 

Ищите ограниченный текст, чтобы указать, где применяется SIP.

По умолчанию (= SIP включен) следующие папки ограничены (см. Страницу поддержки Apple ):

/System
/usr
/bin
/sbin
Apps that are pre-installed with OS X

... и следующие папки бесплатны:

/Applications
/Library
/usr/local
Майк Скотт
источник
1
Я вижу, от запуска ls -lO /usr/localне помечены как ограниченные. Я также похудела /usr/local/рекурсивно. Но я продолжаю видеть, что root вступает во владение /usr/local/binи /usr/local/shareчто влияет на доморощенный. Это тоже работа SIP?
SaxDaddy
1
@SaxDaddy Пока /usr/localэто не ограничено, вы можете легко исправить любые разрешения «ниже» этого каталога. Homebrew на самом деле рекомендует запустить sudo chown -R $(whoami) /usr/local(при входе в систему как администратор), чтобы исправить проблемы с разрешениями.
nohillside
4
@SaxDaddy Вы случайно используете Антивирус Sophos? Существует известная проблема с Sophos, когда он меняет разрешения для этих каталогов. Согласно ветке на их форумах сообщества , это должно быть решено в обновлении "скоро".
ND Geek
1
@NDGeek: +1: Отлично, спасибо! Вы назвали это правильно. И я вижу, что SAV 9.4.1 (выпущенный 18nov15) решил проблему. Я установил эту версию и подтвердил, что /usr/localтеперь права доступа установлены правильно.
SaxDaddy
1
@andro Флаг -O все еще работает в 10.11.6. Если это не работает для вас, это отдельная проблема, и вы должны задать новый вопрос.
Майк Скотт
105

Можно отключить SIP, загрузившись в Recovery HD и выполнив следующую команду:

csrutil disable

введите описание изображения здесь

Также возможно включить защиту SIP и выборочно отключить ее аспекты, добавив один или несколько флагов в csrutil enableкоманду. Все требуют загрузки из Recovery, чтобы установить их:

Включить SIP и разрешить установку неподписанных расширений ядра

csrutil enable --without kext

введите описание изображения здесь

Включить SIP и отключить защиту файловой системы

csrutil enable --without fs

введите описание изображения здесь

Включить SIP и отключить ограничения отладки

csrutil enable --without debug

введите описание изображения здесь

Включить SIP и отключить ограничения DTrace

csrutil enable --without dtrace

введите описание изображения здесь

Включить SIP и отключить ограничения на запись в NVRAM

csrutil enable --without nvram

введите описание изображения здесь

У меня также есть пост с дополнительной информацией о SIP:

Защита целостности системы - добавление еще одного уровня в модель безопасности Apple

Рич Траутон
источник
5
Какое желанное богатство знаний. Возможно, мне придется удвоить эту награду :-)
bmike
Я получаю сообщение об ошибке:csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
Игорь Ганапольский
5
@IgorGanapolsky Прочитайте ответ. ' отключить SIP, загрузившись в Recovery HD ' .
Кирпич
13

Если цель состоит в том, чтобы просто отключить защиту целостности системы, то загрузка в раздел Recovery HD, как ранее рекомендовано в других ответах здесь, через Command+ rпри загрузке, не самый быстрый способ сделать это.

Вы можете сочетать однопользовательскую загрузку с загрузкой HD восстановления в недокументированной комбинации клавиш запуска:

  • https://support.apple.com/en-us/HT204904 покрывает нормальное восстановление
  • держать Command+ r+ , sчтобы загрузить в монопольном режиме восстановления пользователя.

Это приведет вас к минимальной минимальной среде, которая необходима для этого напрямую .

LangLangC
источник
7

Было бы безопаснее изменить, /etc/pathsтак что /usr/local/binэто просто раньше usr/bin. Таким образом, вы можете выполнять свою работу по разработке /usr/local/binбез отключения SIP.

Чистые установки ОС упорядочены /etc/pathsтаким образом со времен El Capitan, но если вы обновляете ОС с Yosemite или более ранней версии, вам придется изменить порядок путей вручную.

user260467
источник
@iconoclast До Эль-Капитана было принято соглашение об установке программ на usr/bin. Поскольку SIP предотвращает это сейчас, необходимо установить программы usr/local/bin, которые не ограничены SIP. Ставя на usr/local/binпервое место, пользователи могут запускать программы без необходимости указывать абсолютный путь к программе. Имеет ли это смысл? Вы смущены чем-то другим?
user260467
Я всегда понимал, что это очень плохая практика - вставлять что-либо /usr/bin... но я думаю, что я должен был спросить: "Как этот ответ на вопрос OP?" Первоначально я предполагал, что это каким-то образом произошло , и что я просто не устанавливал связь. Но сейчас я очень сомневаюсь, что это имеет какое-либо отношение.
иконоборчество
@iconoclast Я думаю, что было бы безответственно не упоминать разработчику, что он действительно не должен отключать SIP только для разработки приложения.
user260467
6

Если вам нужен только доступ к / usr / local, взгляните на эту страницу: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md

Идея состоит в том, чтобы временно отключить SIP с помощью csrutil disable, добавить /usr/local, использовать chflags, чтобы установить этот каталог без ограничений

 sudo mkdir /usr/local && sudo chflags norestricted /usr/local && sudo chown -R $(whoami):admin /usr/local

и затем повторно включите SIP, используя csrutil enable.

Если /usr/localна момент вашего обновления уже существует, то даже вышеперечисленное не является необходимым. Вы можете просто запустить

sudo chown -R $(whoami):admin /usr/local
m_cuffa
источник
Я получаю сообщение об ошибке:Read-only file system
Игорь Ганапольский,
Ссылка не работает: ошибка 404.
иконоборчество
2

Если вы не можете войти в раздел восстановления для запуска csrutil disable(чтобы отключить SIP ), попробуйте установить параметры загрузки с помощью nvramкоманды, например

sudo nvram boot-args="rootless=0"

Однако, если у вас есть следующая ошибка:

nvram: Ошибка установки переменной - «boot-args»: (iokit / common) не разрешено

тогда это не сработает. Вам по-прежнему нужно загрузить его восстановления / безопасный режим.

Видеть:

kenorb
источник
nvram: Error setting variable - 'boot-args': (iokit/common) not permitted
mghicks
1
@mghicks В этом случае это не сработает. Я обновил ответ.
Кенорб