ノート:

OCIファンクションを使用してMicrosoft Azure SentinelにOracle Cloud Infrastructureログを取り込む

イントロダクション

Oracle Cloud Infrastructure(OCI)Functionsは、フルマネージド型のマルチテナントでスケーラビリティに優れたオンデマンドのFunctions-as-a-Serviceプラットフォームです。エンタープライズ・グレードのOracle Cloud Infrastructure上に構築され、Fn Projectオープン・ソース・エンジンを搭載しています。

サービス・コネクタ・ハブは、Oracle Cloud Infrastructureサービス間でのデータの移動時に、相互作用を記述、実行およびモニターするための一元管理ペインを提供するクラウド・メッセージ・バス・プラットフォームです。Service Connector Hubサービスを使用して、Oracle Cloud Infrastructure内のサービス間でデータを転送します。

サービス・コネクタおよびファンクション・サービスを使用すると、OCIクラウド環境からのログの生成を、ご使用の環境のすべての情報セキュリティ・レコードの自動かつスケーラブルな送信とともに、セキュリティ情報およびイベント管理(SIEM) Microsoft Azure Sentinelのインスタンスに接続できます。

目標

OCIファンクションを使用してOCIログをMicrosoft Azure Sentinelに取り込みます。

前提条件

タスク1: OCIインスタンスの起動

  1. Webコンソールを使用して新しいOCIインスタンスを作成し、そのプラグインをデフォルトでアクティブ化し、「インスタンス」ページに移動して「インスタンスの作成」をクリックします。

    OCIインスタンスの作成

  2. インスタンスの作成に必要なすべての情報を入力します。

    インスタンス設定に必要な情報を入力します

  3. ページの最後に進み、「拡張オプションの表示」をクリックします。

    インスタンス詳細オプションの表示

  4. 一部のタブが画面に表示されます。「Oracle Cloud Agent」をクリックし、インスタンス作成の完了後にアクティブにするプラグインを選択します。

    Oracle Cloud Agentオプション

  5. このタブで選択したすべてのプラグインは、インスタンスを使用する準備ができたら自動的にアクティブ化されます。

    Oracle Cloud Agentプラグインの設定

  6. プラグインを選択したら、ページの最後にある「作成」をクリックします。

    OCIインスタンスの作成

タスク2: OCIロギング設定の構成

タスク2.1: Windowsインスタンスのカスタム・ログの構成

Windowsインスタンスを作成したら、サーバーにインストールされているOracle Agentを介してイベント・ビューア・ログを取得するようにOCI環境を構成する必要があります。

  1. 開始する前に、ログを収集するサーバーでカスタム・ログ・プラグインがアクティブであることを確認してください。OCIコンソールで、「コンピュート」「インスタンス」に移動します。

    カスタム・ログ・プラグインがアクティブであることを確認してください

  2. モニターするインスタンスを選択します。

    新しく作成したインスタンスを選択します

  3. 「Oracle Cloud Agent」タブをクリックし、「カスタム・ログ・モニタリング」という名前のプラグインが有効になっていることを確認します。

    カスタム・ログのモニタリング・プラグインのアクティブ化

    • インスタンスでプラグインが有効になっていない場合は有効にします。その後、このエージェントでWindowsイベント・ビューア・イベントを取得できるようにOCIロギングを構成します。

タスク2.2: サーバーの動的グループの構成

1つ以上の Windowsサーバーからイベントビューアログを取得するには、動的グループを作成する必要があります。このグループには、ログを取得する必要があるすべてのWindowsインスタンスが含まれます。

  1. 動的グループを作成するには、OCIコンソールのメイン・メニューをクリックし、「アイデンティティとセキュリティ」「アイデンティティ」に移動します。

    「アイデンティティ」メニューにアクセスします

  2. 「アイデンティティ」メニューから、「*ドメイン」サブメニューにアクセスします。

    ドメイン・メニューへのアクセス

  3. アイデンティティ・ドメインをクリックします(このチュートリアルの例では、「デフォルト」を使用します)。

    デフォルトのドメイン構成にアクセスします

  4. アイデンティティ・ドメイン内で、「動的グループ」メニューをクリックして、モニターするすべてのWindowsサーバーを含む動的グループを作成できます。これが完了したら、「動的グループの作成」をクリックします。

    サーバーの動的グループの作成

  5. 新しいページが開きます。動的グループの作成に関する情報(名前と説明)を入力し、「一致ルール」「ルール・ビルダー」リンクをクリックして、この動的グループにグループ化されるインスタンスを選択するためのルールを作成できます。

    動的グループ・ルールの作成

  6. 作成するルールの例では、コンパートメント内のすべての既存のサーバーがグループ化されます。これを行うには、次の図に示すように、コンパートメントIDを取得し、「値」フィールドに挿入します。

    必要な値を入力します

