Joyber 发布的文章

ModSecurity原本是Apache上的一款开源WAF模块,可以有效的增强Web安全性。目前已经支持Nginx和IIS,配合Nginx的灵活和高效可以打造成生产级的WAF,是保护和审核Web安全的利器。

在这篇文章中,我们将学习配置ModSecurity与OWASP的核心规则集。

什么是ModSecurity
ModSecurity是一个入侵侦测与防护引擎,它主要是用于Web应用程序,所以也被称为Web应用程序防火墙(WAF)。它可以作为Web服务器的模块或是单独的应用程序来运作。ModSecurity的功能是增强Web Application 的安全性和保护Web application以避免遭受来自已知与未知的攻击。

ModSecurity计划是从2002年开始,后来由Breach Security Inc.收购,但Breach Security Inc.允诺ModSecurity仍旧为Open Source,并开放源代码给大家使用。最新版的ModSecurity开始支持核心规则集(Core Rule Set),CRS可用于定义旨在保护Web应用免受0day及其它安全攻击的规则。

ModSecurity还包含了其他一些特性,如并行文本匹配、Geo IP解析和信用卡号检测等,同时还支持内容注入、自动化的规则更新和脚本等内容。此外,它还提供了一个面向Lua语言的新的API,为开发者提供一个脚本平台以实现用于保护Web应用的复杂逻辑。

官网:https://www.modsecurity.org/

什么是OWASP CRS
OWASP是一个安全社区,开发和维护着一套免费的应用程序保护规则,这就是所谓OWASP的ModSecurity的核心规则集(即CRS)。ModSecurity之所以强大就在于OWASP提供的规则,我们可以根据自己的需求选择不同的规则,也可以通过ModSecurity手工创建安全过滤器、定义攻击并实现主动的安全输入验证。

ModSecurity核心规则集(CRS)提供以下类别的保护来防止攻击。

HTTP Protection(HTTP防御)
HTTP协议和本地定义使用的detectsviolations策略。

Real-time Blacklist Lookups(实时黑名单查询)
利用第三方IP名单。

HTTP Denial of Service Protections(HTTP的拒绝服务保护)
防御HTTP的洪水攻击和HTTP Dos攻击。

Common Web Attacks Protection(常见的Web攻击防护)
检测常见的Web应用程序的安全攻击。

Automation Detection(自动化检测)
检测机器人,爬虫,扫描仪和其他表面恶意活动。

Integration with AV Scanning for File Uploads(文件上传防病毒扫描)
检测通过Web应用程序上传的恶意文件。

Tracking Sensitive Data(跟踪敏感数据)
信用卡通道的使用,并阻止泄漏。

Trojan Protection(木马防护)
检测访问木马。

Identification of Application Defects(应用程序缺陷的鉴定)
检测应用程序的错误配置警报。

Error Detection and Hiding(错误检测和隐藏)
检测伪装服务器发送错误消息。

安装ModSecurity
软件基础环境准备
下载对应软件包

$ cd /root
$ wget 'http://nginx.org/download/nginx-1.9.2.tar.gz'
$ wget -O modsecurity-2.9.1.tar.gz https://github.com/SpiderLabs/ModSecurity/releases/download/v2.9.1/modsecurity-2.9.1.tar.gz

安装Nginx和ModSecurity依赖包
Centos/RHEL

$ yum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel zlib zlib-devel openssl openssl-devel

Ubuntu/Debian

$ apt-get install libreadline-dev libncurses5-dev libssl-dev perl make build-essential git  libpcre3 libpcre3-dev libtool autoconf apache2-dev libxml2 libxml2-dev libcurl4-openssl-dev g++ flex bison curl doxygen libyajl-dev libgeoip-dev dh-autoreconf libpcre++-dev

编译安装ModSecurity
Nginx加载ModSecurity模块有两种方式:一种是编译为Nginx静态模块,一种是通过ModSecurity-Nginx Connector加载动态模块。

方法一:编译为Nginx静态模块

编译为独立模块(modsecurity-2.9.1)

$ tar xzvf modsecurity-2.9.1.tar.gz
$ cd modsecurity-2.9.1/
$ ./autogen.sh
$ ./configure --enable-standalone-module --disable-mlogc
$ make

编译安装Nginx并添加ModSecurity模块

