[macOS] System Integrity Protect

2016-08-11  本文已影响311人  水止云起

苹果从 OS 10.11 开始引入了一项保护机制 System Integrity Protection,目的是帮助普通用户避免恶意 app 通过用户授权的方式获得所有系统权限。

OS X 的内核XNU,是一个由Mach,BSD,IOKit混合的内核,它的权限管理系统类似UNIX的BSD。系统中一个文件会有一个所属用户(user),一个所属用户组(group),并有三种权限选项,是否可读(r)、是否可写(w)、是否可执行(x)。对于这个文件,它的所属用户,所属用户组和其他用户都有一套对这个文件的权限状态。为了多用户的权限管理,每个用户会在一个或者多个用户组中,一个用户组也可以有多个用户。其中root用户是一个特殊的超级用户,拥有对所有文件的可读可写可执行权限。 UNIX系统是纯粹基于文件的,换言之你的网络读取,驱动程序,分区表等,其实都会以文件的形式存在,所以这些都涉及到权限的问题。

OS X 内置会有 staff,admin,wheel 这三种常见的用户组。所有创建用户都会属于 staff 这个用户组,提供最基本的对该用户目录 ~ 的rwx权限,其他的一般只有r或者rx权限。默认创建的所有用户也会属于admin用户组,在这个组里的用户可以通过 su 或者 sudo 切换到root用户,只要执行以后输入这个用户的密码即可,而不需要知道root密码。而 wheel 是 root 用户的专属用户组。因为创建的用户是属于 admin 组的,所以如果在使用时,需要对/System/Library/usr等系统文件夹的写入权限时,就可以通过 sudo 命令将权限暂时提升到 root 来执行操作,操作执行完自然切换回用户权限。

而这样带来的问题就是,恶意软件可以通过引导普通用户授权,而获得系统的 root 权限,这样就存在了很大的安全隐患。所以,苹果引入 System Integrity Protection 的目的就在此,它限制了 admin 组中普通用户升级到 root 用户时的权限,而只有真正的 root 用户才不受这些限制。这些限制包括

通过 System Integrity Protection,苹果实现了对第三方软件的限制,有一些操作永远不被允许,恶意软件无法通过用户授权的方式从而获得所有系统权限了。但同时也影响到了一些我们平常要用到的第三方软件,比如使用 gem 安装包时需要 /usr/bin 目录下的操作权限,这时即使通过 sudo 操作,还是会提示

ERROR: While executing gem ... (Errno::EACCES)
    Permission denied - /usr/bin

有几种解决方法:

  1. 关闭 System Integrity Protection 功能。
  2. 通过 Homebrew 重新安装用户的 ruby,而 gem 也随之一同安装到了 /usr/local/bin,如果需要对 ruby 的版本进行管理,还可以使用 RVM,rbenv 等工具安装。
  3. 将包安装到用户自己的目录,gem install xxx --user-install
  4. 使用 -n 参数指定安装路径到 /usr/local/bin 目录,sudo gem install xxx -n /usr/local/bin
  5. 重写 gem 的 bindir $ echo 'gem: --bindir /usr/local/bin' >> ~/.gemrc
上一篇下一篇

猜你喜欢

热点阅读