#!/usr/local/bin/pam_rotation_venv_python3# 注: Pythonインタープリタへのパスにスペースが含まれている場合、スクリプトは実行に失敗します。# これはLinuxのシバン行の既知の制限であり、スペースを含まないパスに # Pythonインタープリタへのシンボリックリンクを作成する必要があります。# 例: sudo ln -s "/usr/local/bin/my python3.11" /usr/local/bin/pam_rotation_venv_python3# 注: このスクリプトは、REST APIを使用してパスワードをローテーションする方法を示すデモであり、# 実際にAPIを呼び出すわけではありません。APIを呼び出すにはスクリプトを変更する必要があります。import asyncioimport sysimport base64import json# デバッグ用にPythonのバージョンを表示print(f"# Python version: {sys.version}")# デバッグ用にインストールされているパッケージを表示。必要に応じてコメントを解除してください。# import pkg_resources# print("# \n# Installed packages for debugging:")# installed_packages = pkg_resources.working_set# installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])# for m in installed_packages_list:# print(f" {m}")# リクエストライブラリをインポートtry:import requestsexceptImportError:print("# Error: The 'requests' package is not installed. Run 'pip install requests' to install it.")exit(1)# 変数を初期化api_access_token_title ='Record with Access Token'api_access_token_record =Noneparams =None# stdinから入力パラメータを読み取り、デコードしますfor base64_params in sys.stdin: params = json.loads(base64.b64decode(base64_params).decode())# デバッグ用に利用可能なパラメータを表示。必要に応じてコメントを解除してください。# print(f"# \n# Available params for the script:")# for key, value in params.items():# print(f"# {key}={value}")# PAM Scriptの箇所でJSON文字列として記録に渡された記録を#「ローテーション資格情報」記録としてデコードしてロードします。 records = json.loads(base64.b64decode(params.get('records')).decode())# タイトルからアクセストークンが含まれている記録を特定 api_access_token_record =next( (record for record in records if record['title'] == api_access_token_title), None)breakif api_access_token_record isNone:print(f"# Error: No Record with the access token found. Title: {api_access_token_title}")exit(1)# 記録の詳細から詳細を抽出rest_api_service_url = api_access_token_record.get('url')service_access_token = api_access_token_record.get('password')# 記録から詳細を抽出rest_api_service_url = api_access_token_record.get('url')service_access_token = api_access_token_record.get('password')# old_password = params.get('oldPassword') # 以前のパスワードを使用したい場合new_password = params.get('newPassword')user_email = params.get('user')# パスワードをローテーションするアカウントのユーザーdefrotate(user_email,new_password):""" Rotate the password for a given user. Args: - user_email (str): The email of the user for whom the password should be rotated. - new_password (str): The new password. Returns: - dict: The response from the API call. """# Headers for the request headers ={"Content-Type":"application/json","Authorization":f"Bearer {service_access_token}"}# Prepare the request payload request_payload ={"userEmail": user_email,"newPassword": new_password,}# APIに対してPOSTリクエストを作成 response = requests.post(url=rest_api_service_url, headers=headers, data=json.dumps(request_payload))# リクエストが成功したかどうかのチェックif response.status_code ==201:return response.json()else: response.raise_for_status()if__name__=='__main__':"""Main function to execute the password rotation.""" response =rotate(user_email, new_password)# デバッグ用に応答を表示print(f"# \n# Response from the API:")print(f"# {response}")