一、概述
本文档以macOS 10.14系统为基础,提供针对macOS Mojave的基本加固指南,以增强系统安全性。在本加固指南中,不包含一些可能影响操作系统功能并且需要进一步测试的设置。我们对每个条目进行了标注,分为“重要”和“可选”两类。其中的“可选”条目,我们也建议应用此设置,但系统的某些功能将会在应用设置后变为不可用,因此需要各位用户自行评估。
重要说明:本安全加固指南在加固过程中,将指导用户强制禁用SIP(系统完整性保护)。在加固完成后,请务必确保再次启用SIP。
二、常规建议
2.1 安全启动
在2018年的MacBook主机中,通过TouchBar内部新安装的T2芯片(包括Secure Enclave),支持安全启动(Secure Boot)功能。要检查是否已经启用安全启动,需要在开机时同时按下COMMAND + R键。在输入固件密码后,可以访问菜单栏中的“启动安全实用程序”(Startup Security Utility)。如果MacBook中带有T2芯片(TouchBar),则可以看到“安全启动”(Secure Boot)和“外部启动”(External Boot)两个选项。我们强烈建议,在需要保证较高安全性的情况下,应选择“安全启动”。在禁止从外部介质启动时,应选择“外部启动”。
2.2 终端保护
默认情况下,macOS已经具有保护机制,例如:XProtect(恶意软件检测)、Secure Boot、代码签名验证、沙箱应用程序和系统完整性保护。此外,如果启用了MDM(例如在macOS服务器上),则可以通过不同的策略配置设备和管理设备。如果需要安装其他终端保护工具,应该评估该工具是否支持macOS设备。
2.3 日志和事件收集
管理员可以根据实际需要,配置macOS的审计框架。通过/Applications/Utilities/Console.app,可以查看到整合后的日志。默认情况下,macOS支持以syslogd守护程序,通过UDP/514端口发送日志。但是,由于缺乏对TLS/SSL的支持,建议不要使用此项功能,预计Apple很快就会弃用这项功能。如果您所在的企业环境中不支持包含代理的macOS SISM,建议可以从本地整合日志,并且避免通过网络发送未经加密的日志。借助macOS提供的日志实用程序,可以以安全的方式获取此类日志,只需日志收集服务器的接收端打开TCP端口(需支持TLS/SSL)。例如,在MacBook上执行以下命令,可以通过加密通道将每个失败的sudo尝试发送到日志服务器:
log stream --style syslog --predicate 'process == "sudo" and eventMessage contains "incorrect password"' | openssl s_client -host <RemoteServer> -port <Port>
日志服务器将收到类似的日志消息,如下所示:
Filtering the log data using "process == "sudo" AND composedMessage CONTAINS "incorrect password"" Timestamp (process)[PID] 2018-10-24 17:23:33.842651+0200 localhost sudo[2002]: MacBook_ERNW : 2 incorrect password attempts ; TTY=ttys002 ; PWD=/Users/MacBook_ERNW ; USER=root ; COMMAND=su
可以使用macOS登录项,来自动启动日志流。此外,管理员可以根据需要,使用过滤器来过滤实际需要的日志。
2.4 移动设备管理
将MacBook与移动设备管理系统(MDM,如macOS服务器)连接,可以强制操作系统必须部署指定的策略。此外,可以通过MDM解决方案来实现部署证书和连接到活动目录(Active Directory)。
三、认证
3.1 确保标准帐户和默认帐户的安全性
macOS会始终强制用户创建新帐户。即使用户以管理员权限帐户运行,也不会拥有与“root”相同的权限,这就是macOS称之为系统完整性保护(SIP)的机制。SIP将拒绝使用者对系统目录(例如:/System)的任何更改。
3.2 用户权限分离
建议用户使用不同的帐户,分别进行管理和日常活动。并且,应该为特殊任务和系统维护创建一个具有管理员权限的帐户,为日常使用过程创建一个普通帐户,从而避免攻击者快速提升权限。
3.3 确保密码安全
应确保所有用户都使用强密码,强密码的具体定义如下:
最小密码长度至少为8个字符;
密码必须同时包含小写字母、大写字母、数字和特殊字符;
不得使用任何默认密码;
密码必须具有6个以上不同的字符;
同一个密码最多使用180天;
用户名不得作为密码的一部分;
新设置的密码,与最近5次设置的历史密码不能相同。
3.4 强制密码安全策略(重要)
管理员可以使用命令行工具pwpolicy,来强制实施密码策略。以下命令可以强制执行上述策略:
pwpolicy -u -setpolicy "minChars=8 requiresAlpha=1 requiresNumeric=1 maxMinutesUntilChangePassword=259200 usingHistory=5 usingExpirationDate=1 passwordCannotBeName=1 requiresMixedCase=1 requiresSymbol=1"
3.5 双因素身份验证(可选)
从macOS 10.11和iOS 9开始,这些Apple设备就内置了双因素身份验证机制,可以保护用户的Apple ID。如果访问了任何需要登录Apple ID的内容,身份验证码就会被推送到另一台安装了macOS 10.11以上版本或iOS 9以上版本系统的设备上。这一过程可能会影响用户的macOS安装,因为可以通过Apple ID重置设备的密码。如果用户需要使用Apple ID执行各种任务,那么建议使用双因素身份验证。
3.6 自动登录和用户列表(重要)
建议禁用用户列表,这样会降低攻击者正确猜测登录凭据的可能性。
在“系统偏好设置”(System Perferences)中,选择“用户和组”(Users & Groups),选择“登录选项”(Login Options),将“自动登录”(Automatic Login)设置为禁用,将“显示登录窗口”(Display Login Window)设置为“用户名和密码”(Name and Password),并禁用密码提示(Password Hints)。
3.7 登录导语(可选)
可以设置登录导语(Login Banner),从而在登录时显示包含策略的信息。
sudo defaults write /Library/Preferences/com.apple.loginwindow LoginwindowText “text”
3.8 访客帐户(重要)
应该始终禁用访客帐户的所有内容,并且停用访客账户。
在“系统偏好设置”中,选择“用户和组”,确保已经禁用访客账户(Guest Users)。
3.9 限制Sudoers文件(重要)
要限制宽限期(Grace Period)并限制为单个ttys,应使用visudo命令,编辑/etc/sudoers,添加以下内容:
Defaults timestamp_timeout=0 Defaults tty_tickets
3.10 自动锁定登录钥匙串(可选)
打开钥匙串访问(Keychain Access),选择登录钥匙串。选择“编辑”(Edit),更改钥匙串设置“登录”。将“不活动[…]分钟后锁定”(Lock after […] minutes)的数值设置为10。勾选“睡眠时锁定”(Lock when sleeping)选项。
注意:自动锁定钥匙串将会影响用户体验,每个锁定守护进程(例如:Wi-Fi服务)都需要解锁。因此,Wi-Fi环境下的自动夜间备份将会受到影响。
四、通用配置
4.1 修复当前系统漏洞(重要)
在执行本指南中的加固措施之前,强烈建议先将当前系统升级到最新且已经安装补丁的状态。可以通过“Apple菜单” – “App Store” – “升级”(Updates)来检查当前系统的更新情况。
或者,也可以在命令行中输入以下命令:
$ softwareupdate -l
4.2 自动更新(重要)
建议始终启用自动更新,以自动向系统提供最新的安全修复程序。可以通过以下命令检查是否启用此设置:
$ defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates 1
如果启用了自动更新,则返回值应该为1,如上面输出所示。如果该设置不存在,可以通过以下命令来手动设置:
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates -int 1
4.3 Gatekeeper(重要)
Gatekeeper将检查应用程序是否使用有效的Apple证书进行签名。通过以下方式来检查应用程序是否具有签名:
spctl –a /Applications/test.app
如果要将其添加到Gatekeeper,可以使用如下命令:
spctl --add test.app
或者直接执行下面的操作:
右键单击,选择“打开”。
注意:在一些情况下,系统可能仍然会拒绝打开应用程序。这时,我们可以强行启动:
点击“系统偏好设置”,选择“安全和隐私”(Security & Privacy),选择“常规”(General)。然后打开应用程序。
4.4 执行代码签名机制(重要)
可以编辑/etc/sysctl.conf,在其中添加以下行:
vm.cs_force_kill=1 # Kill process if invalidated vm.cs_force_hard=1 # Fail operation if invalidated vm.cs_all_vnodes=1 # Apply on all Vnodes vm.cs_enforcement=1 # Globally apply code signing enforcement
注意:此项更改需要禁用系统完整性保护,在加固后请手动启用。在新安装的系统上,sysctl.conf可能不存在,管理员可以创建该文件并重新启动系统。
4.5 禁用元数据文件创建(重要)
建议禁止在macOS在远程卷(例如:网络存储、USB存储)上创建临时文件。下面的命令可以阻止此类行为:
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
4.6 禁用保存到iCloud(重要)
以下命令可以阻止macOS将文件直接保存到任何iCloud服务器:
sudo defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false
4.7 禁用诊断(重要)
要避免向Apple或App Developers发送数据,请禁用以下内容:
在“系统偏好设置”中,选择“安全和隐私”,选择“隐私”(Privacy),选择“诊断和使用”(Diagnostics & Usage)。取消选中“向Apple发送诊断和使用数据”(Send diagnostic & usage data to Apple),取消选中“与应用开发者共享崩溃数据”(Share crash data with app developers)。
4.8 禁用Handoff(重要)
Apple Handoff是一项保持工作区同步的功能,但该功能需要向Apple发送数据,建议禁用这一功能。
在“系统首选项”(System Preferences)中,选择“常规”(General),取消选中“允许在此Mac和iCloud设备之间切换”(Allow Handoff between this Mac and your iCloud devices),并将“最近项目”设置为“无”(None)。
4.9 FileVault(重要)
建议启动FileVault,以在设备上启用完整磁盘加密。该功能应该已经默认启用。但是,在安装macOS之后再打开FileVault会更加安全,因为此时的伪随机数生成器会具有更加随机的种子。
点击“系统偏好设置” – “安全和隐私” – “FileVault”,选择“启用FileVault”。
*可选设置:
如果要在休眠时,从内存中删除加密密钥,并从内存中断电,可以使用以下命令:
sudo pmset -a destroyfvkeyonstandby 1 hibernatemode 25
注意:这项操作可能会对用户体验产生影响,因为必须要在每次合盖/开盖后解密磁盘。因此,启动过程最多可能需要10秒钟时间。我们建议对安全性要求较高的计算机设置此选项,其首选设置如下:
sudo pmset -a powernap 0 sudo pmset -a standby 0 sudo pmset -a standbydelay 0 sudo pmset -a autopoweroff 0
4.10 防火墙(重要)
建议启用具有完整功能的防火墙,并阻止所有传入流量。
点击“系统偏好设置” – “安全和隐私” – “防火墙”,点击“打开防火墙”(Turn on Firewall)。选择“防火墙选项”(Firewall Options),设置“阻止所有传入连接”(Block All Incoming Connections),设置“启用隐身模式”(Enable Stealth Mode)。
4.11 需要管理员密码(重要)
建议始终要求在验证管理员密码后才能访问系统设置。
4.12 屏幕保护程序和解锁(重要)
建议在不活动时,自动锁定屏幕。
点击“系统偏好设置” – “桌面和屏幕保护程序”(Desktop & Screensaver) – “屏幕保护程序”(Screensaver)。根据需要调整时间范围,我们建议将其设置为5分钟。
点击“系统偏好设置” – “安全和隐私” – “常规”,设置“睡眠或屏幕保护程序开始后立即需要密码”(Require password immediately after sleep or screen saver begins)。
4.13 文件扩展名(重要)
要始终掌握用户正在处理的文件类型,建议开启显示文件扩展名。
打开“访达”(Finder),选择“设置”(Settings) – “高级”(Advanced),选择“显示所有文件扩展名”(Show all filename extensions)。
4.14 阻止Safari打开已知类型文件(重要)
如果用户使用Safari作为主要的浏览器,建议阻止Safari在下载文件后打开已知文件类型的文件。
打开Safari,选择“首选项”(Preferences),选择“常规”(General),取消“下载后打开安全文件”(Open safe files after downloading)。
4.15 设置严格的全局Umask(可选)
严格限制全局Umask默认使用用户将来创建的任何文件或目录的权限。我们可以使用以下命令来调整全局Umask:
sudo launchctl config system umask 027
注意:这可能会破坏依赖于较少限制的umask的其他软件安装。
4.16 禁用远程Apple事件(重要)
建议禁用远程Apple事件服务(默认禁用)。该服务可用于通过网络对另一台Mac上的软件执行操作。因此,它应该始终被禁用。下面的命令可以检查是否启用了远程Apple事件:
sudo systemsetup –getremoteappleevents
应确保输出为:
Remote Apple Events: Off
如果启用,那么可以使用以下命令来禁用:
sudo systemsetup -setremoteappleevents off
五、特定配置
5.1 禁用蓝牙(可选)
由于此前存在一些针对蓝牙配对和身份检测的攻击方法,因此建议在不需要使用蓝牙时禁用蓝牙。
点击“系统偏好设置” – “蓝牙”(Bluetooth),选择“停用蓝牙”(Deactivate Bluetooth)。
注意:取消激活蓝牙,将会断开蓝牙键盘、蓝牙鼠标或蓝牙耳机等外接设备。
5.2 固件密码(重要)
要防止单用户模式(Single User Mode)和可引导设备,建议设置足够复杂的固件密码。
在Mac启动时,按下Command + R,将Mac启动到恢复模式(Recovery Mode)。选择“实用程序”(Utilities) – “固件密码实用程序”(Firmware Password Utility),然后设置一个足够复杂的密码。
注意:忘记此密码,可能会导致Mac完全不可用,并阻止计算机起动因此,存储该密码的密码管理器是一个有效的解决方案。此外,无论MacBook的实际键盘布局如何,当尝试访问固件安全组件时,将始终映射英语的默认设置。
5.3 Setuid和Setgid(可选)
改变二进制文件的Setuid位,是比较重要的一个设置。这可能会影响这些二进制文件的功能,但管理员始终可以撤销这些步骤。使用以下命令,可以获取所有SUID二进制文件的列表:
sudo find / -perm -04000 -ls sudo find / -perm -02000 –ls
在这里,过滤掉我们认为“代码质量较差”或通常不信任的应用程序(例如:鼠标外接设备驱动程序)。以下命令可以取消设置文件和目录的描述权限:
chmod u-s #file chmod g-s #file
5.4 禁用核心转储(重要)
要限制内核信息泄露,请禁用核心转储功能。可以编辑/etc/sysctl.conf中的以下行:
kern.coredump=0
注意:此项更改需要禁用系统完整性保护,在加固后请手动启用。在新安装的系统上,sysctl.conf可能不存在,管理员可以创建该文件并重新启动系统。
由于Kerneldumps可以帮助进行调试,因此可以暂时启用:
sudo sysctl -w kern.coredump=1
5.5 禁用USB/蓝牙和其他大容量存储设备(可选)
在某些情况下,需要禁用将任何大容量存储插入系统。这一点可以通过删除KEXT驱动程序或使用企业级MDM工具来实现。
要完全禁用USB大容量存储设备,可以删除/System/Library/Extensions中的KEXT驱动程序IOUSBMassStorageClass.kext(必须禁用SIP)。也可以通过删除前面所提到的文件夹中的IOBlueToothFamily来完全禁用蓝牙。删除KEXT驱动程序后,需要在目录上执行以下命令,以重建kernelcache:
touch /System/Library/Extensions
注意:由于无法插入大容量存储设备,可能会影响MacBook的可用性。但是,USB键盘仍然有效。
此外,一些商业软件(例如:https://www.endpointprotector.com/products/endpoint-protector)可以执行类似的端口阻止,但我们还没有对其进行过任何测试。
六、网络和通信安全
6.1 高级防火墙(可选)
建议管理员更加准确地监控应用了就溜。软件防火墙可以为不同位置和不同网络生成自己的规则集。我们推荐一个更高级的防火墙,例如“Little Snitch”、“Radio Silence”和“Handoff”,这些都是完全成熟的本地防火墙(收费)。如果管理员希望使用免费的防火墙,可以查看精简版的“Murus”。
· https://www.obdev.at/products/littlesnitch/index-de.html
· https://www.oneperiodic.com/products/handsoff/
· https://radiosilenceapp.com/
· http://www.murusfirewall.com/
6.2 禁用LAN唤醒(重要)
选择“系统偏好设置” – “节能”(Energy Saver),取消“网络访问唤醒”(Wake for network access)。
6.3 禁用Apple文件协议AFP(重要)
这一协议相当于SMB协议,在macOS 10.11上默认被禁用。管理员可以在以下位置进行验证:
选择“系统偏好设置” – “共享”(Sharing),选择“文件共享”(File Sharing) – “选项”(Options),取消设置“使用AFP共享文件和文件夹”(Share Files and folders using AFP)。
注意:也可以通过命令行实现禁用:
sudo launchctl unload -w /System/Library/LaunchAgents/AppleFileServer.plist
6.4 禁用不必要的服务(可选)
管理员可以使用以下命令,禁用不必要的服务:
sudo launchctl unload -w /System/Library/LaunchAgents/<Service
注意:这可能会破坏系统的原有功能。要重新加载这些服务,只需将上述命令中的“unload”替换为“load”。
我们在本文的最后,补充了一个可能是不必要服务的清单。
更多服务(Plistfiles)可以在以下目录中找到:
/System/Library/LaunchDaemons /System/Library/LaunchAgents /Library/LaunchDaemons /Library/LaunchAgents /Users//Library/LaunchDaemons /Users//Library/LaunchAgents
6.5 禁用共享(重要)
默认情况下,会禁用共享。管理员可以在这里进行验证:
点击“系统偏好设置” – “共享”,取消其中所有不需要的选项。
6.6 通过NTP启用网络时间同步(重要)
系统时钟对于日志文件来说非常重要。要确保时钟始终正确,并且未被损坏,可以使用以下命令:
sudo systemsetup -setnetworktimeserver "time.euro.apple.com" sudo systemsetup -setusingnetworktime on echo "restrict default ignore" >> /etc/ntp.conf
七、隐私
7.1 计算机名/主机名(重要)
建议平布主机名称,因为其中包含用户名和当前操作系统信息(MacBook → Mac OS)。因此,可以使用以下命令来更改通过网络显示的名称:
sudo scutil --set ComputerName ExampleName sudo scutil --set LocalHostName ExampleName
7.2 限制广告追踪(重要)
要限制设备的追踪,请禁用以下内容:
点击“系统偏好设置” – “安全和隐私” – “隐私” – “广告”(Advertising),选中“限制广告追踪”(Limit Ad Tracking)。
7.3 追踪服务(重要)
建议禁用追踪服务。如果用户决定使用追踪服务,则可以仅禁用Spotlight建议。
点击“系统偏好设置” – “安全和隐私” – “隐私” – “位置服务”(Location Services),选择“系统服务”(System Services) – 详细信息(Details),取消选中“Spotlight建议”(Spotlight Suggestions)。
附录:建议禁用的服务清单
下面列出了服务文件以及建议禁用的相应功能。如果没有特殊需要,不建议启用下面的服务。
com.apple.AppleFileServer.plist AFP ftp.plist FTP org.apache.httpd.plist HTTP Server epcc.plist Remote Apple Events com.apple.xgridagentd.plist Xgrid com.apple.xgridcontrollerd.plist Xgrid com.apple.InternetSharing.plist Iternet Sharing com.apple.dashboard.advisory.fetch.plist Dashboard Auto-Update com.apple.UserNotificationCenter.plist User notifications com.apple.RemoteDesktop.PrivilegeProxy.plist ARD com.apple.RemoteDesktop.plist ARD com.apple.IIDCAssistant.plist iSight com.apple.blued.plist Bluetooth com.apple.RemoteUI.plist Remote Control com.apple.gamed.plist Game Center