ノート: 拡張フィルタを使用して動的グループを作成すると、特定のタグを持つインスタンスのみを取得できます。そのためには、動的グループを定義するための一致ルールの記述にあるOCIの公式ドキュメントを読むことをお薦めします。

タスク2.3: ロギング・グループの作成

また、環境のWindowsサーバーにインストールされているエージェントが送信したすべてのログを集中できるように、ロギング・グループを作成する必要があります。

  1. OCIコンソールのメイン・メニューをクリックし、「監視および管理」「ログ・グループ」に移動します。

    ログ・グループの作成

  2. サービス・ページにアクセスする場合は、「ログ・グループの作成」をクリックします。

    ログ・グループの作成

  3. ログ・グループの作成ページ内で、必要な情報を入力し、「作成」をクリックします。

    必要な情報を入力します

このステップが終了したら、OCIインスタンスにインストールされているOracle Cloud Agentによるイベント・ビューア・ログ取得の作成を開始します。

タスク2.4: OCIロギングの構成

  1. インスタンスを構成したら、動的グループとログ・グループを構成し、「監視および管理」に移動して「ロギング」をクリックします。

    ロギング・サービスへのアクセス

  2. 「OCIロギング」ページで、「エージェント構成」をクリックして、Windowsイベント・ビューア・ログをOCIロギングに送信できる構成を作成できます。エージェント構成ページ内で、「エージェント構成の作成」をクリックします。

    エージェント構成の作成

  3. ページの必要なすべてのフィールドに入力し、前のステップで作成した動的グループを選択します。

    必須情報を入力

    • これらの初期項目を入力する場合は、ページをスクロール・ダウンして「エージェント構成」フィールドに入力し、使用可能な各チャネル(アプリケーション、セキュリティおよびシステム)のWindowsイベント・ログを取得することを通知します。ここでは、各チャネルのログ入力を作成するプロセスを繰り返す必要があります。

    • 構成が終了すると、エージェント構成ページが使用可能になり、次のようになります。

      エージェント構成詳細情報

      ノート:前述のエージェント構成は、Linuxサーバーの/var/log/messagesファイルで生成されたイベント・ビューアのログとログの両方を取得するために作成されました。

    • エージェント構成が「アクティブ」ステータスになったら、最初のログ収集が完了するまで約5分待ちます。収集されたモニター対象インスタンスのログを表示するには、次のイメージに示すように「ログの探索」メニューをクリックします。

      ログの表示

タスク3: Microsoft Azure Sentinelの詳細への注意

重要: Microsoft Azureサブスクリプション内でのMicrosoft Azure Sentinelの作成および構成に関するガイダンスを提供するこのドキュメントの範囲ではありません。これを行うには、MicrosoftのWebサイトにある公式の製品ドキュメントにアクセスします。

タスク4: OCI Vaultの作成

SIEM Sentinelに属するMicrosoft Azure Log Analytics Workspaceデータがすでにあるため、前のタスクにコピーしたシークレット値を格納するOCI Vaultを作成します。このシークレットはOCI Vaultに格納する必要があるため、次のステップで作成するOCIファンクション・コード内に挿入する必要はありません。

  1. OCI Vaultを作成するには、OCIコンソールのメイン・メニューに移動し、「アイデンティティとセキュリティ」「Vault」に移動します。

    OCI Vaultの作成

  2. Vaultページがロードされたら、「Vaultの作成」をクリックし、目的のコンパートメントを選択してVaultという名前を付けます。

    必要な情報を入力します

  3. Vaultを作成したら、マスター暗号化キーを作成する必要があります。このキーは、Vault内のすべてのシークレットの暗号化に使用されます。これを行うには、次のイメージに示すように「キーの作成」をクリックします。

    マスター暗号化キー(MEK)の作成

  4. マスター・キーの作成が終了したら、「シークレット」メニューをクリックし、前のステップで書き留めたMicrosoft Azureシークレットを作成します。

    シークレットの作成

  5. タスク3に示すように、Microsoft Azure Sentinel Log Analyticsワークスペースの主キーまたはセカンダリ・キー・データを使用して、Vaultでシークレットを作成するために必要なフィールドに入力します。

  6. その他の項目(Sentinel Workspace IDおよびログがSentinelに格納される表の名前)は、Vaultに挿入できる場合と挿入されない場合があります。ここでは、ファンクションのコード内に挿入します。

