akiyoko blog

akiyoko の IT技術系ブログです

DjangoCongress JP 2019 で「現場で使える Django のセキュリティ対策」というタイトルで登壇してきました

akiyoko です。

昨日の DjangoCongress JP 2019(Day 1 カンファレンスデー)で「現場で使える Django のセキュリティ対策」というタイトルで登壇してきました。その報告です。


発表資料は こちら にアップしています。


発表の動機

仕事の現場でもっと Django を使ってほしい という想いから、この発表を思い立ちました。Django 普及の突破口のひとつとして、まずはセキュリティの懸念を取り払うことが重要なのでは?と考えたのです。

Python が企業でも幅広く使われるようになったことや書籍が充実し始めたことで、日本でもようやく Django が注目されるようになりました。4月に待望のバージョン2系の LTS がリリースされ、ますます現場で Django が盛り上がることが予想されますが、導入検討の際にネックになるもののひとつに「セキュリティ」への懸念があります。私は現在、ある Django プロジェクトの立ち上げに携わっているのですが、そこで実際によく言われたのが「Django ってセキュリティ的にどうなん?」 でした。日本では(特に SIer 界隈では)Django がまだあまり知られていないので、そのような疑問が出てくるのは当然といえば当然かもしれません。

一方の開発者からすると、フルスタック(全部入り)の Django にはデフォルトでセキュリティ対策も含まれていますが、そのあたりの理解が中途半端だと、リリースした Webアプリケーションが悪意ある攻撃者の格好の餌食になってしまいかねません。そうならないためにも、Django のセキュリティ事情については開発前から(もちろん開発中でも)きちんと把握しておきたいところです。

そこで今回、IPA(情報処理推進機構)が注意喚起情報として公表している「安全なウェブサイトの作り方」という冊子にまとめられた代表的な脆弱性の概要と、それらの脆弱性に対して Django では具体的にどのような対策をしているのかについて解説することにしました。これによって発注側企業においてはセキュリティの懸念が払拭され、一方の開発側企業においてはセキュリティ施策のヒントとして活用されることを期待しています。

対象者

対象者は、Django の導入を検討している方、および Django を使った Webアプリケーション開発者 を想定しています。なお、Django 初級者の方にも十分理解できる内容になっていると思います。

Webアプリケーションの基本的な知識(特に Cookie を使ったセッション管理や HTTPヘッダなどの知識)があれば、セキュリティの知識についてはほぼゼロ(用語を何となく聞いたことがあるレベル)でも問題ありません。CSRF などの重要な、そして重要な割にあまりよく理解されていないものについては、「CSRF(しーさーふ)って何?」というレベルの人にも分かるように基本から解説しています。

ポイント

メインの話題として

① Webアプリケーションのセキュリティ対策ってそもそも必要なの?
② 「これだけは絶対やっとけ」的な基準はある?
③ フルスタック(全部入り)の Django を使えばセキュリティ対策もまるっと万事解決?

の三点について話しました。
詳細についてはスライドをご覧ください。

発表の準備

昨年の LT でド緊張して失敗した苦い思い出があるので、今回はまず、心構えから入りました。事前に読んだのは、たまたま見つけた オリラジ中田さんの講演会ログ です。要約すると、プレゼンでは「カンペを読まない」「言い訳しない」「練習をサボらない」の3つのタブーがあるということです。中でも、人前で練習をすることが「練習」でそれ以外は「練習」ではない というのはまさにその通りだと思い、リハーサルをなるべく多くこなそうと考えていました。

発表の内容については CFP を出した頃に目次レベルまで固めていたのですが、実際に発表資料を準備し始めたのは仕事の関係もあって GW の終盤からとなりました。しかしこれはちょっと遅すぎました。資料が完成したのは本番5日前。そこから2回、会社の Django 経験者やコンサルタントのメンバーの前、そして現プロジェクトメンバーの前でのリハーサルをおこないました。メンバーからのフィードバック、そして自身の反省から、資料がブラッシュアップされていき、話した方がよいこと・話さなくてよいことが明確になり、想定問答も明らかになって私にとっては良いこと尽くめでした。もっとリハーサルをしたかったのですが、何度も集まってもらうのもメンバーの負担になるのと、直前にフィードバックをもらっても反映できない、余計に混乱してしまうと感じたので、これが限界だったのかも知れません。あとはブツブツ独り言を繰り返し、本番の流れをイメージしていきました。


