運用を守るセキュリティ設計

中小企業でも安心して使える、多層防御によるセキュリティアーキテクチャ

セキュリティトークン認証レート制限認証情報管理アクセス制御
読了時間: 8分

このトピックについて

業務システムでは、セキュリティが何より重要です。不正アクセスやデータ漏洩は、会社の信用を失墜させかねません。このプロジェクトでは、中小企業でも安心して使えるよう、多層防御のセキュリティ設計を採用しました。

セキュリティの多層防御

1つの防御策だけに頼るのは危険です。複数の層で防御することで、1つが突破されても次の層で守れます。

セキュリティの4層構造
第1層: トークン認証

秘密トークンで正規のアクセスか確認

通過
第2層: レート制限

短時間の大量リクエストをブロック

通過
第3層: 入力値検証

不正なデータを処理前にはじく

通過
第4層: 認証情報の安全管理

暗号化ストレージ + 自動更新

第1層: トークン認証

GASからの通信には、32文字以上の秘密トークンを使用します。このトークンを知らない第三者からのアクセスは自動的に拒否されます。

トークンの長さ
内容32文字以上(推測が困難)
送信方法
内容HTTPヘッダーに含めて送信
照合場所
内容サーバー側の環境変数と比較
不一致時
内容即座に401 Unauthorizedを返却

トークン管理のポイント

第2層: レート制限

短時間に大量のリクエストが来た場合、自動的にブロックする仕組みです。

レート制限の動作
リクエスト受信

クライアントIP + トークン末尾8文字で識別

カウント確認

過去1分間のリクエスト数をチェック

60回未満
許可してカウント+1
60回以上
429 Too Many Requestsを返却

レート制限で防げること

  • 悪意のある大量アクセス: 攻撃者によるサービス妨害
  • 操作ミス: ボタンの連打による重複処理
  • 無限ループ: プログラムバグによる無限リクエスト

レスポンスヘッダーでの通知

APIレスポンスには、残りのリクエスト回数が含まれています。

X-RateLimit-Remaining
意味残りリクエスト回数
45
X-RateLimit-Reset
意味リセット時刻(Unix時間)
1705363200

第3層: 入力値検証

送信されたデータが正しい形式かどうか、処理前に厳密にチェックします。

日付
検証内容yyyy-mm-dd形式
不正な例2024/01/15(スラッシュ区切り)
金額
検証内容数値(小数点以下3桁まで)
不正な例1,000(カンマ入り)
タグ
検証内容最大10個まで
不正な例11個以上の指定
べき等性キー
検証内容8文字以上
不正な例短すぎるキー

検証で不正が見つかった場合

処理を開始する前にエラーを返却します。これにより、不正なデータが請求書サービスに送信されることを防ぎます。

第4層: 認証情報の安全管理

請求書サービスへの接続に必要な認証情報(アクセストークン)は、特別な管理が必要です。

認証情報管理の3つの工夫

暗号化ストレージ
説明Redisなどの暗号化されたクラウドストレージに保管
メリット漏洩リスクの低減
自動更新
説明有効期限60秒前に自動で新しいトークンを取得
メリット手動管理不要
分散ロック
説明同時アクセスでも重複更新を防止
メリットトークンの不整合を防ぐ
トークン自動更新の流れ
トークン取得リクエスト

APIを呼び出す前にトークンを取得

有効期限チェック

残り60秒以上あるか確認

有効
キャッシュから取得して使用
期限切れ間近
分散ロックを取得して更新
API呼び出し

有効なトークンでリクエスト

分散ロックの仕組み

複数のリクエストが同時にトークン更新を試みると、以下の問題が発生します。

  • 同じトークンを何度も更新(無駄なAPI呼び出し)
  • 古いトークンと新しいトークンが混在(不整合)

分散ロックにより、同時に1つのインスタンスだけがトークン更新を行えるようにしています。

セキュリティ設計のまとめ

不正アクセス
対策トークン認証
防御層第1層
DDoS攻撃
対策レート制限
防御層第2層
不正入力
対策入力値検証
防御層第3層
認証情報漏洩
対策暗号化ストレージ + 自動更新
防御層第4層

この設計で実現できること

運営側にとって

  • セキュリティ対応の工数削減: 自動化された保護機構
  • インシデント対応の容易さ: トークン変更だけで対処可能
  • 監査対応: 構造化ログで履歴を追跡

利用者にとって

  • 安心して利用: 多層防御で守られている
  • 透明性: レート制限の残り回数がわかる
  • 迅速なエラー通知: 問題があればすぐに把握

関連記事