重要: Vault内に作成するシークレットのOCIDをノートにとります。

タスク5: OCIファンクションの作成と構成

OCIリージョンで集中管理されたロギング環境を設定した後、VaultとAzure環境の準備ができたら、OCIリージョンからMicrosoft Azure Sentinelにカスタム・ログおよび監査ログを送信するOCIファンクションを作成します。

タスク5.1: OCIファンクションの作成

  1. OCIコンソールのメイン・メニューに移動し、「開発者サービス」「ファンクション」に移動します。

    OCIファンクション・サービスの処理

  2. 「関数」ページがロードされたら、「アプリケーションの作成」をクリックします。

    アプリケーションの作成

  3. 必要なフィールドに入力し、「作成」をクリックします。

    必要な情報を入力します

  4. 作成後、ファンクションはネットワーク・セキュリティ・グループによって保護されないことに注意してください。これをネットワーク・セキュリティ・グループに追加する必要があります。

    NSG構成

    重要事項:

    1. FunctionがMicrosoft Azure Sentinelにログを送信するためにパブリックMicrosoft Azureエンドポイントにアクセスするため、この関数はインターネットにアクセスできるサブネットに作成する必要があります。

    2. また、VNETセキュリティ・リストを検証して、OCI機能がインターネットにアクセスできないようにします。

タスク5.2: OCIファンクションおよび起動の構成

OCIファンクションが作成されると、環境にファンクションを構成するために必要なコマンドが画面に表示されます。ここでは、例として、Cloud Shellを介してステップバイステップを実行しますが、これらの設定を機器に直接実行することもできます。

  1. 構成するOCIリージョンのWebコンソールでCloud Shellを直接開きます(このチュートリアルでは、リージョンはブラジル東部です)。

    機能構成のリージョン

  2. 「ファンクション」ページに表示されるステップに従って、Cloud Shellターミナル内でリクエストされたコマンドを実行します。

    クラウドシェル端末でコマンドを実行する

  3. 実行する最初の3つのコマンドを変更する必要はありませんが、4番目のコマンドでは、アプリケーション・イメージが格納されるリポジトリの名前を指定する必要があります。この例では、入力された名前は repo-ocilog-to-azuresiemです。

    $ fn update context registry gru.ocir.io/xxxxxxxxxa/repo-ocilog-to-azuresiem

    コマンドの実行

  4. Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)プロファイル内に認証トークンを生成します。認証トークンは、ファンクションのDockerイメージが格納されるOCIリポジトリと対話できるアクセス資格証明です。OCI Webコンソールのユーザー・アイコンをクリックし、「マイ・プロファイル」をクリックします。

    認証トークンの作成

  5. ユーザー・ページ内でスクロール・ダウンし、「認証トークン」をクリックします。

    「認証トークン」メニュー

  6. 「認証トークン」セクションで、「トークンの生成」をクリックします。

    トークンの生成

  7. 認証トークンの名前を入力し、「トークンの生成」をクリックします。

    必要な情報を入力します

    重要:このトークンを書き留め、安全な場所に格納してください。このトークンは、ファンクション・イメージが格納されるOCIレジストリへのアクセス・パスワードです。

  8. OCI Webコンソールのメイン・メニューにアクセスし、「開発者サービス」「ファンクション」にアクセスして、「ファンクション」ページに戻ります。

    機能ページに戻る

  9. 「Functions」ページで、前のステップで作成したFunctionにアクセスします。

    機能へのアクセス

  10. 「開始」メニューをクリックし、認証トークン作成ステップの後にステップバイステップを続行します。

    スタート・ガイド機能メニュー

  11. コマンドdocker loginを実行し、パスワードとして、最後に実行したステップで認証トークンの作成からコピーした文字列を使用します。

    スタート・ガイドの手順に従います

  12. 次のステップでは、ファンクションを作成、デプロイおよび起動します。Cloud Shellでファンクションを初期化するには、画面の例に示されているコマンドを変更します。使用するランタイム環境はPythonにあるため、この変更が必要です(ファンクションの作成によって推奨されるhello-world例に示されているJavaではありません)。

    $ fn init --runtime python func-ocilog-to-azuresiem

    ファンクションを呼び出します