フィードバックの中で、「図を指差しで説明するよりもレーザーポインターでやった方がいい」と言われて急遽買ったのがこれ。パワポのページ送りもできます。本番前日の夕方に届きました。しかしこれが、当日あのような事件を引き起こすことになろうとは。。


あと、GW 中盤に引いた風邪がずっと長引いていたので体調を整えるために前日夜にマッサージに行ったのですが、強かったのか余計に首を痛めてしまいました。


発表はどうだった?

「発表前にやることリスト」を作っていたので、それを淡々とこなすことで緊張はギリギリのところで抑えられていました。

しかし、プレゼン開始直後に事件が起きました。前日の動作チェックでは問題なかったレーザーポインターがページ送りができなくなり、直前に使用を諦めました。これで緊張のコップから水が少し溢れてしまいました。。


f:id:akiyoko:20190519130935p:plain:w180

この事件がきっかけとなって冒頭の10分はガチガチでした。途中からあきらめの境地に至ってから割と話せるようになったと思いますが、そこで何とか踏み止まれたのも事前のリハーサルのおかげです。あれが無ければもうボロボロの結果になったに違いありません。協力してくださった皆さん、本当にありがとうございました。



質問

想定よりも時間がかかってしまいましたが、発表は42分頃に終わりました。そこで出た質問について補足します。

Q.{% csrf_token %} タグを入れ忘れてしまうのを防ぐ方法はないのか?

POST リクエストを送信する form 要素に {% csrf_token %} タグを入れ忘れると、403 エラーが出ます。しかしながら、CsrfViewMiddleware を無効にするなり @csrf_exempt デコレータを利用したりすると、CSRF 検証はされずに脆弱性が露呈してしまいます。会場では、設定ファイルのセキュリティチェックをしてくれる「python manage.py check --deploy」を実行すれば CsrfViewMiddleware が無効化されていることをチェックできるかも知れないと回答しましたが、それを改めて検証してみました。

実際に CsrfViewMiddleware を「MIDDLEWARE」からコメントアウトして check コマンドを実行すると、期待通りに CsrfViewMiddleware が無効化されているという警告が出ました。

(venv) $ python manage.py check --deploy
...(略)...
?: (security.W003) You don't appear to be using Django's built-in cross-site request forgery protection via the middleware ('django.middleware.csrf.CsrfViewMiddleware' is not in your MIDDLEWARE). Enabling the middleware is the safest approach to ensure you don't leave any holes.


いい感じですね。


反響

いろいろと反響をいただきましたが、一番驚いたのがこれです。


あの徳丸さんにTweetしてもろた!😲マジか!

徳丸さんは、私の発表でも紹介した Webアプリのセキュリティ対策の金字塔「徳丸本」こと『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』の著者です。現場でも必読書になっています。



あと夕方頃に気付いたのがこちら。Speaker Deck のスライド資料が、はてなブックマークのホットエントリーに入っていたみたいです。


最後に

今年の DjangoCongress JP 2019(Day 1 カンファレンスデー)はセッションもパーティーも大盛況で、大御所イベントのような安定感がありました。これも、ずっと前からこの日のために動いてくれていたスタッフの皆さんの準備、運営、そして情熱のおかげです。本当にありがとうございました。昨年も参加させていただき、そして今年はセッション発表の機会をいただいて、このような素晴らしい場で発表側に回れたことは大変光栄に感じています。おかげさまで昨年のリベンジもできました。またたくさんの方にセッションを聴きに来ていただき、嬉しくそして心強かったです。機会があれば来年もチャレンジしてみたいと思います。




おまけ

じゃんけん大会で一番人気だった『現場で使える Django REST Framework の薄い本』は、BOOTH というオンラインショップから購入可能です(紙の本のみ)。

akiyoko.booth.pm


DjangoCongress に来るくらいの人はもうほとんど持ってる or 知ってるという噂もありますが(笑)、『現場で使える Django の教科書』シリーズ(基礎編・実践編)も BOOTH で購入できます。

akiyoko.booth.pm


『現場で使える Django の教科書』シリーズ(基礎編・実践編)は、Amazon でも販売しています(電子版もあり)。

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》