安全清单 security-checklist

本节介绍部署后确保 AEM 安装的安全性所需采取的各项步骤。 建议按清单自上而下逐项执行。

NOTE
您还可参考开放 Web 应用程序安全项目(OWASP)发布的最严重安全威胁,以获取更多信息。
NOTE
在开发阶段,还适用一些其他安全注意事项

主要安全措施 main-security-measures

以生产就绪模式运行 AEM run-aem-in-production-ready-mode

有关更多信息,请参阅以生产就绪模式运行 AEM

为传输层安全性启用 HTTPS enable-https-for-transport-layer-security

必须在创作与发布实例上启用 HTTPS 传输层,方可保障实例的安全性。

NOTE
请参阅启用基于 SSL 的 HTTP 部分,以了解更多信息。

安装安全热修复补丁 install-security-hotfixes

请确认已安装 Adobe 提供的最新的安全热修复补丁

更改 AEM 与 OSGi 控制台管理员帐户的默认密码 change-default-passwords-for-the-aem-and-osgi-console-admin-accounts

Adobe 建议在安装完成后(适用于所有实例)更改具有特权的 AEM admin 帐户的密码。

这些帐户包括:

  • AEM 的 admin 帐户

    更改 AEM 管理员帐户密码后,访问 CRX 时请使用新密码。

  • OSGi 网页控制台的 admin 密码

    此更改同样适用于访问网页控制台的管理员帐户,请使用相同的新密码进行访问。

这两个帐户的凭据相互独立。为每个帐户设置不同且强度高的密码,对保障部署安全至关重要。

更改 AEM 管理员密码 changing-the-aem-admin-password

可通过 Granite 操作——用户控制台更改 AEM 管理员帐户的密码。

在此可编辑 admin 帐户并更改其密码

NOTE
更改该管理员帐户同时会影响 OSGi 网页控制台的帐户。 在更改管理员帐户后,建议将 OSGi 帐户的凭据进一步修改为与之不同的密码。

更改 OSGi 网页控制台密码的重要性 importance-of-changing-the-osgi-web-console-password

除了 AEM 的 admin 帐户外,如未更改 OSGi 网页控制台的默认密码,可能会导致:

  • 服务器在启动与关闭期间(大型服务器可能持续数分钟)因使用了默认密码而暴露。
  • 当存储库宕机/重新启动捆绑包而 OSGi 仍在运行时,服务器处于暴露状态。

关于更改网页控制台密码的详细信息,请参见下文更改 OSGi 网页控制台管理员密码

更改 OSGi 网页控制台管理员密码 changing-the-osgi-web-console-admin-password

请更改用于访问网页控制台的密码。 通过 OSGi 配置来更新 Apache Felix OSGi 管理控制台​的以下属性:

  • 用户名​和​密码,用于访问Apache Felix Web管理控制台本身的凭据。
    必须在初始安装 ​更改密码以确保实例的安全性。
NOTE
有关配置 OSGi 设置的完整说明,请参见 OSGi 配置

更改 OSGi 网页控制台管理员密码的步骤

  1. 使用​工具操作​菜单,打开​ Web控制台 ​并导航到​ 配置 ​部分。
    例如,在<server>:<port>/system/console/configMgr

  2. 找到并打开 Apache Felix OSGi 管理控制台​的条目。

  3. 更改​ 用户名 ​和​密码

    chlimage1-3

  4. 选择​保存

实施自定义错误处理程序 implement-custom-error-handler

Adobe 建议定义自定义错误处理页,特别是针对 404 与 500 等 HTTP 响应码,以防止敏感信息泄露。

NOTE
请参阅如何创建自定义脚本或错误处理程序,以了解更多详细信息。

完成 Dispatcher 安全清单 complete-dispatcher-security-checklist

AEM Dispatcher 是您基础架构中的关键组件。 Adobe 建议完成 Dispatcher 安全清单

