Quantcast
Channel: ポン酢ブログ(β)
Viewing all articles
Browse latest Browse all 32

SECCON Beginners CTF 2021のスコアサーバを支える技術(サーバ編・その1)

$
0
0

LifeMemoryTeamの@atponsです。今回のSECCON Beginners CTF 2021も参加いただきありがとうございました。

こちらに書いた通り、今回はAzureを中心としたサービスの利用を行いました。今回は自分の担当部分であるスコアサーバのバックエンドのインフラ部分について書いておきます。

スコアサーバ基盤

f:id:atpons:20210524224357p:plain

Flux CDロゴ引用元: https://fluxcd.io/

今回のスコアサーバは完全自作のLMTdと呼ばれるスコアサーバを投入しました。Go製のWebアプリケーションで、かなり尖ったライブラリや開発環境を採用しています。かなり尖ったせいで自分以外の人に触らせる余地を作れず、結果としてスコアサーバについて心配いただく結果となってしまったことは申し訳ないと思っています。このあたりは今後LMTd使う場合、リファクタへフルコミットして今後もスコアサーバとして安定したものにしていきたいと思っています。

スコアサーバのデプロイ先としてはAzure Kubernetes Seviceを利用しています。今回はAzureを中心としたサービスの利用を行っており、

等を利用しました。AKSを利用することで、複数の環境をすぐにデプロイすることができましたし、external-secretsやcert-manager等はAzureに対応しているため、複雑なコストをかけずに様々な環境をすぐに使えたことが初めてAKSを触りましたが便利だと感じました。サーバのトラフィックを受けるIngressについては、Azure Application Gatewayについては利用を検討したものの、期間等を検討しNGINX Ingress Controllerになりました。

スコアサーバのデプロイ

今回はGitOpsを採用しています。

.
├── cluster
│   ├── cert-manager
│   ├── flux-system
│   ├── ingress-nginx
│   ├── kube-system
│   ├── limebot
│   ├── lmtd
│   ├── monitoring
│   └── proxytest
├── lmtd
│   ├── base
│   ├── dev-base
│   ├── front-base
│   └── overlays
├── secrets
└── tools
    └── limebot

このようなリポジトリが用意され、Flux CDが定期的にReconcileをしてくれて適用される仕組みになっています。Kustomizeなどを書いているのでイメージを更新したらここにプッシュして更新、入れ替えとすることができました。すべての設定をGitで管理することで、不具合発生時のアップデートもしくはクローズがすぐにできるようになったことは非常に便利でした。

スコアサーバ実装

今回のスコアサーバの目玉となる部分については、

  • Prometheus Exporterが統合されている
  • 問題のGitOps(?)が可能

な部分です。この二つについて今回は説明します。

Prometheus Exporterの統合

f:id:atpons:20210524225655p:plain

LMTdは、このようなPromQLを用いて現状のスコア等を集計することが出来ます。

# チームスコア上位10チーム
topk(10, (sum(lmtd_team_score{namespace="production", name!=""}) by (name)))

# 問題毎のサブミッション
sum(lmtd_challenge_submission_correct{namespace="production", name!=""}) by (name)

これをGrafana等に出すことでメトリクスとして表示することができます。その他にもGrafana LokiとPromtailをクラスタにデプロイしておくことで、リクエストログから様々なメトリクスを取得し監視することができました。

f:id:atpons:20210524225842p:plain

また、問題の生ログについてはFluent Bitを別でデプロイして保存しています。特に出番はなかったですが、何かあったときに使えるかなと思って残せるようにしておきました。

問題のGitOps(?)

f:id:atpons:20210524230815p:plain

これはLMTdを作るときから狙っていたものです。先に優秀なCTFチームであるところのWani Hackaseさんのところで実装されていましたが、今回はLMTdにもこれを導入して問題のCDを可能にしました。各種のYAMLを用意しておき、Gitリポジトリと同期する点では共通しています。

---apiVersion: lmtd.lifememory.team/v1beta1
kind: Category
labels:importer.lmtd.lifememory.team/unique-key: category-crypto
spec:name: crypto
  order:1---apiVersion: lmtd.lifememory.team/v1beta1
