Enable javascript in your browser for better experience. Need to know to enable it? Go here.

DevOps最佳实践之操作系统和服务

作者:冯炜

 

本系列内容是我们在不同项目的维护过程中总结的关于DevOps/SRE方面的最佳实践,我们将致力于在项目上尽最大的努力来推行这些最佳实践。我们希望这些最佳实践能对项目的稳定运营提供帮助,也希望刚接触DevOps/SRE的新人能通过学习这些最佳实践来提升自己在这方面的水平。

 

当涉及到 DevOps/SRE 的最佳实践时,操作系统和服务的管理是一个关键领域。在这个领域,有许多最佳实践可以帮助团队更好地管理他们的系统,提高效率和安全性。

 

在本章中,我们将探讨一些关键的最佳实践,包括隐藏服务商资源地址、只安装必要的依赖和工具、只运行必要的服务和端口以及使用堡垒机保护内部资源。这些最佳实践有助于使您的系统和服务更加安全、可靠和高效。

 

隐藏服务商资源地址

 

用户可以通过网络访问服务商提供的某些服务,然而服务商提供的资源地址对应着承载该服务的具体资源,并通过带有随机字符串的域名或IP地址来标识。因此,直接将资源地址直接暴露给用户可能会导致攻击者更容易地访问和操纵敏感数据或系统。此外,当需要切换资源时,还需要通知用户及时更新他们的配置信息。为了提高系统的安全性和灵活性,建议使用负载均衡或代理服务来作为用户和实际服务之间的中介。中间设备应该提供可被管理的域名,并使用CNAME或Alias的方式将服务域名解析到负载均衡或代理服务上。负载均衡或代理服务再去访问实际服务,从而保护实际服务资源。如果服务商需要更改资源,例如将资源迁移到新的服务器或IP地址,可以通过更新域名解析或者代理服务器配置来更新资源映射,无需让用户更改他们使用的资源信息,从而提升系统的可维护性和可扩展性。

 

优点:

  1. 高性能:通过CDN(Content Delivery Networks)等代理服务将网站内容缓存在位于世界各地的服务器上,减少服务到达用户的距离。这将为远离网站源服务器的用户提供更快的加载时间以及更好的网站性能,从而提高用户满意度和留存率。

  2. 安全性:通过向用户隐藏服务器的具体信息来提高系统的安全性,使攻击者难以找到具体的服务资源。

  3. 易扩展:使用代理服务可以对后端的多个实例,提供统一的入口访问,增加服务的扩展性,同时提高了服务的可靠性和灵活性。

  4. 用户体验:使用单个、易于记忆的域名,而不是特定的IP地址,可以很好的提升用户体验。

 

缺点:

  1. 复杂性:额外的负载均衡和代理服务会增加系统复杂度,不合理的配置也可能会对服务的稳定性造成影响

  2. 增加成本:引入额外的负载均衡和代理服务会增加系统的整体成本,在系统的设计阶段,应合理进行评估和规划。

 

实施要点:

  1. 当服务商提供的资源名称带有证书,使用映射后的域名访问会碰到证书不匹配的问题。可以通过使用支持证书的负载均衡设备代理相应的服务来解决这类问题,用户使用域名证书与负载均衡设备进行通信,而负载均衡设备使用资源证书与后台资源进行通信。
    一些云平台厂商提供具体的负载均衡资源可供参考:

  • AWS: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html

  • GCP: https://cloud.google.com/load-balancing/docs/https

  1. 设计合适的负载均衡和代理服务时,要考虑预期的流量、请求的类型、用户的地理位置、正在使用的服务器类型和所需的安全水平等因素。设计还应该考虑对网络延迟、带宽利用率和整体系统复杂性的潜在影响。

 

只安装必要的依赖和工具

 

在业务运行的系统中,无论是虚拟机还是容器中,保持系统的最小化和精简化是一种有效的安全措施,只安装必要的依赖和工具可以最大限度地减小系统大小并降低系统的攻击面,减少系统漏洞和风险。此外,在排查问题时隔离有问题的虚拟机或者容器后仅在必要时安装需要的工具。在排错结束之后,及时销毁这台虚拟机或者容器,可以最大限度地保护系统安全。在安装工具之前,建议先进行必要的安全检查并确保工具的来源和完整性。可以使用数字签名或哈希值验证工具的完整性,以确保安装的工具没有被篡改或植入恶意代码。

 

优点:

  1. 提高性能:通过仅安装必要的依赖和工具,可以降低系统的负载,使虚拟机或容器将运行得更快、更高效。

  2. 减少存储需求:更少的依赖和工具意味着更少的磁盘空间和内存,可以减少存储成本和系统资源的占用。

  3. 提高安全性:不安装不必要的依赖文件,可以最大化减少工具和服务产生的漏洞和风险,从而提高系统的安全性和稳定性。

  4. 易于维护:当需要管理的依赖和工具减少时,系统或容器更新和维护的难度也会降低,节省了运维的时间和精力。

 