CAUTION
使用 Dispatcher 时,必须禁用 “.form” 选择器。

验证步骤 verification-steps

配置复制与传输用户 configure-replication-and-transport-users

在 AEM 标准安装流程中,默认复制代理会将 admin 作为传输凭据的用户。 此外,创作系统上用于发起复制的用户也通常是 admin。

基于安全考虑,应根据实际使用场景更换上述帐户,并注意以下两点:

  • 传输用户​不得为管理员帐户。 建议在发布系统上创建仅具备相应区域访问权限的用户,并使用该用户的凭据进行传输。

    您可从随附的 replication-receiver 用户着手,按需配置该用户的访问权限。

  • 复制用户​或​代理用户 ID 同样不能为管理员帐户,而是应为仅能查看复制内容的用户。 复制用户用于在创作系统上收集待复制内容,然后再发送至发布者。

检查操作仪表板的安全健康检查 check-the-operations-dashboard-security-health-checks

AEM 6 引入了全新的操作仪表板,以帮助运维人员排障并监控实例健康状况。

该仪表板包含一系列安全健康检查。 建议在生产实例上线前,检查所有安全健康检查的状态。 如需了解更多信息,请参阅操作仪表板文档

检查示例内容是否仍存在 check-if-example-content-is-present

在对外开放前,应在生产系统上彻底卸载并删除所有示例内容与示例用户(如 Geometrixx 项目及其组件)。

NOTE
若实例以生产就绪模式运行,示例 We.Retail 应用程序会移除。 如非上述情况,可以在包管理器中搜索并卸载所有 We.Retail 包以移除示例内容。

请参阅使用包

检查是否存在 CRX 开发用捆绑包 check-if-the-crx-development-bundles-are-present

在对外开放前,应在创作与发布生产系统上卸载以下开发用 OSGi 捆绑包:

  • Adobe CRXDE Support(com.adobe.granite.crxde-support)
  • Adobe Granite CRX Explorer(com.adobe.granite.crx-explorer)
  • Adobe Granite CRXDE Lite(com.adobe.granite.crxde-lite)

检查是否存在 Sling 开发用捆绑包 check-if-the-sling-development-bundle-is-present

AEM 开发人员工具会部署 Apache Sling Tooling Support Install(org.apache.sling.tooling.support.install)。

在对外开放前,应在创作与发布生产系统上卸载该 OSGi 捆绑包。

防止出现跨站点请求伪造 protect-against-cross-site-request-forgery

CSRF 保护框架 the-csrf-protection-framework

自 AEM 6.1 起,系统内置名为 CSRF 防护框架​的机制,用于抵御跨站点请求伪造攻击。 有关使用方法的更多信息,请参加相关文档

Sling 反向链接过滤器 the-sling-referrer-filter

为解决 CRX WebDAV 和 Apache Sling 中已知的跨站点请求伪造(CSRF)安全问题,需要配置以启用反向链接过滤器。

反向链接过滤器服务是一个 OSGi 服务,该服务允许您配置以下内容:

  • 需要被过滤的 HTTP 方法

  • 是否允许空的反向链接头

  • 以及除当前服务器主机外允许的服务器列表。

    默认情况下,所有 localhost 的变体以及服务器绑定的当前主机名均在允许列表中。

要配置反向链接过滤器服务:

  1. 在以下地址打开 Apache Felix 控制台(配置):

    https://<server>:<port_number>/system/console/configMgr

  2. admin 身份登录。

  3. 在​ 配置 ​菜单中选择:

    Apache Sling Referrer Filter

  4. Allow Hosts 字段中输入所有允许作为反向链接的主机。 每个条目必须采用以下格式:

    <protocol>://<server>:<port>

    例如:

    • https://allowed.server:80 允许来自该服务器指定端口的所有请求。
    • 若还需允许 https 请求,必须另起一行单独输入。
    • 若要允许该服务器的所有端口,可以使用 0 作为端口号。
  5. 如需允许空的或缺失的反向链接头,请勾选 Allow Empty 字段。

    note caution
    CAUTION
    Adobe 建议在使用 cURL 等命令行工具时提供反向链接,而非允许空值,否则可能使系统暴露于 CSRF 攻击风险中。
  6. Filter Methods 字段中编辑过滤器用于检查的方法。

  7. 单击​ 保存 ​以保存更改。

