Webからのファイルアクセスを適切に制限する
2021/12/13 03:00
佐賀県のWebページで起きた画像の漏洩の事件をきっかけに、画像ファイルの守り方について画像へのリクエストについて権限をチェックする方法と、AWS S3の署名付きURLを利用した方法について実演と共に紹介しています。2本合わせて30分程度の動画です。
ファイルへのアクセス制限
アクセスを制限するという観点で考えると、以下の2つの方法が一般的だと思います。
- ファイルの情報へアクセスするためのURLをシステム内に準備し、アクセスされた際に権限をチェックする方法
- ページへのアクセスの際に権限をチェックし、レスポンスのHTML内にAWS S3の署名付きURLでファイルのURLを入れる方法
以下の方法は、「アクセスを制限する」という観点では難しい扱いになるでしょう。
- 長いランダムな文字列を入れたファイルを公開ディレクトリ内に配置する方法
公開ディレクトリの理解
Webサーバの設定によってWebに公開されるディレクトリ(「公開ディレクトリ」と呼びます)と、公開されないディレクトリがあります。アクセスを制限すると考えた場合には公開ディレクトリに直接ファイルを置いてしまうのは危険度が高いです(.htaccess
などで制限する方法もありますが、セキュアさの度合いからするとこの方法も少しの不備で公開される危険性があるので推奨はされません)。
ファイルへのアクセスURLを用意する方法
画像URLが固定で、アクセスを受けた時にログインしているかなどの権限チェックを行い、合格すればファイル内容をボディに含めてレスポンスします。
古典的な方法であり概念が簡単なので実装しやすいですが、紹介した方法のままだとファイルの置き場がWebサーバの中になってしまう為、スケールすることが難しい設計です。このリソースの置き場をAWS S3などにする方法も考えられます(が、そうするなら署名付きURLの方を選択する方が良さそうに感じます)。
署名付きURLを作成する方法
署名付きURLは、ファイルの置いてあるURLに適切な署名が付いている場合にのみアクセスを許してくれる仕組みです。HTMLのimgタグから画像を参照しているような場合には、レスポンスのHTMLを作成する前に権限のチェックを行い、合格していればimgタグのsrc内に署名付きのURLを仕込んで送り返します。
正規のユーザであればこの流れで画像が閲覧できますが、署名を作成できるのは基本的には開発したシステムだけの為、不正なユーザが署名を作成することができず、閲覧が不可能となります。
解説に利用したコード ~ Sample code ~
https://github.com/CircleAround/simple-koa-bbs/pull/13
https://github.com/CircleAround/simple-koa-bbs/compare/before_s3...s3?expand=1