ノート:

OCI Auditを使用してマルチクラウド・セキュリティを実装し、OCI Identity and Access Managementからイベントを取得

イントロダクション

Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)アイデンティティ・ドメインは、管理者およびエンド・ユーザーが実行する操作に応じて監査データを生成します。監査イベントは、ユーザー・アカウントやグループ・メンバーシップの作成または更新、ログイン試行の成功または失敗などの操作に対して生成されます。

この監査データにアクセスするには、Oracle Cloud Infrastructure (OCI)コンソールで直接レポートを生成するか、外部クラウド・プラットフォームで動作している可能性がある外部セキュリティ監視ソリューションにこれらのイベントを送信することもできます。組織がサードパーティのセキュリティ・インシデントおよびイベント管理(SIEM)ソリューションを活用するのが一般的であり、一般的な要件は、脅威の分析とコンプライアンスのためにOCI IAM監査データをSIEMに取り込むことです。その要件を満たす方法の1つは、OCI IAMアイデンティティ・ドメインのAuditEvents APIを活用することです。しかし、アイデンティティ・ドメインには、一部の組織で実装しやすく、マルチクラウド環境での監査イベントの共有をサポートする別のオプションが用意されています。

OCI Auditは、サポートされているすべてのOCI APIへのコールをイベントとして自動的に記録するOCIサービスです。OCI IAMアイデンティティ・ドメインAPIを使用するのではなく、OCI AuditサービスからOCI IAM監査イベントをプルすることを選択できる一般的な理由がいくつかあります。OCI Auditには、次の利点があります。

目標

OCI IAMアイデンティティ・ドメインで生成された監査イベントを外部ストアに同期します。

前提条件

タスク1: OCI Auditを利用してOCI IAMから監査イベントを取得する方法の理解

OCI Auditを使用してOCI IAMから監査イベントを取得するアプローチを示すために、次のシナリオを使用します。

2つのOCI IAMアイデンティティ・ドメインを持つテナンシがあります。テナンシ管理に使用されるテナンシ・デフォルト・ドメインのドメイン・タイプは「無料」です。その管理者ドメインを呼び出します。Oracle Apps Premiumというドメイン・タイプの追加のアイデンティティ・ドメインがあり、すべての従業員がOracle SaaSおよびオンプレミス・アプリケーションへのアクセスのためにプロビジョニングされます。その従業員ドメインを呼び出します。アカウントは、Microsoft Azure ADから従業員ドメインにプロビジョニングされます。これは、いくつかの方法(System for Cross-domain Identity Management (SCIM)、Just-in-Timeプロビジョニング、またはバルク・ユーザー・インポート)のいずれかで発生する可能性があります。また、お客様の環境内の多数のシステムから監査データを取り込むSIEMソリューション(Microsoft Sentinelなど)もあり、両方のアイデンティティ・ドメインのすべての監査イベントをほぼリアルタイムでSIEMに公開する必要があります。

要件に対応するには、OCI Auditサービス、OCI Eventsサービス、OCI Functionsサービス、Azure Log Analytics Workspaceの使用など、全体的なアプローチが必要です。基本的なフローは次のとおりです。

  1. OCI IAMアイデンティティ・ドメインは、監査イベントをOCI Auditに書き込みます。
  2. OCIイベント・サービスには、OCI IAMの特定の監査イベント・タイプについてOCI監査を監視するルールがあります。ルールがトリガーされると、OCIファンクションのファンクションが起動します。
  3. この関数は、RAW監査ログをそのペイロードで受信し、Azure Log Analytics Data Collector APIを呼び出してデータをAzure Log Analytics Workspaceに送信します。
  4. Azure Log Analytics Workspaceは、Microsoft Sentinelのデータ・ストアとして機能します。

高レベルのアーキテクチャのイメージ