タスク5.2.1: OCIファンクションのソース・コードの記述

  1. initコマンドが実行されたら、新しく作成されたFunctionディレクトリにアクセスします。

    $ cd func-ocilog-to-azuresiem/

    • アクセスしたディレクトリ内に、Pythonファイル(func.py)、YAMLファイル(func.YAML)および要件ファイル(requirements.txt)があることに注意してください。これらの2つのファイルを編集する必要があります。
  2. func.pyファイルを編集し、すべてのコンテンツを削除して、次のコンテンツをそのファイルに挿入します。

    import io
    import json
    import requests
    import datetime
    import hashlib
    import hmac
    import base64
    import logging
    import oci
    import base64
    import sys
    from fdk import response
    
    # Global variable
    logger = logging.getLogger()
    
    # Get Resource Principal Credentials
    # OCI Functions get permission to read vault from OCI IAM
    signer = oci.auth.signers.get_resource_principals_signer()
    
    # Retrieve secret from OCI Vault
    def get_binary_secret(secret_ocid):
        try:
            client = oci.secrets.SecretsClient({}, signer=signer)
            secret_content = client.get_secret_bundle(secret_ocid).data.secret_bundle_content.content.encode('utf-8')
            secret_content_decoded = base64.b64decode(secret_content).decode('UTF-8')
        except Exception as ex:
            logger.critical("ERROR: failed to retrieve the secret content from OCI Vault. ", ex)
            raise
        return secret_content_decoded
    
    # 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 (Microsoft Azure Sentinel public endpoint)
    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.critical( '===> Upload to Microsoft Azure Sentinel was accepted %s', content_length )
        else:
            logger.critical( "Error during upload.  Response code: {}" .format(response.status_code))
    
    ####
    ## PART 3
    ####
    
    #
    # Entrypoint and initialization
    #
    def handler(ctx, data: io.BytesIO=None):
        logger.info("OCI Function - Handler function init fired.")
    
        # Update the customer ID to your Log Analytics workspace ID
        customer_id =  ‘<PUT_HERE_YOUR_AZURE_LOG_ANALYTICS_WORKSPACE_ID>'
    
        # For the shared key, use either the primary or the secondary Connected Sources client authentication key
        shared_key_OCID = "<PUT_HERE_THE_OCID_OF_YOUR_OCI_VAULT_SHARED_KEY_SECRET>"
        shared_key = get_binary_secret(shared_key_OCID)
    
        # The log type is the name of the event that is being submitted
        log_type =  '<SENTINEL_TABLE_NAME>'
    
        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" }
        )
    
    
    • これは、Azure SIEMに接続してOCIログをリモート・エンドポイントに送信するPythonスクリプトです。

    • このスクリプトをコピーして貼り付けることに加えて、その中の3つのフィールドを変更する必要があります。

      1. _customer_id: Azureサブスクリプション内のLog AnalyticsワークスペースIDの「エージェント管理」メニュー。

      2. _shared_key: 「エージェント管理」メニューからも取得できる主キーまたはセカンダリ・キー。

      3. _log_type: SIEM Sentinelが使用するLog Analyticsワークスペースの名前。このワークスペースに入ってくるすべてのログは、Sentinelによって分析されます。この例では、OCILoggingを使用しています。

    • 上の情報を取得できる画面の例を次に示します。

      Log AnalyticsワークスペースのAzure値

    ノート: Azureサブスクリプション内でLog Analytics Workspaceを構成するには、このドキュメントの範囲外です。詳細については、Microsoftの公式ドキュメントを参照してください。

  3. func.pyファイルを変更したら、requirements.txtファイルを編集します。OCI Functionsパッケージ・マネージャがスクリプトを正しく動作させるために必要なPython依存関係をインストールする要件を挿入します。この場合、requestsという単語をファイルの最後の行に挿入します。

    必要なPythonモジュール

  4. これが完了したら、ファンクションのデプロイ・ステップを実行します。

    $ fn -v deploy --app app-ocilog-to-azuresiem

数分後、ファンクションの構成とDockerイメージの作成が正常に完了します。

必要なPythonモジュール

タスク5.2.2: OCIファンクションに必要な権限の提供

OCIファンクションをスムーズに実行するには、Vault内のAzureシークレットを読み取る権限が必要です。そのためには、作成したファンクションの動的グループを作成し、この動的グループに対して、コードでVaultを読み取ってAzureから共有キーをセキュアに取得できるように、必要な権限(最小権限)を付与します。

そのため、前述の項目2.2と同様に、ログを収集するサーバーを集計する動的グループを作成し、ステップを再トレースして、ファンクションを含む動的グループを作成します。

