(最終更新月:2023年2月)
✔このような方へ向けて書かれた記事となります
「Djangoで開発したアプリのセキュリティってどんなものなのだろうか?」
「そもそもWebアプリでセキュリティ対策って必要なのかな?」
「Djangoのセキュリティ対策を向上させる方法を具体的に知りたい」
✔当記事を通じてお伝えすること
- Webサイト・アプリのセキュリティ対策について
- Djangoに備わっているセキュリティ対策とは?
- DjangoのWebアプリをより甲セキュリティするための具体策
当記事では、Djangoに備わっているセキュリティ対策についてはもちろん、そもそもWebアプリにはどのようなリスクが潜んでいるのかまで理解いただけます。
ぜひ最後までご覧ください。
Webアプリの構築で気を付けるべきポイント
情報処理推進機構(IPA)が喚起を促すWebサイト・アプリのセキュリティ対策を参考にしつつ、アプリ構築にあたっての注意点をカテゴリー別に見ていきます。
Djangoのセキュリティを判断する基準として、それぞれの概要だけでも理解しておきましょう。
- Webサーバー
- DNS
- ネットワーク
(参考:安全なウェブサイトの作り方|情報処理推進機構(IPA))
それぞれについて簡単に解説していきますが、詳しくは別記事でご紹介していきます。
Webサーバー
Webサーバーでは、以下のようなことに気を付けましょう
- ブルートフォース攻撃
- クロスサイトスクリプティング
- SQLインジェクション
Webサーバーは、ユーザーとのやり取りを担っているため、外部との接触が多くなります。
設定を間違えると、悪意のあるユーザーにより、情報を盗まれたり、サイトを破壊されたりしてしまいます。
DNS
DNSについては、以下のようなことに気を付けるべきとされています。
- DDoS攻撃
- DNSキャッシュポイズニング
DNSは、打ち込んだURLを元に、ユーザーを適切なサイトへ連れていく役割を担っています。
不正な書き換えにより、悪意あるサイトへ促されてしまう可能性があるのです。
ネットワーク
ネットワークについて、以下のようなことが注意事項となります。
- HTTPヘッダインジェクション
- CSRF
ネットワーク通信の際、データに不正な値を混ぜることで、情報漏洩を促したり、サーバー内に侵入しやすくなるのです。
不正な値に対しての対策が必要となります。
Djangoによる各リスクへの対策
Djangoでは、一定のリスクに対して、対策が施されています。
一から開発をするのではなく、フレームワークを活用するメリットのひとつといえるでしょう。
以下でそれぞれの対策を見ていきます。
- ブルートフォース攻撃
- クロスサイトスクリプティング
- SQLインジェクション
- DDoS攻撃
- DNSキャッシュポイズニング
- HTTPヘッダインジェクション
- CSRF
それぞれの攻撃がどのようなものかを見ながら、Djangoに備わっているものやできることを解説していきます。
ブルートフォース攻撃
ブルートフォース攻撃とは、手当たりしだいパスワードを打ち込み、サーバ内に侵入したり、暗号を解読する方法です。
プログラムを使って自動化することで、短いパスワードであれば短時間で解除できてしまう可能性があります。
一般的な対策で、Djangoに備わっているかどうかは以下の表にてご確認ください。
対策 | Djangoでできること |
---|---|
強固なパスワードを設定する | AUTH_PASSWORD_VALIDATORS変数で強度を設定する |
2段階認証にする | 2段階認証パスワード用のアプリを作成する |
パスワードの入力回数に制限をつける | 外部ライブラリ(django-axesなど)を導入する |
ブルートフォース対策には、パスワードを強固なものにすることで、危険は少なくなるでしょう。
(2段階認証アプリについては、別記事でご紹介予定)
またパスワードの漏洩については、実際の値を保存するのではなく、ハッシュ値で保存しているため、リスクは小さいといえるでしょう。
クロスサイトスクリプティング
クロスサイトスクリプティング(XSS)は、悪意のあるスクリプトをサイトに埋め込み、一般のユーザーのセッション情報を盗んだり、悪意のあるページに遷移させたりする攻撃です。
ブログや掲示板、アンケートサイトなどがその対象といえるでしょう。
Djangoでは、エスケープ処理という、危険な文字を文字列に変更することを通じて、その対策としています。
Djangoが推奨する書き方で、テンプレートを記載していれば、リスクはかなり小さいと言って良いです。
SQLインジェクション
SQLインジェクションとは、悪意のあるユーザーがデータベースを操作するために、SQLコードを実行する攻撃です。
SQLコードを含めることにより、データベース内のデータが削除されたり、漏洩したりするリスクがあります。
これに対して、Djangoでは、クエリをパラメータ化すること(任意の変数にSQLコードを格納したうえで処理をおこなうこと)で、対策しています。
コード内にSQLコードを直接書くなどをしない限りは、リスクは小さいといえるでしょう。
DDoS攻撃
DDoS攻撃とは、大量のデータを送り込むことで、サーバーをダウンさせる攻撃などのことをいいます。
これについては、Webアプリケーション側でおこなえることは少なく、サーバ側でのファイアウォールの設定などが有効です。
DNSキャッシュポイズニング
DNSキャッシュポイズニングとは、URLの行き先を管理するDNSサーバーに偽の情報を埋め込み、ユーザーを悪意のあるサイトに誘導する方法です。
こちらについても、Webアプリ側でおこなえることは少なく、DNSサーバー側でおこなう設定になります。
一般的に名前の通ったレンタルサーバやVPSサービスなどであれば、ひとまずは安心できるといえるでしょう。
HTTPヘッダインジェクション
HTTPヘッダインジェクションとは、悪意のあるユーザーが、不正な文字列などを含むリクエストを送信し、Webサーバ所有者が意図しないスクリプトなどを実行させる攻撃です。
これにはWAFと呼ばれる対策が有効ですが、Django側ではなくApacheなどのサーバソフト側で設定することになります。
Djangoでおこなわれている対策としては、以下が挙げられます。
- ランダムな文字列でセッションIDが発行される
- LoginViewでは、古いセッションは廃棄される仕組になっている
- HOST先を適切に管理するALLOWED_HOSTが備わっている
自前でおこなうことは少ないですが、既に備わっているものと、サーバ側での対策が必要です。
CSRF
CSRF(クロス・サイト・リクエスト・フォージェリ)は、ユーザーのCookieに保存している値を強制的に送信したり、読み込んだりする手法です。
強制的な送信をすることで、意図しない場面で商品を購入させられてしまうことなどがリスクとして存在します。
Djangoでは、リスクのあるPOSTメソッドでフォームを送信する際に特有のトークンを生成することで、送信者が正しいかの判断をする仕組みが備わっています。
Middlewareやテンプレートでは、CSRFトークンに関する記載があることを必ずチェックしておきましょう。
まとめ:Djangoのセキュリティは一定の水準以上
当記事の内容をまとめます。
- Webアプリの構築では、そのセキュリティを気にしなければならない
- Webアプリを守るには、どのような攻撃があるかを理解すべき
- Djangoには、Webアプリでできる対策は備わっていることが多い
Djangoなどのフレームワークには、必要な機能が揃っていることが多いです。
これはセキュリティにおいても同様で、一から作るよりかはかなり安全性が高いと考えて良いでしょう。
ただし、Djangoが進めてないやり方やどうしても例外的なやり方でコードを書く場合は、必ずどんなリスクがあるのかを把握したうえで、コードを書くことが重要です。