Salesforceセキュリティの強化:トランザクションセキュリティポリシーの詳細解説

Salesforce アーキテクトとして、我々は単に機能的なソリューションを設計するだけでなく、組織の最も価値ある資産であるデータを保護するための堅牢なセキュリティフレームワークを構築する責任を負っています。Salesforceプラットフォームは多層的なセキュリティ機能を提供しますが、その中でも特に動的かつリアルタイムな脅威に対応できる強力なツールが Transaction Security Policies (トランザクションセキュリティポリシー) です。本記事では、アーキテクトの視点からこの機能の深層を探り、その戦略的な活用方法について解説します。


背景と応用シナリオ

Transaction Security Policiesは、Salesforce Shield の一部であり、Real-Time Event Monitoring (リアルタイムイベントモニタリング) の機能を活用して、Salesforce組織内のユーザーアクティビティをリアルタイムで監視し、特定のイベントに対して自動的にアクションを実行するフレームワークです。従来の静的なセキュリティ設定(プロファイル、権限セットなど)が「誰が何にアクセスできるか」を定義するのに対し、トランザクションセキュリティポリシーは「誰が、いつ、どこで、どのようにデータにアクセスしようとしているか」というコンテキストに基づいて動的な制御を可能にします。

アーキテクトとして考慮すべき主な応用シナリオは以下の通りです。

  • データ漏洩の防止: 一度に大量のレコードをエクスポートしようとするレポート実行をブロックする。例えば、退職予定の営業担当者が顧客リスト全体をダウンロードしようとするのを防ぎます。
  • アクセスコンテキストの強化: 通常業務を行わない深夜や、会社のIPアドレス範囲外からのログイン成功後に、重要なオブジェクトへのアクセスが発生した場合に多要素認証を要求する。
  • 権限昇格の悪用防止: 特定のユーザーが短時間のうちに複数の権限セットを自身に割り当てようとする行為を検知し、管理者に通知またはユーザーを凍結する。
  • APIの異常利用の検知: 外部システムからのAPIコールが、通常とは異なるパターン(例:短時間に大量のクエリを実行)を示した場合に、そのセッションをブロックする。

これらのシナリオは、内部不正やアカウント乗っ取りといった、静的なセキュリティモデルだけでは防ぎきれない脅威に対して、リアルタイムの防御壁を築く上で非常に重要です。


原理説明

Transaction Security Policiesの動作は、「Event (イベント)」、「Policy (ポリシー)」、「Action (アクション)」という3つの主要な構成要素に基づいています。

1. Event (イベント)

ポリシーが評価されるきっかけとなるユーザーのアクティビティやシステム事象です。Salesforceは様々なイベントを監視しており、ポリシーのトリガーとして利用できます。代表的なイベントには以下のようなものがあります。

  • ApiEvent: SOAP、REST、Bulk APIなど、あらゆるAPIクエリが対象。
  • ReportEvent: レポートの実行やエクスポート。
  • ListViewEvent: リストビューの実行。
  • LoginEvent: ユーザーのログイン試行。
  • ResourceActionEvent: ファイルのプレビューやダウンロード。

各イベントは、その発生時のコンテキスト情報(誰が、どのIPアドレスから、どのリソースに対して、など)を詳細に含んだオブジェクトとしてポリシーに渡されます。

2. Policy (ポリシー)

イベントが発生した際に実行される評価ロジックです。ポリシーは「条件が満たされたかどうか」を判断します。ポリシーの実装方法は2つあります。

  • Condition Builder (条件ビルダー): コーディング不要のポイント&クリックツール。単純な条件(例:「レポートの行数が5000を超える」かつ「ユーザープロファイルがStandard User」)を定義する場合に迅速かつ容易に設定できます。
  • Apex: 複雑で動的な条件分岐や、他のオブジェクトのデータを参照する必要がある高度なロジックを実装する場合に使用します。Apexクラスで TxnSecurity.PolicyCondition インターフェースを実装する必要があります。アーキテクトとしては、このApexによる実装がカスタマイズ性と拡張性の鍵となります。

