ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
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 APIでは、各アイデンティティ・ドメインを個別に問い合せる必要があるため、追加のオーバーヘッドが発生します。
- データはSIEMなどの外部システムにプッシュできますが、OCI IAM AuditEvents APIではポーリングが必要です。
- OCI Auditでは、1年間のイベント・データが保存されます。OCI IAMでは、90日間監査イベントが格納されます。
目標
OCI IAMアイデンティティ・ドメインで生成された監査イベントを外部ストアに同期します。
前提条件
- アイデンティティ・ドメインのあるOCIテナンシ
- Azure Log Analytics Workspaceを使用したAzureクラウド・アカウント
タスク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の使用など、全体的なアプローチが必要です。基本的なフローは次のとおりです。
- OCI IAMアイデンティティ・ドメインは、監査イベントをOCI Auditに書き込みます。
- OCIイベント・サービスには、OCI IAMの特定の監査イベント・タイプについてOCI監査を監視するルールがあります。ルールがトリガーされると、OCIファンクションのファンクションが起動します。
- この関数は、RAW監査ログをそのペイロードで受信し、Azure Log Analytics Data Collector APIを呼び出してデータをAzure Log Analytics Workspaceに送信します。
- Azure Log Analytics Workspaceは、Microsoft Sentinelのデータ・ストアとして機能します。
タスク2: OCI Auditを使用したOCI IAMからの監査イベントの取得
-
この例では、AzureポータルでAzure Log Analytics Workspaceを設定していることを前提としています。設定したら、ワークスペースIDおよびプライマリ(またはセカンダリ)キーをワークスペース名、設定、エージェント、Log Analyticsエージェント手順の下にコピーします。これらの値は、OCIファンクションを使用してカスタム・ファンクションを記述する際に必要になります。
-
テナント管理者としてOCIコンソールにログインします。
-
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" } )
-
-
このガイドに従って、CloudShell (CloudShellでのファンクション・クイックスタート)を使用してファンクションをデプロイします。
-
基準に一致する監査ログを検索し、ステップ3および4で作成およびデプロイしたファンクションを呼び出すOCIイベント・サービスにルールを作成します。
-
コンソールの検索バーまたは左側の「サービス」メニュー内の検索バーで「イベント」を検索して、イベント・サービスに移動します。検索結果で「ルール」をクリックします。
-
管理者ドメインおよび従業員ドメインでユーザー作成、更新または削除イベントを検索する条件を含むルールを作成します。
-
ユーザーの作成、更新および削除イベント・タイプは、アイデンティティ・サービスで使用できます。
-
2つのアイデンティティ・ドメインのGUIDを含む追加の"属性"条件を追加します。
ノート: これはオプションです。デフォルトでは、クラウド・アカウント内のすべてのアイデンティティ・ドメインの監査イベントが一致します。ただし、アイデンティティ・ドメインのサブセットにのみ関心がある場合は、スコープ内ドメインを明示的に指定できます。)アイデンティティ・ドメインGUIDは、アイデンティティ・ドメインの概要ページで確認できます。
-
「アクション」パネルで、「ファンクション」アクション・タイプを選択し、前述のステップ3および4で作成およびデプロイしたファンクションを選択します。
-
-
-
ここで、いずれかのアイデンティティ・ドメインでユーザーを作成、更新または削除すると、RAW監査ログをペイロードとしてOCIファンクションが呼び出されます。OCIファンクションは、データをAzure Log Analyticsワークスペースにポストします。
OCILogging_CL
という名前のカスタム表のデータが表示されます。
関連リンク
謝辞
- 著者: Ari Kermaier (コンサルティング・メンバー、OCI Identity)およびManoj Gaddam (プリンシパル・プロダクト・マネージャ、OCI Identity)
その他の学習リソース
docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Implement multicloud security using OCI Audit to capture events from OCI Identity and Access Management
F83130-01
June 2023
Copyright © 2023, Oracle and/or its affiliates.