$ tar xzvf nginx-1.9.2.tar.gz
$ cd nginx-1.9.2
$ ./configure --add-module=/root/modsecurity-2.9.1/nginx/modsecurity/
$ make && make install

方法二:编译通过ModSecurity-Nginx Connector加载的动态模块

编译LibModSecurity(modsecurity-3.0)

$ cd /root
$ git clone https://github.com/SpiderLabs/ModSecurity
$ cd ModSecurity
$ git checkout -b v3/master origin/v3/master
$ sh build.sh
$ git submodule init
$ git submodule update
$ ./configure
$ make
$ make install

LibModSecurity会安装在/usr/local/modsecurity/lib目录下。

$ ls /usr/local/modsecurity/lib
libmodsecurity.a  libmodsecurity.la  libmodsecurity.so  libmodsecurity.so.3  libmodsecurity.so.3.0.0

编译安装Nginx并添加ModSecurity-Nginx Connector模块
使用ModSecurity-Nginx模块来连接LibModSecurity

$ cd /root
$ git clone https://github.com/SpiderLabs/ModSecurity-nginx.git modsecurity-nginx
$ tar xzvf nginx-1.9.2.tar.gz
$ cd nginx-1.9.2
$ ./configure --add-module=/root/modsecurity-nginx
$ make
$ make && make install

添加OWASP规则
ModSecurity倾向于过滤和阻止Web危险,之所以强大就在于规则。OWASP提供的规则是社区志愿者维护的被称为核心规则CRS,规则可靠强大,当然也可以自定义规则来满足各种需求。

下载OWASP规则并生成配置文件

$ git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
$ cp -rf owasp-modsecurity-crs  /usr/local/nginx/conf/
$ cd /usr/local/nginx/conf/owasp-modsecurity-crs
$ cp crs-setup.conf.example  crs-setup.conf

配置OWASP规则
编辑crs-setup.conf文件

$ sed -ie 's/SecDefaultAction "phase:1,log,auditlog,pass"/#SecDefaultAction "phase:1,log,auditlog,pass"/g' crs-setup.conf
$ sed -ie 's/SecDefaultAction "phase:2,log,auditlog,pass"/#SecDefaultAction "phase:2,log,auditlog,pass"/g' crs-setup.conf
$ sed -ie 's/#.*SecDefaultAction "phase:1,log,auditlog,deny,status:403"/SecDefaultAction "phase:1,log,auditlog,deny,status:403"/g' crs-setup.conf
$ sed -ie 's/# SecDefaultAction "phase:2,log,auditlog,deny,status:403"/SecDefaultAction "phase:2,log,auditlog,deny,status:403"/g' crs-setup.conf

默认ModSecurity不会阻挡恶意连接,只会记录在Log里。修改SecDefaultAction选项,默认开启阻挡。

启用ModSecurity模块和CRS规则
复制ModSecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到Nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。

modsecurity.conf-recommended是ModSecurity工作的主配置文件。默认情况下,它带有.recommended扩展名。要初始化ModSecurity,我们就要重命名此文件。

$ cd /root/modsecurity-2.9.1/
$ cp modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf  
$ cp unicode.mapping  /usr/local/nginx/conf/

将SecRuleEngine设置为On,默认值为DetectOnly即为观察模式,建议大家在安装时先默认使用这个模式,规则测试完成后在设置为On,避免出现对网站、服务器某些不可知的影响。

$ vim /usr/local/nginx/conf/modsecurity.conf

SecRuleEngine On
ModSecurity中几个常用配置说明:

1.SecRuleEngine:是否接受来自ModSecurity-CRS目录下的所有规则的安全规则引擎。因此,我们可以根据需求设置不同的规则。要设置不同的规则有以下几种。SecRuleEngine On:将在服务器上激活ModSecurity防火墙,它会检测并阻止该服务器上的任何恶意攻击。SecRuleEngine Detection Only:如果设置这个规则它只会检测到所有的攻击,并根据攻击产生错误,但它不会在服务器上阻止任何东西。SecRuleEngine Off:这将在服务器上上停用ModSecurity的防火墙。

2.SecRequestBodyAccess:它会告诉ModSecurity是否会检查请求,它起着非常重要的作用。它只有两个参数ON或OFF。

3.SecResponseBodyAccess:如果此参数设置为ON,然后ModeSecurity可以分析服务器响应,并做适当处理。它也有只有两个参数ON和Off,我们可以根据求要进行设置。

