LogoLogo
KeeperPAMとシークレットマネージャー
KeeperPAMとシークレットマネージャー
  • KeeperPAM
  • 特権アクセス管理
    • セットアップ手順
    • クイックスタート (Sandbox)
    • はじめに
      • アーキテクチャ
        • アーキテクチャ図
        • ボルト (保管庫) のセキュリティ
        • ルータのセキュリティ
        • ゲートウェイのセキュリティ
        • 接続とトンネルのセキュリティ
      • KeeperPAMのライセンス
      • 強制適用ポリシー
      • ボルトの構造
      • レコードリンク
      • アプリケーション
      • デバイス
      • ゲートウェイ
        • ゲートウェイの作成
        • Dockerにインストール
        • Linuxにインストール
        • Windowsにインストール
        • 自動アップデータ
        • 高度な設定
          • AWS KMSでのゲートウェイ構成
          • カスタムフィールドを使用したゲートウェイ構成
      • PAM構成
        • AWS環境のセットアップ
        • Azure環境のセットアップ (英語)
        • ローカル環境のセットアップ (英語)
      • PAMリソース
        • PAMマシン
          • 例: Linuxマシン (英語)
          • 例: Azure仮想マシン (英語)
        • PAMデータベース
          • 例: MySQLデータベース (英語)
          • 例: PostgreSQLデータベース (英語)
          • 例: Microsoft SQL Serverデータベース (英語)
        • PAMディレクトリ
        • PAMリモートブラウザ
        • PAMユーザー
      • 共有とアクセス制御 (英語)
      • ジャストインタイムアクセス (JIT) (英語)
    • パスワードローテーション
      • ローテーションの概要
      • ローテーションの活用事例
        • Azure
          • Azure ADユーザー
          • Azure VMユーザーアカウント
          • Azureマネージドデータベース
            • Azure SQL
            • Azure MySQL - シングル/フレキシブルデータベース
            • Azure MariaDBデータベース
            • Azure PostgreSQL - シングル/フレキシブルデータベース
          • Azureアプリケーションシークレットローテーション
        • AWS
          • IAMユーザーのパスワード
          • Managed Microsoft ADユーザー
          • EC2仮想マシンユーザー
          • IAMユーザーのアクセスキー
          • マネージドデータベース
            • AWS RDS for MySQL
            • AWS RDS for SQL Server
            • AWS RDS for PostgreSQL
            • AWS RDS for MariaDB
            • AWS RDS for Oracle
        • ローカルネットワーク
          • Active DirectoryやOpenLDAPユーザー
          • Windowsユーザー
          • Linuxユーザー
          • macOSユーザー
          • データベース
            • ネイティブMySQL
            • ネイティブMariaDB
            • ネイティブPostgreSQL
            • ネイティブMongoDB
            • ネイティブMS SQL Server
            • ネイティブOracle
        • SaaSアカウント
          • Oktaユーザー
          • Snowflakeユーザー
          • REST APIを使用した認証情報のローテーション (英語)
        • ネットワークデバイス
          • Cisco IOS XE
          • Cisco Meraki
      • サービス管理
      • ポストローテーションスクリプト
        • 入力と出力
        • スクリプトの添付
        • コード例
    • 接続
      • はじめに
      • セッションプロトコル
        • SSH接続
        • RDP接続 (英語)
        • RBI接続 (英語)
        • MySQL接続 (英語)
        • SQL Server接続 (英語)
        • PostgreSQL接続 (英語)
        • VNC接続 (英語)
        • Telnet接続 (英語)
      • 具体例 (英語)
        • SSHプロトコル - Linuxマシン (英語)
        • RDPプロトコル - Azure仮想マシン (英語)
        • MySQLプロトコル - MySQLデータベース (英語)
        • PostgreSQLプロトコル - PostgreSQLデータベース (英語)
    • トンネル
      • トンネルの設定
    • リモートブラウザ分離
      • RBI (リモートブラウザ分離) の設定
        • URLパターンとリソースURLパターン
        • ブラウザの自動入力
    • セッションの録画と再生
    • SSHエージェント
      • Gitとの統合
    • 検出
      • コマンダーを使用した検出 (英語)
      • ボルトを使用した検出 (英語)
    • オンプレミス用コネクションマネージャー
    • 参考資料
      • ポートマッピング
      • SSHの設定
      • WinRMを設定
      • SQL Serverの設定 (英語)
      • Linuxへのsqlcmdのインストール (英語)
      • LinuxでのDockerインストール
      • ローテーション用のKSMアプリの作成
      • Active Directoryの最小権限
      • イベントレポート
      • PAMレコードのインポート
      • CLIによるローテーション管理
      • Commander SDK
      • Cron式で自動ローテーション設定
      • プレビュー版へのアクセス方法
  • エンドポイント特権マネージャー
    • 概要
  • セットアップ
  • デプロイメント (展開)
  • ポリシー
  • リクエストの管理
  • よくある質問
  • シークレットマネージャー
    • 概要
    • クイックスタートガイド
    • Keeperシークレットマネージャー (KSM) について
      • アーキテクチャ
      • 用語
      • セキュリティと暗号化モデル
      • ワンタイムアクセストークン
      • Secrets Managerの設定
      • Keeper表記法
      • イベントレポート
      • フィールド/レコードタイプ
    • シークレットマネージャーCLI
      • profileコマンド
      • initコマンド
      • secretコマンド
      • folderコマンド
      • syncコマンド
      • execコマンド
      • configコマンド
      • versionコマンド
      • 各種コマンド
      • Dockerコンテナ
      • カスタムのレコードタイプ
    • パスワードローテーション
    • 開発者用SDK
      • Python SDK
      • Java/Kotlin SDK
        • レコードフィールドクラス
      • JavaScript SDK
      • .NET SDK
      • Go SDK
        • レコードフィールドクラス
      • PowerShell
      • ボルトのSDK
    • インテグレーション
      • Ansible
        • Ansibleプラグイン
        • Ansible Tower
      • AWS CLI認証プロセス
      • AWSシークレットマネージャー同期
      • AWS KMSでの暗号化
      • Azure DevOps拡張機能
      • Azure Key Vaultとの同期
      • Azure Key Vaultでの暗号化
      • Bitbucketプラグイン
      • Dockerイメージ
      • Dockerランタイム
      • Docker Writerイメージ
      • Entrust HSM
      • Git - SSHでコミットに署名
      • GitHub Actions
      • GitLab
      • GCPシークレットマネージャー
      • Google Cloud Key Management Encryption (英語)
      • Hashicorp Vault
      • Heroku
      • Jenkinsプラグイン
      • Keeper Connection Manager
      • Kubernetes外部シークレットオペレータ
      • Kubernetes
      • Linux Keyring
      • Octopus Deploy
      • Oracle Key Vault Encryption (英語)
      • PowerShellプラグイン
      • ServiceNow
      • TeamCity
      • Teller
      • Terraformプラグイン
        • Terraformレジストリ
      • Windows資格情報マネージャー
      • XSOAR
    • トラブルシューティング
  • コマンダーCLI
    • コマンダーの概要
    • インストールとセットアップ
      • WindowsでのCLIインストール
      • MacでのCLIインストール
      • LinuxでのCLIインストール
      • Python開発者用セットアップ
      • .NET開発者用セットアップ
      • PowerShellモジュール
      • ログイン
      • 設定と使用法
        • AWS Secrets Manager
        • AWS Key Management Service
      • Windowsタスクによる自動化
      • AWS Lambdaで自動化
      • アンインストール
    • コマンドリファレンス
      • データのインポートとエクスポート
        • インポート/エクスポートコマンド
        • CyberArkからのインポート
        • LastPassデータのインポート
        • Delinea/Thycotic Secret Serverインポート
        • Keepassインポート
        • ManageEngineインポート
        • Mykiインポート
        • Proton Passインポート
        • CSVインポート
        • JSONインポート
      • レポート作成コマンド
        • レポートの種類
      • エンタープライズ管理コマンド
        • ユーザーの作成と招待
        • コンプライアンスコマンド
        • Breachwatchコマンド
        • SCIMプッシュ配信設定
      • レコードに関するコマンド
        • レコードタイプに関するコマンド
        • レコードタイプの作成
      • 共有コマンド
      • KeeperPAMコマンド
      • 接続コマンド
        • SSH
        • SSHエージェント
        • RDP
        • connectコマンド
        • SFTP同期
      • シークレットマネージャーコマンド
      • MSP管理コマンド
      • 各種コマンド
      • パスワードローテーション
        • パスワードローテーションコマンド
        • AWSプラグイン
        • Azureプラグイン
        • Microsoft SQL Serverのプラグイン
        • MySQLプラグイン
        • Oracleプラグイン
        • PostgreSQLプラグイン
        • PSPasswdプラグイン
        • SSHプラグイン
        • Unix Passwdプラグイン
        • Windowsプラグイン
        • Active Directoryプラグイン
        • 自動実行
    • サービスモードREST API
    • トラブルシューティング
