El Capitan以后的MacOS安全机制

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

你可能感兴趣的:(El Capitan以后的MacOS安全机制)