4.SecDataDir:定义ModSecurity的工作目录,该目录将作为ModSecurity的临时目录使用。

在owasp-modsecurity-crs/rules下有很多定义好的规则,将需要启用的规则用Include指令添加进来就可以了。

3.x版本CRS

$ cd /usr/local/nginx/conf/owasp-modsecurity-crs
# 生成例外排除请求的配置文件
$ cp rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
$ cp rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
$ cp rules/*.data /usr/local/nginx/conf

为了保持modsecurity.conf简洁,这里新建一个modsec_includes.conf文件,内容为需要启用的规则。

$ vim /usr/local/nginx/conf/modsec_includes.conf

include modsecurity.conf
include owasp-modsecurity-crs/crs-setup.conf
include owasp-modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
include owasp-modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf
Include owasp-modsecurity-crs/rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
include owasp-modsecurity-crs/rules/REQUEST-905-COMMON-EXCEPTIONS.conf
include owasp-modsecurity-crs/rules/REQUEST-910-IP-REPUTATION.conf
include owasp-modsecurity-crs/rules/REQUEST-911-METHOD-ENFORCEMENT.conf
include owasp-modsecurity-crs/rules/REQUEST-912-DOS-PROTECTION.conf
include owasp-modsecurity-crs/rules/REQUEST-913-SCANNER-DETECTION.conf
include owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf
include owasp-modsecurity-crs/rules/REQUEST-921-PROTOCOL-ATTACK.conf
include owasp-modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf
include owasp-modsecurity-crs/rules/REQUEST-931-APPLICATION-ATTACK-RFI.conf
include owasp-modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf
include owasp-modsecurity-crs/rules/REQUEST-933-APPLICATION-ATTACK-PHP.conf
include owasp-modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
include owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
include owasp-modsecurity-crs/rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf
include owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf
include owasp-modsecurity-crs/rules/RESPONSE-950-DATA-LEAKAGES.conf
include owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf
include owasp-modsecurity-crs/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf
include owasp-modsecurity-crs/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf
include owasp-modsecurity-crs/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf
include owasp-modsecurity-crs/rules/RESPONSE-959-BLOCKING-EVALUATION.conf
include owasp-modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf
include owasp-modsecurity-crs/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

注:考虑到可能对主机性能上的损耗,可以根据实际需求加入对应的漏洞的防护规则即可。

配置Nginx支持Modsecurity
启用Modsecurity
使用静态模块加载的配置方法
在需要启用Modsecurity的主机的location下面加入下面两行即可:

ModSecurityEnabled on;
ModSecurityConfig modsec_includes.conf;

修改Nginx配置文件,在需要启用Modsecurity的location开启Modsecurity。

$ vim /usr/local/nginx/conf/nginx.conf

server {
  listen       80;
  server_name  example.com;

  location / {
    ModSecurityEnabled on;
    ModSecurityConfig modsec_includes.conf;
    root   html;
    index  index.html index.htm;
  }
}

使用动态模块加载的配置方法
在需要启用Modsecurity的主机的location下面加入下面两行即可:

modsecurity on;
modsecurity_rules_file modsec_includes.conf;

修改Nginx配置文件,在需要启用Modsecurity的location开启Modsecurity。

$ vim /usr/local/nginx/conf/nginx.conf

server {
  listen  80;
  server_name localhost mike.hi-linux.com;
  access_log /var/log/nginx/yourdomain.log;

  location / {

  modsecurity on;
  modsecurity_rules_file modsec_includes.conf;
  root   html;
  index  index.html index.htm;
}
}

验证Nginx配置文件

$ /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

启动Nginx

$ /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

测试Modsecurity
ModSecurity现在已经成功配置了OWASP的规则。现在我们将测试对一些最常见的Web应用攻击。来测试ModSecurity是否挡住了攻击。这里我们启用了XSS和SQL注入的过滤规则,下面的例子中不正常的请求会直接返回403。

Brotli是一种开源的压缩算法,可以让数据在互联网上以更快的速度传输。

现代的网页通常包含了由大量的HTML, CSS和JavaScript代码编写的图片、视频或其他大型文件数据,导致了网页打开的速度很慢。如果能有一种好的压缩算法将这些内容和数据进行压缩后传输,那么用户只需要等待很短时间就可以完全加载整个页面上的内容。

2015年9月谷歌发布了Brotli压缩算法,直到现在才开始被大多数的浏览器所兼容。

现在最新的HTTP服务器程序Apache和nginx也支持了Brotli压缩算法,谷歌和一些商业公司也开始对Brotli提供支持服务。和谷歌的gzip解压缩格式比起来,Brotli能在此基础上将数据在压缩20~25%。它通过一本英语、西班牙语、汉语、印地语、俄语、阿拉伯语的常用字、词汇字典,结合机器语言,特别是HTML和JavaScript的常用术语,能够将数据比gzip, bzip2, LZMA等压缩算法的基础上进一步进行压缩,减少了数据内容的容量大小,使得网页在加载时速度更快。

Cloudflare公司的工程师们为了验证Brotli压缩算法比其他压缩算法更好,还特意做了实验来说明。还有http://Discouse.org的联合创始人Sam Saffron给各种压缩算法的文件压缩大小和压缩速度打分,事后证明Brotli不仅全面吊打其他压缩算法,还能支持HTTPS网络加密下的压缩。

有些网络服务运营商已经开始部署Brotli压缩服务,例如DreamHost公司在2016年12 月就发布了DreamPress插件,可以在使用nginx来TLS连接时,直接调用谷歌在Brotli内置的ngx模块来部署Brotli。

当然目前还有一些浏览器并不支持这种压缩算法,比如苹果的safari浏览器,微软也只有Edge浏览器才支持,老旧的IE并不支持,而且微软自家的web server套件IIS目前还没有免费的插件可以支持Brotli压缩,这就意味着使用IIS作为web server的网站也不无法支持Brotli压缩传输。

用户如果想要检查网站是否使用了Brotli压缩进行传输,可以在浏览器的页面解码的头部分,会看到br:

最早使用的是“bro”缩写,但是由于在美式英语中,这个缩写还有其他的含义,因此最后改为了“br”,这样还能节省字节。

虽然在日常使用中,普通的用户对Brotli压缩传输的内容不会有特别的感受,但只要是能加快网络数据内容的传输又有什么不好呢?

附录[1] – OpenCore 支持的内核驱动 (Kext) 及其用途
参考 https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/Kexts.md

GitHub 项目的下载地址位于 Release 下, 驱动具体支持的设备请进入项目地址查看

有线网卡
驱动及项目地址 备注
AppleRTL8169Ethernet Realtek RTL8169 官方驱动
AtherosE2200Ethernet.kext 高通 Atheros Killer E2200 系列驱动
AtherosL1cEthernet.kext 高通 Atheros AR813x/815x 驱动
IntelMausi.kext 英特尔有线网卡 Acidanthera 分支
IntelMausiEthernet.kext 英特尔有线网卡原作者
NullEthernetInjector.kext 仿冒内建网卡 (没有可用的内建网卡时使用)
RealtekR1000SL.kext Realtek 8111B/C/D/E/EP/F/G/GU/8411B 系列驱动
RealtekRTL8100.kext Realtek RTL810X 系列驱动
RealtekRTL8111.kext Realtek RTL8111/8168 系列驱动
Wi-Fi 和蓝牙
驱动及项目地址 备注
AirPortAtheros40.kext 高通 Atheros AR92xx/AR93xx 驱动, 仅用于 10.14+
AirportBrcmFixup.kext 非苹果官方博通网卡修复
ATH9KFixup.kext 高通 Atheros AR9xxx 无线网卡修复
BrcmPatchRAM.kext 博通网卡蓝牙固件上传
BT4LEContinuityFixup.kext IOBluetoothFamily 修补
MT7610 联发科 MT7610
RT5370 联发科 RT5370
RTL8192CU Realtek RTL8192CU 驱动 (链接为谷歌云盘)
键盘, 鼠标和触摸设备
驱动及项目地址 备注
ApplePS2SmartTouchPad.kext 触摸板和键盘
AsusSMC.kext 华硕 Fn 键, 键盘背光灯和环境光传感器 驱动
NoTouchID.kext 禁用 Touch ID 检测, 修复输密码时卡顿
SerialMouse.kext 使用 Microsoft 串行鼠标协议的串行鼠标驱动
VoodooI2C.kext I2C 触摸板/屏 驱动
VoodooPS2Controller.kext PS2 键盘/触摸板 驱动
显卡和声卡
驱动及项目地址 备注
AppleALC.kext 定制万能声卡驱动
NVIDIA CUDA drivers NVIDIA CUDA 驱动
NVIDIA Web-drivers NVIDIA 显卡驱动
SNBGraphicsMojaveInstaller 二代酷睿核显驱动, 仅用于 10.14+
VoodooHDA.kext 万能声卡驱动
WhateverGreen.kext 显卡补丁驱动
Polaris22Fixup.kext Polaris22/VegaM 显卡修复
CPU 和 SMC
驱动及项目地址 备注
CPUFriend.kext CPU 变频管理
FakeSMC.kext and sensors Clover 官方 FakeSMC
HWPEnabler.kext 启用 HWP
NullCPUPowerManagement.kext AMD 和虚拟机专用版本
OpcodeEmulator.kext Opcode 模拟驱动
TSCAdjustReset.kext TSC 频率同步驱动
VirtualSMC.kext 及传感器 Acidanthera 的 SMC 和传感器驱动
VoodooTSCSync.kext TSC 频率同步驱动
USB 和 其它接口
驱动及项目地址 备注
IOElectrify.kext 在雷电 3 设备上启用常开电源
USBWakeFixup.kext 修复 Skylake 平台 USB 唤醒黑屏
SASMegaRAID.kext LSI MegaRAID SAS 系列 RAID 控制器驱动
Sinetek-rtsx.kext Realtek RTSX SDHC 读卡器驱动
VoodooSDHC.kext SDHC 读卡器驱动
其它驱动
驱动及项目地址 备注
AppleIntelInfo.kext CPU / 核显 变频测试
HibernationFixup.kext 修复因 RTC 变量和 NVRAM 造成的睡眠问题
Lilu.kext SDK & Library
LiluFriend.kext 用于确保 Lilu 在 L/E 下正常加载
RTCMemoryFixup.kext 修复 BIOS CMOS (RTC) 内存和 AppleRTC 之间的冲突问题
NightShiftUnlocker.kext 解锁 NightShift
WebCamera.kext 某些旧设备的摄像头驱动
附录[2] – UEFI 驱动 (.efi) 及其用途
OpenCore 支持的 UEFI 驱动
ApfsDriverLoader
APFS 文件系统引导驱动
AudioDxe
OpenCore 用于在 UEFI 环境播放音频的驱动
CrScreenshotDxe
增加 OpenCore UI 内截屏功能, 快捷键为 LCtrl + LAlt + F12 ( 左Ctrl + 左Alt + F12)
FwRuntimeServices
通过支持只读和只写 NVRAM 变量来提高 OpenCore 和 Lilu 的安全性。有些设置项, 例如 RequestBootVarRouting, 需要此驱动程序才能正常运行
HFSPlus
苹果自带的闭源 HFS 驱动, 不具有 Bless 和其它功能, 但是启动速度比它的等效驱动 VBoxHfs 快 3 倍
HiiDatabase.efi
用于给 Ivy Bridge (3 代酷睿) 或更老代主板上支持 UEFI 字体渲染, UEFI Shell 中文字渲染异常时使用, 新主板不需要
NvmExpressDxe
从 Broadwell 开始的大多数固件中都包含此驱动程序。对于 Haswell 及更早的固件, 如果安装了 NVMe SSD 就需要使用
MemoryAllocation.efi
为 Z390/X99 等主板预留第一组 512MB 内存, 帮助引导工具注入内核以及内核缓存至第一组 512MB 内存, 需要配合 FwRuntimeServices 和引导标识符 slide=1
AppleUsbKbDxe
添加了对 AppleKeyMapAggregator 协议支持的 USB 键盘驱动, 这是 AppleGenericInput 的等效驱动, 根据固件的不同, 实际效果会更好或更坏
VariableRuntimeDxe
EDK II 的 NVRAM 驱动, OpenCore 中用于模拟 NVRAM, 需要配合 FwRuntimeServices(.efi) 和 DisableVariableWrite(Quirk)
VBoxHfs
具有 bless 支持的 HFS 文件系统驱动程序。该驱动程序可以等效替代 Apple 固件中常见的闭源 HFSPlus 驱动。此驱动虽然功能更加完善, 但启动速度相比大约慢 3 倍,并且尚未经过安全审核
XhciDxe
来自 MdeModulePkg 的 XHCI USB 控制器支持驱动程序。从 Sandy Bridge 开始的大多数固件中都包含此驱动程序。在较旧的固件上可以用于支持 USB 3.0 PCI 卡
部分网上无法找到的 UEFI 驱动可以在这里下载

Download

OpenCore 不兼容的 UEFI 驱动
AppleGenericInput
添加了对 AppleKeyMapAggregator 协议支持的用户输入驱动。此外, 还解决了某些固件上的鼠标输入问题, 这是 AppleUsbKbDxe 的等效驱动, 根据固件的不同, 实际效果会更好或更坏
已合并入 OpenCore
AppleImageCodec
为 Clover 启动 FileVault 2 解码 PNG 和 BMP, OpenCore 已集成
AppleKeyAggregator
为 Clover 支持 FileVault 2 启动 UI 的驱动, OpenCore 已集成
AppleKeyFeeder
为 Clover 支持 FileVault 2 内 PS/2 键盘输入的驱动, OpenCore 已集成
AppleUITheme
为 Clover 支持 FileVault 2 启动 UI 主题的驱动, OpenCore 已集成
AptioInputFix & AppleGenericInput
用于解决 UEFI 固件输入问题的驱动, 已与 OpenCore 合并
AptioMemoryFix
NVRAM 和内存驱动, 用于修复 UEFI 固件上的内存问题, 已与 OpenCore 合并为 FwRuntimeServices
CsmVideoDxe
用于 Clover GUI 的显卡驱动, 允许使用更多分辨率, 基于 UEFI BIOS 中的 CSM 兼容模块, 并将启用所需的 CSM, OpenCore 不兼容
DataHubDxe
macOS 必需的 DataHub 协议, OpenCore 自带且提供了这个 Quirk
EmuVariableUefi
Clover 的模拟 NVRAM 驱动, OpenCore 不兼容, 替代品为 VariableRuntimeDxe
EnglishDxe
在 UEFI Shell 中支持 UnicodeCollation 协议, OpenCore 自带且提供了这个 Quirk
EnhancedFatDxe
这个驱动已存在于所有 UEFI 固件中, 无法从 OpenCore 直接使用。由于很多固件的 FAT 支持都有问题, 导致在尝试写入时会损坏文件系统。如果在引导过程中写入 EFI 分区出现问题, 则需要将此驱动用 UEFITool 刷入固件中
FirmwareVolume
为 Clover 启动 FileVault 2 创建 FirmwareVolume 光标的驱动, OpenCore 已集成
FSInject
Clover 用于注入内核驱动 (Kext) 的驱动, OpenCore 自带且使用更先进的方法
HashServiceFix
修复 UEFI BIOS 中的哈希支持, OpenCore 自带且提供了这个 Quirk
OsxAptioFixDrv
旧的 Clover NVRAM 和内存驱动, 用于修复 UEFI 固件上的内存问题, 与 FwRuntimeServices 和 OpenCore 不兼容
OSXAptioFix2Drv-Free2000.efi
Clover 的内存驱动, 用于修复 UEFI 固件上的内存问题, 作者已经声明会损坏硬件
OsxAptioFix3Drv
Clover NVRAM 和内存驱动, 用于修复 UEFI 固件上的内存问题, 与 FwRuntimeServices 和 OpenCore 不兼容
OsxFatBinaryDrv
Clover 用于支持 OS X 10.9 和更早版本的 FAT Binary 可执行文件的驱动, 与 FwRuntimeServices 和 OpenCore 不兼容
OsxLowMemFixDrv
精简版的 OsxAptioFixDrv, 用于修复 UEFI 固件上的内存问题, 与 FwRuntimeServices 和 OpenCore 不兼容
PartitionDxe
用于支持非常规分区图的驱动, 如: 混合 GPT/MBR 或 Apple 分区图, OpenCore 兼容性未知
Ps2MouseDxe
PS/2 鼠标驱动, 这个驱动已存在于所有 UEFI 固件中
SMCHelper
UEFI 层面的 SMC 驱动, 用于与 FakeSMC 配合。与 OpenCore 不兼容
VirtualSmc
UEFI 层面的 SMC 驱动, 已与 OpenCore 合并
其它未在本文中提到的 UEFI 驱动一律不兼容
附录[3] – 常用内核引导标识符合集
引导标识符 作用
-amd_no_dgpu_accel 关闭 AMD 显卡硬件加速
cpus=# 启用 # 个 CPU 核心
darkwake=0 禁用 Power Nap
dart=0 禁用 VT-d
debug=0x100 发生 KP 时不自动重启
keepsyms=1 发生 KP 时保留 Debug Symbols, 用于给开发者反馈问题
kext-dev-mode=1 启用 Kext 开发模式, 非开发者请勿使用
-no_compat_check 关闭兼容性检查
npci=0x2000 在旧设备上禁用 kIOPCIConfiguratorPFM64
nvda_drv=1 启用 N 卡驱动的老方法, 在 10.12 及以后失效
nv_disable=1 关闭 N 卡硬件加速
-s 单用户模式
slide=# 手动设置 KASLR slide 值为 #
-v verbose 跑码模式
-x 安全模式
内核驱动提供的引导标识符请去对应驱动的 Readme 查看

https://blog.csdn.net/m_nanle_xiaobudiu/article/details/105649294

推荐使用的是docker方式,运营lnmp容器来实现快速搭建
镜像名称:haveyb/lnmp

主要命令摘要:

cd ~
cd .docker
vi daemon.json
 
#将文件内容替换为下面内容
 
{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
 


docker pull haveyb/lnmp

docker run -itd --name lnmp --privileged -p 6379:6379 -p 80:80 -p 3307:3306 -v /Users/SH-Server:/data haveyb/lnmp /usr/sbin/init


docker exec -it lnmp bash

#exit回到MAC系统中,添加域名绑定到本机
sudo vi /etc/hosts

# 先从mac进入容器内部
docker exec -it lnmp bash

#然后到 /usr/local/nginx/cond.d 目录下创建一个名为 ttt.haveyb.com.conf 的文件,内容如下:
    server {
           listen       80;
           server_name  ttt.haveyb.com;
       
           client_max_body_size 128M;
       
           charset utf-8;
           error_log    /usr/local/nginx/logs/error/ttt.haveyb.com.log error;
           access_log  /usr/local/nginx/logs/access/ttt.haveyb.com.log main;
     
           root   /data/ttt;
           index  index.html index.htm index.php;
       
           location / {
               try_files $uri $uri/ /index.php?$query_string;
           }
       
           location ~ ^/assets/.*\.php$ {
               deny all;
           }
       
           location /favicon.ico {
               log_not_found off;
               access_log off;
           }
       
           error_page  404 403 500 502 503 504  /404.html;
       
           location = /404.html {
               root   /data/errorPage;
            }
        
            location ~ \.php$ {
                fastcgi_pass   unix:/dev/shm/php-cgi.sock;
                fastcgi_index  index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
            }
        
            location ~ /\.ht {
                deny  all;
            }
                
        }
 
#编写测试文件,到定义的网站目录下编写一个测试的PHP文件,这里就是上面指定的 /data/ttt 目录

cd /data
mkdir ttt
vi index.php
 
<?php
phpinfo();

程序管理(在docker 容器中操作)

systemctl status/start/stop/restart/reload nginx
 
# 站点的配置文件放在 /usr/local/nginx/conf.d 目录下

systemctl status/start/stop/restart/reload php-fpm
 
# php.ini 文件位于/usr/local/php/etc/php.ini
 
# phpize全局可用

systemctl status/start/stop/restart/reload mysql
 
# MySQL 数据文件、慢查询日志、错误日志位于 /usr/local/mysql/data 目录下
 
# 配置文件位于 /etc/my.cnf  可以通过设置mysql错误日志级别 log_error_verbosity 来减少mysql错误日志的记录,默认是都记录,建议添加 log_error_verbosity = 1,即只记录error
 
# 初始密码:123456

systemctl status/start/stop/restart/reload redis
 
# conf 配置文件位于 /etc/redis.conf,哨兵sentinel配置文件位于 /etc/redis-sentinel.conf
 
# 初始密码:haveyb


systemctl status/start/stop/restart/reload memcached 

四、Docker 使用过程中可能遇到的问题及解决方案
1、Docker创建容器后并映射端口号后,navicat 远程连接mysql

2、Docker中使用git clone 报错 Could not resolve host: github.com; Unknown error

3、进入容器后,没有clear指令

yum install ncurses

使用 mac 开发过程中,建议使用的软件
1、开发idea 还是使用 PHPStorm
2、连接本地、远程SSH 使用 Termius
3、虚拟机:vmware fusion,只放一些MAC中无法被代替的,否则就没必要了吧
4、连接数据库:navicat Premium
5、接口测试 postman