見出し画像

node.jsを利用したクローラー作成(42)

フロントエンドとバックエンドのセキュリティ検討を行う!

🤯うわー

ベストプラクティスにしろ項目多すぎる…

N予備校のテキスト

よくあるwebサービスの脆弱性について診断を行う。

✅OSコマンドインジェクション ←該当なし
✅SQLインジェクション ←対応済み
・NoSQL部分(firestore)のクエリはサーバー側で投げる
・urlをパラメータ化している部分はvalidation(whitelist)を行う
✅ディレクトリ・トラバーサル ←対応済み
・expressのRooterが担保する
・GCPのdispatch.yamlがrootingを担保する
✅セッションハイジャック ← 対応済み
・firebase auth のトークン発行機能+serviceworkerでのセッション管理にて担保する
・firebaseのuidはバレても大丈夫そうだが、積極的な公開を控える

✅XSS ← ユーザー入力値に応じた表示部分なし。
・エンドポイント(API)については入力値をvalidationする。
✅CSRF ←ユーザー入力値に応じた送信部分なし。
・認証状態についてはfirebase authトークンが期限付きになっている。
✅ HTTP ヘッダインジェクション ←問題なし
・servicewokerでheaderにトークンを埋め込む。サーバー側で検証する。
・⚠serviceworker実装が手作りに近い…。
✅クリックジャッキング ←対応済み
・expressのhelmet middlewareにてX-Frame-Options設定がされる
✅パスワード周り ←対応済み
・firebaseuiを利用したOauth認証。自サイトではpassword等を管理しない。
・⚠firebaseuiの実装よく見てない…。

GAEのセキュリティ

セキュリティ診断機能とfirewallあり

🔰セキュリティ診断 ←サイトdeploy後にやる。保留。
🔰firewall設定 ←保留。アクセス解析と合わせないと意味ない。
アクセス解析設定を後でやる。

DDOS攻撃について

App EngineはSYN floods攻撃、IP fragment floods攻撃、ポート枯渇攻撃など、レイヤー4以下の攻撃の多くを緩和・吸収するGoogleフロントエンドの後ろに位置します。

正規のHTTP通信の大量送信についてはfirewallにて対処する。
cloud armerは未調査。前提としてCloud Load Balancingが必要で、そちらは有料なので…。

バックエンドのエンドポイントを守る

画像1

✅対応済み
・GCP内で付与される特殊なリクエストヘッダーを用いて、CloudTaskからの呼び出しかどうか判定できる。

expressでは判定用のミドルウェア作成し、ダメならリクエストを却下する。
GAEのcronリクエストにも特殊リクエストヘッダーがある。そちらも対応。

Expressのセキュリティベストプラクティス

公式情報。

✅古いExpressのversion使わない ←ok
✅TLSを利用する ←GAEはhttpsで公開される

✅helmet利用する ←導入
✅Cookieを安全に利用する← Cookie利用なし。
・firebase-js-sdk導入したら勝手に使ってる?←使ってなかった
✅ブルートフォース対策 ←GAEdefault + firewallのwhitelist
✅依存関係の脆弱性解決 ←ツールにて確認。
・yarn auditを実行。脆弱性なし。npmでのauditやり方と対処記事。

・snykを実行。脆弱性なし。日本語情報少ねぇ。

✓ Tested 354 dependencies for known issues, no vulnerable paths found.

Node.jsセキュリティ

項目多くて辛い。気になるところだけやる…。

✅Eslint入れろ ←導入した。
・とりあえずデフォルト設定を利用。
未使用変数の削除と異常時処理の一部の不具合修正できた。今の設定。

module.exports = {
   "env": {
       "node": true,
       "mocha": true,
       "browser": true,
       "es6": true
   },
   "extends": "eslint:recommended",
   "globals": {
       "Atomics": "readonly",
       "SharedArrayBuffer": "readonly"
   },
   "parserOptions": {
       "ecmaVersion": 2018,
       "sourceType": "module"
   },
   "rules": {
   }
};

・Expressのnextは必ず警告される…行を無視するコメントで対応する。

// eslint-disable-next-line no-unused-vars

✅プロセスのエラーをキャッチしろ。クラッシュさせるな。
・express-async-handlerで非同期エンドポイントはエラーをキャッチする。

徳丸本

真面目に取り組むと凄い年月かかる!ざっくりと読んだ。

✅ HTTPレスポンスのコンテンツヘッダは必ず設定する ←ajax周り対応。
✅ツールによる脆弱性診断← GCPconsoleからGAE security checkを行う
・書籍で紹介されてたのはOWASP ZAP

徳丸さんの最近バズった記事。

セキュリティ対応はすんげー大変…ってことだ😇地獄かな

本で紹介されてた参考資料
IPAの資料(ちと古い)

まとめ

ServiceWorkerのセッション管理系が手作り感あるので一番心配…。
(次点は謎の失敗が多いfirebaseui)
IPAの資料にも書いてあったが、セッション周りを自分で実装してるとセキュリティホールになりやすいらしい。

備考 (脆弱性有無の判定基準詳細、その他)
セッション ID のパラメータ名等で、言語・ミドルウェアのセッション管理
機構を使用しているかを判断します(※注 9)。
判断がつかない場合には、"手作りの疑いあり"として報告します。

一応根幹はfirebaseAuthを利用しているので完全に手作りではない!
と主張して今日は寝よう…。


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