Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

4.146 visualizaciones

Publicado el

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

Publicado en: Tecnología
  • Inicia sesión para ver los comentarios

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)

×