GitBook提供
このページ内
  • 概要
  • 要件
  • ローテーションスクリプトのロジックフロー
  • 1. 管理者資格情報の取得
  • 2. シークレットのローテーションロジック
  • PAM ユーザー レコード - フィールド要件
  • 必須フィールド
  • 必要となるカスタムフィールド
  • Keeperボルトでのローテーションの設定
  • Pythonスクリプト
GitHubで編集
  1. 特権アクセス管理
  2. パスワードローテーション
  3. ローテーションの活用事例
  4. Azure

Azureアプリケーションシークレットローテーション

KeeperシークレットマネージャーローテーションでAzureアプリのシークレットを自動的にローテーション

前へAzure PostgreSQL - シングル/フレキシブルデータベース次へAWS

最終更新 1 か月前

概要

本ページでは、KeeperPAMの「PAMスクリプトのみ実行」オプションを使用して、Azureアプリケーションのシークレットをローテーションさせる方法について取り扱います。 これはPAMユーザーのローテーション設定内のオプションであり、ゲートウェイが主要なローテーション方法をスキップし、ボルト内のPAMユーザーレコードに添付されたポストローテーションスクリプトを直接実行するよう指示する設定です。

以下には、要件、手順、Pythonスクリプトの例を記載しています。スクリプトでは、以前のシークレットを削除して、新しいアプリケーションシークレットをKeeperに保存するなど、安全にアプリケーションシークレットをローテーションするようにします。この新しいシークレットは自動的に、既に許可されているすべてのKSMアプリケーションおよびユーザーが利用できるようになります。

