在本章中,我们将探讨一些关键的优秀实践,包括隐藏服务商资源地址、只安装必要的依赖和工具、只运行必要的服务和端口以及使用堡垒机保护内部资源。
【资料图】
作者|冯炜
本系列内容是我们在不同项目的维护过程中总结的关于DevOps/SRE方面的最佳实践,我们将致力于在项目上尽最大的努力来推行这些最佳实践。我们希望这些最佳实践能对项目的稳定运营提供帮助,也希望刚接触DevOps/SRE的新人能通过学习这些最佳实践来提升自己在这方面的水平。
当涉及到 DevOps/SRE 的最佳实践时,操作系统和服务的管理是一个关键领域。在这个领域,有许多最佳实践可以帮助团队更好地管理他们的系统,提高效率和安全性。
在本章中,我们将探讨一些关键的最佳实践,包括隐藏服务商资源地址、只安装必要的依赖和工具、只运行必要的服务和端口以及使用堡垒机保护内部资源。这些最佳实践有助于使您的系统和服务更加安全、可靠和高效。
隐藏服务商资源地址
用户可以通过网络访问服务商提供的某些服务,然而服务商提供的资源地址对应着承载该服务的具体资源,并通过带有随机字符串的域名或IP地址来标识。因此,直接将资源地址直接暴露给用户可能会导致攻击者更容易地访问和操纵敏感数据或系统。此外,当需要切换资源时,还需要通知用户及时更新他们的配置信息。
为了提高系统的安全性和灵活性,建议使用负载均衡或代理服务来作为用户和实际服务之间的中介。中间设备应该提供可被管理的域名,并使用CNAME或Alias的方式将服务域名解析到负载均衡或代理服务上。
负载均衡或代理服务再去访问实际服务,从而保护实际服务资源。如果服务商需要更改资源,例如将资源迁移到新的服务器或IP地址,可以通过更新域名解析或者代理服务器配置来更新资源映射,无需让用户更改他们使用的资源信息,从而提升系统的可维护性和可扩展性。
优点:
高性能:通过CDN(Content Delivery Networks)等代理服务将网站内容缓存在位于世界各地的服务器上,减少服务到达用户的距离。这将为远离网站源服务器的用户提供更快的加载时间以及更好的网站性能,从而提高用户满意度和留存率。安全性:通过向用户隐藏服务器的具体信息来提高系统的安全性,使攻击者难以找到具体的服务资源。易扩展:使用代理服务可以对后端的多个实例,提供统一的入口访问,增加服务的扩展性,同时提高了服务的可靠性和灵活性。用户体验:使用单个、易于记忆的域名,而不是特定的IP地址,可以很好的提升用户体验。缺点:
复杂性:额外的负载均衡和代理服务会增加系统复杂度,不合理的配置也可能会对服务的稳定性造成影响增加成本:引入额外的负载均衡和代理服务会增加系统的整体成本,在系统的设计阶段,应合理进行评估和规划。实施要点:
当服务商提供的资源名称带有证书,使用映射后的域名访问会碰到证书不匹配的问题。可以通过使用支持证书的负载均衡设备代理相应的服务来解决这类问题,用户使用域名证书与负载均衡设备进行通信,而负载均衡设备使用资源证书与后台资源进行通信。一些云平台厂商提供具体的负载均衡资源可供参考:
AWS: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.htmlGCP: https://cloud.google.com/load-balancing/docs/https设计合适的负载均衡和代理服务时,要考虑预期的流量、请求的类型、用户的地理位置、正在使用的服务器类型和所需的安全水平等因素。设计还应该考虑对网络延迟、带宽利用率和整体系统复杂性的潜在影响。
只安装必要的依赖和工具
在业务运行的系统中,无论是虚拟机还是容器中,保持系统的最小化和精简化是一种有效的安全措施,只安装必要的依赖和工具可以最大限度地减小系统大小并降低系统的攻击面,减少系统漏洞和风险。
此外,在排查问题时隔离有问题的虚拟机或者容器后仅在必要时安装需要的工具。在排错结束之后,及时销毁这台虚拟机或者容器,可以最大限度地保护系统安全。在安装工具之前,建议先进行必要的安全检查并确保工具的来源和完整性。可以使用数字签名或哈希值验证工具的完整性,以确保安装的工具没有被篡改或植入恶意代码。
优点:
提高性能:通过仅安装必要的依赖和工具,可以降低系统的负载,使虚拟机或容器将运行得更快、更高效。减少存储需求:更少的依赖和工具意味着更少的磁盘空间和内存,可以减少存储成本和系统资源的占用。提高安全性:不安装不必要的依赖文件,可以最大化减少工具和服务产生的漏洞和风险,从而提高系统的安全性和稳定性。易于维护:当需要管理的依赖和工具减少时,系统或容器更新和维护的难度也会降低,节省了运维的时间和精力。缺点:
增加运维复杂度:需要运维人员可以识别哪些是必要的依赖和工具,并且解决它们之间的各种关键依赖问题后成功安装,且要让各种系统或应用可以正常运行。这在一些复杂的系统中,安装的复杂度会快速叠加。有限的功能:在虚拟机和容器的应用开发过程中,前期安装的依赖和库不满足需要,会导致要额外添加或更新依赖和库。这可能会比较耗时,尤其是在虚拟机中安装更新依赖和库。增加运维成本:需要运维通过一些工具或文档记录和维护虚拟机或容器中所安装的所有依赖和库,会增加运维的工作量和成本。实施要点:
使用最小的基础镜像:使用虚拟机或Docker时,你可以选择一个最小的基础镜像,它只包含应用程序所需的组件。在构建系统和应用时,还可以采用分层构建。这些都可以帮助你减小系统和应用的大小并避免安装不必要的依赖项。确定系统或应用的具体要求:在开始安装任何依赖或工具之前,需要确认你的系统或应用要运行什么程序依赖什么库。使用包管理工具:包管理工具可以帮助你只为系统或应用安装必要的依赖项,并管理它们的版本和依赖项。系统的包管理工具如yum/apt等。编程语言的包管理器如 Python 的 pip/poetry、Node.js 的 npm/yarn 和 java 的 gradle等。使用虚拟环境:可以为应用程序创建虚拟隔离环境。这样可以避免不同版本包之间的冲突,并确保你只安装应用程序所需的内容。删除未使用的依赖项:需要你定期检查系统或容器中安装的依赖项并删除不再需要的依赖项。这可以帮助你减小系统或应用的整体大小并提高其性能。实施示例:
Docker的分层构建包管理工具只运行必要的服务和端口
确保系统中只运行必要的服务,并限制服务对外访问权限,是一种常见的安全措施。如果一个服务并不需要对外提供访问,那么最好将其关闭,以避免可能的安全漏洞。如果一个服务有多个端口,最好将业务端口和管理端口分离,并根据需要限制两种端口的访问权限。
优点:
提高安全性:仅启动必要的服务和端口,可以减少系统的攻击面,从而提高系统的安全性。攻击者无法利用未使用的服务和端口进行攻击。提高系统性能:减少不必要的服务和端口,系统将不会浪费资源来处理对应的中断和信息,可以释放系统资源并提高性能。提高可靠性:不需要运行的服务在异常情况下可能会导致系统崩溃或停止响应, 减少不必要的服务和端口,可以减少系统故障的风险。。简化系统维护:减少运行的服务和端口可以简化系统维护。管理员不必费力去维护不必要的服务和端口,从而提高了维护效率。缺点:
特定需求受限:如果只运行必要的服务和端口,则系统可能无法满足一些特定需求,例如网络共享或远程管理等。需要重新评估和配置:如果需要添加新功能或服务,则需要重新评估并重新配置系统以确保安全性和性能。这可能涉及到重新打开某些服务或端口,同时确保它们不会影响系统的安全性和性能。分析和测试:确定哪些服务和端口是必要的,需要进行深入的分析和测试,这可能会增加系统配置的复杂性。实施过程中可能会影响业务的正常运作,需要谨慎评估风险和影响。实施要点:
只运行必要的服务:在系统中只安装并启动需要的服务,避免安装不必要的服务。对于不需要的服务,最好将其卸载或者禁用。限制对外访问权限:对于需要对外提供服务的服务,应该根据实际需求限制访问权限,例如使用防火墙等工具来控制外部访问。同时,对于不需要对外提供服务的服务,应该禁止其对外访问。分离业务端口和管理端口:对于一个服务有多个端口的情况,应该将业务端口和管理端口分离。业务端口用于对外提供服务,而管理端口则用于服务管理和配置。这样可以更好地控制管理端口的访问权限,避免安全漏洞。根据需要限制访问权限:针对业务端口和管理端口,应该根据需要限制访问权限。例如,只允许特定的IP地址或者IP地址段访问,或者使用访问控制列表(ACL)来限制访问权限。使用堡垒机来访问服务资源:使用堡垒机来访问服务资源,能够增加访问控制,并且减少暴露给公网的风险。同时,堡垒机也能够记录所有的访问日志,便于安全审计。实施示例:
在Linux系统中查看当前正在运行的服务和端口在Linux系统中查看特定端口的运行情况使用堡垒机保护内部资源
堡垒机(Bastion Host)或跳板机是一种网络安全设备,通常用于管理和控制远程访问内部网络的权限和流量。它是一种安全网关,位于外部网络和受保护网络的边界,它可以限制只有授权用户或系统管理员通过它来访问内部的受保护资源,从而提高网络安全性。堡垒机也需要定期进行安全检查和升级,以确保其安全性和稳定性。