こんにちは。アルバイトの take (@ww24) です。
みなさん、情報セキュリティに気を付けていますか?
特に Web サービスにおいて、セキュリティへの配慮は必要不可欠です。とりあえず動けば良いと、正常系にのみ気を取られていると脆弱性は生まれます。
先日、社内で Web Security 勉強会を実施しました。
Web Security 勉強会とは
この Web Security 勉強会は、毎週金曜日に行っている社内勉強会とは別に業務の一環として実際に起こり得るセキュリティ・インシデントを想定し、特に重要な内容を3回に分けて各回座学とハンズオンのセットで実施していくものです。
昨年、秋の情報セキュリティスペシャリスト試験に合格した僕と、 SECCON CTF 全国大会に出場した社員が教材担当としてアサインされ、初のセキュリティ勉強会を 6/19(座学) と 6/30(ハンズオン) に実施しました。
第1回目の目的と内容
目的は、適切なアクセスコントロールの設計とテストの方法を理解する事です。
第1回目として、もっとも基礎的で危険な脆弱性を扱いました。
それは、”強制的ブラウジング”や、”アクセス制御や認可制御の欠落”と呼ばれるものです。ログインしなくても他人のプライベートな投稿や画像が見れてしまうのが典型的な例です。
名前の通り、アクセス制御や認可制御が欠落すると起こります。Web アプリケーションの設計において、適切なアクセス制御や認可制御とはなにか? というテーマで解説しました。
ハンズオン
座学とは別の日に、同じテーマでハンズオンを行いました。
ハンズオンでは手を動かして、脆弱性がある Web アプリケーションを攻撃し、発見した脆弱性を修正するという内容になっています。
このハンズオン環境の構築には Docker を利用しました。
ハンズオンでは参加者全員に同一の環境を提供する必要がありますが、 Docker を利用すると低コストで実現可能です。その上、アプリのコードや DB への変更が他の環境へ影響しないように各環境を隔離することができます。
3~4人の参加者ごとにチームを作り、各チームに1つずつ Docker コンテナを割り振りました。
各チームは用意された Docker コンテナに SSH でログインし、課題に取り組みました。
ハンズオン環境
前述の通り、チームごとに隔離された環境の土台として Docker を用い、その上に Supervisor で OpenSSH, MySQL, Nginx, PHP-FPM を立ち上げました。本来 Docker はコンテナの中に単一のプロセスしかないアプリケーションコンテナとして利用しますが、今回は管理の手間を省くためにシステムコンテナとして利用しました。
PHP のバージョンは最新の 5.6、テンプレートエンジンは社内でもっとも利用されている Smarty、エディタは宗教戦争が起こらないよう Vim, Emacs はもちろん、学習コストの低い nano も導入しました。
URI とResource を意識して index.php の1ファイルだけでルーティングを俯瞰できるよう、 Slim というマイクロフレームワークを採用しました。
Slim Framework を用いることでコントローラを1つの PHP ファイルにまとめて記述できて可読性も上がるため、時間の限られているハンズオンに適しています。
課題 – MISSON –
ハンズオンでは、座学で学んだことを活かしてミッションをこなしていきます。
まず、用意された環境にはアプリケーションのコードは無いので git clone します。
アプリケーションの稼働に必要な database や table をセットアップします。
今回の本題であるアクセス制御、認可制御に関わる脆弱性を探します。20分程度で探してもらいました。
5チーム全てが時間内に発見し、修正方法を考えていました。
最後のミッションは脆弱な実装の修正です。こちらは30分程度時間を取りました。
時間内に修正できたチームは1チームでした。
最後に、修正方法を紹介して第1回 Web Security 勉強会は幕を閉じました。
Web Security 勉強会を開催してみて
このような勉強会を行う上で難しいのは、対象者に合わせたレベルの課題設定だと思います。
テスターからベテラン社員まで経験年数が様々な方を対象としたので、上に合わせると新人の方が付いて来られなくなり、下に合わせると常識的なことも全て説明する必要があり、時間内に収まりきらず多くの参加者にとって退屈な内容になってしまいます。
そこで今回、社内勉強会としては初めてチーム形式を試みました。 チームで協力することで一人で悩んでも解決しない問題も、チーム内で教え合うことによって新人の方が置いていかれないようにするという意図があります。
結果として勉強になった方が多かったようで、成功を収めました。
しかし、実施後のアンケートでは課題が難しい、実装についての説明が不足しているという声も少なくありませんでした。
これについては今後改善していきたいと思います。
講師として資料を作成しているとまだまだ学ぶことも多いです。今後も勉強を続け、社内に貢献していきます!
インフィニットループではエンジニアを募集しています。
PHP で安全な Web アプリケーションを開発したい方は、ぜひ以下のページからご応募ください。
→ インフィニットループ採用情報ページ