OSGI 设置 osgi-settings

某些 OSGi 设置默认启用,以便于对应用程序进行调试。 在发布与创作生产实例上应修改这些设置,以避免内部信息泄露。

NOTE
Day CQ WCM 调试筛选条件​外,下列所有设置均已由生产就绪模式自动覆盖。 因此,Adobe 建议在生产环境部署实例之前,检查所有相关设置。

对于以下每项服务,都必须更改指定的设置:

请参阅 OSGi 配置设置

在使用 AEM 时,可通过多种方式管理这些服务的配置设置。有关更多详情与最佳做法,请参阅配置 OSGi

进一步阅读 further-readings

缓解拒绝服务(DoS)攻击 mitigate-denial-of-service-dos-attacks

拒绝服务(DoS)攻击是指试图使计算机资源对预期用户不可用的行为。 此类攻击通常通过资源过载来实现,例如:

  • 来自外部源的请求洪流。

  • 请求超出系统可正常提供的信息量。

    例如,请求整个存储库的 JSON 展现方案。

  • 通过请求一个包含无限数量 URL 的内容页面,URL 可以包含一个句柄、一些选择器、一个扩展名和一个后缀,其中任何一项都可以进行修改。

    例如,.../en.html 可被请求为:

    • .../en.ExtensionDosAttack
    • .../en.SelectorDosAttack.html
    • .../en.html/SuffixDosAttack

    所有有效变体(例如返回 200 响应并配置为可缓存)都会被 Dispatcher 缓存,最终可能导致文件系统被填满,从而无法处理进一步请求。

防止此类攻击的配置点很多,这里仅讨论与 AEM 相关的部分。

配置 Sling 以防止 DoS 攻击

Sling 采用​ 以内容为中心 ​的框架。 每个 HTTP 请求都会以 JCR 资源(存储库节点)的形式映射到内容上,因此处理流程会围绕内容展开:

  • 首个目标是存放内容的资源(JCR 节点)。
  • 其次,系统会根据请求的部分内容(如选择器和/或扩展名)以及资源属性定位渲染器或脚本。

请参阅 Sling 请求处理,以了解更多信息。

这种方式使 Sling 功能强大且灵活,但必须谨慎管理这种灵活性。

为防止滥用 DoS,可采取以下措施:

  1. 在应用程序层面引入控制。 由于可能存在大量变体,默认配置不可行。

    在应用程序中应当:

    • 控制应用程序中的选择器,​提供明确需要的选择器,并对其他选择器一律返回 404
    • 防止输出无限数量的内容节点。
  2. 检查默认渲染器的配置,因为它们可能成为问题来源。

    • 尤其是 JSON 渲染器会跨多个层级遍历树结构。

      例如,该请求:

      http://localhost:4502/.json

      可能将整个存储库导出为 JSON 展现方案,从而引发严重的服务器问题。 因此,Sling 对最大结果数设有限制。 要限制 JSON 渲染的深度,请为以下属性设置值:

      JSON 最大结果数json.maximumresults

      位于 Apache Sling GET Servlet 的配置中。 超过该限制时,渲染会被中止。 AEM 中 Sling 的默认值为 1000

    • 作为预防措施,应禁用其他默认渲染器(HTML、纯文本、XML)。 同样通过配置Apache Sling GET Servlet 实现。

    note caution
    CAUTION
    请勿禁用 JSON 渲染器,因为 AEM 的正常运行依赖于它。
  3. 使用防火墙来过滤对实例的访问。

    • 必须使用操作系统级别的防火墙来过滤对实例中各点的访问,因为如果不加以保护,这些访问可能会导致拒绝服务攻击。

