ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
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に取り込みます。
前提条件
- Oracle Cloudテナンシへのアクセス
- テナンシでのVirtual Cloudネットワーク設定
- ログ、ストリーミングおよびファンクションのすべてのポリシー設定。
タスク1: OCIインスタンスの起動
-
Webコンソールを使用して新しいOCIインスタンスを作成し、そのプラグインをデフォルトでアクティブ化し、「インスタンス」ページに移動して「インスタンスの作成」をクリックします。
-
インスタンスの作成に必要なすべての情報を入力します。
-
ページの最後に進み、「拡張オプションの表示」をクリックします。
-
一部のタブが画面に表示されます。「Oracle Cloud Agent」をクリックし、インスタンス作成の完了後にアクティブにするプラグインを選択します。
-
このタブで選択したすべてのプラグインは、インスタンスを使用する準備ができたら自動的にアクティブ化されます。
-
プラグインを選択したら、ページの最後にある「作成」をクリックします。
タスク2: OCIロギング設定の構成
タスク2.1: Windowsインスタンスのカスタム・ログの構成
Windowsインスタンスを作成したら、サーバーにインストールされているOracle Agentを介してイベント・ビューア・ログを取得するようにOCI環境を構成する必要があります。
-
開始する前に、ログを収集するサーバーでカスタム・ログ・プラグインがアクティブであることを確認してください。OCIコンソールで、「コンピュート」、「インスタンス」に移動します。
-
モニターするインスタンスを選択します。
-
「Oracle Cloud Agent」タブをクリックし、「カスタム・ログ・モニタリング」という名前のプラグインが有効になっていることを確認します。
- インスタンスでプラグインが有効になっていない場合は有効にします。その後、このエージェントでWindowsイベント・ビューア・イベントを取得できるようにOCIロギングを構成します。
タスク2.2: サーバーの動的グループの構成
1つ以上の Windowsサーバーからイベントビューアログを取得するには、動的グループを作成する必要があります。このグループには、ログを取得する必要があるすべてのWindowsインスタンスが含まれます。
-
動的グループを作成するには、OCIコンソールのメイン・メニューをクリックし、「アイデンティティとセキュリティ」、「アイデンティティ」に移動します。
-
「アイデンティティ」メニューから、「*ドメイン」サブメニューにアクセスします。
-
アイデンティティ・ドメインをクリックします(このチュートリアルの例では、「デフォルト」を使用します)。
-
アイデンティティ・ドメイン内で、「動的グループ」メニューをクリックして、モニターするすべてのWindowsサーバーを含む動的グループを作成できます。これが完了したら、「動的グループの作成」をクリックします。
-
新しいページが開きます。動的グループの作成に関する情報(名前と説明)を入力し、「一致ルール」で「ルール・ビルダー」リンクをクリックして、この動的グループにグループ化されるインスタンスを選択するためのルールを作成できます。
-
作成するルールの例では、コンパートメント内のすべての既存のサーバーがグループ化されます。これを行うには、次の図に示すように、コンパートメントIDを取得し、「値」フィールドに挿入します。
-
動的グループの作成の詳細は、ノートブック・セッションから他のOracle Cloud Infrastructureリソースにアクセスするための動的グループおよびポリシーの作成の公式ドキュメントを参照してください。
-
作成が終了すると、動的グループ情報を含むページが使用可能になります。
-
動的グループが作成され、OCI環境のログを一元化するために使用できます。
-
ノート: 拡張フィルタを使用して動的グループを作成すると、特定のタグを持つインスタンスのみを取得できます。そのためには、動的グループを定義するための一致ルールの記述にあるOCIの公式ドキュメントを読むことをお薦めします。
タスク2.3: ロギング・グループの作成
また、環境のWindowsサーバーにインストールされているエージェントが送信したすべてのログを集中できるように、ロギング・グループを作成する必要があります。
-
OCIコンソールのメイン・メニューをクリックし、「監視および管理」、「ログ・グループ」に移動します。
-
サービス・ページにアクセスする場合は、「ログ・グループの作成」をクリックします。
-
ログ・グループの作成ページ内で、必要な情報を入力し、「作成」をクリックします。
このステップが終了したら、OCIインスタンスにインストールされているOracle Cloud Agentによるイベント・ビューア・ログ取得の作成を開始します。
タスク2.4: OCIロギングの構成
-
インスタンスを構成したら、動的グループとログ・グループを構成し、「監視および管理」に移動して「ロギング」をクリックします。
-
「OCIロギング」ページで、「エージェント構成」をクリックして、Windowsイベント・ビューア・ログをOCIロギングに送信できる構成を作成できます。エージェント構成ページ内で、「エージェント構成の作成」をクリックします。
-
ページの必要なすべてのフィールドに入力し、前のステップで作成した動的グループを選択します。
-
これらの初期項目を入力する場合は、ページをスクロール・ダウンして「エージェント構成」フィールドに入力し、使用可能な各チャネル(アプリケーション、セキュリティおよびシステム)のWindowsイベント・ログを取得することを通知します。ここでは、各チャネルのログ入力を作成するプロセスを繰り返す必要があります。
-
構成が終了すると、エージェント構成ページが使用可能になり、次のようになります。
ノート:前述のエージェント構成は、Linuxサーバーの
/var/log/messages
ファイルで生成されたイベント・ビューアのログとログの両方を取得するために作成されました。 -
エージェント構成が「アクティブ」ステータスになったら、最初のログ収集が完了するまで約5分待ちます。収集されたモニター対象インスタンスのログを表示するには、次のイメージに示すように「ログの探索」メニューをクリックします。
-
タスク3: Microsoft Azure Sentinelの詳細への注意
-
OCIリージョンで集中管理されたロギング環境を設定した後、Microsoft Azureサブスクリプションに移動し、次の情報を収集します:
- ワークスペースID: Microsoft Azureサブスクリプション内でMicrosoft Azure Sentinelによって使用されるLog AnalyticsワークスペースID。
- 共有キー: Log Analytics Workspaceアクセス・キー。
-
これらの値は、Azureサブスクリプションの次のイメージに示すように、「エージェント管理」メニュー内にあります:
-
これらの値をノートにとります。
重要: Microsoft Azureサブスクリプション内でのMicrosoft Azure Sentinelの作成および構成に関するガイダンスを提供するこのドキュメントの範囲ではありません。これを行うには、MicrosoftのWebサイトにある公式の製品ドキュメントにアクセスします。
タスク4: OCI Vaultの作成
SIEM Sentinelに属するMicrosoft Azure Log Analytics Workspaceデータがすでにあるため、前のタスクにコピーしたシークレット値を格納するOCI Vaultを作成します。このシークレットはOCI Vaultに格納する必要があるため、次のステップで作成するOCIファンクション・コード内に挿入する必要はありません。
-
OCI Vaultを作成するには、OCIコンソールのメイン・メニューに移動し、「アイデンティティとセキュリティ」、「Vault」に移動します。
-
Vaultページがロードされたら、「Vaultの作成」をクリックし、目的のコンパートメントを選択してVaultという名前を付けます。
-
Vaultを作成したら、マスター暗号化キーを作成する必要があります。このキーは、Vault内のすべてのシークレットの暗号化に使用されます。これを行うには、次のイメージに示すように「キーの作成」をクリックします。
-
マスター・キーの作成が終了したら、「シークレット」メニューをクリックし、前のステップで書き留めたMicrosoft Azureシークレットを作成します。
-
タスク3に示すように、Microsoft Azure Sentinel Log Analyticsワークスペースの主キーまたはセカンダリ・キー・データを使用して、Vaultでシークレットを作成するために必要なフィールドに入力します。
-
その他の項目(Sentinel Workspace IDおよびログがSentinelに格納される表の名前)は、Vaultに挿入できる場合と挿入されない場合があります。ここでは、ファンクションのコード内に挿入します。
重要: Vault内に作成するシークレットのOCIDをノートにとります。
タスク5: OCIファンクションの作成と構成
OCIリージョンで集中管理されたロギング環境を設定した後、VaultとAzure環境の準備ができたら、OCIリージョンからMicrosoft Azure Sentinelにカスタム・ログおよび監査ログを送信するOCIファンクションを作成します。
タスク5.1: OCIファンクションの作成
-
OCIコンソールのメイン・メニューに移動し、「開発者サービス」、「ファンクション」に移動します。
-
「関数」ページがロードされたら、「アプリケーションの作成」をクリックします。
-
必要なフィールドに入力し、「作成」をクリックします。
-
作成後、ファンクションはネットワーク・セキュリティ・グループによって保護されないことに注意してください。これをネットワーク・セキュリティ・グループに追加する必要があります。
重要事項:
-
FunctionがMicrosoft Azure Sentinelにログを送信するためにパブリックMicrosoft Azureエンドポイントにアクセスするため、この関数はインターネットにアクセスできるサブネットに作成する必要があります。
-
また、VNETセキュリティ・リストを検証して、OCI機能がインターネットにアクセスできないようにします。
-
タスク5.2: OCIファンクションおよび起動の構成
OCIファンクションが作成されると、環境にファンクションを構成するために必要なコマンドが画面に表示されます。ここでは、例として、Cloud Shellを介してステップバイステップを実行しますが、これらの設定を機器に直接実行することもできます。
-
構成するOCIリージョンのWebコンソールでCloud Shellを直接開きます(このチュートリアルでは、リージョンはブラジル東部です)。
-
「ファンクション」ページに表示されるステップに従って、Cloud Shellターミナル内でリクエストされたコマンドを実行します。
-
実行する最初の3つのコマンドを変更する必要はありませんが、4番目のコマンドでは、アプリケーション・イメージが格納されるリポジトリの名前を指定する必要があります。この例では、入力された名前は repo-ocilog-to-azuresiemです。
$ fn update context registry gru.ocir.io/xxxxxxxxxa/repo-ocilog-to-azuresiem
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)プロファイル内に認証トークンを生成します。認証トークンは、ファンクションのDockerイメージが格納されるOCIリポジトリと対話できるアクセス資格証明です。OCI Webコンソールのユーザー・アイコンをクリックし、「マイ・プロファイル」をクリックします。
-
ユーザー・ページ内でスクロール・ダウンし、「認証トークン」をクリックします。
-
「認証トークン」セクションで、「トークンの生成」をクリックします。
-
認証トークンの名前を入力し、「トークンの生成」をクリックします。
重要:このトークンを書き留め、安全な場所に格納してください。このトークンは、ファンクション・イメージが格納されるOCIレジストリへのアクセス・パスワードです。
-
OCI Webコンソールのメイン・メニューにアクセスし、「開発者サービス」、「ファンクション」にアクセスして、「ファンクション」ページに戻ります。
-
「Functions」ページで、前のステップで作成したFunctionにアクセスします。
-
「開始」メニューをクリックし、認証トークン作成ステップの後にステップバイステップを続行します。
-
コマンド
docker login
を実行し、パスワードとして、最後に実行したステップで認証トークンの作成からコピーした文字列を使用します。 -
次のステップでは、ファンクションを作成、デプロイおよび起動します。Cloud Shellでファンクションを初期化するには、画面の例に示されているコマンドを変更します。使用するランタイム環境はPythonにあるため、この変更が必要です(ファンクションの作成によって推奨されるhello-world例に示されているJavaではありません)。
$ fn init --runtime python func-ocilog-to-azuresiem
タスク5.2.1: OCIファンクションのソース・コードの記述
-
init
コマンドが実行されたら、新しく作成されたFunctionディレクトリにアクセスします。$ cd func-ocilog-to-azuresiem/
- アクセスしたディレクトリ内に、Pythonファイル(
func.py
)、YAMLファイル(func.YAML
)および要件ファイル(requirements.txt
)があることに注意してください。これらの2つのファイルを編集する必要があります。
- アクセスしたディレクトリ内に、Pythonファイル(
-
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つのフィールドを変更する必要があります。
-
_customer_id: Azureサブスクリプション内のLog AnalyticsワークスペースIDの「エージェント管理」メニュー。
-
_shared_key: 「エージェント管理」メニューからも取得できる主キーまたはセカンダリ・キー。
-
_log_type: SIEM Sentinelが使用するLog Analyticsワークスペースの名前。このワークスペースに入ってくるすべてのログは、Sentinelによって分析されます。この例では、OCILoggingを使用しています。
-
-
上の情報を取得できる画面の例を次に示します。
ノート: Azureサブスクリプション内でLog Analytics Workspaceを構成するには、このドキュメントの範囲外です。詳細については、Microsoftの公式ドキュメントを参照してください。
-
-
func.py
ファイルを変更したら、requirements.txt
ファイルを編集します。OCI Functionsパッケージ・マネージャがスクリプトを正しく動作させるために必要なPython依存関係をインストールする要件を挿入します。この場合、requestsという単語をファイルの最後の行に挿入します。 -
これが完了したら、ファンクションのデプロイ・ステップを実行します。
$ fn -v deploy --app app-ocilog-to-azuresiem
数分後、ファンクションの構成とDockerイメージの作成が正常に完了します。
タスク5.2.2: OCIファンクションに必要な権限の提供
OCIファンクションをスムーズに実行するには、Vault内のAzureシークレットを読み取る権限が必要です。そのためには、作成したファンクションの動的グループを作成し、この動的グループに対して、コードでVaultを読み取ってAzureから共有キーをセキュアに取得できるように、必要な権限(最小権限)を付与します。
そのため、前述の項目2.2と同様に、ログを収集するサーバーを集計する動的グループを作成し、ステップを再トレースして、ファンクションを含む動的グループを作成します。
動的グループの作成時には、ファンクションの取得に使用される照合ルールが必要です。この例では、このチュートリアル専用のコンパートメントのすべてのファンクションをリストする一致ルールを作成します。
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxgjxxxxglxxxxiqxxxxjdxxxxnxxxxmxxxxm3xxxxmoxxxxsxxx'}
-
コンパートメントのOCIDを取得し、それを一致ルールに挿入して、動的グループを作成します。
-
動的グループを作成したら、「アイデンティティとセキュリティ」、「ポリシー」に移動して、ファンクションが読取りモードでVaultにアクセスできるようにするポリシーを作成します。
- 動的グループが作成されたら、ファンクションによるVaultへのアクセスを許可するポリシーを作成します。
-
次のポリシーを使用して、Vault資格証明読取りアクティビティを実行するために必要な最小限のアクセス権をファンクションに付与します。
Allow dynamic-group <FUNCTION\_DYNAMIC\_GROUP\_NAME> to read secret-bundles in compartment <COMPARTMENT\_NAME>
タスク5.2.3: OCIファンクションの実行
-
関数を実行して、正しく動作していることを確認します。
$ fn -v deploy --app app-ocilog-to-azuresiem
ファイナライズするには、OCIサービス・コネクタを構成して、リージョンからすべてのOCIログを取得し、作成したファンクションを使用してAzure SIEMに送信する必要があります。
タスク6: サービス・コネクタの構成
Microsoft Azure Sentinelの分析のためにOCIテナントのリージョンのログを送信できるようにするには、サービス・コネクタを構成する必要があります。
基本的に、このサービスは、すでに構成したOCIログを取得し、これをファンクションに送信し、次にすべてのログをAzureサブスクリプションに転送します。
-
OCIコンソールのメイン・メニューに移動し、「監視および管理」、「**サービス・コネクタ」に移動します。
-
サービス・コネクタ内で、「サービス・コネクタの作成」をクリックします。
-
必須の名前および説明フィールドに入力し、サービス・コネクタを作成するコンパートメントを選択します。
-
ここで、サービス・コネクタを介して転送されるデータのソースを選択します。ここでは、ロギングを使用します。また、ターゲットとして、つまりデータが移行される場所として、Functionsを使用します。
-
構成をファイナライズするには、ソースの構成で、OCIファンクションに送信されるログを選択します。このステップでは、
\_Audit
ログを選択し、さらにログを追加する必要があります。この手順の最初のステップで作成したログ・グループを選択します。- 別のログ・グループを追加する場合は、「+別のログ」をクリックします。
-
このステップを完了したら、ターゲット・パラメータ(つまり、Azureサブスクリプションにデータを送信するOCI関数)を定義する必要があります。これを行うには、ファンクションがあるコンパートメントを選択し、アプリケーションを選択してから、ファンクションの名前を選択します。次に、次のイメージに示すように「作成」をクリックします。
プロセスは終了しました。この時点で、ログが自動的にMicrosoft Azureに送信されるまで待ちます。
「メトリック」メニューによって作成されたサービス・コネクタの操作をモニターできます。
タスク7: Microsoft Azure Sentinelでのログの読取り
-
しばらくすると、次のイメージに示すように、すべてのサーバーのログがMicrosoft Azureサブスクリプションに送信されます。
-
Microsoft Azure Sentinel構成によると、SIEMルールがトリガーされると、インタフェースでインシデントが表示され始めます。
-
ブラジル東部リージョン・サーバーに対してインシデントをオープンしました(この例ではインシデントを生成するために、「[Lab] Regex Incident」というカスタム・ルールを作成しました)。
-
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を参照してください。
Ingest Oracle Cloud Infrastructure logs into Microsoft Azure Sentinel using OCI Functions
F80858-01
April 2023
Copyright © 2023, Oracle and/or its affiliates.