
等保三级测评里Redis 绝对算得上重灾区之一。我做了几年安全测评和加固项目见过太多业务系统第一版部署的 Redis 就是裸奔状态——默认 6379 端口开在公网、requirepass 没设、bind 还是 0.0.0.0日志也基本是启动信息。等保三级对 Redis 的安全测评本质上不是让你死记硬背测评要求而是把身份鉴别、访问控制、安全审计、数据安全这几条主线真正落到一份能持续执行的运维规范里。这篇文章我把评审现场怎么查、查完怎么改、改了之后有哪些坑从头到尾完整捋一遍准备测评的同事和正在做等保整改的运维同学可以参考参考。1. 等保三级 Redis 测评的基本逻辑1.1 测评依据与测评对象怎么定Redis 等保测评的硬依据主要是 GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》里的安全计算环境部分以及 GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》。如果项目走的是等保三级那就按三级系统的通用安全要求来计算环境测评项。测评对象怎么定很关键。如果 Redis 是部署在业务服务器上的本地缓存那 Redis 实例通常跟随该服务器作为一个整体对象测评如果 Redis 是做成了独立的缓存集群或者中间件平台就会被单独列为测评对象。这个定位决定了后续访谈谁、查哪些服务器、整改范围有多大所以测评前一天先把架构图和数据流捋清楚比闷头看配置重要得多。测评的方式基本是访谈配置检查工具验证三件套。访谈主要是问管理员密码策略、备份策略、审计日志怎么管配置检查就是登录进服务器查 redis.conf、查进程启动参数、查日志目录工具验证包括 redis-cli 执行只读命令、nmap 扫端口、tcpdump 抓包看是否明文传输。这三部分组合起来才能给出一个相对客观的符合性结论。1.2 等保三级要求里的核心控制点等保三级对 Redis 的关注点并不像很多人想的只要设个密码就完事了。我习惯把检查项归纳成下面这个表测评的时候对着它一项项勾线上排查也按这个顺序走基本不会漏。控制点等保三级核心要求Redis 对应检查项身份鉴别唯一标识、复杂密码、登录失败处理requirepass、masterauth、ACL 用户、密码复杂度策略、是否配置登录失败限制访问控制默认拒绝、最小权限、命令限制bind、protected-mode、防火墙规则、rename-command、ACL 命令权限安全审计记录操作行为、日志留存、审计保护logfile、loglevel、slowlog、ACL LOG、操作系统日志、日志轮转策略入侵防范最小化安装、升级加固、恶意代码防范Redis 版本、运行用户、危险命令禁用、是否安装冗余模块数据完整性保密性传输加密、存储校验TLS 配置、RDB/AOF 校验机制数据备份恢复备份策略、异地备份、恢复验证持久化方式、备份任务、恢复演练记录资源控制并发、内存、超时限制maxmemory、maxclients、timeout、tcp-keepalive这张表是测评的骨架后面所有实操都是在往这个骨架里填细节。特别提醒一下登录失败处理这条是很多 Redis 测评的高频不符合项因为 Redis 本身没有账号锁定的概念必须靠 ACL 日志、Fail2ban、防火墙或外部认证网关来补这一点在访谈阶段要和测评工程师解释清楚。1.3 一条典型的测评流程长什么样等保测评的整体流程一般分五步定级备案、差距分析/自查、现场测评、风险分析、整改复测。Redis 在整个流程里属于现场测评阶段的计算环境检查项。现场测评那几天时间往往很紧张一家单位可能只给你半天时间测 Redis。我自己的习惯是上午集中做配置收集下午做验证测试最后留一小时整理证据截图。如果 Redis 是主从或者 Cluster那就得提前跟业务方约变更窗口因为有些检查命令在极端情况下可能影响实例比如在压力很高的集群节点上执行 KEYS 命令就可能导致堵塞这类操作不能盲目在生产上做。测评前还有一件非常重要的事把 Redis 版本、部署架构、网络拓扑、认证方式、持久化配置、备份策略这些信息通过自查表发给测评方。信息提前到位现场测评的压力会小很多而且很多差距在自查阶段就能改掉复测成本也低。2. 测评前的信息收集与风险预判2.1 先摸清楚部署情况和版本情况去现场之前我一般先让客户提供一份 Redis 部署清单至少要包含三个维度实例角色、部署形态、版本号。实例角色要区分是单机、主从、哨兵还是 Cluster。角色不同测评和整改的侧重点完全不一样。比如主从架构除了配置 requirepass还得配 masterauth否则主库设置了密码后从库复制直接断掉如果是 Cluster那各个节点的 ACL 用户、认证配置还要保证一致任何一个节点漏配都可能被扫描工具发现。部署形态也要问清楚裸机安装、Docker 容器、还是 Kubernetes 里通过 Helm 部署的。现在不少业务把 Redis 容器化但容器化的 Redis 在等保整改里坑更多比如端口映射把 6379 直接暴露到宿主机、容器里改配置不持久化、重启后配置丢失等这都在测评时会成为不符合项。版本信息也很重要。Redis 6.x 之后引入了 ACL 和官方 TLS 支持7.x 进一步增强了 ACL 日志和命令权限。如果系统还跑着老旧的 5.x那很多等保整改项就不好落地测评方很可能会给出版本过低建议升级的整改建议这个要提前评估升级成本和兼容性风险。# 获取版本 redis-server --version redis-cli -p 6379 INFO server | grep redis_version2.2 现场测评要带齐的检查工具我个人习惯用一套轻量级工具组合redis-cli、nmap、配置文件备份、文本编辑器、截图工具。工具不用多关键是会用。redis-cli 负责做只读检查包括查 INFO、查 CONFIG GET 里的关键项、查 ACL 列表这些命令不会改动实例状态可以放心执行。nmap 用来确认 Redis 端口在外部视角是否可达一般只扫 6379 等常用端口顺便看看是否有其他非预期端口对公网开放。配置文件备份则是为了应对改坏了要还原的情况这个在上生产环境检查前必须准备好。还有一点要提醒测评现场不要一上来就执行危险命令比如 CONFIG SET、FLUSHALL、SHUTDOWN、DEBUG 这类操作除非已经和客户确认过是变更窗口。现场测评的最高原则是只读优先、最小影响宁可多跑一条只读命令也不能让测评动作本身变成事故。# 常见只读检查命令 redis-cli -p 6379 INFO server redis-cli -p 6379 INFO replication redis-cli -p 6379 CONFIG GET requirepass redis-cli -p 6379 CONFIG GET protected-mode redis-cli -p 6379 CONFIG GET bind redis-cli -p 6379 CONFIG GET maxmemory redis-cli -p 6379 ACL LIST2.3 哪些情况基本预判会拿高分或直接红灯测评做多了哪些配置看一眼就知道结果。默认配置的 Redis 基本是十测九挂最常见的高风险问题排前三的分别是无认证且监听全网卡、未配置访问控制导致任意来源可连、无备份恢复策略。这三种情况一旦确认测评结论基本就是高风险整改压力非常大。反过来如果实例已经配置了强密码、bind 内网地址、protected-mode 开启、危险命令已禁用、日志留存超过 6 个月、TLS 加密也有落地那即使个别小项有瑕疵整体结论也会好很多。所以风险预判阶段的价值就是帮客户看清差距把整改优先级排出来先消高风险的燃烧弹。3. 核心测评项拆解与整改实操3.1 身份鉴别密码、ACL 与登录失败处理身份鉴别这条线最基础的是给 Redis 设置访问密码。修改 redis.conf 里的 requirepass或者用命令动态设置两种方式各有适用场景# 配置文件方式持久化需要重启或发送 CONFIG REWRITE # redis.conf 中添加 requirepass Str0ng#Pass2024 # 动态配置方式立即生效但注意持久化问题 redis-cli -p 6379 -a oldpass CONFIG SET requirepass Str0ng#Pass2024这里有个特别容易踩的坑CONFIG SET 设置 requirepass 后只是内存中生效如果不执行 CONFIG REWRITERedis 重启后会回到配置文件里的原始值。等保测评里如果只验证了当前有密码而不检查配置文件的持久化状态很容易出现测评当场有密码、下次巡检又没密码的尴尬情况所以整改时我习惯两条路都走通既改配置文件再执行一次 CONFIG REWRITE 确保一致。主从架构下还要额外配置 masterauth。这个配置是给从库用的主库设置密码后从库要用 masterauth 指定的密码去连接主库进行复制同步。很多人只改了主库的 requirepass忘了改从库结果一重启主从就断开了。类似地哨兵模式下如果启用了认证sentinel.conf 里的 auth-pass 也要同步配置。Redis 6.0 之后更推荐的做法是使用 ACL 替代单一的 requirepass因为 ACL 可以做到一个用户一个密码、不同用户不同权限更贴近等保里唯一标识、最小权限的要求。一个典型的最小权限用户配置大概长这样# 在 redis-cli 中执行 ACL SETUSER 命令 ACL SETUSER appuser on Str0ng#Pass2024 ~app:* read write -FLUSHALL -FLUSHDB -CONFIG -SHUTDOWN这条命令创建了一个只能访问 app: 前缀 key、可以执行常规读写命令但禁止 FLUSHALL、FLUSHDB、CONFIG、SHUTDOWN 的用户。如果测评方要求体现最小权限和命令限制这种配置比全局 requirepass 更有说服力。等保测评里常见的登录失败处理也可以通过 ACL 日志配合 Fail2ban 或告警平台来覆盖访谈时把这条链路讲清楚一般能认定为有补偿措施。密码策略这块等保一般要求密码长度不少于 8 位、包含大小写字母数字和特殊字符、定期更换。我见过不少客户用123456或者redis123当密码的这种在测评报告里基本会被提出来作为弱密码高风险项。整改时我一般建议密码生成用随机密码工具然后放入公司密码管理平台这样既满足复杂度要求又方便团队共享。3.2 访问控制网络边界与命令权限的收口访问控制是等保三级里最硬核的一块。很多 Redis 被攻击核心问题不是 Redis 自身漏洞而是监听在公网且没有认证。整改的第一步是把网络边界管住。redis.conf 里的 bind 只允许声明本机地址和内网地址千万不要写 0.0.0.0。protected-mode 也要保持开启它的作用是在没有配置密码和 bind 的情况下拒绝外部来源的连接请求算是 Redis 的最后一道默认防线。这两个配置项一旦确认有问题测评基本直接给高风险。# redis.conf 关键访问控制项 bind 127.0.0.1 10.0.0.5 protected-mode yes port 6379网络层面的防火墙规则同样重要。即使 bind 只写了内网地址如果云安全组或者本地防火墙把 6379 端口对所有来源放行了那 Redis 依然可以被外部扫描到。等保三级里应在网络边界根据访问控制策略设置访问控制规则这句话对应的就是防火墙和云安全组配置。测评时我会先跑一遍 nmap看看 6379 端口在外部视角下能否建立 TCP 连接如果能再检查是否有对应来源的防火墙限制。命令权限的收敛也是访问控制的重点。Redis 默认允许 FLUSHALL、FLUSHDB、KEYS、CONFIG、SHUTDOWN、DEBUG 等一批高危命令一旦被未授权访问等于把数据库和服务器都交出去了。等保整改里最常见的手法是用 rename-command 把这些命令改成空字符串或者改成极少人知道的随机字符串彻底禁用掉# redis.conf 中禁用或重命名危险命令 rename-command FLUSHALL rename-command FLUSHDB rename-command CONFIG user_redis_config_9f3k rename-command SHUTDOWN rename-command DEBUG 这里有个实际教训CONFIG 命令一旦重命名后续想用 CONFIG GET 在线查看配置就不方便了整改前要提前规划好管理方式。如果是 Redis 6.0 以上版本我更推荐用 ACL 直接控制用户的命令权限比如上面的 appuser 就只允许读写、禁止管理命令这样既满足等保要求也保留了管理员的运维通道。Docker 部署的 Redis 还有一个典型坑docker run 时用-p 6379:6379会把容器端口直接映射到宿主机所有网卡等于绕过防火墙暴露了 Redis。等保测评里如果发现这种映射方式即使容器内 bind 是内网地址也可能被判为访问控制不符合。整改时我建议删除端口映射改用 hostNetwork 加内网 IP或者用-p 127.0.0.1:6379:6379只映射到本机回环地址再通过反向代理或堡垒机统一出口。3.3 安全审计日志、慢查询与操作追溯安全审计这条线Redis 和传统的 Oracle、MySQL 比确实偏弱因为 Redis 本身不记录业务操作明细。但等保三级要求应启用安全审计功能审计覆盖到每个用户对重要的用户行为和重要安全事件进行审计所以测评时审计项必须给出一个交代。最基本的落地是开启 Redis 自身的运行日志。logfile 指定日志路径loglevel 设置为 notice这样系统启动、配置变更、认证失败等信息能被记录下来。慢查询日志也要开启slowlog-log-slower-than 建议 10000 微秒10 毫秒slowlog-max-len 设置 128 或 256方便定位慢命令和潜在的风险操作。# redis.conf 审计相关配置 logfile /var/log/redis/redis-server.log loglevel notice slowlog-log-slower-than 10000 slowlog-max-len 256但这里要强调一个测评人员经常问的问题Redis 日志默认不记录 GET、SET 这类数据操作那等保审计要求是不是就满足不了答案是光靠 Redis 自身不够需要配合外部手段。比较通用的做法有三类基于 ACL 日志Redis 6.0 以上可以用 ACL LOG 查看用户认证成功、失败、命令越权等安全事件这是 Redis 自带的安全审计基础。接入系统日志把 Redis 日志重定向到 syslog接入 SIEM 平台统一分析日志留存时间长、可检索性强。业务侧审计如果必须记录详细的数据操作在应用层记录 Redis 操作流水或者通过数据库网关、代理层做全量审计。还有一个容易忽略的点日志文件的权限不能是 777否则测评方会在审计信息保护上扣分。redis 用户要对日志目录有写权限其他用户尽量只读或者无权限。生产环境我通常用 redis 用户运行实例日志目录属主设为 redis权限 750 或 640 即可。日志留存时间也是等保三级常见不符合项。规范要求一般按 6 个月以上留存这需要配合 logrotate 做自动轮转和归档。配置好 logrotate 之后还要检查一段时间内日志是否真的在按预期切割和清理别出现日志文件无限增长把磁盘撑满的情况。3.4 数据安全持久化、备份恢复与传输加密数据安全在等保三级里要是不过关后果比认证缺失还严重因为可能直接导致数据丢失或者泄露。Redis 的持久化机制有 RDB 和 AOF 两种生产环境我建议同时开启RDB 负责周期性快照AOF 负责更细粒度的命令追加两者结合起来兼顾恢复速度和数据完整性。# redis.conf 持久化配置 save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysec测评时除了看上面这些配置还要看备份是否在持续执行、备份文件是否存到了独立介质。很多客户只配置了本地 RDB 存储没有异地或第二副本备份这在等保三级里属于明显的备份恢复不足。我通常会建议把 RDB 文件或者 AOF 文件通过定时任务复制到独立的备份服务器或对象存储同时对备份完整性做定期校验。备份是否可恢复也是测评方重点关注的问题。访谈时如果客户只能说我们做了备份但拿不出恢复演练记录测评方很可能给不符合或者部分符合。我陪客户做等保整改时经常会拉上运维同事做一次完整的备份恢复演练把演练时间、参与人、恢复结果记录成文档测评时这份材料非常加分。数据保密性方面最容易被忽略的是传输加密。Redis 老版本默认没有 TLS 支持密码和数据在网络上都是明文传输如果在机房内部被嗅探风险非常大。Redis 6.0 之后可以启用官方 TLS步骤大体如下# 1. 编译时开启 TLS make BUILD_TLSyes # 2. 生成 CA 和服务端证书示意 openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650 -nodes openssl req -newkey rsa:2048 -keyout redis.key -out redis.csr -nodes openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 3650 # 3. redis.conf 中启用 TLS 端口 tls-port 6379 tls-cert-file /etc/redis/tls/redis.crt tls-key-file /etc/redis/tls/redis.key tls-ca-cert-file /etc/redis/tls/ca.crt tls-auth-clients yes启用后客户端连接要加上--tls参数并指定 CA 证书redis-cli --tls --cacert /etc/redis/tls/ca.crt -h 10.0.0.5 -p 6379很多图形化客户端比如 Another Redis Desktop Manager 的新版本已经支持 TLS配置的时候注意勾选 TLS 选项并填写 CA 证书路径。如果不支持 TLS那整改时可以考虑在 Redis 前加一层支持 TLS 的负载均衡或代理由代理负责加解密Redis 走内网明文链路但这种方式测评时需要说明清楚网络边界和代理层的安全防护。3.5 资源控制与运行加固等保三级对资源控制的要求经常被忽视但 Redis 侧翻车概率一点也不低。典型的场景是 maxmemory 没设置Redis 把服务器内存吃满触发操作系统 OOM甚至把同机其他进程一起拖下水。测评时这里要抓两个关键项maxmemory 和 maxmemory-policy。redis-cli -p 6379 CONFIG GET maxmemory redis-cli -p 6379 CONFIG GET maxmemory-policy redis-cli -p 6379 CONFIG GET maxclients redis-cli -p 6379 CONFIG GET timeoutmaxmemory 建议设置为物理内存的 70% 左右具体要看机器上是否还部署了其他组件留足系统和其他进程的内存余量。maxmemory-policy 推荐用 allkeys-lru在内存达到上限时优先淘汰不常用的 key尽量避免直接报 OOM 错误影响业务。timeout 也要设置让闲置连接自动断开防止连接数被打满。此外 maxclients 根据业务高峰合理设置超过了会影响新连接设置太低会导致业务故障这块需要在整改时和业务方反复确认。运行用户也是等保测评的一个惯常检查点。Redis 不允许用 root 用户启动这是基本红线。生产环境要单独创建 redis 用户配置文件、数据文件、日志文件都属主为 redis。如果发现有人在 root 下跑 Redis 实例测评方基本会直接给一个中高风险项整改就需要重建启动脚本、调整文件属主工作量不小建议一开始部署就按最小权限来做。4. 常见问题与排查技巧实录4.1 设置 requirepass 后主从复制瞬间断开这个坑我在协助客户整改时遇到过好多次。主库配置了 requirepass从库没有同步配置 masterauth重启主库后从库连不上INFO replication显示 master_link_status:down同步中断。排查思路很简单先从库上执行redis-cli -p 6379 INFO replication看连接状态然后检查从库 redis.conf 是否配置了 masterauth。如果配置了密码但还是一直连不上再用redis-cli -p 6379 -a 密码 CONFIG GET masterauth确认一下配置取值是否和主库 requirepass 一致。提示如果 Redis 用的是 ACL 用户而不是全局 requirepass从库 masteruser 也要指定对应的用户名否则认证依然失败。这类问题在代码里不报错但看日志会看到MASTER - REPLICA sync started之后马上断开的循环记录。4.2 改完配置不生效或重启后配置丢失测评现场最尴尬的情况是管理员信心满满地说我们早就在 redis.conf 里写了 requirepass结果执行CONFIG GET requirepass返回空或者返回的密码和配置文件里的不一致。原因无非三种一是改完配置文件没重启进程内存里还是老配置二是启动时指定的不是这个 redis.conf用的是自定义路径或默认配置三是用 CONFIG SET 动态改过但没执行 CONFIG REWRITE重启后回滚到文件原值。排查的时候不要只看一个地方要把进程启动参数、配置文件内容、CONFIG GET 返回值三者对齐。# 查看启动参数确认实际加载的配置文件路径 ps -ef | grep redis-server # 然后根据实际路径检查配置 cat /etc/redis/redis.conf | grep -E ^(requirepass|bind|protected-mode)如果确认是 CONFIG SET 后没持久化执行一次 CONFIG REWRITE 再重启验证就行。整改后记得重新检查一遍。4.3 开启 TLS 后客户端大面积连不上有一次帮客户整改TLS 配好之后业务方反馈缓存全都不通了一查发现是应用程序里的 Redis 客户端没启用 TLS还在拿着明文端口连接。这个问题整改前要评估所有客户端类型包括后台服务、运维脚本、监控系统、图形化管理工具逐个适配 TLS 配置。测试阶段可以先保留一个明文端口作为过渡等客户端全部切换到 TLS 后再关闭明文端口这样能最大限度降低业务影响。但如果业务要求不能暴露明文那就必须在变更窗口内一键切换并提前写好回滚方案。TLS 证书到期也需要提前规划否则到期当天 Redis 连接全部失败这种故障责任通常比没做等保整改还要严重。4.4 Redis 日志太少安全审计项不满足怎么办经常有客户问我日志已经开了但测评方还是说审计不足怎么办原因很简单Redis 默认日志只记录启动、关闭、配置变更、复制状态这类事件不记录业务数据操作。等保三级要求审计覆盖到每个用户时单靠 Redis 日志撑不起来。我通常的建议是先确认是否已经接入外部日志平台比如 syslog 或者 SIEM再确认是否开启了 ACL LOG 并把认证失败等安全事件纳入监控如果没有这类外部链路就抓紧把 Redis 日志转发到统一日志平台同时保留日志轮转和留存 180 天以上的策略。如果需要更细粒度的操作审计那只能在应用层或代理层做这个要和测评方沟通清楚因为很多情况下 Redis 本身的定位就是缓存组件数据操作审计放在应用侧更合理。4.5 端口可达但连不上怎么快速定位卡在哪儿ip 通、端口通但 redis-cli 连上去要么超时要么直接报 NOAUTH这场景在测评和排障里特别常见。我一般按四层来排查现象可能原因检查命令/方法TCP 连接被重置或超时防火墙拦截、bind 未包含来源 IPtelnet、nmap、iptables -L、CONFIG GET bind连接成功但命令报 DENIEDprotected-mode 开启且未配置密码CONFIG GET protected-mode、CONFIG GET requirepass连接成功但报 NOAUTH客户端没带密码redis-cli -a 参数、AUTH 命令验证连接成功但 ACL 用户权限不足用户没有对应命令/key 权限ACL WHOAMI、ACL LIST、ACL GETUSER这套排查思路不仅测评时能用日常故障演练、接管新项目时也非常有效。先把网络层排除掉再谈认证和 ACL切忌一上来就改配置容易把问题带偏。5. 风险判定、整改建议与个人经验5.1 风险等级怎么判更合理等保三级测评中对 Redis 相关问题的风险判定不同测评机构之间会有些微差异但大原则是相通的。无认证、可公网访问、弱口令、备份缺失这类直接导致数据泄露或丢失的问题基本会判高风险缺少日志审计、未启用 TLS、资源控制不足这类影响可见性或可用性的问题通常判中风险版本老旧、日志权限不严这类相对边缘的问题一般是低风险居多。实操中我发现一个细节判定风险等级不能只盯着 Redis 本身要结合系统承载的业务重要性和网络环境来看。比如 Redis 只在纯内网且没有敏感数据那未启用 TLS可以争取从高风险降为中风险但如果缓存里存了用户会话或者订单信息那明文传输就必须按高风险来整改。测评不是填空题而是结合上下文的风险评估。5.2 整改建议要能落地避免正确的废话给客户的整改建议我坚持一个原则每条建议必须包含改哪个文件、改成什么、如何验证、由谁负责、何时完成这五个要素。比如建议开启认证这种话就属于废话正确的写法是列出 redis.conf 里 requirepass 的配置片段、给出密码复杂度样例、写明多长时间内完成验证、指派负责人。配套动作比单点整改更重要。Redis 等保整改最好能沉淀成一份上线配置基线后续新部署的 Redis 实例都按这套基线去初始化而不是每次测评前挨个手工改。我见过一个团队在测评前连夜给 22 个 Redis 节点补配置改完这个忘了那个光排查就花了三天就是因为缺少自动化的基线模板和巡检脚本。5.3 测评后的持续合规比一次整改更关键等保三级是持续性的要求不是整改完拿到报告就结束了。我参与过的一个项目第一次测评整改花了很大力气结果半年后巡检发现好几个节点的 requirepass 因为程序扩容被覆盖成默认值又回到了裸奔状态。所以测评结束后最好把 Redis 安全配置检查项固化到日常巡检和 CI/CD 流水线里。我自已的习惯是沉淀一套简单的巡检脚本定期执行并推送结果到告警群检查项包括是否设置了 requirepass、bind 是否合规、protected-mode 是否为 yes、日志文件是否在滚动、maxmemory 是否设置、ACL 用户是否有弱密码等。这套东西本身不复杂但能防止测评季突击整改、平时回归裸奔的循环。Redis 的安全测评说到底比的是运维习惯和流程纪律技术本身反而不是最大的难题。