缓解因使用表单选择器引发的 DoS 攻击

NOTE
仅当 AEM 环境未使用 Forms 时,才应执行此缓解措施。

由于 AEM 并未为 FormChooserServlet 提供开箱即用的索引,在查询中使用表单选择器可能会触发代价高昂的存储库遍历,而这通常会导致 AEM 实例停滞。 查询中存在​ &ast;.form.&ast; ​字符串,可以检测到表单选择器。

要缓解此问题,可以执行以下步骤:

  1. 通过在浏览器中访问 https://<serveraddress>:<serverport>/system/console/configMgr 来打开网页控制台

  2. 搜索 Day CQ WCM 表单选择器 Servlet

  3. 点击该条目后,在以下窗口中禁用​高级搜索要求

  4. 单击​保存

缓解因资产下载 Servlet 引发的 DoS 攻击

默认的资产下载 Servlet 允许已验证的用户发起任意规模的并发下载请求,以创建资产的 ZIP 文件。 生成大型 ZIP 压缩包可能会导致服务器与网络过载。 为降低此行为带来的潜在的拒绝服务(DoS)风险,Experience Manager 的发布实例默认禁用 AssetDownloadServlet OSGi 组件。 但在 Experience Manager 作者实例上则默认启用。

若无需下载功能,请在创作与发布部署中均禁用该 Servlet。 如果您的环境必须启用资产下载功能,请参见从 Adobe Experience Manager 下载资产,以获取更多信息。 此外,您还可以为部署定义可承受的最大下载限制。

禁用 WebDAV disable-webdav

可在创作与发布环境中停止相关 OSGi 捆绑包来禁用 WebDAV。

  1. 连接到正在以下位置运行的 Felix 管理控制台

    https://<*host*>:<*port*>/system/console

    例如 http://localhost:4503/system/console/bundles

  2. 在捆绑包列表中找到以下名称的捆绑包:

    Apache Sling Simple WebDAV Access to repositories (org.apache.sling.jcr.webdav)

  3. 在“操作”列中点击“停止”按钮即可停止该捆绑包。

  4. 同样,在捆绑包列表中找到以下名称的捆绑包:

    Apache Sling DavEx Access to repositories (org.apache.sling.jcr.davex)

  5. 点击“停止”按钮停止该捆绑包。

    note
    NOTE
    无需重启 AEM。

确认您未在用户主路径中泄露个人身份信息 verify-that-you-are-not-disclosing-personally-identifiable-information-in-the-users-home-path

确保存储库用户主路径中不会暴露任何个人身份信息,这是保护用户的重要措施。

自 AEM 6.1 起,用户(即可授权)ID 节点名称的存储方式已通过新的 AuthorizableNodeName 接口实施。 该新接口不再在节点名中暴露用户 ID,而是生成随机名称。

无需额外配置,因为该方式已成为 AEM 生成可授权 ID 的默认方式。

尽管不推荐,但如需与现有应用程序保持向后兼容,可禁用该功能以恢复旧的实施。 如需禁用,请执行以下操作:

  1. 进入网页控制台,在 Apache Jackrabbit Oak SecurityProvider 中的 requiredServicePids 属性里移除 ​ org.apache.jackrabbit.oak.security.user.RandomAuthorizableNodeName 条目。

    您也可在 OSGi 配置中查找 org.apache.jackrabbit.oak.security.internal.SecurityProviderRegistration PID 来定位 Oak 安全提供商。

  2. 在网页控制台中删除 Apache Jackrabbit Oak 随机可授权节点名称 OSGi 配置。

    为方便查找,该配置的 PID 为 org.apache.jackrabbit.oak.security.user.RandomAuthorizableNodeName

NOTE
若要了解更多信息,请参阅 Oak 文档生成可授权节点名称

