Slide 1

Slide 1 text

ネットワークは なぜつながらないのか 〜インフラの意味論的検査を目指して〜 チェシャ猫 (@y_taka_23) ProofCafe AWS Dev Day Online Japan (30th Sep. 2021) Breakout Session G-4 (#AWSDevDay)

Slide 2

Slide 2 text

自己紹介 ● 講演者:チェシャ猫 (@y_taka_23) ○ 主に CloudNative 界隈で活動中 ○ 感想は #AWSDevDay でツイートしてね! ● Amazon Web Service (AWS) の関係者ではありません ○ 本日の内容は論文その他の公開情報から構成したものです ○ 最新の内部実装と一致していることを保証しません

Slide 3

Slide 3 text

Reachability Analysis for AWS-Based Networks Backes J. et al. 2019 https://d1.awsstatic.com/whitepapers/Security/Rea chability_Analysis_for_AWS-based_Networks.pdf

Slide 4

Slide 4 text

本日のコンテンツ ● VPC Reachability Analyzer の概要 ○ 自動でネットワークの到達可能性が検査できる ● SAT ソルバと SMT ソルバ ○ Reachability Analyzer の要素技術 ● SMT ソルバによるネットワークのエンコーディング ○ VPC の到達可能性をどうやって表現するのか

Slide 5

Slide 5 text

VPC Reachability Analyzer Debug Your Network Configurations Automatically Section 1

Slide 6

Slide 6 text

VPC Security group 1 Security group 2 Private subnet Y Private subnet X Instance A Instance B Instance C Ingress: 172.0.0.0/16:TCP22 Egress: 0.0.0.0/0:ALL Ingress: (no rules) Egress: 0.0.0.0/0:ALL SSH-able Non SSH-able 172.0.0.0/16

Slide 7

Slide 7 text

ネットワークのトラブルシュート ● 実際に通信してみて疎通を確認 ○ ping、traceroute、telnet、nc や E2E テストなど ○ 疎通できない箇所はわかっても修正方法はわからない ● 実際の通信は行わず、設定状況を確認 ○ マネジメントコンソールを眺めてアタリをつける ○ 各種設定の「意味」を知っている必要がある

Slide 8

Slide 8 text

つらい

Slide 9

Slide 9 text

VPC Reachability Analyzer ● ネットワークの到達性を全自動で検査 ○ 送信元、送信先、ポート番号、プロトコルでパスを定義 ○ 人間がセグメント毎に原因究明しなくて済む ● 実際にパケットの送出はせず、設定のみから検査 ○ 設定が実際に発揮する効果の「意味」を理解している ○ 修正すべき箇所も含めて (Blocked Path) 判定できる

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

到達可能な場合 ルートを回答 到達不可能な場合 原因となっているコンポーネントを回答

Slide 13

Slide 13 text

私見:インフラの自動検査水準 ● Level 1:構文論的な検査 ○ テンプレートが文法的に正しいか ● Level 2:ルールベースの検査 ○ 個別項目がルールに合致するか(例:0.0.0.0/0 は禁止) ● Level 3:意味論的な検査 ○ 設定が発揮する効果の「意味」まで考えて正しいか

Slide 14

Slide 14 text

Section 1 のまとめ ● VPC ネットワークのトラブルシュートの難しさ ○ 設定項目の「意味」を人間が判断しつつ調べる必要性 ● インフラの検査には「レベル感」がある ○ 単純:構文論 < ルールベース < 意味論:複雑 ● VPC Reachability Analyzer による到達可能性判定 ○ 実際の通信テストではなく設定の「意味」ベースの検査

Slide 15

Slide 15 text

SAT ソルバと SMT ソルバ Core Engines for Automated Reasoning Section 2

Slide 16

Slide 16 text

SAT ソルバ ● 命題論理の充足可能性(SATisfiability)を検査 ○ 各変数に真 or 偽を割り当てて全体を真にできるか ● 例 1:(P ∨ Q) ∧ (P ∨ ¬Q) ∧ (¬P ∨ ¬Q) ○ 答:充足可能(P = True, Q = False が唯一解) ● 例 2:(P ∨ Q) ∧ (P ∨ ¬Q) ∧ (¬P ∨ ¬Q) ∧ (¬P ∨ Q) ○ 答:充足不可能(どう割り当てても全体は偽)

Slide 17

Slide 17 text

SMT ソルバ ● SAT ソルバは命題論理しか扱えない ○ 命題論理に直接翻訳すると問題のサイズが爆発しがち ○ 問題のドメイン知識(例:不等式の推移性)が使えない ● 特定ドメインの理論ソルバを別途実装して組み合わせる ○ 整数の算術、文字列、ビットベクトル、など ○ ∧ や ∨ など論理演算部分は SAT ソルバが担当する

Slide 18

Slide 18 text

SMT ソルバ ● 例 1(整数の算術) ○ 問:(x < y + 2) ∧ (x = 2z + 10) ∧ (y + z >= 10) ○ 答:充足可能(例えば x = 12, y = 11, z = 1) ● 例 2(文字列) ○ 問:str ++ "b" = "a" ++ str ○ 答:充足不可能(先頭の a の個数が合わない)

Slide 19

Slide 19 text

どうやって組み合わせるのか?

Slide 20

Slide 20 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) もともと解きたい問題

