阿里云 DevOps 资源安全扫描实践

news2024/11/24 18:21:59

随着企业上云进程的加速,云资源的使用量日益增长,云环境中资源的安全性和稳定性成为了企业业务运营的关键要素

面对多样化的云资源和复杂的应用场景,传统的安全管理手段已无法完全满足企业日益严苛的安全需求。为了确保云上资源的安全性,并在快速发展的业务环境中保持稳定性,企业需要采用更智能、自动化的解决方案

对于阿里云,我们实践了对云资源两种不同的扫描方式

脚本语言 + Github Actions

对于一些定制化的需求,最直观的方式当然是直接通过脚本的方式实现

从获取账号下的资源,到合规性到检查,到吐日志信息到控制台或者其他存储介质,最后代码提交到仓库的时候通过 Github Actions 触发脚本运行

整体流程看起来会是这样:

自定义规则校验

让我们从一个最简单的例子开始:Virtual private clouds (VPCs) must be configured and associated to the service

def validator():
	describe_dbinstance_attribute_request = rds_20140815_models.DescribeDBInstanceAttributeRequest(dbinstance_id='YOUR_INSTANCE_ID')
	runtime = util_models.RuntimeOptions()
	response = client.describe_dbinstance_attribute_with_options(describe_dbinstance_attribute_request, runtime)
	json = response.to_map().get("body")
	vpc_id = json.get("VpcId")
	return vpc_id != None
 

校验逻辑实际上非常简单,通过判断 rds 实例信息中有没有 vpc,sdk 文档可以到 openapi 中查看,获取账号下资源和吐日志的部份在这里就不过多展开了,相信还是比较简单的,也会有很多现成的方案

Github Actions 配置

不知道大家平时会不会用到 Actions 来做一些依赖版本更新的检查或者单测等工作,简单介绍一下,主要是通过 workflow 的方式定义工作流,Github 会扫描项目根目录下 .github/workflows 中的 yaml 文件,并行处理其中定义的 jobs

这对于社区开源项目当然没有什么问题,但是对于企业级私有项目并不能直接将脚本运行在公共的 runner 中,所以我们需要为仓库绑定一个 self-hosted 的 runner 来运行我们的脚本

name: "Ali"

on:
  push:
    branches: [master]
  schedule:
    - cron: '0 23 * * *'

jobs:
  Scan:
    runs-on: ["self-hosted"]
    steps:
      - uses: actions/checkout@v1

      - name: "Setup Python Environment"
        shell: bash
        run: pip install -r ./requirements.txt

      - name: "Trigger Script"
	      run: python3  ./main.py
 

