Nginx与SpringBoot TLS安全加固实战:从等保测评失败到A+评级
1. 项目概述:从一次等保测评失败说起
最近在帮一个金融项目做等保测评(网络安全等级保护测评)的预检,结果在应用安全层面栽了个跟头。扫描报告里赫然列着一条“TLS/SSL协议密钥强度不足”的高危漏洞。这问题说大不大,说小不小,说它大,是因为它直接关系到数据传输的机密性,是等保测评里的必查项;说它小,是因为修复思路很明确——换用更强的加密套件和密钥。但麻烦就麻烦在,我们的系统架构是典型的前后端分离:前端静态资源和API网关用的是Nginx,后端业务服务则是基于SpringBoot构建的。这两个组件的TLS配置方式、参数语法乃至背后的原理机制都有所不同,不能一概而论。
很多文章要么只讲Nginx的ssl_ciphers配置,要么只提SpringBoot的server.ssl属性,但当你真正面临一个需要统一修复的混合架构时,就会发现“知其然”还不够,必须“知其所以然”。为什么Nginx里禁用某个算法要在密码套件字符串里用!号,而SpringBoot里可能是在jdk.tls.disabledAlgorithms里做文章?为什么同样的ECDHE_RSA算法,在Nginx和Java环境下的表现和性能开销可能不一样?这次实战,我就把踩过的坑、验证过的方案和背后的逻辑,做一个完整的对比梳理。无论你是运维、开发还是安全工程师,在面对等保测评或日常安全加固时,这份对比指南应该能帮你少走弯路。
2. 核心需求解析:等保测评对TLS提出了什么要求?
在动手改配置之前,我们得先搞清楚“敌人”是谁。等保测评(尤其是等保2.0)对传输加密的要求,主要依据《GB/T 22239-2019 信息安全技术 网络安全等级保护基本要求》。对于三级系统,在“安全通信网络”和“安全计算环境”中,都对通信保密性提出了明确要求。
2.1 漏洞扫描器到底在报什么警?
市面上主流的漏洞扫描器或等保测评工具(如绿盟、启明、安恒等),检测TLS密钥强度时,核心逻辑是模拟客户端与你的服务端进行TLS握手。它们会尝试使用一系列已知的、被业界认为不安全或强度不足的加密算法、密钥交换协议或哈希算法来发起连接。如果你的服务器接受了其中任何一种,扫描器就会判定存在风险。
具体到我们遇到的“密钥强度不足”,通常指向以下几类问题:
- 使用了弱加密算法:例如RC4、DES、3DES(在某些场景下)、NULL算法等。这些算法或已被证明存在严重漏洞(如RC4),或密钥长度太短易被暴力破解(如DES)。
- 密钥交换协议不安全:例如使用静态RSA密钥交换(不具备前向安全性),或者使用了已被弃用的DHE算法且参数长度不足(如DHE密钥长度小于2048位)。
- 哈希算法强度不足:例如在签名或消息认证码(MAC)中使用了MD5或SHA-1。这些哈希算法已发生碰撞,不再安全。
- 支持了低版本的TLS协议:如仅支持TLS 1.0或TLS 1.1。这些旧协议存在已知缺陷(如POODLE、BEAST攻击),等保2.0通常要求至少支持TLS 1.2。
注意:这里有个常见的理解误区。很多人以为“密钥强度”仅仅指证书里RSA密钥的长度(比如2048位还是4096位)。实际上,在TLS语境下,它指的是整个加密套件(Cipher Suite)的强度,这是一个由密钥交换算法、身份验证算法、对称加密算法、消息认证码算法四部分组成的组合。扫描器报警,往往是针对这个组合中的某个或某几个薄弱环节。
2.2 我们的修复目标是什么?
基于以上分析,我们的修复方案必须达成以下几个核心目标:
- 禁用不安全的协议:明确禁用SSLv2、SSLv3、TLS 1.0、TLS 1.1。理想情况下,应仅启用TLS 1.2和TLS 1.3。TLS 1.3由于简化了握手流程并禁用了大量不安全的算法,安全性更高,应优先支持。
- 选用强加密套件:制定一个安全的加密套件列表,优先使用具备前向安全性(Forward Secrecy, FS)的密钥交换算法(如ECDHE),使用强对称加密算法(如AES-GCM、CHACHA20_POLY1305),并使用安全的哈希算法(如SHA256、SHA384)。
- 合理排序加密套件:在TLS握手时,客户端会提供它支持的加密套件列表,服务器会从中选择一个。服务器的选择逻辑通常是按照其配置的套件列表顺序,选择第一个双方都支持的。因此,我们必须将最安全、性能最优的套件放在列表最前面。
- 确保兼容性:在追求安全的同时,不能“一刀切”导致合法的老旧客户端(如某些特定版本的浏览器或SDK)无法连接。需要在安全与兼容性之间取得平衡,通常的做法是提供一个“安全”配置和一个“兼容”配置,根据实际业务客户端情况选择。
明确了目标,接下来我们就分别深入Nginx和SpringBoot的“战场”,看看具体怎么打这场仗。
3. Nginx的TLS安全加固实战
Nginx作为高性能的Web服务器和反向代理,其TLS配置集中在nginx.conf文件中的server块内,通过ssl_protocols和ssl_ciphers两个核心指令控制。
3.1 基础安全配置模板
首先,给出一个经过等保测评验证的、高安全性的Nginx TLS配置模板:
server { listen 443 ssl http2; server_name your.domain.com; # 1. 证书配置 ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/privkey.pem; # 2. 协议配置:禁用旧协议,启用TLS 1.2/1.3 ssl_protocols TLSv1.2 TLSv1.3; # 3. 加密套件配置(TLS 1.2及以下) ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # 4. 优先使用服务器端定义的套件顺序 ssl_prefer_server_ciphers on; # 5. 会话复用与票据,提升性能 ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # 如果启用,需确保票证密钥安全轮转 # 6. 安全增强参数 ssl_dhparam /etc/nginx/ssl/dhparam.pem; # 自定义DH参数,增强DHE强度 ssl_ecdh_curve secp384r1; # 指定ECDHE使用的椭圆曲线,secp384r1强度高于secp256r1 ssl_stapling on; # 开启OCSP装订,加快证书验证并提升隐私 ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # 7. HSTS头,强制客户端使用HTTPS(谨慎使用) add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # ... 其他location等配置 }3.2 关键配置逐行解读与避坑指南
关于ssl_ciphers字符串:这是配置中最复杂也最容易出错的部分。上面的字符串是一个“安全优先”的配置。
ECDHE-ECDSA-AES128-GCM-SHA256:这是目前推荐的首选套件。它使用ECDHE进行密钥交换(前向安全),使用ECDSA证书进行身份验证(比RSA验证更快),使用AES-128-GCM进行对称加密(支持硬件加速且安全),使用SHA256作为哈希算法。:是分隔符,列表从左到右是服务器的优先级顺序。- 为什么没有AES256?AES128-GCM在目前看来安全性已足够,且比AES256-GCM性能稍好。列表中包含了AES256的选项以供选择。
DHE-RSA-AES...放在最后:DHE算法计算开销远大于ECDHE,且需要生成强大的DH参数文件(ssl_dhparam),因此作为兼容性备选放在末尾。- 如何禁用算法?在套件字符串前加上
!,例如ssl_ciphers '!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA:HIGH:@STRENGTH';这是一种“黑名单”方式,先禁用一堆不安全的,然后从剩下的(HIGH)中按强度选择。但我更推荐上面那种“白名单”方式,明确指定允许的套件,更清晰、更安全。
实操心得:
ssl_dhparam的生成如果你的套件列表中包含了DHE,那么ssl_dhparam指令必须配置,且参数长度至少为2048位,等保测评推荐4096位。生成命令:openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096。这个过程非常消耗CPU,在虚拟机或容器中可能需要数分钟甚至更久,建议在性能较好的机器上生成后拷贝进去。不配置ssl_dhparam而使用DHE套件,Nginx会使用内置的1024位弱参数,这本身就是一个高危漏洞!
关于ssl_ecdh_curve:指定用于ECDHE密钥交换的椭圆曲线。secp384r1比通用的secp256r1(即P-256)提供更高的理论安全强度,但计算开销也稍大。对于绝大多数应用,secp256r1已完全足够且性能更优。选择secp384r1是为了应对更长远的安全需求或满足某些极端严格的安全审计。
关于ssl_session_tickets:会话票证是一种无状态的会话复用机制,能显著提升重连性能。但票证加密的密钥如果泄露,会导致历史会话被解密。在分布式部署中,需要确保所有Nginx实例共享相同的票证密钥,否则会话复用会失效。对于安全性要求极高的场景,可以关闭(off)或定期轮转密钥。关闭后,依赖ssl_session_cache进行有状态的会话复用。
3.3 配置验证与测试方法
改完配置,千万别急着重启上线。一定要验证。
- 语法检查:
nginx -t - 在线工具扫描:使用如 SSL Labs SSL Test 这样的免费服务,输入你的域名,它会给出详尽的评分和报告,明确指出协议、套件强度等问题。目标是拿到A或A+评级。
- 命令行工具测试:
- 测试支持的协议:
openssl s_client -connect your.domain.com:443 -tls1_2(测试TLS 1.2)-tls1_3(测试TLS 1.3)。 - 测试支持的加密套件:可以使用
nmap脚本:nmap --script ssl-enum-ciphers -p 443 your.domain.com。这个脚本会列出所有支持的套件并评估其强度。
- 测试支持的协议:
4. SpringBoot应用的TLS安全加固实战
SpringBoot应用的TLS配置有两层:一层是SpringBoot内置的Web服务器(默认是Tomcat)的SSL配置;另一层是Java运行环境(JRE/JDK)本身的TLS安全策略。等保测评往往需要两者配合调整。
4.1 通过application.yml配置Tomcat
这是最直接的方式,控制的是SpringBoot内嵌Tomcat服务器的行为。
server: port: 8443 ssl: enabled: true key-store: classpath:keystore.jks # 或 .p12 文件 key-store-password: your-keystore-pass key-store-type: JKS # 或 PKCS12 key-alias: your-alias protocol: TLS # 使用最高支持的TLS版本 enabled-protocols: TLSv1.2,TLSv1.3 # 显式启用协议 ciphers: >- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384注意:这里的ciphers列表名称与Nginx的OpenSSL风格名称不同,使用的是IANA标准名称。TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256对应 Nginx 的ECDHE-RSA-AES128-GCM-SHA256。
4.2 配置Java安全策略(java.security)
这是解决“密钥强度不足”问题的关键和难点。即使Tomcat配置了强套件,如果JVM的默认安全策略允许弱算法,连接仍然可能被建立。策略文件位于$JAVA_HOME/conf/security/java.security。
我们需要修改jdk.tls.disabledAlgorithms和jdk.certpath.disabledAlgorithms这两个属性。
# 禁用不安全的TLS相关算法 jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, \ RSA keySize < 2048, DHE keySize < 2048, \ TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, \ TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, \ TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, \ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, \ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, \ TLS_EMPTY_RENEGOTIATION_INFO_SCSV, 3DES_EDE_CBC # 禁用证书路径验证中的弱算法 jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \ RSA keySize < 2048, DSA keySize < 2048, EC keySize < 224重要提示:直接修改JRE全局的
java.security文件会影响所有运行在该JRE上的应用,风险较高。推荐的做法是:在启动SpringBoot应用时,通过JVM参数覆盖这些设置:java -Djdk.tls.disabledAlgorithms="SSLv3, TLSv1, TLSv1.1, RC4, DES, ..." \ -Djdk.certpath.disabledAlgorithms="MD2, MD5, SHA1 jdkCA & usage TLSServer, ..." \ -jar your-springboot-app.jar或者,对于容器化部署,可以在Dockerfile的
JAVA_OPTS环境变量中设置。
4.3 使用WebServerFactoryCustomizer进行编程式配置
对于更灵活、更动态的配置,可以实现WebServerFactoryCustomizer接口,这在需要根据环境变量或配置中心动态调整TLS设置时非常有用。
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import java.io.InputStream; import java.security.KeyStore; @Component public class TomcatTlsCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { factory.addConnectorCustomizers(connector -> { connector.setPort(8443); connector.setSecure(true); connector.setScheme("https"); AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol<?>) connector.getProtocolHandler(); protocol.setSSLEnabled(true); // 设置协议版本 protocol.setSslEnabledProtocols("TLSv1.2,TLSv1.3"); // 设置加密套件(与application.yml中类似,但用数组) protocol.setCiphers("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256," + "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256," + "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384," + "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"); // 其他属性,如keystore配置,可以从环境读取 protocol.setKeystoreFile("path/to/keystore.jks"); protocol.setKeystorePass("password"); protocol.setKeyAlias("alias"); }); } }5. Nginx与SpringBoot方案对比与选型建议
通过上面的详细拆解,我们可以从几个维度对两者进行对比:
| 对比维度 | Nginx | SpringBoot (内嵌Tomcat) |
|---|---|---|
| 配置位置 | 集中,在nginx.conf中。 | 分散,涉及application.yml、JVM参数、java.security文件。 |
| 配置语法 | OpenSSL风格密码套件字符串,相对紧凑灵活。 | IANA标准密码套件名称,以逗号分隔的列表。更规范,但需注意与OpenSSL名称的映射。 |
| 核心控制点 | ssl_protocols,ssl_ciphers,ssl_dhparam,ssl_ecdh_curve。 | Tomcat的server.ssl.ciphers和enabled-protocols;JVM的jdk.tls.disabledAlgorithms。 |
| 性能影响 | Nginx以高性能著称,其SSL/TLS处理经过高度优化,支持会话复用、OCSP装订等,对性能影响相对较小。 | Java的TLS实现(通常是SunJSSE)同样成熟,但GC和JVM本身的开销可能比Nginx的C语言实现稍大。在大量短连接场景下,会话复用的配置至关重要。 |
| 前向安全性(FS) | 通过配置ECDHE或DHE套件实现。需注意DHE需自定义ssl_dhparam。 | 同样通过配置ECDHE或DHE套件实现。需确保JVM未禁用相关算法(如未在disabledAlgorithms中限制DHE密钥长度)。 |
| 动态调整 | 修改配置后需nginx -s reload,可实现不停机更新。 | 修改application.yml或JVM参数通常需要重启应用。编程式配置(Customizer)可结合外部配置实现一定动态性。 |
| 运维复杂度 | 较低。配置集中,测试工具丰富(如openssl s_client,ssllabs)。 | 较高。需要同时关注应用配置和JVM安全策略,问题排查可能涉及Java层和网络层。 |
| 适用场景 | 作为入口网关、反向代理、静态资源服务器,处理外部HTTPS流量。 | 作为业务应用服务器,处理来自网关或内部服务的HTTPS/HTTP流量。 |
选型与协作建议:
“边缘TLS终结”模式(推荐):这是目前最主流的架构。让Nginx(或专业的负载均衡器/API网关如F5, AWS ALB)在边缘负责TLS解密。Nginx配置强TLS策略,对外提供高安全性的HTTPS服务。然后,Nginx以HTTP或内部HTTPS(配置可稍宽松)将请求反向代理到后端的SpringBoot应用。这样做的好处是:
- 安全集中:TLS安全策略只需在Nginx一层统一管理和加固,复杂度降低。
- 性能优化:Nginx擅长处理SSL/TLS卸载,可以释放后端SpringBoot应用的计算资源,让其专注于业务逻辑。
- 灵活性:后端服务可以灵活伸缩、升级,无需关心证书和TLS协议的细节。
端到端TLS模式:在某些对内部通信安全要求也极高的场景(如金融、政务内网),可以在Nginx到SpringBoot之间也使用HTTPS。此时,需要两份证书(外部和内部),且SpringBoot也需要进行上述安全配置。这种模式运维复杂度翻倍,但提供了更强的内部链路安全保障。
我个人在实际项目中的选择是边缘终结模式。Nginx使用最严格的TLS 1.2/1.3和强密码套件配置,并通过了SSL Labs的A+评级。SpringBoot应用则关闭SSL,监听HTTP端口,由Nginx通过本地环回地址(127.0.0.1)或内部网络进行HTTP代理。这样,SpringBoot的配置简化了,等保测评的压力全部由Nginx承担,问题定位也更快。
6. 常见问题排查与修复实录
在实际操作中,你肯定会遇到各种“坑”。下面是我总结的几个典型问题及其解决方法。
6.1 问题一:配置后,某些客户端(如旧版APP、特定浏览器)无法连接。
排查思路:
- 检查协议支持:确认客户端是否只支持TLS 1.0或1.1。如果你的配置只启用了TLS 1.2+,旧客户端自然会失败。使用
openssl s_client -connect your.domain:443 -tls1等命令测试。 - 检查加密套件兼容性:你的安全套件列表可能完全拒绝了客户端支持的所有套件。例如,你只配置了
ECDHE套件,但客户端只支持RSA密钥交换。
解决方案:
- 制定兼容性配置:在安全与兼容间权衡。可以在Nginx配置中,在强套件列表后追加一些广泛支持但相对安全的套件,例如:
这个配置优先使用前向安全的现代套件,但也兼容一些较老的DHE套件,并禁用最不安全的算法。ssl_ciphers 'ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:!aNULL:!MD5:!DSS'; - 分而治之:如果可能,为老旧客户端提供独立的访问入口(如一个子域名),该入口使用兼容性配置。主流客户端则使用高安全配置的主入口。
6.2 问题二:SpringBoot应用启动报错,提示“No appropriate protocol”或“SSLHandshakeException”。
排查思路:
- 检查JVM安全策略:这是最常见的原因。你通过
application.yml启用了TLS 1.2,但JVM的jdk.tls.disabledAlgorithms可能因为版本问题默认禁用了某些必要的算法(比如在旧JDK 8早期版本中,可能对TLS_ECDHE_*套件支持不完整)。 - 检查证书和密钥库:确保证书是有效的,密钥库格式(JKS/PKCS12)正确,密码无误,并且密钥别名存在。
解决方案:
- 升级JDK:确保使用较新的JDK版本(如JDK 8u161+, JDK 11+),这些版本有更现代和安全的默认TLS配置。
- 显式指定JVM参数:在启动命令中,除了设置
disabledAlgorithms,还可以显式指定启用的协议和套件(尽管不常用):-Dhttps.protocols=TLSv1.2,TLSv1.3 -Djdk.tls.client.protocols=TLSv1.2,TLSv1.3 - 使用
SSLContext进行调试:编写一个简单的测试程序,打印出当前JVM环境支持的所有SSLContext协议和密码套件,与你的配置进行对比。
6.3 问题三:使用DHE套件时,Nginx错误日志中出现“dh key too small”或性能极差。
排查原因:
- 未配置或错误配置
ssl_dhparam:这是根本原因。Nginx使用了弱DH参数。 - DH参数强度过高:你生成了4096位甚至8192位的DH参数,导致每次DHE握手时服务器端计算量巨大,CPU飙升,连接建立缓慢。
解决方案:
- 必须生成并指定自定义DH参数文件:
openssl dhparam -out dhparam.pem 2048(等保测评通常要求2048位即可,4096位更安全但性能损耗大)。 - 性能权衡:如果性能敏感,优先考虑使用
ECDHE套件,完全避免DHE。ECDHE在相同安全强度下,计算速度比DHE快一个数量级以上。将DHE套件从ssl_ciphers列表的优先位置移除或直接删除。
6.4 问题四:如何验证修复是否真的生效?
不要只看配置文件和日志,要用工具说话。
- SSL Labs测试:拿到A或A+评级是最直观的证明。报告会详细列出支持的协议、套件及其强度。
- Nmap脚本深度扫描:
nmap --script ssl-enum-ciphers -p 443 your.domain.com输出非常详细,可以看到每个套件的强度评级(A, B, C, D, F)。 - TestSSL.sh:这是一个功能强大的命令行工具,比nmap更专业。
./testssl.sh your.domain.com它会进行数百项测试,包括心脏出血、POODLE、ROBOT等各种漏洞,并给出非常清晰的报告。 - 内部验证脚本:可以写一个简单的Python脚本,使用
ssl模块尝试用弱协议(如TLSv1.0)或弱套件去连接你的服务,确认连接会被拒绝。
import socket import ssl def test_tls(hostname, port, tls_version): context = ssl.SSLContext(protocol=tls_version) context.set_ciphers('RC4') # 尝试使用弱密码套件 try: with socket.create_connection((hostname, port)) as sock: with context.wrap_socket(sock, server_hostname=hostname) as ssock: print(f"连接成功!使用的协议: {ssock.version()}, 套件: {ssock.cipher()}") return True except ssl.SSLError as e: print(f"连接被拒绝 (符合预期): {e}") return False except Exception as e: print(f"其他错误: {e}") return False # 测试弱协议应失败 test_tls("your.domain.com", 443, ssl.PROTOCOL_TLSv1) # 测试强协议应成功 test_tls("your.domain.com", 443, ssl.PROTOCOL_TLSv1_2)修复TLS配置不是一劳永逸的事情。密码学在不断发展,新的漏洞也会被发现(如2022年的“Return of Bleichenbacher’s Oracle Threat - ROBOT”漏洞就影响了某些RSA密钥交换的实现)。因此,定期(如每半年或一年)复查你的TLS配置,关注业界最佳实践(如Mozilla的SSL配置生成器),并使用工具重新扫描验证,是维持系统长期安全性的必要习惯。等保测评也不只是一次性的考试,而是督促我们建立持续安全运维机制的过程。