オンラインコンパイラ「Amadeus」の開発OSC 前夜祭@mrtc0
View Slide
> whoamiもりたこ(@mrtc0)広島工業大学 B3#seccamp'15,16#ctf4b NW/ForensicsWebApp Pentenster(好きな||嫌いな)脆弱性: DOM Based XSS2
Amadeusとは?3
Aiming to the most accessible developmentenvironment for university students学生のための開発環境(オンラインコンパイラ)4
牧瀬紅莉栖とは関係ないです5
> 背景プログラミング初学者がどこで躓くのかテスト(試験)だけではわからないコーディングの様子を監視したい環境構築に時間を取らせたくないVisualStudio, MSYS, Cygwin...オンラインコンパイルつくるか!!6
> 構成バックエンドDjango REST Framework, NodeJSフロントエンドVueJS, ReactJS, ElectronコンテナLXD7
8
> 特徴多言語C(gcc,clang), Java, Scala, Python, Ruby...RESTful API補完可能なエディタAceEditorをfork入力を1文字ずつロギングOnline Judge機能9
> 特徴ユーザーのリアルタイム監視コピペの検知, 正解までのdiffなど変数トレーサーGDBのPythonAPIを利用Terminalgottyをforketcチャットなど10
> DEMO11
> コンテナユーザーのコードを安全に実行コード実行環境を隔離/仮想化コンテナ技術の利用cgroupsやNamespaceによるホストとの分離ホスト側/他コンテナに影響を及ぼさないできるだけ速く,オーバーヘッドが小さいもの12
> どのコンテナ使うか問題Docker? FreeBSD Jail? LXC?Dockerはオーバーヘッドが大きい印象があった速度, スケーラビリティでLXDを採用LXCをより柔軟に扱うための機構(OpenStackプラグインもあるので遊びたい...13
> Security各種リソース制限LXC cgroupsでCPUやメモリ使用量, プロセス数を制限ディスク領域の制限特に設けていない(!w)LXDはZFS, btrfsでのみ制限可能Quotaで制限をかけるか検討中14
> Restful APIDjango REST Frameworkで実装$.ajax({'type': 'POST','url': '/api/compiler/','data' : {'post_code': '#include \nint main()...','stdin': '1 2 3','language': 'c-gcc',...},'dataType' : 'json',...15
> ユーザーの監視担当講師が1人ずつ見て回るのは大変全員のコーディング状況を把握チャットによるアドバイスServer Sent EventとWebSocket16
> DjangoでWebSocketしんどいNginx + uwsgiで苦戦NodeJS(Express)で実装することにDjangoのセッションをNodeJSから利用するRedisにセッション情報を保存NginxのリバースプロキシでCookieのSOP制限回避17
18
> その他無限ループ対策SIGALRMをPythonから叩く@timeout(5)def execute_code():# コンテナでコードを実行する関数...except TimeoutError:container.execute('kill -9 a.out')...19
> 作ってみて/運用してみて型...UI構成が難しいここが一番しんどかったどこに何のボタンを配置すればいいかDB, モデル設計大事...「SQLアンチパターン」をもっと早く読んでおくべきだった...20
> 作ってみて/運用してみて学習から試験まで使える上に全てのログが取れるので重点的に教える箇所が分かるユーザー(学生)から好評やはりこれが一番うれしかった21
> 今後の展望取得したデータの分析対応言語などの拡張教師の自動化とプログラムの評価できればOSS化していきたい22