Slide 21

Slide 21 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題

Slide 22

Slide 22 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題 P: True, Q: True R: True, S: True 真偽割り当ての可能性 充足可能

Slide 23

Slide 23 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題 P: True, Q: True R: True, S: True 真偽割り当ての可能性 充足可能 理論ソルバで解く問題 Refinement x > 0, y - 2z ≧ 0, y = z, z ≧ x

Slide 24

Slide 24 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) ∧ ¬(P ∧ Q ∧ R ∧ S) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題 理論ソルバで解く問題 x > 0, y - 2z ≧ 0, y = z, z ≧ x 充足不可能なので ¬(P ∧ Q ∧ R ∧ S) を SAT が学習

Slide 25

Slide 25 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題 P: False, Q: True R: True, S: True 真偽割り当ての可能性 充足可能 (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) ∧ ¬(P ∧ Q ∧ R ∧ S)

Slide 26

Slide 26 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題 P: False, Q: True R: True, S: True 真偽割り当ての可能性 充足可能 理論ソルバで解く問題 Refinement x ≦ 0, y - 2z ≧ 0, y = z, z ≧ x (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) ∧ ¬(P ∧ Q ∧ R ∧ S)

Slide 27

Slide 27 text

((x > 0) ∨ (y - 2z ≧ 0)) ∧ (¬(x > 0) ∨ (y = z)) ∧ (¬(x > 0) ∨ (z ≧ x)) Boolean Abstraction P: x > 0 Q: y - 2z ≧ 0 R: y = z S: z ≧ x もともと解きたい問題 SAT ソルバで解く問題 P: False, Q: True R: True, S: True 真偽割り当ての可能性 充足可能 理論ソルバで解く問題 Refinement x ≦ 0, y - 2z ≧ 0, y = z, z ≧ x (P ∨ Q) ∧ (¬P ∨ R) ∧ (¬P ∨ S) ∧ ¬(P ∧ Q ∧ R ∧ S) x = 0 y = 0 z = 0 充足可能

Slide 28

Slide 28 text

Lazy SMT (Online Integration) ● 現在主流の手法は両ソルバが「オンライン」で連携 ○ SAT ソルバの動作の途中でも理論ソルバを呼ぶ ● 制約伝搬(Theory Propagation) ○ 理論ソルバの知識も使って SAT 側の論理式を単純化 ● 矛盾からの節学習 (Conflict-Driven Clause Learning) ○ 充足不可能だった原因をより狭く特定し SAT 側に追加

Slide 29

Slide 29 text

AWS のどこで使われているのか?

Slide 30

Slide 30 text

Tiros(本日のテーマ!) ● ネットワーク設定に関するクエリに答える ○ 例:EC2 インスタンス A から B に SSH 可能か? ○ 実際のパケットは送出せず、設定のみから推論 ● いくつかのサービスのバックエンドとして稼働中 ○ VPC Reachability Analyzer、Amazon Inspector ○ 一部のユーザには API を直接提供している

Slide 31

Slide 31 text

Zelkova ● アクセス制御に関するクエリに答える ○ 例:S3 Object が外部アカウントから読み取り可能か? ○ 実際のアクセスは行わず、設定のみから推論 ● セキュリティ系のサービスに統合されている ○ IAM Access Analyzer、AWS Config、Macie など ○ 内部的には Lambda Function として稼働

Slide 32

Slide 32 text

参考:CI/CD Conference 2021 での Zelkova 解説スライド https://speakerdeck.com/ytaka23/cicd-conference-2021

Slide 33

Slide 33 text

Section 2 のまとめ ● SMT ソルバによる充足可能性判定 ○ 現実の問題に対して SAT は表現力が足りない ○ 個別ドメイン専用の理論ソルバを組み合わせる ● AWS でも SMT ソルバベースの検査機能を提供 ○ Tiros:ネットワークに関する検査 ○ Zelkova:アクセス制御に関する検査

