見出し画像

Webサービス公開前に対策しておきたいセキュリティ施策まとめ

直近で新しいWebサービスのセキュリティ周りを整備する機会があったので、その時に検討した内容をメモしておきます。

このnoteの前提

重点的にみたのが認証機構の部分でしたのでそれに寄った内容になります。
また、一般的なセキュリティ対策(XSSやSQLインジェクション)などについて触れていません。そういった内容については2018年の現在でも徳丸先生の本を一読することが近道かと思います。

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 | 徳丸 浩
https://www.amazon.co.jp/dp/4797361190

"なぜ"セキュリティ施策をするのか

セキュリティ対策は大切だということはわかっていても、"なぜ"対策をしないといけないかということにパッと答えられる人はそう多くないのではないでしょうか。

総務省が公開しているテキストには、以下のようなことが書いてあります。

いまや情報システムやインターネットは、企業や組織の運営に欠かせないものになりました。しかし、現在の企業や組織は、情報システムへの依存による利便性の向上と引き換えに、大きな危険性を抱え持つことになってしまいました。情報システムの停止による損失、顧客情報の漏洩(ろうえい)による企業や組織のブランドイメージの失墜など、情報セキュリティ上のリスクは、企業や組織に大きな被害や影響をもたらします。また、多くの場合、被害や影響は取引先や顧客などの関係者へも波及します。
企業や組織にとって、情報セキュリティに対するリスクマネジメントは重要な経営課題のひとつと考えなければなりません。特に、個人情報や顧客情報などの重要情報を取り扱う場合には、これを保護することは、企業や組織にとっての社会的責務でもあります。
今日、情報セキュリティ対策は、世界的にも重要な経営課題であると認識されており、情報セキュリティ製品・システム評価基準(ISO/IEC15408)や情報セキュリティマネジメントシステムの認証基準(ISO/IEC27001)が、国際標準として規格化されています。情報セキュリティ対策の重要度が高まるにつれて、日本国内においても、これらの国際基準を採用する企業が増えてきています。

出典:情報セキュリティ対策の必要性|組織幹部のための情報セキュリティ対策
http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/business/executive/01.html

Webサービスを運営している人間からすると、主に以下のような内容が『必要な理由』になるのではないかと思います。

・機密情報の漏洩
・個人情報の流出
・Webサービスの停止/乗っ取り
・ウィルス感染

それではセキュリティ施策の紹介にうつります。
『概要』『実現方法』『注意点』という構成で書いていきます。

Webサービス公開前に対策しておきたいセキュリティまとめ

ログインしました通知をする
概要:

・ログインがおこなわれた際にユーザに何らかの方法で通知する
・第三者がログインを試みた場合にユーザに知らせることができる
実現方法:
・ログインの処理内で通知をおこなう
注意点:
・ログインの度に通知がされることを嫌がるユーザも一定数いるのでOn/Offできるようにしておくことも併せて検討したい

ログイン履歴の保存と可視化
概要:
・過去のログイン履歴をシステム上に貯めておいて可視化できるようにする
・ユーザのマイページなどに見える機能を提供
実現方法:
・ログイン履歴テーブルのようなものを用意してデータを貯めていく
注意点:
・ユーザ数が多いサービスだとログデータがひたすら増えていってしまうのでデータパージ(一定期間で削除or退避)も併せて検討したい

二段階認証の導入
概要:

・ID/PWだけでなくもう一段階の認証をいれることで、より一層ユーザ本人のみが認証を通過できるようにする
実現方法:
・携帯電話へのSNS送信
・Google Authenticatorなどのトークンソフトウェア連携
注意点:
・実装方式によっては工数が膨れやすい
・二段階認証自体は強力な認証方式だがそこまでリテラシーが高くないユーザは導入してくれない
・携帯の機種変更時対応など運用フローの整備も必要

いつもと違うIPからログインされたときにアラート通知をする
概要:

・ログイン自体は成功したとしても、いつも使っている場所/地域と離れた場所からのログイン時にアラートを通知する
・海外Proxy経由した悪意のあるユーザや海外からの攻撃などはそれなりの数があるので有用
実現方法:
・[ログイン履歴の保存]と併せておこなう必要があるが、ログインユーザのIPアドレスを取得しておく
・ログイン認証通過時に普段のIPアドレス地域と比較して大きくことなる場合はアラートを通知する
注意点:
・単純にIPの完全一致で判定するとアラートが沢山いってしまうので使い物にならない
・"大きくことなる"の判定が難しい

認証間違え回数によるロック
概要:

・認証をN回間違えたらN分ロックする
実現方法:
・ユーザ毎にユーザ認証失敗回数を記録しておき、条件(一定回数/時間)を超えた場合はロックする
注意点:
・(いまどきのサービスだとほぼ必須ですが)パスワードリマインダーなどの設置も併せてしておかないと本当のパスワード忘れをしているユーザには大きなストレスとなる

CAPTCHAの導入
概要:

・ロボット/Botなどでは解読しづらい文字や画像の組み合わせを解かせることにより人間であることを証明する
実現方法:
・CAPTCHAのAPIを提供しているサービスを組み込む or CAPTCHAのライブラリを組み込む
・最近はGoogle社が提供している『reCAPTCHA』がおすすめです
注意点:
・あまりにも難しいとユーザストレスが加速する
・ログインや登録のコンバージョンは下がる可能性がある

ファイルアップロード機能がある場合のウィルスチェック
概要:

・ユーザがアップロードしたファイルへのウィルスチェックチェック
実現方法:
・ウィルスチェックのミドルウェアを導入してアップロード時にチェック or ウィルスチェックAPIを提供しているサービスを組み込む
注意点:
・お金がかかる(ASP代もそうですし運用コストもそうですし)ことが多いです
・メンテナンス(定義ファイルの更新など)がほぼ必須

不正IPからのアクセス遮断
概要:

・TorやクラウドのIPアドレスなど、『通常のユーザが使わないIPアドレス』を遮断する
実現方法:
・TorのIPリストやクラウドのIPアドレスレンジを取得してNginxなどのミドルウェアのDenyリストを更新する
注意点:
・多くの場合自動化して組み込むことになるはずなので、『このIPだけからは許可したい』というときはそれ用の実装をする必要がある

セキュリティ対策以外にも検討できること

プログラマも人間ですから実装ミスなどによって想定通りに動かないことはよく起こります。

機能のテストはよく聞きますがセキュリティのテストというのはいまはまだ馴染みが薄い気がしています。

セキュリティで有名なラック社やNRI社などはそういったサービスを展開しておりますので必要に応じて受けてみるといいかもしれません。

最後に

いくつかのセキュリティ施策について紹介してみました。
セキュリティは高難易度かつ攻撃手法や対策手法も時代の流れとともに変化してきていますので、時勢を読みつつユーザビリティを守りながらもサービスを安全に提供していきたいですね。

この記事が気に入ったらサポートをしてみませんか?