3. Action (アクション)

ポリシーの条件が満たされた(Apexメソッドがtrueを返した)場合に実行される措置です。主なアクションは以下の通りです。

  • Block: 該当する操作(レポートのエクスポート、APIコールなど)を完全にブロックします。
  • TwoFactorAuthentication: ユーザーに多要素認証(MFA)を要求します。認証に成功すれば、操作を続行できます。高リスクな操作に対する追加の本人確認として有効です。
  • NoAction: 操作はブロックしませんが、通知(メールなど)を送信します。潜在的な脅威の監視や、ポリシー導入前の影響評価(ドライラン)に使用されます。

これらの要素を組み合わせることで、「ユーザーAが会社のIP範囲外から500件以上のリードをエクスポートしようとしたら、その操作をブロックし、セキュリティ管理者にメールで通知する」といった具体的なセキュリティルールを構築できます。


サンプルコード

ここでは、最も一般的なシナリオの一つである「大規模なレポートエクスポートのブロック」をApexで実装する例を見ていきましょう。このポリシーは、指定された行数(この例では2,000行)を超えるレポートが実行された場合にトリガーされます。

このコードは、Salesforce公式ドキュメントで提供されている例に基づいています。

Apexクラス: BlockLargeReportExport

global class BlockLargeReportExport implements TxnSecurity.PolicyCondition {

    /**
     * TxnSecurity.PolicyConditionインターフェースのevaluateメソッドを実装します。
     * このメソッドは、トランザクションセキュリティポリシーがトリガーされるたびに呼び出されます。
     * @param event イベントに関する情報を含むSObject。この例ではReportEventオブジェクトが渡されます。
     * @return Boolean ポリシーのアクション(Blockなど)を実行すべき場合はtrue、何もしない場合はfalseを返します。
     */
    public boolean evaluate(SObject event) {
        // イベントのタイプをチェックし、適切な処理にキャストします。
        // ここではReportEventを想定しています。
        switch on event {
            when ReportEvent reportEvent {
                // ReportEventから実行されたユーザーの情報を取得します。
                // Userオブジェクトに対してSOQLクエリを実行し、特定のプロファイルのユーザーをポリシーの対象外にすることができます。
                User u = [SELECT Id, Profile.Name FROM User WHERE Id = :reportEvent.UserId];
                
                // システム管理者プロファイルのユーザーは、このポリシーの対象外とします。
                // これにより、管理業務に支障が出るのを防ぎます。
                if (u.Profile.Name == 'System Administrator') {
                    // 管理者の場合は常にfalseを返し、ポリシーをトリガーしません。
                    return false;
                }

                // ReportEventのNumberOfRowsフィールドを評価します。
                // このフィールドには、レポートによって処理された行数が含まれます。
                // 閾値(この例では2000)を超えているかどうかを確認します。
                if (reportEvent.NumberOfRows > 2000) {
                    // 閾値を超えている場合、trueを返してポリシーのアクション(Block)をトリガーします。
                    return true;
                }
            }
            when null {
                // イベントがnullの場合、何もしません。
                return false;
            }
            when else {
                // 想定外のイベントタイプの場合、何もしません。
                return false;
            }
        }
        // 上記のどの条件にも一致しない場合、デフォルトでfalseを返します。
        return false;
    }
}

ポリシーの設定手順

  1. 上記のApexクラスをSalesforce組織にデプロイします。
  2. [設定] > [セキュリティ] > [トランザクションセキュリティポリシー] に移動します。
  3. [新規] をクリックし、「Apex」を選択して [次へ] をクリックします。
  4. 以下の情報を入力します:
    • Apex クラス: `BlockLargeReportExport` を選択します。
    • イベント: 「レポートイベント」を選択します。
    • リソース: `Report` を選択します。
    • アクション: 「ブロック」を選択します。
    • ポリシー名: 「大規模レポートエクスポートのブロック」など、分かりやすい名前を付けます。
    • 有効: チェックを入れます。
  5. [保存] をクリックします。