匿名权限强化包 anonymous-permission-hardening-package

默认情况下,AEM 会将系统元数据(如 jcr:createdByjcr:lastModifiedBy)作为节点属性与常规内容一并存储在存储库中。 根据配置与访问控制设置的不同,在某些情况下这可能会导致个人身份信息(PII)暴露,例如当此类节点以原始 JSON 或 XML 形式渲染时。

与所有存储库数据一样,这些属性由 Oak 授权栈介导。 应遵循最小权限原则限制对这些属性的访问。

为此,Adobe 提供了一个权限强化包,供客户在此基础上进一步扩展。 该强化包通过在存储库根目录安装一条“拒绝”访问控制项,限制匿名用户访问常用系统属性。 此包可在所有受支持的 AEM 版本中下载并安装。

为说明这些变化,以下对比展示了安装该包前后匿名用户可查看的节点属性:

安装包之前

以及安装包后可查看的属性,其中 jcr:createdByjcr:lastModifiedBy 已不可见:

安装包之后

有关更多信息,请参阅该包的发行说明。

防御点击劫持攻击 prevent-clickjacking

若要防御点击劫持攻击,Adobe 建议您将 Web 服务器配置为将 X-FRAME-OPTIONS HTTP 标头集提供给 SAMEORIGIN

有关点击劫持攻击的更多信息,请参阅 OWASP 网站

确保在需要时正确复制加密密钥 make-sure-you-properly-replicate-encryption-keys-when-needed

某些 AEM 功能与身份验证机制要求在所有 AEM 实例间复制加密密钥。

在执行之前请注意,不同版本的密钥复制方式不同,因为 6.3 与更早版本存储密钥的方式不同。

有关详细信息,请参阅下文。

在 AEM 6.3 中复制密钥 replicating-keys-for-aem

在早期版本中,复制密钥存储在存储库中;而从 AEM 6.3 起,密钥存储在文件系统中。

因此,要在实例间复制密钥,需要将其从源实例复制到目标实例文件系统中的相应位置。

具体步骤如下:

  1. 访问包含要复制的密钥材料的 AEM 实例(通常是作者实例);

  2. 在本地文件系统中找到 com.adobe.granite.crypto.file 捆绑包。 例如,路径如下:

    • <author-aem-install-dir>/crx-quickstart/launchpad/felix/bundle21

    每个文件夹内的 bundle.info 文件标识了对应的捆绑包名称。

  3. 进入数据文件夹。 例如:

    • <author-aem-install-dir>/crx-quickstart/launchpad/felix/bundle21/data
  4. 复制 HMAC 与主文件。

  5. 随后进入要复制 HMAC 密钥的目标实例,并导航到数据文件夹。 例如:

    • <publish-aem-install-dir>/crx-quickstart/launchpad/felix/bundle21/data
  6. 粘贴先前复制的两个文件。

  7. 如果目标实例已在运行,请刷新加密包。

  8. 对所有需要复制密钥的实例重复上述步骤。

在 AEM 6.2 及更早版本中复制密钥 replicating-keys-for-aem-and-older-versions

在 AEM 6.2 及更早版本中,密钥存储于存储库的 /etc/key 节点下。

推荐的安全做法是仅复制该节点,以在实例间复制密钥。 您可以通过 CRXDE Lite 有选择地复制节点:

  1. 通过访问 https://&lt;serveraddress&gt;:4502/crx/de/index.jsp 来打开 CRXDE Lite
  2. 选择 /etc/key 节点。
  3. 切换到​ 复制 ​选项卡。
  4. 点击​ 复制 ​按钮。

执行渗透测试 perform-a-penetration-test

Adobe 建议在进入生产环境前对您的 AEM 基础架构执行渗透测试。

开发最佳做法 development-best-practices

新开发的项目必须遵循安全性最佳做法,以确保 AEM 环境的安全性。

recommendation-more-help
experience-manager-65-lts-help-main-toc