kind: Challenge
labels:importer.lmtd.lifememory.team/unique-key: challenge-encrypter
spec:name: encrypter
  order:1isPublic:trueownerCategoryUniqueKey: category-crypto
  description: |
    ### hoge
    fuga
    ### piyo
    maru
    [LMT](https://lifememory.team)

---apiVersion: lmtd.lifememory.team/v1beta1
kind: Flag
labels:importer.lmtd.lifememory.team/unique-key: flag-encrypter
spec:ownerChallengeUniqueKey: challenge-encrypter
  content: SECCON
  point:869

また、YAMLに配布物を以下のように定義することでさくらのクラウドのオブジェクトストレージにアップロードし公開することも可能にしました。

apiVersion: lmtd.lifememory.team/v1beta1
kind: Challenge
labels:importer.lmtd.lifememory.team/unique-key: challenge-werewolf
spec:...dists:- name:"app.py" # 配布したいファイル名をfiles以下に置いて書くuploadType: raw
      replaceKey:"<URL>"- name:"Dockerfile" # 配布したいファイル名をfiles以下に置いて書くuploadType: raw

この他に配布ファイル以下をtar.gzに固める等も実装しており、できるだけ作問者が意識せずに済むようにしました。(この辺は実は突貫になってしまいました)

このCDの方法については、GitHub ActionsなどのCIツールを使用せず、kubernetes/git-syncを用いて実装しました。LMTdのサイドカーとしてWebhookを受け取って指定されたディレクトリをインポートするだけのアプリケーションを書いて、あとはgit-syncコンテナが自動で継続的にPullを行ってWebhookを投げてくれることで、CIツールなどを用意せずに継続的デリバリーを可能にしました。

また、デプロイの冪等性を担保するために今回はKubernetesマニフェスト風のYAMLなものの、ユニークなキーをYAMLごとに付与させることでファイル名やディレクトリ構造にできるだけ依存しないようなデプロイが可能なようにしました。(ファイルのアップロードを突貫で作ったため、このあたりは微妙になってしまいましたが)

※デプロイ時に差分計算も行っています

Kubernetes ControllerでなくてもKubernetesマニフェストのような書き方をしてCDをするアイデアは、PipeCDからアイデアを得ました。また、git-syncの場合は完全なReconcileにはならないことが注意が必要です。LMTd v2になったらきっとCTF Controllerができるでしょう。

おしまい

スコアサーバについては、まだまだ語りたいことがあり、ここには余白が足りないので第二弾の記事も書こうと思っています。まず、今回はどのようなインフラで動いていたのか、忘れないうちに書いておこうと思い備忘録的に書きました。今回は、参加ありがとうございました!

スコアサーバのオープン時、不具合でユーザーの一部の方々にはご心配とご迷惑をおかけしたことを申し訳なく思っております。オープン時の不具合については再発防止を行い、安心してCTFをお楽しみいただけるよう改善していく予定です。

参考リンク


Viewing all articles
Browse latest Browse all 32

Latest Images

Trending Articles


天達武史が結婚した嫁画像は?出身高校や大学は?本名や年収って?


報道局ニュースセンターで番記者として活躍中の澤井さん。そのやりがいとは?(ビジネスパーソン研究FILE Vol.175 株式会社テレビ朝日 澤井尚子さん)


[1080p]回復術士のやり直し 11 完全《回復》ver.


画像・写真】ららぽーと横浜で16歳男子高校生が転落死 不審な動き→逃走し警備員に追いかけられ→柵越え飛び降り・12m転落 窃盗・万引き?それとも盗撮?


[PS2] Dragon Quest V [ドラゴンクエストV 天空の花嫁] ISO (JPN) Download


《實衣與山田小姐》絕對是近年看到最討厭最噁心的漫畫,認為這部是對殘障人士的偏見我能理解,原本是支持派覺得作者很努力想在這個議題維持平衡藉由漫畫傳遞些什麼,...


ヴァンパイア・ノーツ 攻略


aki373: 電脳学園III トップをねらえ! ユング・フロイト


冬うらら一陽嘉節祝いの夜!12月11日開店!原辰徳氏経営の創作料理【麻布十番 嘉(YOSHI)】


ロンドンの学べるホラースポット「クリンク刑務所博物館」|イギリス|Travel.jp[たびねす]



Latest Images