これで、システム管理者以外のユーザーが2,000行を超えるレポートを実行しようとすると、操作がブロックされるようになります。


注意事項

Transaction Security Policiesを設計・実装する際には、以下の点に細心の注意を払う必要があります。

権限

ポリシーを作成・管理するには、「アプリケーションのカスタマイズ」および「トランザクションセキュリティポリシーの管理」権限が必要です。これらの権限は強力なため、最小権限の原則に従い、限られた管理者にのみ付与すべきです。

API制限とパフォーマンス

最重要事項: Apexで実装されたポリシーは、ユーザーのアクションと同期的に実行され、そのトランザクションのガバナ制限を消費します。非効率なSOQLクエリ(特にループ内でのクエリ)や複雑な計算処理は、ユーザーの操作を遅延させたり、最悪の場合はCPU時間制限超過などで失敗させたりする可能性があります。アーキテクトとして、ポリシーのApexコードは極めて軽量かつ高速に実行されるように設計しなければなりません。キャッシュの活用や、クエリの最適化が不可欠です。

エラー処理

ポリシーのApexクラス内でハンドルされない例外が発生した場合、Salesforceはデフォルトで「フェイルセーフ」として動作し、対象のイベントをブロックします。これは、セキュリティ上の抜け穴を防ぐための仕様ですが、意図しない業務停止を引き起こすリスクも孕んでいます。したがって、Apexコード内には適切なtry-catchブロックを実装し、予期せぬエラーが発生した場合でも意図した通りの動作(例えば、ブロックせずに管理者に通知するだけなど)を保証する設計が求められます。

テスト

本番環境へのデプロイ前に、必ずSandbox環境で徹底的なテストを行ってください。ポリシーが正しくトリガーされるシナリオと、トリガーされるべきでないシナリオの両方を網羅的にテストすることが重要です。また、パフォーマンスへの影響を評価するために、本番環境と同等のデータ量や負荷を想定したテストも実施すべきです。


まとめとベストプラクティス

Transaction Security Policiesは、Salesforce組織のセキュリティ体制を静的なものから動的で応答性の高いものへと進化させるための強力なアーキテクチャコンポーネントです。これにより、リアルタイムの脅威検知と自動防御が可能になります。

アーキテクトとしてこの機能を最大限に活用するためのベストプラクティスは以下の通りです。

  • Declarative First (宣言的アプローチを優先): 可能な限りCondition Builderを使用し、Apexは本当に複雑なロジックが必要な場合に限定します。これにより、メンテナンス性が向上し、パフォーマンスリスクが低減します。
  • パフォーマンスを最優先に設計: Apexを使用する際は、処理のオーバーヘッドを最小限に抑えることを常に意識してください。これはセキュリティ機能であると同時に、ユーザー体験に直接影響を与えるコンポーネントです。
  • セキュリティとビジネスロジックの分離: トランザクションセキュリティポリシーを、本来自動化ツール(FlowやApexトリガー)で実装すべきビジネスプロセスの代替として使用しないでください。その目的はあくまでセキュリティの強制です。
  • 監視と通知の徹底: ポリシーがトリガーされた際に、誰が、いつ、なぜブロックされたのかを追跡できるように、適切な通知メカニズム(メールアラート、Chatter投稿、カスタムオブジェクトへのログ記録など)を設計に組み込みます。
  • 定期的なレビュー: ビジネス要件や脅威の状況は変化します。定義したポリシーが依然として有効かつ適切であるか、定期的に見直しと監査を行ってください。

これらの原則に従い、Transaction Security Policiesを慎重に計画・実装することで、Salesforceプラットフォームをより安全で信頼性の高いものにし、組織のデータを未来の脅威から保護することが可能になります。

コメント