動的グループの作成時には、ファンクションの取得に使用される照合ルールが必要です。この例では、このチュートリアル専用のコンパートメントのすべてのファンクションをリストする一致ルールを作成します。

ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxgjxxxxglxxxxiqxxxxjdxxxxnxxxxmxxxxm3xxxxmoxxxxsxxx'}

  1. コンパートメントのOCIDを取得し、それを一致ルールに挿入して、動的グループを作成します。

    Functionsの動的グループの構成

  2. 動的グループを作成したら、「アイデンティティとセキュリティ」「ポリシー」に移動して、ファンクションが読取りモードでVaultにアクセスできるようにするポリシーを作成します。

    FunctionsによるVaultへのアクセスを許可するポリシーの作成

    • 動的グループが作成されたら、ファンクションによるVaultへのアクセスを許可するポリシーを作成します。
  3. 次のポリシーを使用して、Vault資格証明読取りアクティビティを実行するために必要な最小限のアクセス権をファンクションに付与します。

    Allow dynamic-group <FUNCTION\_DYNAMIC\_GROUP\_NAME> to read secret-bundles in compartment <COMPARTMENT\_NAME>

    OCIポリシーの詳細

タスク5.2.3: OCIファンクションの実行

  1. 関数を実行して、正しく動作していることを確認します。

    $ fn -v deploy --app app-ocilog-to-azuresiem

    ファンクションの実行

ファイナライズするには、OCIサービス・コネクタを構成して、リージョンからすべてのOCIログを取得し、作成したファンクションを使用してAzure SIEMに送信する必要があります。

タスク6: サービス・コネクタの構成

Microsoft Azure Sentinelの分析のためにOCIテナントのリージョンのログを送信できるようにするには、サービス・コネクタを構成する必要があります。

基本的に、このサービスは、すでに構成したOCIログを取得し、これをファンクションに送信し、次にすべてのログをAzureサブスクリプションに転送します。

  1. OCIコンソールのメイン・メニューに移動し、「監視および管理」、「**サービス・コネクタ」に移動します。

    「Service Connectors」メニュー

  2. サービス・コネクタ内で、「サービス・コネクタの作成」をクリックします。

    サービス・コネクタの作成

  3. 必須の名前および説明フィールドに入力し、サービス・コネクタを作成するコンパートメントを選択します。

    必要な情報を入力します

  4. ここで、サービス・コネクタを介して転送されるデータのソースを選択します。ここでは、ロギングを使用します。また、ターゲットとして、つまりデータが移行される場所として、Functionsを使用します。

    サービス・コネクタのソースとターゲットの定義

  5. 構成をファイナライズするには、ソースの構成で、OCIファンクションに送信されるログを選択します。このステップでは、\_Auditログを選択し、さらにログを追加する必要があります。この手順の最初のステップで作成したログ・グループを選択します。

    構成を確定します

    • 別のログ・グループを追加する場合は、「+別のログ」をクリックします。
  6. このステップを完了したら、ターゲット・パラメータ(つまり、Azureサブスクリプションにデータを送信するOCI関数)を定義する必要があります。これを行うには、ファンクションがあるコンパートメントを選択し、アプリケーションを選択してから、ファンクションの名前を選択します。次に、次のイメージに示すように「作成」をクリックします。

    「作成」ボタンをクリックします

プロセスは終了しました。この時点で、ログが自動的にMicrosoft Azureに送信されるまで待ちます。

「メトリック」メニューによって作成されたサービス・コネクタの操作をモニターできます。

サービス・コネクタ・メトリックのモニター

タスク7: Microsoft Azure Sentinelでのログの読取り

  1. しばらくすると、次のイメージに示すように、すべてのサーバーのログがMicrosoft Azureサブスクリプションに送信されます。

    Microsoft Azure Sentinelでのログ

  2. Microsoft Azure Sentinel構成によると、SIEMルールがトリガーされると、インタフェースでインシデントが表示され始めます。

    作成中のSIEMインシデント

    • ブラジル東部リージョン・サーバーに対してインシデントをオープンしました(この例ではインシデントを生成するために、「[Lab] Regex Incident」というカスタム・ルールを作成しました)。

      作成中のSIEMインシデント

    • Us-Phoenixリージョン・サーバーのインシデントを開きます。

      オープン・インシデント

謝辞

作成者 - Rodrigo Pace de Barros(Oracle LAD A-Team Cloud Securityソリューション・エンジニア)

その他の学習リソース

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

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