Semgrep是一种新兴的静态分析工具,正在AppSeccommunity中引起关注。它对多种编程语言的广泛支持以及创建规则的简便性,使其成为功能强大的工具,可以帮助AppSec团队扩大工作量,以防止其代码库中存在完整的漏洞类别。
但是云安全性如何?在“基础架构即代码”时代,诸如Terraform,CloudFormation,Pulumi(以及许多其他工具)之类的工具被用于从事实上的源代码中提供基础架构,我们是否可以采用相同的方法从代码库中消除与云相关的漏洞类?
我决定在周末的一部分时间中对此进行试验,以了解Semgrep可以为云/平台安全团队提供什么。
在进入细节之前,值得解释一下Semgrepactually是什么。根据他们的网站,Semgrep是:
一种快速,开源的静态分析工具,擅长表达代码标准(无复杂查询),并在编辑,提交和CI时尽早发现bug。
精确的规则看起来像您要搜索的代码;不再遍历抽象语法树或与正则表达式搏斗。
Semgrep注册表具有由Semgrep社区编写的1000多个规则,涉及安全性,正确性和性能错误。除非您愿意,否则无需DIY。
在较高的层次上,Semgrep利用抽象语法树(AST)建立您正在分析的代码的模型。与其他基于AST的工具不同,Semgrep通过抽象化AST语法本身来降低条目栏。
开箱即用的Semgrep支持主流编程语言(例如Go,Java,Python,Ruby,Javascript等),并具有可重复使用的开源规则库。
解释如何使用Semgrep超出了本博客文章的范围,但是官方文档确实制作精良,并且在线游乐场是开始使用它的绝佳空间(无需花时间安装任何东西)。
如前所述,Semgrep可以给AppSec teamsis带来明显的好处(如果您仍然不满意,我建议您观看Clint Gibler的本次演讲)。
我很好奇的尝试是,同一种方法可以很好地适应Terraform(HCL)和YAML文件制成的代码库,因为Semgrep当前不支持这些语言。因此,我依靠其通用模式匹配引擎。
在此文件夹中,我们可以看到已经开放了7条规则,主要集中在Terragoatscenarios和S3存储桶上。
让我们通过选择未加密的ebs-volume规则来开始思考。在回购中,我们可以看到一个样例Terraform文件(如下所示):
资源" aws_ebs_volume" " web_host_storage" {Availability_zone =" ap-southeast-2"已加密=假大小= 1#规则ID:未加密的ebs-volume标签= {名称=" abcd-ebs" }}
非常简单,使用aws_ebs_volume资源声明一个禁用了加密的EBS卷(从加密= false可以看出)。
因此,我们要在此处进行grep的原因是出现了加密= false(或缺少加密= true),如相应规则所示:
规则:-id:未加密的ebs-volume模式:-pattern-任一个:-pattern:| {...}-pattern-not-inside:|资源" aws_ebs_volume" " ..." {... encryption = true ...}-模式内:资源" aws_ebs_volume" " ..." {...}语言:-通用路径:包括:-' * .tf'讯息: EBS卷配置为未启用加密。严重性:警告
作为第二项测试,我想创建我的第一个Semgrep规则以检测对世界开放的安全组(0.0.0.0/0),如下所示:
资源" aws_security_group" " allow_tls" {name =" allow_tls" description ="允许TLS入站流量" vpc_id = aws_vpc。主要。 id入口{description =" VPC中的TLS" from_port = 443 to_port = 443协议=" tcp" cidr_blocks = [" 10.0.1.0/24" ," 0.0.0.0/0" ]}标签= {名称=" allow_tls" }}
我们想在这里grep的是在入口块内出现的0.0.0.0/0:
规则:-id:开放安全组模式:-模式内部:入口{...}-模式:" 0.0.0.0/0"语言:-通用路径:包括:-' * .tf'讯息:一个安全组允许来自公共Internet(0.0.0.0/0)的入站流量。严重性:警告
当然,这是一个不同的基本情况,其中,有问题的字符串(0.0.0.0/0)直接在安全组定义中进行硬编码。如果我们要考虑可以通过例如变量指定CIDR的情况,则必须扩展该规则。
接下来,我想创建一个更专注于Kubernetes(或更确切地说,YAML文件)的规则。
让我们以以下示例为例:您可能希望将所有Kubernetes入口强制为私有,并删除所有公共的:
apiVersion:extensions / v1beta1种类:入口元数据:名称:测试入口注释:kubernetes.io/ingress.class:公共规范:规则:-http:路径:-路径:/ testpath pathType:前缀后端:服务:名称:测试端口:数量:80
在此示例中,我们要对kubernetes.io/ingress.classannotation进行grep验证,并确保其具有nginx-internal的批准值:
规则:-id:公共入口模式:-模式:kubernetes.io/ingress.class-模式不在内部:| kubernetes.io/ingress.class:nginx内部语言:-通用路径:include:-' * .yaml'讯息:一个Ingress已公开。严重性:警告
我不得不说Semgrep的可扩展性和简单的语法对云安全团队也非常有前途。在几小时内,由于有了官方文档和Playground,我得以从绝对0编写我的第一个规则。 目前,我能想到的主要挑战是:使用Confa进行Semgrepoverlap的费用是多少?尽管Conftest最初是考虑到云资源而创建的,但受益于其他OPA产品(如Gatekeeper)的弊端,基本上每个人 我认为这可能是一个决定性因素,可能有助于扩大平台团队对Semgrep的支持,因此,业界有时会抱怨Rego语言是如此繁琐。 我很想听听其他人对此的看法,因此请随时在Twitter上与我联系。