要件

以下がすでに実行されていることを前提としています。

  • がご利用のロールに対して有効になっていること

  • Keeperシークレットマネージャーが作成済みであること

  • がKeeperのドキュメントに従って設定されていること

  • ゲートウェイホストには、以下の2つの依存関係に対応したバージョンのPythonがインストールされている必要があります。

pip3 install keeper_secrets_manager_core
pip3 install azure.identity

ローテーションスクリプトのロジックフロー

1. 管理者資格情報の取得

スクリプトからは、以下の2つの方法で管理者の認証情報を取得します。

  1. ポストローテーションスクリプトに直接添付されたレコード。

  2. ローテーション用に選択されたAzure PAM構成に提供されるアクセスキー。このアクセスキーは、ポストローテーションスクリプトに添付されたレコード (1で作成したもの) 内にアクセスキーが見つからない場合に使用されます。

管理アプリケーションのシークレットを含む別のレコードをPAMスクリプトに添付すると、本ページに記載のプロセスを使用して、その別のレコード内で管理アプリケーションのシークレットを簡単にローテーションできるようになります。

2. シークレットのローテーションロジック

スクリプトでは以下を行います。

  1. PAMスクリプトに添付されたレコードまたは PAM構成から管理アプリケーションのシークレットを取得します。

  2. 上記の手順で見つかった管理者アプリケーションのシークレットを使用して、Microsoft Graph アクセストークンを取得します。

  3. PAMユーザーレコードで定義されたAzureアプリケーションで新しいクライアントシークレットを作成します。

  4. 定義されたAzureアプリケーション用のその他の既存のシークレットをすべて削除して、上記の手順で生成されたシークレットのみを保持します。

  5. 新しいシークレットとシークレットIDを使用してKeeper PAMユーザーレコードを更新します。

