跳转到: 导航, 搜索

Security/Guidelines

注意 - 此文档目前正在进行中。

跨项目安全指南

目标

  • 建立并巩固跨项目的安全最佳实践。
  • 方便社区就安全主题进行讨论/投票。
  • 通过复制合适的“需求链接”并将其粘贴到评审评论中,简化 Gerrit 评审。
  • 通过作为安全最佳实践背景和理由的中心参考,简化社区对安全主题的讨论。

指南

需求链接 描述 详情链接
#auth_backoff 失败的身份验证尝试必须触发递增的退避时间,然后用户才能尝试重新身份验证。退避时间必须可由操作员配置。 auth_backoff
#auth_timing_attack 为了防止攻击者使用时序攻击定位有效帐户,对有效和失败的身份验证尝试的响应时间不得有可行且可察觉的差异。 auth_timing_attack
#clearing_memory 仅在内存中保存机密数据最短的时间,然后在用完后将内存清零,作为一种纵深防御措施。 同样,尽快清除包含机密数据的环境变量。 clearing_memory
#crypto_algorithms 除非有法律或行业合规性原因,否则所有加密算法/密钥长度必须至少与以下算法/密钥强度相同:对称加密:AES-128,非对称加密:RSA-2048,哈希:SHA-256。 crypto_algorithms
#digital_signatures 项目中任何可能跨越信任边界的数字资产必须使用 RSA-2048 + SHA-256 或更强的算法/密钥进行数字签名。 例如:如果 Glance 镜像将在系统上执行,则应在使用前对镜像进行数字签名和身份验证。 digital_signatures
#encrypted_comm 除非存在无法克服的开销,否则服务/系统之间的所有通信都必须加密。 这是一种纵深防御措施,旨在限制在控制平面系统或服务受到破坏时攻击的范围。 encrypted_comm
#exec_least_priv 作为一种纵深防御措施,所有软件必须以最小权限和最严格的配置运行。(注意:这可能是操作员的任务。) exec_least_priv
#key_revocation 系统必须实现密钥撤销系统,以快速停用潜在受损的密钥。 key_revocation
#log_insecure_config 如果存在配置选项可能会以有意义的方式扩大项目的攻击面,则记录该配置选项以及对潜在结果的简要描述(至少使用警告级别或更高级别的日志级别)。 这为操作员提供了一个早期警告。 log_insecure_config
#logging_guidelines 遵循规定的日志记录指南,以防止机密数据泄露(有关详细信息,请参阅外部链接) logging_guidelines
#network_isolation 除非有明确的需求来启用连接,否则项目内的系统之间必须完全网络隔离。 任何例外情况都应由社区讨论并记录。 network_isolation
#req_load_man 许多提议的系统操作在计算/资源方面代价高昂。 这些操作的完成应可预测且线性,并根据需要按用户/项目/服务抵御拒绝服务或放大攻击。 这可能涉及排队请求、对这些队列设置高水位线(在现有请求清除之前拒绝其他请求)、在队列处理中设置节流延迟、速率限制、单独的工作池或其他负载管理技术。 即使一部分租户受到攻击或恶意攻击,系统也必须保持对其他租户的可用性。 req_load_man
#secure_defaults 所有配置选项必须默认使用安全设置。 例如,如果有一个启用或禁用用户身份验证的选项,则默认必须启用。 secure_defaults
#secure_storage 机密数据,例如凭据信息和私钥,不应以未加密的形式存储在非易失性存储器中。 这是一种纵深防御主题,旨在为攻击者在他们获得系统某些部分的访问权限时设置障碍。 在可能的情况下,将安全责任分配给用户应用程序存储/执行环境。 即使非易失性存储器中的加密数据也可能很有价值(特别是考虑到实现中的错误的可能性),从而创建一个高价值目标。 将安全数据尽可能地推送到更远的地方,可以减少攻击者对任何单个数据存储的价值。 secure_storage
#session_management 会话必须超时并要求用户重新身份验证。 超时值可以由操作员配置,建议 24 小时超时为最大值。 此超时必须取消属于该用户的所有会话。 session_management
#input_validation 如果未正确管理,任何输入到系统的输入都可能引入不同的命令注入到系统中。 例如,网页表单/命令行输入中的用户输入,或来自不受信任来源的 XML/JSON 输入可能导致 SQLi、XMLi、JSONi、XSS 等,从而导致系统中发生不希望的代码执行。 为了缓解此类攻击,请确保引入系统的所有输入都是受信任的并且经过适当的验证,如果呈现给用户,则经过适当的转义/清理,以确保引入的任何代码仅被解释为文本而不是执行。 input_validation