タスク2: OCI Auditを使用したOCI IAMからの監査イベントの取得

  1. この例では、AzureポータルでAzure Log Analytics Workspaceを設定していることを前提としています。設定したら、ワークスペースIDおよびプライマリ(またはセカンダリ)キーをワークスペース名、設定、エージェント、Log Analyticsエージェント手順の下にコピーします。これらの値は、OCIファンクションを使用してカスタム・ファンクションを記述する際に必要になります。

    Azure Log Analytics Workspace Agentのイメージ

  2. テナント管理者としてOCIコンソールにログインします。

  3. OCIファンクションとともにデプロイされるカスタム・ファンクションを記述します。次のコード例ではPythonを使用していますが、選択した言語で簡単にファンクションを実装できます。3つの簡単なステップでファンクション・コードを追加します。

    • func.pyというPythonファイルを作成し、次の必要なインポート文およびパラメータ宣言を追加します。パラメータ値は、Log Analyticsワークスペース環境と一致する必要があります。顧客ID (ポータルのワークスペースID)および共有キーの値は、Azure PortalのLog Analyticsワークスペース、your-workspace-nameおよびエージェントの管理ページで確認できます。ログ・タイプ・パラメータは、Azure Log Analyticsワークスペースの新規(または既存の)カスタム・ログおよびデータ・アップロードのターゲットの場所を定義するために使用されるわかりやすい名前です。

      Log Analyticsワークスペースの顧客IDおよび共有キー値をハードコーディングするかわりに、OCIシークレット・サービスを使用してOCIファンクションの値にセキュアにアクセスできます。コードでOCIシークレットを使用するステップの詳細なウォークスルーについては、次の記事を参照してください。

      このチュートリアルでは、シークレットをボールトに格納し、OCIファンクション・インスタンス・プリンシパルへのアクセス権を付与するIAMポリシーを設定すると想定します。

      {.python .numberLines .lineAnchors}
      import oci
      import io
      import json
      import requests
      import datetime
      import hashlib
      import hmac
      import base64
      import logging
      from fdk import response
      
      # Get instance principal context, and initialize secrets client
      signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
      secret_client = oci.secrets.SecretsClient(config={}, signer=signer)
      
      # Replace values below with the ocids of your secrets
      customer_id_ocid = "ocid1.vaultsecret.oc1.<customer_id_ocid>"
      shared_key_ocid = "ocid1.vaultsecret.oc1.<shared_key_ocid>"
      
      # Retrieve secret
      def read_secret_value(secret_client, secret_id):
          response = secret_client.get_secret_bundle(secret_id)
          base64_Secret_content = response.data.secret_bundle_content.content
          base64_secret_bytes = base64_Secret_content.encode('ascii')
          base64_message_bytes = base64.b64decode(base64_secret_bytes)
          secret_content = base64_message_bytes.decode('ascii')
          return secret_content
      
      # Retrieve the customer ID using the secret client.
      customer_id =  read_secret_value(secret_client, customer_id_ocid)
      
      # For the shared key, use either the primary or the secondary Connected Sources client authentication key    
      _shared_key =  read_secret_value(secret_client, shared_key_ocid)
      
      # The log type is the name of the event that is being submitted
      log_type = 'OCILogging'
      
    • 次のコード行を追加して、Azureデータ・アップロード・エンドポイントに対してセキュアなRESTコールを行うためのタスクを定義します。このコードを検証して、Microsoftの最新のエンドポイントまたはバージョンの構文に対して構文を検証する必要がある場合があります。

      ノート: このコードの一部は、次のMicrosoftドキュメントからコピーされます。

      {.python .numberLines .lineAnchors}
      # Build the API signature
      def  build_signature(customer_id, shared_key, date, content_length, method, content_type, resource):
      x_headers =  'x-ms-date:'  + date
      string_to_hash = method +  "\n"  + str(content_length) +  "\n"  + content_type +  "\n"  + x_headers +  "\n"  + resource
      bytes_to_hash = bytes(string_to_hash, encoding= "utf-8" )  
      decoded_key = base64.b64decode(shared_key)
      encoded_hash = base64.b64encode(hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest()).decode()
      authorization =  "SharedKey {}:{}" .format(customer_id,encoded_hash)
      return  authorization
      
      # Build and send a request to the POST API
      def  post_data(customer_id, shared_key, body, log_type, logger):
      method =  'POST'
      content_type =  'application/json'
      resource =  '/api/logs'
      rfc1123date = datetime.datetime.utcnow().strftime( '%a, %d %b %Y %H:%M:%S GMT' )
      content_length = len(body)
      signature = build_signature(customer_id, shared_key, rfc1123date, content_length, method, content_type, resource)
      uri =  'https://'  + customer_id +  '.ods.opinsights.azure.com'  + resource +  '?api-version=2016-04-01'
      
      headers = {
      'content-type' : content_type,
      'Authorization' : signature,
      'Log-Type' : log_type,
      'x-ms-date' : rfc1123date
      }
      
      response = requests.post(uri,data=body, headers=headers)
      if (response.status_code >= 200 and  response.status_code <=  299 ):
      logger.info( 'Upload accepted' )
      else :
      logger.info( "Error during upload.  Response code: {}" .format(response.status_code))
      print(response.text)
      
    • 次のコード・ブロックをfunc.pyコード・ファイルに追加して、実行エントリ・ポイントおよびフレームワークの詳細を定義します。拡張データ解析、書式設定、カスタム例外処理などのオプション機能を追加する場合を除き、変更する必要はありません。

      {.python .numberLines .lineAnchors}
      """
      Entrypoint and initialization
      """
      def  handler(ctx, data: io.BytesIO= None ):
      logger = logging.getLogger()
      try :
      _log_body = data.getvalue()
      post_data(_customer_id, _shared_key, _log_body, _log_type, logger)
      except  Exception  as  err:
      logger.error( "Error in main process: {}" .format(str(err)))
      return  response.Response(
      ctx,  
      response_data=json.dumps({ "status" :  "Success" }),
      headers={ "Content-Type" :  "application/json" }
      )
      
  4. このガイドに従って、CloudShell (CloudShellでのファンクション・クイックスタート)を使用してファンクションをデプロイします。

  5. 基準に一致する監査ログを検索し、ステップ3および4で作成およびデプロイしたファンクションを呼び出すOCIイベント・サービスにルールを作成します。

    • コンソールの検索バーまたは左側の「サービス」メニュー内の検索バーで「イベント」を検索して、イベント・サービスに移動します。検索結果で「ルール」をクリックします。

      OCIコンソール1でルールを探します

      OCIコンソール2でルールを探します

    • 管理者ドメインおよび従業員ドメインでユーザー作成、更新または削除イベントを検索する条件を含むルールを作成します。

      1. ユーザーの作成、更新および削除イベント・タイプは、アイデンティティ・サービスで使用できます。

      2. 2つのアイデンティティ・ドメインのGUIDを含む追加の"属性"条件を追加します。

        ノート: これはオプションです。デフォルトでは、クラウド・アカウント内のすべてのアイデンティティ・ドメインの監査イベントが一致します。ただし、アイデンティティ・ドメインのサブセットにのみ関心がある場合は、スコープ内ドメインを明示的に指定できます。)アイデンティティ・ドメインGUIDは、アイデンティティ・ドメインの概要ページで確認できます。

      3. 「アクション」パネルで、「ファンクション」アクション・タイプを選択し、前述のステップ3および4で作成およびデプロイしたファンクションを選択します。

        OCIコンソールでのルールの作成

  6. ここで、いずれかのアイデンティティ・ドメインでユーザーを作成、更新または削除すると、RAW監査ログをペイロードとしてOCIファンクションが呼び出されます。OCIファンクションは、データをAzure Log Analyticsワークスペースにポストします。OCILogging_CLという名前のカスタム表のデータが表示されます。

    Azure Log Analytics WorkspaceでのOCIロギング・データの検索

謝辞

その他の学習リソース

docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。