PAM ユーザー レコード - フィールド要件

必須フィールド

フィールド名
説明

ログイン

この必須フィールドは、このスクリプトでは使用されません。このフィールドを使用して、ローテーションするAzureアプリケーションの名前などの情報を保存できます。

パスワード

この場合はダミー値になります。パスワードフィールドは自動的にローテーションし、使用されることはありませんが、必須フィールドです。

必要となるカスタムフィールド

カスタムフィールドラベル
フィールドタイプ
説明

テキスト

このフィールドで、Azure内のどのアプリケーションをローテーションするかを指定します。Azureポータル > アプリケーションの登録 > アプリの概要タブ > アプリケーション (クライアント) ID から、ローテーションするアプリケーションのアプリケーションオブジェクトIDを取得する必要があります。

テキスト

このフィールドには、ローテーション後に新しいクライアントシークレットIDが設定されます。

隠しフィールド

このフィールドは、ローテーション後に新しいクライアントシークレットが設定れます。

テキスト

このフィールドには、ローテーション後の新しいシークレットの有効期限が設定されます。

テキスト

NOOPを有効にする2番目のフィールド。

値は以下となります。

上記の詳細を使用してPAMユーザーレコードを手動で作成する代わりに、以下のcsvファイルをインポートすることもできます。これにより、必要に応じて修正および複製できるテンプレートレコードが作成されます。

ファイルをインポートすると、ログインレコードタイプが生成されますので、必ずPAM ーザーに変換してください。

Keeperボルトでのローテーションの設定

このスクリプトは、Azureに対して認証し、別のアプリケーションのシークレットをローテーションするために、管理者アプリケーション シークレットを必要とします。ここでは、Azure PAM構成で提供される管理者アプリケーションのシークレットを使用します。

Keeperボルトからの設定

  1. ボルトに共有フォルダを作成します。

  2. ゲートウェイがまだ存在しない場合は、Keeperボルトのシークレットマネージャータブでゲートウェイ用の新しいアプリケーションを作成します。

  3. アプリケーションに上記で作成した共有フォルダに対して編集権限があることを確かにします。

  4. Linuxボックスでゲートウェイ (アプリケーションを選択した後のゲートウェイタブ) をプロビジョニングします。Keeperボルトによって提供されるインストール コマンドを実行し、Pythonと上記の依存関係がインストールされていることを確かにします。

  5. Keeperボルトのシークレットマネージャータブで、PAM構成タブに移動します。必要に応じて、新しいPAM構成を作成します。

  6. 「環境」で、「Azure」を選択し、ゲートウェイを選択して、共有フォルダを選択し、「Entra ID」名 (Entra ID 環境の任意の名前)、管理アプリケーションの「クライアント ID」 (Azureポータルの管理アプリケーションの[概要]タブ)、「クライアントシークレット」 (Azureポータルの管理アプリケーションの[証明書とシークレット]タブ)、「サブスクリプション ID」および「テナント ID」を入力します。

  7. 前述のPAMユーザーレコードを編集します。

    • パスワードローテーション設定: 希望するスケジュールと上記で作成したPAM構成を選択します。

    • レコードにPAMスクリプトを追加します。以下のファイルを選択し、スクリプトコマンドを指定してください。

python3

管理者 Azure アプリケーションのアプリケーション シークレットをローテーションすることも可能です。これを行うには、管理者 Azure アプリ シークレットを別の Keeper PAM ユーザー レコードに保存する必要があります。

