トランザクションセキュリティでレポートを制御してみる

はじめましてこんにちは。お久しぶりです4年ぶり。テラスカイの渕上です。

 

さて、

トランザクションセキュリティというこの機能、元々は2要素認証の調査をしてる時に、「これは便利かも!?」と思い、ちょっと触ってみようと思った次第です。

ちなみに調査というのは、

Salesforce Authenticatorにて毎度認証するのは不便なので、特定のIPアドレスからのアクセスの場合は認証をスキップしたいんだなあ」

的なことをやろうとして、こちらのページのパッケージを入れたりしたんですが、現在(Summer '17)では「セッションの設定>(ID 検証)信頼済み IP アドレスからのみ許可」にチェックを入れるだけで出来てしまったりします。素晴らしい!

 

さてさて、

トランザクションセキュリティについてヘルプに記載されている概要は、

トランザクションセキュリティは、設定したポリシーに基づいてイベントを監視します。これらのポリシーは組織内のイベントに適用され、特定のイベントの組み合わせが生じた場合に実行するアクションを指定します。ポリシーがトリガされると、アクションが実行され、必要に応じて通知を受信できます。

とのこと。

 

イベントって何?アクションって何?ということで、ヘルプや設定画面を確認しますと、設定出来る内容としては

  • カスタムポリシー(カスタムトランザクションセキュリティポリシー) + Apex ポリシー(ApexTxnSecurity.PolicyCondition インターフェースを実装したApexクラス)で構成

  • カスタムポリシーは、イベント・リソース名・リアルタイムアクション・通知等を設定する(選択可能な内容は下記表参照)

イベントの種別 リソース名 リアルタイムアクション 通知
Login ・None
・ブロック
・2 要素認証
・ログインするためにセッションを終了
・アプリケーション内通知(Salesforce1のみ)
・メール通知
Entity Chatter メッセージ ・None
・ブロック
・ユーザを凍結
アイデア
フィードコメント
フィード項目
質問
クライアントブラウザ ・None
ログイン IP
認証セッション
認証プロバイダ
DataExport Account ・None
・ブロック
・2 要素認証
Case
Contact
Lead
Opportunity
Access Resource レポート & ダッシュボード ・None
・ブロック
・2 要素認証
接続アプリケーション

といった感じですかね。

設定の詳細については、ヘルプtrailheadを参照ください。

なお、Apex ポリシーのサンプルコードも色々あります。こちらのヘルプリファレンスを見るとより何が出来るかのイメージが湧くかと思います。

 

また、

例えばこんな要件にも利用出来たりもします(あるかわかりませんが・・)。

  • レポートのエクスポートはシステム管理者以外も使用する。(プロファイルの「レポートのエクスポート」を有効にする必要がある)

  • だけど、Contactだけはシステム管理者以外のユーザには、レポートやDataloader等でエクスポートさせたくない。

 

実装内容(及び結果)はこんな感じになります。

・Apexポリシー

global class ExportPolicyCondition implements TxnSecurity.PolicyCondition {
  public boolean evaluate(TxnSecurity.Event e) {
    return 'システム管理者' != [Select Profile.Name From User Where Id = :e.userId].Profile.Name;
  }
}


・カスタムポリシー

カスタムポリシーimage





















・レポート実行結果
レポート実行結果Image





・メール通知
メール通知Image









AccountやLeadのカスタムポリシーを作れば、同じApexポリシーが使えますね。

今後、DataExportの対象にカスタムオブジェクトも選択出来るようになると更に良いですね。

 

あと、

トランザクションセキュリティの利用にあたって、いくつか制限や注意点がありましたので少し触れてみようかなと。

まず、評価結果が「true」または「false」のどちらでも、DML 操作はロールバックされるそうです。
DMLがダメならメール送信はどうなんだろうと、SingleEmailMessageを確認してみましたが、こちらも「Too many Email Invocations: 1」のエラーに抵触してしまい、送信できませんでした。

ということで、下記のように非同期で試してみるとDMLもメール送信も正常に動作しましたが、評価結果が「true」の場合のみ実行されるという結果になりました。

global class ExportPolicyCondition implements TxnSecurity.PolicyCondition {
  public boolean evaluate(TxnSecurity.Event e) {
    createLog(JSON.serializePretty(e));
    sendMail(JSON.serializePretty(e));
    return 'システム管理者' != [Select Profile.Name From User Where Id = :e.userId].Profile.Name;
  }

  @future
  private static void createLog(String s){
    insert new EventLog__c(logDetail__c = s);
  }

  @future
  private static void sendMail(String s){
    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
    mail.setTargetObjectId(UserInfo.getUserId());
    mail.setSubject('TxnSecurity.PolicyConditionをメールしてみる');
    mail.setPlainTextBody(s);
    mail.setSaveAsActivity(false);
    Messaging.sendEmail(new List<Messaging.Email> { mail });
  }
}

とすると、非同期でレコードを作成し、戻り値を一律「true」、アクションを「None」とすれば、レポートをブロックさせずにエクスポート履歴を取ることとかも出来そう!と思ったのですが‥、アクションを「None」とすると、評価結果が「false」の場合と同じく何も動作しない‥。残念。

じゃあ、「None」てどういう時に使うんだろうなあと少々疑問は残りますが、新しめの機能としてはあるあるですかねー。今後に期待です。

 

他にはですね、同じイベントとリソースの組み合わせは、複数作成すること出来ないという制限がありました。
つまり、一つのイベントとリソースの組み合わせに対し、アクションを使い分けることは出来ないということなんですね。

 

最後にも一つ、当然なんですが、いい加減なログイン制御のカスタムポリシーを有効化してしまうと、システム管理者でもログイン出来なくなります。結構ドキドキしますのでご注意ください。

 

それでは。