新卒エンジニアが覚えるべきセキュリティ基礎
なぜセキュリティについて学ぶべきなのか
- webサービスを作る上でエンジニアが攻撃について理解を深めることは、セキュリティの向上、脆弱性の発見と修正、ユーザー情報の保護、サービスの信頼性と継続性、法的および規制要件の遵守など、さまざまな側面で重要な役割を果たためです。
実際に学んでみての感想
- 最初の方はセキュリティに関して、知識がない状態でインプットをしていたので、思ったよりも理解するまで手こずりました。
まず、どんな攻撃かそしてどのように対策するのかなどを文として覚えてても内容を深く理解してるかと言えばそうではなかったです。
最初はchatGPTなどに聞いたりをして勉強していましたが図などで流れを把握するために色々な記事をみました。
そうすることで理解が進み段々と理解できてきたのが今です。
主な攻撃
- SQLインジェクション
- クロスサイトスクリプティング(XSS)
- クロスサイトリクエストフォージェリ(CSRF)
- セッションハイジャック
それぞれの攻撃内容
- SQLインジェクション
- Webアプリケーションのデータベースに対して不正なSQLクエリを挿入することにより、攻撃者がデータベースの情報を抽出、改ざん、削除する攻撃
「SQLインジェクション」は、Webアプリケーションの脆弱性を利用してデータベースを不正に操作する攻撃を指します。
「SQL」はデータベースを操作する言語の名称で、「インジェクション」は「注入」の意味です。具体的には検索ボックスや入力フォームなどに記入する文字列に不正な操作を行うSQL文を意図的に「注入」することにより、データベース内のデータの消去や改ざんといった操作やデータの盗用を図る攻撃です。
引用元: https://www.nttpc.co.jp/column/security/sql_injection.html
- クロスサイトスクリプティング
- Webアプリケーションに悪意のあるスクリプトを挿入し、ユーザーのブラウザ上で実行させる攻撃
攻撃者がウェブサイト上で実行する悪意のあるスクリプトを注入するタイプの攻撃
ターゲットとしたWebサイトの脆弱性を悪用して罠を仕掛け、攻撃者が悪質なサイトへ誘導するスクリプトを実行し、サイトに訪れるユーザーの個人情報などを詐取したり、マルウェア感染させたりする
引用元: https://www.shadan-kun.com/waf_websecurity/xss/
- クロスサイトリクエストフォージェリ
- 攻撃者が正規のユーザーの権限を悪用し、意図しない操作を実行させる攻撃
攻撃者がユーザーのブラウザを使って、ユーザが意図しない操作をウェブサイト上で実行させるタイプの攻撃
これがクロスサイトスクリプティングと似ていて、わかりにくい
結局のところ似ているのですが、攻撃としては全然違うものです。
こちらについて、後でお互いの違いをまとめたいと思っています。
引用元: https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/csrf.html
- セッションハイジャック
- 攻撃者がユーザーのセッションIDを盗み、そのIDを使用して不正にログインする攻撃
セッションハイジャックとは、何らかの手段でこれらの情報を窃取し、本人に成り代わって通信を行うというサイバー攻撃。言わばなりすましなので、他人のパスポートで悪用することをイメージするとわかりやすいと思います。
引用元: https://www.ubsecure.jp/blog/session_hijacking
それぞれに対する対策
-
SQLインジェクション
- 入力データを検証し、不正な文字や特殊文字をエスケープすることで、攻撃者が意図しないSQLコードを挿入するのを防ぐ
-
クロスサイトスクリプティング
- 入力データを適切に検証し、HTMLエスケープすることで、悪意のあるスクリプトの埋め込みを防ぐ
-
クロスサイトリクエストフォージェリ
- フォームやリクエストに一意のCSRFトークンを組み込み、正当なユーザーからのリクエストであることを確認する
-
セッションハイジャック
- セッションIDをクッキーで安全に管理し、セッションIDの複雑さとランダム性を確保する
クロスサイトスクリプティングとクロスサイトリクエストフォージェリの違い
この二つは非常に似ていてよく、お題に出されることがあると思います。
実行ケースとして、不正なURLへのアクセスが挙げられこの二つ同じじゃんという方も多いです
ですが、実行される場所が違ったり、発生するための条件が違います。
自分の中では、一番違いとしてわかりやすいのが、ログイン済みでないと発生しないのが、クロスサイトリクエストフォージェリだと思います。
自分もここの部分は下記のqiitaの記事を参考に勉強したのでぜひみてみてください!
https://qiita.com/wanko5296/items/142b5b82485b0196a2da
まとめ
SQLインジェクションへの対策
- プレースホルダーを使用する。
- 入力の検証とエスケープを実施する。
- パラメータ化されたクエリを使用する。
- 最小特権原則に基づいたアクセス権の設定を行う。
クロスサイトスクリプティング(XSS)への対策
- 入力の検証とエスケープを実施する。
- Content Security Policy (CSP) を使用する。
- セッションクッキーにSecureフラグとHTTPOnlyフラグを設定する。
クロスサイトリクエストフォージェリ(CSRF)への対策
- CSRFトークンを使用する。
- Refererヘッダーの検証を行う。
- 重要なアクションの前にユーザーの意思確認を実施する。
セッションハイジャックへの対策
- セキュアな通信プロトコル(HTTPS)を使用する。
- セッションIDを安全に管理し、ランダム性を確保する。
- セッションタイムアウトを設定する。
- 強力なユーザー認証と認可を実施する。
新卒の時にこの有名な攻撃を覚えておくことに意味があると思っています。
これはフロントエンド、バックエンド、モバイル、インフラ、様々なエンジニアに共通する話だと思います。
しっかりとここの基礎がわかっているだけで、脆弱性を低く保ち、実装を進めていけます。
新卒でそれを意識できているだけでコードの質も上がると思いますので自分も頑張っていきたい思います!