管理者アプリシークレットレコードの要件

PAMユーザーレコードには、上記のドキュメントで説明されているすべてのフィールドに加えて、以下の追加フィールドが必要です。

必要なカスタムフィールド

カスタムフィールドラベルstom Field Label
フィールドタイプ
Description

テキスト

ご利用のAzureテナントIDを入力します。

テキスト

管理アプリクライアントIDを入力します。Azureポータル > アプリ登録で管理アプリケーションの概要タブにあります。

上記のドキュメントと追加フィールドを使用してPAMユーザーレコードを手動で作成する代わりに、以下のCSVファイルをインポートすることもできます。これにより、必要に応じて修正および複製可能なテンプレートレコードが作成されます。

ファイルをインポートするとログインレコードタイプが生成されるため、必ずPAMユーザーに変換してください。

Keeperボルトからの設定:

  1. ボルトに共有フォルダを作成します。

  2. 上記のフィールドとカスタムフィールドを使用して、共有フォルダにPAMユーザーレコードを作成します。

  3. ゲートウェイがまだ存在しない場合は、Keeperボルトのシークレットマネージャータブでゲートウェイ用の新しいアプリケーションを作成します。

  4. アプリケーションに上記で作成した共有フォルダに対して編集権限があることを確かにします。

  5. Linuxボックスでゲートウェイ (アプリケーションを選択した後のゲートウェイタブ) をプロビジョニングします。Keeperボルトによって提供されるインストール コマンドを実行し、Pythonと上記の依存関係がインストールされていることを確かにします。

  6. Keeperボルトのシークレットマネージャータブで、PAM構成タブに移動します。必要に応じて、新しいPAM構成を作成します。

  7. 「環境」で、「Azure」を選択し、ゲートウェイを選択して、共有フォルダを選択し、「Entra ID」名 (Entra ID 環境の任意の名前)、管理アプリケーションの「クライアント ID」 (Azureポータルの管理アプリケーションの[概要]タブ)、「クライアントシークレット」 (Azureポータルの管理アプリケーションの[証明書とシークレット]タブ)、「サブスクリプション ID」および「テナント ID」を入力します。

  8. 前述のPAMユーザーレコードを編集します。

    • パスワードローテーション設定: 希望するスケジュールと上記で作成したPAM 構成を選択します。

    • レコードにPAMスクリプトを追加します。以下のファイルを選択し、スクリプトコマンドを指定してください。

python3

Pythonスクリプト

import logging
import requests
import sys
import base64
import json
from azure.identity import ClientSecretCredential
from datetime import datetime, timedelta, timezone
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage

# sys.stdinは配列ではなく、添字でアクセスできません(例:sys.stdin[0])。
for base64_params in sys.stdin:
    # ゲートウェイからパラメータを取得する
    params = json.loads(base64.b64decode(base64_params).decode('utf-8'))
    break

# ポストローテーションスクリプトに添付されたレコードをKeeperから取得する
records = json.loads(base64.b64decode(params.get('records')).decode('utf-8'))

# ゲートウェイ設定を使用してKeeperシークレットマネージャーSDKを初期化する
secrets_manager = SecretsManager(config=FileKeyValueStorage('/etc/keeper-gateway/gateway-config.json'))

# ログの設定
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

GRAPH_API_URL = "https://graph.microsoft.com/v1.0"

# ClientSecretCredentialを使用してMicrosoft Graphアクセストークンを取得する関数
def get_access_token(tenant_id, client_id, client_secret):
    try:
        credential = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
        token = credential.get_token("https://graph.microsoft.com/.default")
        logger.info("Authentication successful.")
        return token.token
    except Exception as e:
        logger.error(f"Authentication failed: {e}")
        raise