缺点:

  1. 增加运维复杂度:需要运维人员可以识别哪些是必要的依赖和工具,并且解决它们之间的各种关键依赖问题后成功安装,且要让各种系统或应用可以正常运行。这在一些复杂的系统中,安装的复杂度会快速叠加。

  2. 有限的功能:在虚拟机和容器的应用开发过程中,前期安装的依赖和库不满足需要,会导致要额外添加或更新依赖和库。这可能会比较耗时,尤其是在虚拟机中安装更新依赖和库。

  3. 增加运维成本: 需要运维通过一些工具或文档记录和维护虚拟机或容器中所安装的所有依赖和库,会增加运维的工作量和成本。

 

实施要点:

  1. 使用最小的基础镜像:使用虚拟机或Docker时,你可以选择一个最小的基础镜像,它只包含应用程序所需的组件。在构建系统和应用时,还可以采用分层构建。这些都可以帮助你减小系统和应用的大小并避免安装不必要的依赖项。

  2. 确定系统或应用的具体要求:在开始安装任何依赖或工具之前,需要确认你的系统或应用要运行什么程序依赖什么库。

  3. 使用包管理工具:包管理工具可以帮助你只为系统或应用安装必要的依赖项,并管理它们的版本和依赖项。系统的包管理工具如yum/apt等。编程语言的包管理器如 Python 的 pip/poetry、Node.js 的 npm/yarn 和 java 的 gradle等。

  4. 使用虚拟环境:可以为应用程序创建虚拟隔离环境。这样可以避免不同版本包之间的冲突,并确保你只安装应用程序所需的内容。

  5. 删除未使用的依赖项:需要你定期检查系统或容器中安装的依赖项并删除不再需要的依赖项。这可以帮助你减小系统或应用的整体大小并提高其性能。

 

实施示例:

 

  1. Docker的分层构建

  1. 包管理工具

     

system/app

Package Managers

Linux

yum / apt

Python

pip/ poetry

Node.js

npm/ yarn

Java

maven/ gradle

 

只运行必要的服务和端口

 

确保系统中只运行必要的服务,并限制服务对外访问权限,是一种常见的安全措施。如果一个服务并不需要对外提供访问,那么最好将其关闭,以避免可能的安全漏洞。 如果一个服务有多个端口,最好将业务端口和管理端口分离,并根据需要限制两种端口的访问权限。

 

优点:

  1. 提高安全性:仅启动必要的服务和端口,可以减少系统的攻击面,从而提高系统的安全性。攻击者无法利用未使用的服务和端口进行攻击。

  2. 提高系统性能:减少不必要的服务和端口,系统将不会浪费资源来处理对应的中断和信息,可以释放系统资源并提高性能。

  3. 提高可靠性:不需要运行的服务在异常情况下可能会导致系统崩溃或停止响应, 减少不必要的服务和端口,可以减少系统故障的风险。。

  4. 简化系统维护:减少运行的服务和端口可以简化系统维护。管理员不必费力去维护不必要的服务和端口,从而提高了维护效率。

 

缺点:

  1. 特定需求受限:如果只运行必要的服务和端口,则系统可能无法满足一些特定需求,例如网络共享或远程管理等。

  2. 需要重新评估和配置:如果需要添加新功能或服务,则需要重新评估并重新配置系统以确保安全性和性能。这可能涉及到重新打开某些服务或端口,同时确保它们不会影响系统的安全性和性能。

  3. 分析和测试:确定哪些服务和端口是必要的,需要进行深入的分析和测试,这可能会增加系统配置的复杂性。实施过程中可能会影响业务的正常运作,需要谨慎评估风险和影响。

 

实施要点:

  1. 只运行必要的服务:在系统中只安装并启动需要的服务,避免安装不必要的服务。对于不需要的服务,最好将其卸载或者禁用。

  2. 限制对外访问权限:对于需要对外提供服务的服务,应该根据实际需求限制访问权限,例如使用防火墙等工具来控制外部访问。同时,对于不需要对外提供服务的服务,应该禁止其对外访问。

  3. 分离业务端口和管理端口:对于一个服务有多个端口的情况,应该将业务端口和管理端口分离。业务端口用于对外提供服务,而管理端口则用于服务管理和配置。这样可以更好地控制管理端口的访问权限,避免安全漏洞。

  4. 根据需要限制访问权限:针对业务端口和管理端口,应该根据需要限制访问权限。例如,只允许特定的IP地址或者IP地址段访问,或者使用访问控制列表(ACL)来限制访问权限。

  5. 使用堡垒机来访问服务资源:使用堡垒机来访问服务资源,能够增加访问控制,并且减少暴露给公网的风险。同时,堡垒机也能够记录所有的访问日志,便于安全审计。

 

