Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計

3,489 views

Published on

NGK2015B で使用したスライドです。モデル検査器 Alloy を用いて、AWS のセキュリティグループ設定を自動で検査します。

Published in: Technology
  • Be the first to comment

AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計

  1. 1. AWS は形式手法の夢を見るか? モデル検査器 Alloy によるインフラ設計 チェシャ猫 (@y_taka_23) NGK2015B 昼の部 (2015/12/05)
  2. 2. 自己紹介 ● 名前 : チェシャ猫 ○ Twitter: @y_taka_23 ○ GitHub: y-taka-23 ● 仕事 : インフラ担当 ○ 主に AWS 周り ○ もうちょいアプリ側やりたい
  3. 3. Amazon Web Service
  4. 4. AWS のネットワーク周り ● セキュリティ系 ○ Security Group ○ Network ACL ● ルーティング系 ○ Route Table ○ VPC Peering ○ Route 53
  5. 5. しかし現実は……
  6. 6. 複雑化、破綻しがちな運用 ● セキュリティ系() ○ 場当たり的に開けられるポート ○ 誰も把握できない許可・禁止ルールの重複 ● ルーティング系() ○ あちらが通じればこちらが通じない Route Table ○ なぜか解決できないドメイン名 ○ どんどん増える VPC Peering
  7. 7. インフラをきちんと設計したい?
  8. 8. 形式手法を使ってみよう!
  9. 9. Alloy Analyzer って? ● 形式手法の一種、モデル検査のツール ● 低い検証コスト + 強力な可視化 ○ 関係によってモデルを定義 ○ 検査したい制約を記述 ○ 制約を満たす / 満たさない例を全数探索 ○ 発見した例をいい感じに可視化
  10. 10. 例えば Security Group https://gist.github.com/y-taka-23/89a98fdb2ba48710a39c
  11. 11. 関係でモデルを定義する sig Instance { priIPs : some IP, secGrps : set SecurityGroup, } sig SecurityGroup { inRules : set Rule, outRules : set Rule, }
  12. 12. 関係でモデルを定義する sig Instance { priIPs : some IP, secGrps : set SecurityGroup, } sig SecurityGroup { inRules : set Rule, outRules : set Rule, } インスタンス 1 個に対して IP アドレスが 1 個以上複数個対応
  13. 13. 関係でモデルを定義する sig Instance { priIPs : some IP, secGrps : set SecurityGroup, } sig SecurityGroup { inRules : set Rule, outRules : set Rule, } インスタンス 1 個に対して セキュリティグループが 0 個以上複数個対応
  14. 14. 検査したい制約を記述する pred inboundOK(src, dest : Instance, proto : Protocol, port Port) { some r : dest.secGrps.inRules | proto = r.protocol && port in r.ports && some (src.priIPs in r.source.ips + src.secGrps in r.souce) }
  15. 15. 検査したい制約を記述する pred inboundOK(src, dest : Instance, proto : Protocol, port Port) { some r : dest.secGrps.inRules | proto = r.protocol && port in r.ports && some (src.priIPs in r.source.ips + src.secGrps in r.souce) } 通信先インスタンスのセキュリティグループの あるインバウンドルール r について
  16. 16. 検査したい制約を記述する pred inboundOK(src, dest : Instance, proto : Protocol, port Port) { some r : dest.secGrps.inRules | proto = r.protocol && port in r.ports && some (src.priIPs in r.source.ips + src.secGrps in r.souce) } ルール r は指定されたプロトコルで
  17. 17. 検査したい制約を記述する pred inboundOK(src, dest : Instance, proto : Protocol, port Port) { some r : dest.secGrps.inRules | proto = r.protocol && port in r.ports && some (src.priIPs in r.source.ips + src.secGrps in r.souce) } ルール r は指定されたポート番号を含み
  18. 18. 検査したい制約を記述する pred inboundOK(src, dest : Instance, proto : Protocol, port Port) { some r : dest.secGrps.inRules | proto = r.protocol && port in r.ports && some (src.priIPs in r.source.ips + src.secGrps in r.souce) } ルール r は送信元インスタンスのプライベート IP またはセキュリティグループを含む
  19. 19. 具体例を全数探索 run { some disj i1 i2 : Instance, proto : Protocol, port : Port | inboundOK[i1, i2, proto, port] && outboundOK[i1, i2, proto, port] }
  20. 20. 具体例を全数探索 run { some disj i1 i2 : Instance, proto : Protocol, port : Port | inboundOK[i1, i2, proto, port] && outboundOK[i1, i2, proto, port] } 相異なる 2 つのインスタンス i1, i2 について
  21. 21. 具体例を全数探索 run { some disj i1 i2 : Instance, proto : Protocol, port : Port | inboundOK[i1, i2, proto, port] && outboundOK[i1, i2, proto, port] } Security Group の設定上、通信が可能
  22. 22. この間、わずか 0.3 秒
  23. 23. 発見された具体例いろいろ
  24. 24. 発見された具体例いろいろ
  25. 25. 発見された具体例いろいろ
  26. 26. こんな応用どうだろう? ● 通信の到達可能性 / 不可能性の確認 ● 不要なルール設定の発見 ● IAM によるアクセス権限制御の検証 ● 無駄に課金しない運用フローの作成
  27. 27. まとめ ● インフラ設計に形式手法の力を ● Alloy Analyzer でお手軽モデリング ● アイデア次第で色々な応用が
  28. 28. Have a Nice Infrastructure! presented by チェシャ猫 (@y_taka_23)

×