# 新しいクライアントシークレットを作成し、そのIDとシークレットテキストを返す関数
def create_client_secret(access_token, target_app_id, secret_expiry_days=365):
    try:
        # タイムゾーンを考慮した日時を使用して、シークレットの有効期限を設定する
        expiry_time = (datetime.now(timezone.utc) + timedelta(days=secret_expiry_days)).isoformat()

        # 新しいクライアントシークレットを作成するためのAPIリクエストボディ
        body = {
            "passwordCredential": {
                "displayName": "Client Secret Rotated by Keeper",
                "endDateTime": expiry_time
            }
        }

        headers = {
            "Authorization": f"Bearer {access_token}",
            "Content-Type": "application/json"
        }

        response = requests.post(f"{GRAPH_API_URL}/applications/{target_app_id}/addPassword", json=body, headers=headers)
        
        if response.status_code == 200:
            response_json = response.json()
            new_client_secret = response_json['secretText']
            secret_id = response_json['keyId']  # 新しいクライアントシークレットのIDを取得

            # 新しいシークレットとそのIDの両方をログに記録する
            logger.info(f"New client secret created for Application {target_app_id}. Secret ID: {secret_id}.")
            return secret_id, new_client_secret, expiry_time
        else:
            logger.error(f"Failed to create client secret: {response.status_code}, {response.text}")
            raise Exception(f"Failed to create client secret: {response.status_code}")
    except Exception as e:
        logger.error(f"An error occurred: {e}")
        raise

# 既存のクライアントシークレットを取得する関数
def get_existing_client_secrets(access_token, target_app_id):
    try:
        headers = {
            "Authorization": f"Bearer {access_token}"
        }

        response = requests.get(f"{GRAPH_API_URL}/applications/{target_app_id}", headers=headers)
        if response.status_code == 200:
            app = response.json()
            logger.info(f"Retrieved existing client secrets for Application {target_app_id}.")
            return app.get('passwordCredentials', [])
        else:
            logger.error(f"Failed to retrieve client secrets: {response.status_code}, {response.text}")
            raise Exception(f"Failed to retrieve client secrets: {response.status_code}")
    except Exception as e:
        logger.error(f"An error occurred: {e}")
        raise

# 新しく作成されたクライアントシークレットを除く、古いクライアントシークレットを削除する関数
def delete_old_secrets(access_token, target_app_id, new_client_secret_id):
    try:
        headers = {
            "Authorization": f"Bearer {access_token}",
            "Content-Type": "application/json"
        }

        existing_secrets = get_existing_client_secrets(access_token, target_app_id)
        
        # すべてのシークレットを繰り返し処理し、新しく作成されたシークレットでないものを削除する
        for secret in existing_secrets:
            if secret['keyId'] != new_client_secret_id:
                body = {
                    "keyId": secret['keyId']
                }
                response = requests.post(f"{GRAPH_API_URL}/applications/{target_app_id}/removePassword", json=body, headers=headers)

                if response.status_code == 204:
                    logger.info(f"Deleted secret with ID: {secret['keyId']} for Application {target_app_id}.")
                else:
                    logger.error(f"Failed to delete secret: {response.status_code}, {response.text}")
                    raise Exception(f"Failed to delete secret: {response.status_code}")
    except Exception as e:
        logger.error(f"An error occurred: {e}")
        raise

# メイン関数
def rotate_client_secret(tenant_id, client_id, client_secret, target_app_id, secret_expiry_days=365, delete_old_secrets_flag=False):
    try:
        # ステップ1: アクセストークンを取得する
        access_token = get_access_token(tenant_id, client_id, client_secret)
        
        # ステップ2: 新しいクライアントシークレットを作成し、そのIDを取得する
        new_client_secret_id, new_client_secret, expiry_time = create_client_secret(access_token, target_app_id, secret_expiry_days)
        if not new_client_secret:
            logger.error("Failed to create a new client secret. Exiting.")
            return None, None, None  # シークレットの作成に失敗した場合は、さらに実行を防止する
        
        logger.info(f"New client secret id: {new_client_secret_id}. Expiration date: {expiry_time}")
        
        # ステップ3: 必要に応じて古いシークレットを削除するが、新しく作成されたシークレットは除外する
        if delete_old_secrets_flag:
            delete_old_secrets(access_token, target_app_id, new_client_secret_id)

        return new_client_secret_id, new_client_secret, expiry_time
    except Exception as e:
        logger.error(f"An error occurred during the secret rotation process: {e}")
        return None, None, None  # エラーが発生した場合は、`None`を返す