Slide 34

Slide 34 text

ネットワークの意味論と検査 Interpret the Network Semantics for Effective Solvers Section 3

Slide 35

Slide 35 text

Reachability Analysis for AWS-Based Networks Backes J. et al. 2019 https://d1.awsstatic.com/whitepapers/Security/Rea chability_Analysis_for_AWS-based_Networks.pdf

Slide 36

Slide 36 text

3 種類のバックエンド候補 ● Soufflé (https://souffle-lang.github.io) ○ Datalog 言語(Prolog の亜種)の処理系 ● MonoSAT (https://github.com/sambayless/monosat) ○ グラフに関する理論を実装した SMT ソルバ ● Vampire (https://vprover.github.io) ○ 一階述語論理の自動定理証明器

Slide 37

Slide 37 text

各バックエンドのベンチマーク ● Vampire は遅すぎて論外 ● ほとんどのケースでは Soufflé より MonoSAT が速い ● 10 万インスタンスで 数 100 秒から 1,000 秒 ● MonoSAT は複数経路に弱い (Backes J. et al. 2019, Fig. 4)

Slide 38

Slide 38 text

MonoSAT ● グラフに関連する理論が実装された SMT ソルバ ○ ユーザは「繋がる可能性があるエッジ」を入力 ○ MonoSAT は「実際に繋げるエッジ」を解として返す ○ 到達可能性の他にも最小スパニング木なども可能 ● ビットベクトルの理論も実装している ○ グラフの辺に重みが定義できるようになっている

Slide 39

Slide 39 text

g = Graph() n1 = g.addNode() n2 = g.addNode() n3 = g.addNode() e1 = g.addEdge(n1, n2) e2 = g.addEdge(n2, n3) e3 = g.addEdge(n1, n3) Assert(Not(And(e1, e2, e3))) Assert(Or(e1, e3)) Assert(g.reaches(n1, n3)) => e1: False, e2: False, e3: True n1 n2 n3 e1 e2 e3 ● e1, e2, e3 の 3 辺のうち 少なくとも 1 辺は通行不能 ● e1, e3 の 2 辺のうち 少なくとも 1 辺は通行可能 ● n1 から n3 へは到達可能

Slide 40

Slide 40 text

g = Graph() n1 = g.addNode() n2 = g.addNode() n3 = g.addNode() e1 = g.addEdge(n1, n2) e2 = g.addEdge(n2, n3) e3 = g.addEdge(n1, n3) Assert(Not(And(e1, e2, e3))) Assert(Or(e1, e3)) Assert(g.reaches(n1, n3)) => e1: False, e2: False, e3: True n1 n2 n3 e1 e2 e3 ● e1, e2, e3 の 3 辺のうち 少なくとも 1 辺は通行不能 ● e1, e3 の 2 辺のうち 少なくとも 1 辺は通行可能 ● n1 から n3 へは到達可能

Slide 41

Slide 41 text

g = Graph() n1 = g.addNode() n2 = g.addNode() n3 = g.addNode() e1 = g.addEdge(n1, n2) e2 = g.addEdge(n2, n3) e3 = g.addEdge(n1, n3) Assert(Not(And(e1, e2, e3))) Assert(Or(e1, e3)) Assert(g.reaches(n1, n3)) => e1: False, e2: False, e3: True n1 n2 n3 e1 e2 e3 ● e1, e2, e3 の 3 辺のうち 少なくとも 1 辺は通行不能 ● e1, e3 の 2 辺のうち 少なくとも 1 辺は通行可能 ● n1 から n3 へは到達可能

Slide 42

Slide 42 text

g = Graph() n1 = g.addNode() n2 = g.addNode() n3 = g.addNode() e1 = g.addEdge(n1, n2) e2 = g.addEdge(n2, n3) e3 = g.addEdge(n1, n3) Assert(Not(And(e1, e2, e3))) Assert(Or(e1, e3)) Assert(g.reaches(n1, n3)) => e1: False, e2: False, e3: True n1 n2 n3 e1 e2 e3 ● e1, e2, e3 の 3 辺のうち 少なくとも 1 辺は通行不能 ● e1, e3 の 2 辺のうち 少なくとも 1 辺は通行可能 ● n1 から n3 へは到達可能

Slide 43

Slide 43 text

g = Graph() n1 = g.addNode() n2 = g.addNode() n3 = g.addNode() e1 = g.addEdge(n1, n2) e2 = g.addEdge(n2, n3) e3 = g.addEdge(n1, n3) Assert(Not(And(e1, e2, e3))) Assert(Or(e1, e3)) Assert(g.reaches(n1, n3)) => e1: False, e2: False, e3: True n1 n2 n3 e1 e2 e3 ● e1, e2, e3 の 3 辺のうち 少なくとも 1 辺は通行不能 ● e1, e3 の 2 辺のうち 少なくとも 1 辺は通行可能 ● n1 から n3 へは到達可能

Slide 44

Slide 44 text

MonoSAT をどうやって使うのか?

Slide 45

Slide 45 text

VPC ネットワークのエンコーディング ● VPC のネットワークをグラフで表現する ○ ノード:ネットワークコンポーネント ○ エッジ:所属もしくはアタッチされている関係 ● CIDR 等に条件がある部分をビットベクトルで表現 ○ SecurityGroup や RouteTable など ○ クエリと条件が合わない場合はエッジを繋がない

Slide 46

Slide 46 text

VPC Security group 1 Security group 2 Private subnet Y Private subnet X Instance A Instance B Instance C Ingress: 172.0.0.0/16:TCP22 Egress: 0.0.0.0/0:ALL Ingress: (no rules) Egress: 0.0.0.0/0:ALL SSH-able Non SSH-able 172.0.0.0/16

Slide 47

Slide 47 text

Instance A ENI A Security group 1 Subnet X Instance B ENI B Security group 2 VPC Instance C ENI C Subnet Y

Slide 48

Slide 48 text

Instance A ENI A Security group 1 Subnet X Instance B ENI B Security group 2 VPC Instance C ENI C Subnet Y

Slide 49

Slide 49 text

Query protocol: TCP srcAdr: 172.0.1.1 dstAdr: 172.0.2.1 port: 22 e1 e2 e3 e4 Ingress: 172.0.0.0/16:TCP22

Slide 50

Slide 50 text

Query protocol: TCP srcAdr: 172.0.1.1 dstAdr: 172.0.2.1 port: 22 e1 e2 e3 e4 Assert( Implies( Or(srcAdr & 0xFFFF0000 != 0xAC000000, protocol != TCP, port != 22) , And(Not(e1), Not(e2)))) Ingress: 172.0.0.0/16:TCP22

Slide 51

Slide 51 text

Instance A ENI A Security group 1 Subnet X Instance B ENI B Security group 2 VPC Instance C ENI C Subnet Y

Slide 52

Slide 52 text

Instance A ENI A Security group 1 Subnet X Instance B ENI B Security group 2 VPC Instance C ENI C Subnet Y Security group 2

Slide 53

Slide 53 text

なぜグラフ理論を採用したのか?

Slide 54

Slide 54 text

SAT Modulo Monotonic Theories Bayless S. et al. 2015 https://ojs.aaai.org/index.php/AAAI/article/view/9755

Slide 55

Slide 55 text

Boolean Monotonic Theory ● 定義:Boolean Monotonic な理論 ○ 変数が Boolean 値のみを取り、各述語の各変数が False のとき成立するなら True に変えても成立する ● 例:グラフの到達可能性 ○ 新しくエッジを繋いでも(= False から True に変更) もとの状態で到達可能であればやはり到達可能

Slide 56

Slide 56 text

Monotonicity による探索効率化 ● 制約伝播の効率性 ○ 未割り当て変数を仮に True として理論ソルバに投げる ○ 充足不可能なら割り当て済みの範囲で既に矛盾がある ● 学習の効率性 ○ 論理式の組み合わせではなく個々の式が検査可能 ○ 矛盾している式がピンポイントに学習できる

Slide 57

Slide 57 text

Section 3 のまとめ ● VPC ネットワークの SMT エンコーディング ○ MonoSat はグラフに関する理論ソルバを持つ ○ コンポーネントをノードで、接続をエッジで表現 ○ 疎通に条件が要る部分はビットベクトルで表現 ● Monotonicity による探索の効率化 ○ 各変数の割り当てが False で成立すれば True でも成立

Slide 58

Slide 58 text

本日のまとめ Recap Section 4

Slide 59

Slide 59 text

本日のまとめ ● VPC Reachability Analyzer の機能 ○ 実際の通信ではなく設定の「意味」ベースの検査 ● SMT ソルバ の仕組み ○ SAT ソルバと個別ドメイン専用の理論ソルバが連携 ● MonoSAT による VPC ネットワークの意味論的検査 ○ グラフによる表現、Monotonicity による効率化

Slide 60

Slide 60 text

Test Networks by Logic! Presented by チェシャ猫 (@y_taka_23)