El Capitan之前的安全机制
MacOS中,总有一个root
用户,uid为0
。
$ dscacheutil -q user -a name root
name: root
password: *
uid: 0
gid: 0
dir: /var/root
shell: /bin/sh
gecos: System Administrator
MacOS的登录用户不是root,没有最高权限。修改一些系统保护的资源时,需要临时切换到root用户。root具有最高权限,可以做任何事情。此时需要使用sudo命令。
比如登录用户是不能修改/etc/hosts文件的。
$ whoami
foo
$ vi /etc/hosts
'readonly' option is set for "/private/etc/hosts".
Do you wish to write anyway?
"/private/etc/hosts"
"/private/etc/hosts" E212: Can't open file for writing
要修改/etc/hosts文件,必须以root的身份执行这条命令。此时需要输入登录密码。
$ sudo vi /etc/hosts
Password:
El Capitan之后的安全机制
MacOS发现root的权限太大了,可以对系统做任何事情。如果用户使用root用户执行了一些误操作,会造成不可挽回的错误。从El Capitan(OS X 10.11)
开始,MacOS限制了root用户的权限。以前可以用sudo执行的操作,现在不能执行了。
$ sudo mkdir /usr/root
mkdir: /usr/root: Operation not permitted
这个功能叫做System Integrity Protection
。SIP在内核中对root的操作做了限制,即使使用sudo,也不能执行内核限制的操作。此时root失去最高权限,变成了一个缩水的root用户。
SIP增加的限制主要是以下四方面:
- root不能对特定文件和文件夹执行写操作。
- root不能使用debugger工具跟踪系统进程,也不能向系统进程注入代码。
- 所有的内核扩展都被签名。
- 操作系统分区上不能禁止SIP,只能在OS X的恢复分区上禁止SIP。
SIP保护目录
- /System
- /bin
- /usr
- /sbin
SIP保护以上目录,root不能在这些目录中执行写操作,否则会报错。
$ sudo touch /usr/IamRoot
Password:
touch: /usr/IamRoot: Operation not permitted
root也不能把设备挂载到这些目录上。
$ sudo mount -t nfs company.com:share_folder /System
mount_nfs: can't mount share_folder from company.com onto /System: Operation not permitted
SIP允许操作的目录
对开发者而言,现在不能随意放置文件。MacOS允许也推荐开发者把文件放到一下目录中。
- /Library
- ~/Library
- /usr/local
- /Applications
使用/Library和~/Library替换/System,使用/usr/local替换/usr,/bin, /sbin。苹果强烈推荐开发者把应用程序的所有文件放在/Applications中,方便卸载应用程序。
这是我的Mac中,/usr/local目录下的内容。
$ tree /usr/local/ -L 1
/usr/local/
├── Cellar
├── Frameworks
├── Homebrew
├── bin
├── etc
├── go
├── include
├── lib
├── opt
├── remotedesktop
├── sbin
├── share
└── var
brew安装在/usr/local/Homebrew/bin/brew,brew安装的程序都放在/usr/local/Cellar/中。
$ tree -L 1 /usr/local/Cellar/
/usr/local/Cellar/
├── apr
├── apr-util
├── ascii
├── autoconf
├── automake
├── cmake
├── doxygen
├── erlang
├── git
├── htop
├── httpd24
├── jpeg
├── libevent
├── libpng
├── libtiff
├── libtool
├── mysql
├── openssl
├── pcre
├── pkg-config
├── rabbitmq
├── sphinx-doc
├── tree
├── wget
├── wxmac
└── zlib