- [macOS] System Integrity Protect
- [macOS] root下仍然"/usr/bin: Operat
- 解决XtraFinder、TotalFinder无法安装的问题
- Mac 升级到10.13.1mac OS High Sierra
- iOS开发- Alcatraz插件管理 Xcode 8、Xcod
- SIP(System Integrity Protection)
- Error: Asus Anti-Surge was trigg
- MacBook外接2K显示器开启HIDPI
- Mac 使用SwitchResX设置外置2k+显示器的HIDPI
- 关于Mac系统没有修改/usr/bin或者/usr/sbin文件
苹果从 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
,/bin
,/sbin
,/usr
目录的修改(但/usr/local
目录不受此限制)。只有苹果自身签名的软件(含命令行工具)或通过苹果开发者认证的 app 才有权限对其修改. - 禁止注入系统进程。
- 禁止加载内核扩展(kexts),除非它们被苹果开发者正确的签名。
通过 System Integrity Protection,苹果实现了对第三方软件的限制,有一些操作永远不被允许,恶意软件无法通过用户授权的方式从而获得所有系统权限了。但同时也影响到了一些我们平常要用到的第三方软件,比如使用 gem 安装包时需要 /usr/bin 目录下的操作权限,这时即使通过 sudo 操作,还是会提示
ERROR: While executing gem ... (Errno::EACCES)
Permission denied - /usr/bin
有几种解决方法:
- 关闭 System Integrity Protection 功能。
- 通过 Homebrew 重新安装用户的 ruby,而 gem 也随之一同安装到了
/usr/local/bin
,如果需要对 ruby 的版本进行管理,还可以使用 RVM,rbenv 等工具安装。 - 将包安装到用户自己的目录,
gem install xxx --user-install
- 使用 -n 参数指定安装路径到
/usr/local/bin
目录,sudo gem install xxx -n /usr/local/bin
- 重写 gem 的 bindir
$ echo 'gem: --bindir /usr/local/bin' >> ~/.gemrc
网友评论