Semantic-based Automated Reasoning for AWS Access Policies using SMT
Introduction
- 访问控制策略是对哪些资源可以访问、由谁访问以及在什么条件下访问的表达性规范。
- 云客户想要一个工具,允许他们根据安全要求检查策略配置
- AWS 提供了一种policy language
- allow statements
- deny statements
- 语句中的条件可以基于访问详细信息,如源地址、加密和其他配置选项
- 99%的policy questions —— 160 milliseconds
- AWS的特点
- AWS策略语言是根据JSON序列化定义的,旨在用于各种云服务和访问控制场景
- ZELKOVA将政策语言的所有组件合并到一个分析工具中
Approach
- 当向AWS服务提出访问请求时,将生成一个请求上下文,其中包括提出请求的主体、请求的资源和请求的具体操作。
- 策略评估引擎将此请求上下文与用户和资源的策略进行比较,以确定是否授予或拒绝访问。
- ZELKOVA通过对所有可能的请求上下文进行推理来验证AWS策略。
- ZELKOVA的基本机制是能够说出一种政策是否比另一种政策更宽松。
Policy language overview
- AWS policy language
- Effect : whether the statement allows or denies access (默认值:deny)
- 允许语句覆盖默认权限,拒绝语句覆盖允许语句授予的权限。
- policy中没有顺序的概念
- Principal : 指定哪些用户、帐户、服务或实体被授予或拒绝访问资源
- Action : 指定了相应资源上允许或拒绝的操作列表
- Resource : 指定授予或拒绝访问的服务特定资源的列表
- Condition : 规定了授予或拒绝访问权限的条件
- Effect : whether the statement allows or denies access (默认值:deny)
Example
- Amazon Simple Storage Service (S3)
- object store
- a logical unit of storage is called a bucket
- uniquely identified through an Amazon Resource Name (ARN)
- 附加到bucket上的策略控制对bucket和bucket中对象的访问
- Encoding of the policies
- To determine if policy X X X is less-or-equally-permissive than policy Y Y Y , ZELKOVA uses SMT solvers to check if
( X 0 ∨ X 1 ) ⇒ ( Y 0 ∧ ┐ Y 1 ) (X_0 \lor X_1) \Rightarrow (Y_0 \land \urcorner Y_1) (X0∨X1)⇒(Y0∧┐Y1)
- To determine if policy X X X is less-or-equally-permissive than policy Y Y Y , ZELKOVA uses SMT solvers to check if
SMT Encoding
- 策略授予的权限被编码为允许语句授予的,并不被拒绝声明撤销的所有权限:
( ⋁ S ∈ A l l o w [ [ S ] ] ) ∧ ┐ ( ⋁ S ∈ D e n y [ [ S ] ] ) (\bigvee_{S \in Allow} [[S]]) \land \urcorner(\bigvee_{S \in Deny} [[S]]) (S∈Allow⋁[[S]])∧┐(S∈Deny⋁[[S]])
其中 [ [ S ] ] [[S]] [[S]]代表权限集合 - 策略中的每个语句都对主体、操作、资源和条件的约束进行编码:
[ [ S ] ] : = ( ⋁ v ∈ P ( S ) p = v ) ∧ ( ⋁ v ∈ A ( S ) a = v ) ∧ ( ⋁ v ∈ R ( S ) r = v ) ∧ ( ⋀ O ∈ C ( S ) [ [ O ] ] ) [[S]] := (\bigvee_{v \in P(S)} p = v) \land (\bigvee_{v \in A(S)} a = v) \land (\bigvee_{v \in R(S)} r = v) \land (\bigwedge_{O \in C(S)} [[O]]) [[S]]:=(v∈P(S)⋁p=v)∧(v∈A(S)⋁a=v)∧