Github Actions 提供了非常强大的自定义工作流的功能,可以看到在这个配置文件中我们不只是 push 到 master 分支,还存在一个定时触发的配置,深入学习可以看看这里!(https://github.com/features/actions)

那么到此为止我们走完了一个从验证到触发简单的流程

显而易见的这种方式提供了足够的灵活度(毕竟啥都是手搓的)但是另一方面这实在是稍显简陋,对于仅限于阿里云的资源扫描还有什么其他的方式吗?

阿里云函数计算 + 配置审计

阿里云已经考虑到了一些客户对资源审计的需求,所以有一个现成的 配置审计 控制台,支持通过账号组的方式跨账号扫描资源并汇总到概览页面,这似乎很美好,那让我们深入看看

厂商提供了三种方式定义规则:基于模版创建 / 基于条件自定义 / 基于函数计算自定义

当然一部分需求可以被现成的模版覆盖到,但是大部分并不能被很好的处理,条件自定义也只是提供了一部分字段给用户定义判断逻辑(聊胜于无

那么对于自定义程度比较高的规则我们唯一的选择只有 函数计算

结合了模版和函数计算的流程看起来会是 这样:

 

对于函数计算我们可以把他简单的理解为每个函数有一台机器,然后根据使用方的不同调用不同的方法,他也并不是只为配置审计这一个功能使用

我们同样以判断 vpc 是否存在为例子:

def evaluate_configuration_item(rule_parameters, configuration_item):
    compliance_type = COMPLIANCE_TYPE_NON_COMPLIANT
    annotation = None

    full_configuration = configuration_item["configuration"]
    if not full_configuration:
        annotation = "Configuration is empty."
        return compliance_type, annotation

    configuration = json.loads(full_configuration)
    if not configuration:
        annotation = "Configuration:{} is invalid.".format(full_configuration)
        return compliance_type, annotation

    vpc_id = configuration.get("VpcId")

    if vpc_id != None:
        compliance_type = COMPLIANCE_TYPE_COMPLIANT

    return compliance_type, annotation
 

这是处理判断的主要逻辑,当然还有涉及到和审计配置交互的逻辑在文档中也会有现成的部份 → 基于函数计算创建自定义规则

相信仔细看实现逻辑的话能在里面找到获取资源信息和向配置审计中回调结果的部份

但是如果所有信息都能直接从实例信息中获取到的话理论上我们也可以通过条件自定义的方式实现,对于 openapi 中提供的能力是一点没有,在环境中也没有提供现成的 sdk 那要怎么做呢?

只能是通过 自研签名 从最基本的 http 请求开始了,很庆幸文档最后有基于各种语言的实现

到此为止我们也走通了以 阿里云配置审计 + 函数计算的实现方式

那么这就是完美的方案了嘛?

Py Script vs Ali cc + fc

通过两种方式我们会发现,在自定义程度较高的场景下,我们不得不需要依靠一定的编程的能力来解决问题,python 也只是一个例子,无论是 runner 还是函数计算,都支持多种语言,两种方式的差异主要是体现在触发方式上

众所周知,软件开发没有银弹,每种方式都有适合的场景

接下来会从几个方面对比一下这两种解决方案

综上所述,对于仅限于阿里云的场景,如果对于成本的把控没有那么苛刻的话,云厂商提供的 配置审计 + 函数计算 无疑是更优雅的实现方式,和平台的集成度也更高,但是由于提供的环境不能灵活的自定义,所以一些特殊需求可能实现起来会比较复杂

反之如果有多云的需求,或者对整体执行的流程需要有复杂的定制,编程语言提供的能力会更加强大,也不失为一种选择

最后

无论选择哪种方法,实施资源安全扫描都是保护云环境的必要步骤

应根据自身的特定需求、资源状况和技术能力来制定相应的安全策略,在快速变化的云环境中,持续优化和调整安全方案将是确保企业持续稳定运营的关键

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebGL进阶(十一)层次模型

理论基础&#xff1a; 效果&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vie…

vscode下面python调试报错ImportError: cannot import name ‘Literal‘ from ‘typing‘

1 问题描述 我在vscode下面编写python程序&#xff0c;这个程序是在一个英伟达anoconda环境下的项目。之前能运行能调试&#xff0c;最近发现只能运行ctlf5&#xff0c;但是使用f5进行调试时&#xff0c;报错“File “c:\Users\86137.vscode\extensions\ms-python.debugpy-202…

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下&#xff0c;开发一…

Android 常用命令和工具解析之GPU相关

目录 1、GPU基本信息 1.1 获取GPU基本信息 1.2 伪造GPU基本信息 2、GPU内存信息 3、经典案例 案例1&#xff1a;GPU伪造信息方案 案例2&#xff1a;GPU内存统计算法 GPU 指的是 Graphics Processing Unit&#xff0c;即图形处理单元。GPU 是一种专门用于处理图形和图像相…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

cookie反爬----普通服务器,阿里系

目录 一.常见COOKIE反爬 普通&#xff1a; 1. 简介 2. 加密原理 二.实战案例 1. 服务器响应cookie信息 1. 逆向目标 2. 逆向分析 2. 阿里系cookie逆向 1. 逆向目标 2. 逆向分析 实战&#xff1a; 无限debugger原理 1. Function("debugger").call() 2. …

C++中的erase()函数用法总结

在 C 中&#xff0c;erase() 是 std::string 和 std::vector 等容器中的成员函数&#xff0c;用于删除容器中的元素。erase可以删去容器中指定位置的元素&#xff0c;容器的size&#xff08;大小&#xff09;会改变&#xff0c;但是容器的容量不变。 常用用法&#xff1a; 1.…

全面解析:HTML页面的加载全过程(四)--浏览器渲染之样式计算

主线程遍历得到的 DOM 树&#xff0c;依次为树中的每个节点计算出它最终的样式&#xff0c;称之为 Computed Style。 通过前面生成的DOM 树和 CSSOM 树&#xff0c;遍历 DOM 树&#xff0c;为每一个 DOM 节点&#xff0c;计算它的所有 CSS 属性&#xff0c;最后会得到一棵带有…

Linux|内存级文件原理

目录 进程与文件 Linux下的文件系统 文件操作&#xff0c;及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时&#xff0c;文件必须…

40分钟学 Go 语言高并发:Context包与并发控制

Context包与并发控制 学习目标 知识点掌握程度应用场景context原理深入理解实现机制并发控制和请求链路追踪超时控制掌握超时设置和处理API请求超时、任务限时控制取消信号传播理解取消机制和传播链优雅退出、资源释放context最佳实践掌握使用规范和技巧工程实践中的常见场景…

【SpringMVC - 1】基本介绍+快速入门+图文解析SpringMVC执行流程

目录 1.Spring MVC的基本介绍 2.大致分析SpringMVC工作流程 3.SpringMVC的快速入门 首先大家先自行配置一个Tomcat 文件的配置 配置 WEB-INF/web.xml 创建web/login.jsp 创建com.ygd.web.UserServlet控制类 创建src下的applicationContext.xml文件 重点的注意事项和说明…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件&#xff0c;我的路径是&#xff1a;D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径&#xff0c; 2.用管理员模式打开conf文件&#xff0c;右键管理员&#xff0c;记事本或者not 3.选中的一行新建一…

如何最简单、通俗地理解Python的迭代器?

我们知道迭代器&#xff08;iterator&#xff09;可以用for循环去取数&#xff0c;这和列表取数有什么区别呢&#xff1f; 想理解Python迭起器的差异&#xff0c;有个很简单的例子 打个比方&#xff0c;你去玩街头投篮机&#xff0c;可以投5个球&#xff0c;这里有两种方式&a…

JavaEE 【知识改变命运】02 多线程(1)

文章目录 线程是什么&#xff1f;1.1概念1.1.1 线程是什么&#xff1f;1.1.2 为什么要有线程1.1.3 进程和线程的区别1.1.4 思考&#xff1a;执行一个任务&#xff0c;是不是创建的线程或者越多是不是越好&#xff1f;&#xff08;比如吃包子比赛&#xff09;1.1.5 ) Java 的线程…

Linux内核USB2.0驱动框架分析--USB包

一&#xff0c; 包的组成 每个包都由SOP&#xff08;包起始域&#xff09;、SYNC&#xff08;同步域&#xff09;、Packet Content&#xff08;包内容&#xff09;、EOP&#xff08;包结束域&#xff09;四部分组成&#xff0c;其中SOP、SYNC、EOP为所有包共有的域&#xff0c…

云轴科技ZStack亮相2024 IDC中国生态峰会,共塑AI时代IT生态新格局

11月21日&#xff0c;2024 IDC中国生态峰会在北京举办&#xff0c;吸引了超过300位生态伙伴齐聚一堂&#xff0c;聚焦行业内最前沿的热点话题。本届峰会以“创见先机&#xff0c;智领风云”为主题&#xff0c;深入探讨宏观经济趋势、技术革新以及如何融合AI与数据技术&#xff…

C0029.在Clion中解决Debug时,提示Process finished with exit code -1的错误

1.错误提示 Process finished with exit code -12.解决办法 如上在使用Debug进行代码调试时&#xff0c;直接出现如上报错&#xff0c;解决办法就是直接点击运行程序&#xff0c;即可查出报错编号&#xff0c;然后根据报错编号来查找问题&#xff1b; 然后在网上就可以根据该…

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程&#xff0c;通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom&#xff0c;根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据&#xff0c;可以使用通义千问&#xff0c;关于LinearScale与BandScale不懂的地方也可以在通义千…

读取各种来源格式单细胞数据集构建seurat分析对象,代做生信分析

参考资料和分析注意事项 全流程的分析指导视频 演示数据集网盘文件 分析参数文件路径格式的特别提示 大家给要分析用到的文件路径或目录路径的时候&#xff0c;以D:/omics_tools/demo_data/scrnaseq/GSE189125/GSE189125_5prime_scRNAseq_seqbatchA_counts.txt.gz 这个文件为…

SQL-多表操作

前文所介绍的sql操作都是基于单表进行的&#xff0c;接下来我们来学习多表操作。 多表设计 在实际的项目开发中&#xff0c;会根据业务需求和业务模块之间的关系进行数据库表结构设计&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xf…