实施示例:

 

  1. 在Linux系统中查看当前正在运行的服务和端口

2. 在Linux系统中查看特定端口的运行情况

使用堡垒机保护内部资源

 

堡垒机(Bastion Host)或跳板机是一种网络安全设备,通常用于管理和控制远程访问内部网络的权限和流量。它是一种安全网关,位于外部网络和受保护网络的边界,它可以限制只有授权用户或系统管理员通过它来访问内部的受保护资源,从而提高网络安全性。堡垒机也需要定期进行安全检查和升级,以确保其安全性和稳定性。

 

优点:

  1. 提高安全性:堡垒机可以对远程访问进行身份验证和授权,确保只有授权的用户可以访问敏感系统和数据,从而提高网络安全性。

  2. 简化管理:堡垒机可以集中管理所有远程访问请求和日志记录,管理员可以更轻松地监控和审计远程访问活动,同时可以简化对远程访问的管理工作。

  3. 减少风险:堡垒机可以监视远程访问并实时响应威胁和攻击,包括拦截和隔离威胁,从而降低风险。

  4. 增强合规性:堡垒机可以记录所有远程访问活动和审计数据,从而更好地满足合规性要求,如PCI DSS、HIPAA等。

 

缺点:

  1. 单点故障:如果堡垒机是一个单节点设备,在它出现故障,所有的远程访问都会受到影响,可能会导致业务中断。

  2. 性能影响:堡垒机需要处理大量的网络流量和访问请求,如果性能不足或配置不当,可能会导致网络延迟或阻塞。

  3. 需要培训:堡垒机需要管理员具备一定的技术知识和技能,包括配置、管理和故障排除等方面,需要额外的培训成本。

  4. 部署复杂:堡垒机需要与其他网络安全工具、身份验证系统和访问控制系统进行集成,部署和配置比较复杂,需要耗费时间和资源。

 

实施场景:

  1. 远程访问控制:企业通常有多个地点或办公室,员工需要远程访问企业内部的系统和应用程序来完成工作。通过实施堡垒机,企业可以控制远程访问的权限和流量,防止未经授权的访问和入侵,并可以记录所有远程访问活动以进行安全审计和监测。

  2. 云安全管理:随着云计算的普及,企业需要管理和控制对云资源的访问和操作。通过实施堡垒机,企业可以控制云主机的远程访问权限和流量,保护敏感数据和系统不受未经授权的访问和攻击,并可以记录所有云访问活动以进行安全审计和监测。

  3. 第三方访问控制:企业通常需要与供应商、客户或合作伙伴共享系统和应用程序,这些第三方用户需要远程访问企业内部资源。通过实施堡垒机,企业可以控制第三方访问的权限和流量,确保只有授权的用户可以访问受保护的资源,同时还可以记录所有第三方访问活动以进行安全审计和监测。

  4. 内部访问控制:企业内部员工需要访问和操作多个系统和应用程序,有时候也需要在不同的权限级别下进行操作。通过实施堡垒机,企业可以控制内部用户的访问权限和流量,保护敏感数据和系统不受未经授权的访问和攻击,并可以记录所有内部用户的访问活动以进行安全审计和监测。

 

实施要点:

  1. 设计网络架构:在部署堡垒机之前,需要先设计好网络架构。这包括确定哪些服务器需要保护,以及堡垒机如何与这些服务器进行通信。需要考虑安全性、性能和可用性等因素来设计网络架构。

  2. 选择堡垒机软件:选择适合您需求的堡垒机软件是非常重要的。需要考虑软件的功能、安全性、易用性和可扩展性等方面,以及它是否满足您的需求。

  3. 安全设置:堡垒机的安全设置是非常重要的,它决定了谁可以访问堡垒机以及如何保护堡垒机。需要为堡垒机设置强密码、限制登录尝试、启用双因素认证、限制网络访问等安全措施。

  4. 认证和授权:为了确保只有授权用户才能访问堡垒机和私有网络,需要配置认证和授权策略。这包括使用身份验证机制、配置访问控制列表(ACL)、限制用户权限等。

  5. 日志和审计:为了监控堡垒机上的用户活动并检测异常行为您需要配置日志和审计功能。这包括记录登录和退出时间、监视用户活动、检测安全事件等。

  6. 监控和报警:为了快速检测并响应安全事件,需要设置监控和报警功能。这包括监视堡垒机和私有网络的活动、检测异常行为、配置警报规则等。

  7. 测试和评估:在部署堡垒机之前,需要进行测试和评估,以确保它能够满足需求并提供足够的安全保护。这包括测试堡垒机的性能、安全性、可用性等方面。

 

感谢

 

非常感谢侯璐璐,许乐和高晓明参与本章的撰写。

 

免责声明:本文内容仅表明作者本人观点,并不代表Thoughtworks的立场

及时了解最新的洞见