# ゲートウェイからの入力と、KSMを使用した完全なPAMユーザークエリ
pam_user_to_update = secrets_manager.get_secrets([params.get('userRecordUid')])[0]

# アプリケーションのオブジェクトIDを取得してローテーションを実行する
try:
    target_app_id = pam_user_to_update.custom_field('application_object_id', single=True)
except Exception as e:
    raise RuntimeError(f"No app object id found, the script will exit after this error: {e}")

# 管理者ユーザーアカウントのアクセスキーを取得する
admin_cred_provided = False
for record in records:
    if "application_client_id" in record:
        client_id = record["application_client_id"]
        client_secret = record["client_secret"]
        tenant_id = record["tenant_id"]
        admin_cred_provided = True
        logger.info(f"Admin creds provided. Using secret_id {client_id}, from attached record UID {record['uid']}.")
        break
    elif "clientId" in record:
        client_id = record["clientId"]
        client_secret = record["clientSecret"]
        tenant_id = record["tenantId"]
        admin_cred_provided = True
        logger.info(f"Admin creds provided. Using secret_id {client_id}, from attached PAM Config record UID {record['uid']}.")
        break

# もし添付されたレコードにアプリケーションキーが提供されていない場合は、PAM設定を使用する
if admin_cred_provided == False:
    try:
        pam_config = secrets_manager.get_secrets([params.get('providerRecordUid')])[0]
        client_id = pam_config.field('clientId', single=True)
        client_secret = pam_config.field('clientSecret', single=True)
        tenant_id = pam_config.field('tenantId', single=True)
        admin_cred_provided = True
        logger.info(f"Using PAM config creds. Using secret_id {client_id}, from PAM Config UID.")
    except Exception as e:
        logger.error(f"Error retrieving admin creds from PAM config: {e}")

# 認証情報が提供されていない場合は終了する
if not admin_cred_provided:
    raise RuntimeError("No admin creds provided. The script will exit.")

# クライアントシークレットをローテーションし、成功/失敗を処理する
new_client_secret_id, new_client_secret, expiry_time = rotate_client_secret(
    tenant_id, client_id, client_secret, target_app_id, secret_expiry_days=365, delete_old_secrets_flag=True
)

if new_client_secret_id and new_client_secret:
    logger.info("\nRotation Result:")
    logger.info(f"New secret id: {new_client_secret_id}")

    # KeeperでPAMユーザーレコードを更新する
    try:
        pam_user_to_update.custom_field('client_secret_id', new_client_secret_id)
        pam_user_to_update.custom_field('client_secret', new_client_secret)
        pam_user_to_update.custom_field('expires', expiry_time)
        secrets_manager.save(pam_user_to_update)
    except Exception as e:
        logger.error(f"Error while updating PAM User record in Keeper: {e}")

後ほどローテーションを設定するために、レコードを作成し、以下のフィールドを作成します。

のフィールドとカスタムフィールドを使用して、共有フォルダにPAMユーザーレコードを作成します。

application_object_id
client_secret_id
client_secret
expires
Private Key Type
rsa-ssh
tenant_id
application_client_id
ローテーションのポリシー
アプリケーション
Azure環境
PAMユーザー
上記
237B
PAM User Template AzureAppSecretRotation.csv
KeeperボルトへインポートするCSVファイル
9KB
RotateAzureApp.py
PAMユーザーレコードの例
共有フォルダ内のPAMユーザーレコード
PAMスクリプトをPAMユーザーレコードに添付
Azure PAM構成
PAMスクリプトをPAMユーザーレコードに添付