Python SDK
Keeperシークレットマネージャー向けPython SDKの詳細情報
ダウンロードとインストール
PIPによるインストール
pip3 install -U keeper-secrets-manager-core
ソースコード
Pythonのソースコードは、GitHubリポジトリで入手できます。
SDKの使用
初期化
トークンのみを使用して新しい構成ファイルを生成するには、トークンをバインドし、config.json
に完全に読み込むために少なくとも1回の読み取り操作が必要です。
SecretsManager(token, config)
# トークンのみを使用して(後で使用するために)設定を生成するには、
# トークンをバインドするアクセス操作が少なくとも1回必要です
#get_secrets(uids=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# トークンのみを使用して設定を生成するには
# トークンをバインドするアクセス操作が少なくとも1回必要です
#secrets_manager.get_secrets(uids=None)
シークレットの取得
get_secrets(uids=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# すべてのレコードを取得
all_secrets = secrets_manager.get_secrets()
# すべてのレコードを出力
for secret in all_secrets:
print(secret.dict)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDレコードで特定のシークレットを取得
secret = secrets_manager.get_secrets(['EG6KdJaaLG7esRZbMnfbFA'])[0]
# シークレットを出力
print(secret.dict)
戻り値
型: Record[]
Keeperのすべてのレコード、または指定されたUIDを持つレコード。
シークレットから値を取得
パスワードを取得
Keeperシークレットマネージャーからシークレットを取得すると、このショートカットでそのシークレットのパスワードを取得します。
secret.field('password', single=True)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDレコードで特定のシークレットを取得
secret = secrets_manager.get_secrets(['<RECORD UID>'])[0]
# レコードからパスワードを取得
my_secret_password = secret.field('password', single=True)
標準フィールドを取得
secret.field(field_type, single=False, value=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDレコードで特定のシークレットを取得
secret = secrets_manager.get_secrets(['<RECORD UID>'])[0]
# シークレットのログインフィールドを取得
my_secret_login = secret.field("login", single=True)
カスタムフィールドを取得
secret.custom_field(label, field_type=None, single=False, value=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDで特定のシークレットを取得
secret = secrets_manager.get_secrets(['EG6KdJaaLG7esRZbMnfbFA'])[0]
# 標準テンプレートフィールドを取得
password = secret.field('password', single=True)
# APIキーなどのカスタムフィールドを取得
api_key = secret.custom_field('API Key', single=True)
カスタムフィールドは、レコードタイプ定義の一部ではありませんが、ユーザーが追加できるフィールドです。 各標準レコードタイプのフィールドの一覧は、レコードタイプのページをご参照ください。
同じカスタムタイプの複数のフィールドを1つのレコードに表示することができます。これらのフィールドを区別するには、フィールドラベルが必要です。
戻り値
型: String
またはString[]
フィールドの1つまたは複数の値。 single=True
オプションを指定した場合のみ、単一の値になります。
タイトルによってシークレットを取得
# 一致するレコードをすべて取得
get_secrets_by_title(record_title)
# 最初に一致するレコードのみを取得
get_secret_by_title(record_title)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# シークレットマネージャーをセットアップ
secrets_manager = SecretsManager(
config=FileKeyValueStorage('ksm-config.json'))
# レコードタイトルに一致する最初のシークレットを取得する
secret = secrets_manager.get_secret_by_title("My Credentials")
# レコードタイトルに一致するすべてのシークレットを取得する
secrets = secrets_manager.get_secrets_by_title("My Credentials")
Keeper表記法を使用して値を取得
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# Keeper表記法を使用して特定の標準フィールドを取得
password = secrets_manager.get_notation('EG6KdJaaLG7esRZbMnfbFA/field/password')[0]
# Keeper表記法を使用して特定のカスタムフィールドを取得
custom_field_value = secrets_manager.get_notation('EG6KdJaaLG7esRZbMnfbFA/custom_field/my_field')
| | | | |
| | | | 指定したフィールドの値を取得するためのKeeper表記法を使用したクエリ |
戻り値
型: string
or string[]
照会したフィールドの値
TOTPコードを取得
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
from keeper_secrets_manager_core.utils import get_totp_code
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# レコードからTOTP url値を取得
url = record.get_standard_field_value('oneTimeCode', True)
# TOTP urlからコードを取得
totp = get_totp_code(url)
print(totp.code)
シークレットを更新
レコード更新コマンドは、成功時にローカルのレコードデータ (特にレコードリビジョンの更新) を更新しないため、既に更新されたレコードを継続的に更新してもリビジョンの不一致により失敗となります。各更新バッチの後に、更新済みのレコードをすべてリロードするようにしてください。
変更をシークレットに保存
save(record:KeeperRecord)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDで特定のシークレットを取得
secret_to_update = secrets_manager.get_secrets(['EG6KdJaaLG7esRZbMnfbFA'])[0]
# フィールド値を更新
secret_to_update.field('login', 'new login')
secrets_manager.save(secret_to_update)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# シークレットマネージャのセットアップ
secrets_manager = SecretsManager(
config=FileKeyValueStorage('ksm-config.json')
)
# UIDを使用して特定のシークレットを取得
secret = secrets_manager.get_secrets(['EG6KdJaaLG7esRZbMnfbFA'])[0]
# レコードのパスワードをローテーション
secret.field('password', 'new password')
# トランザクションを開始
secrets_manager.save(secret, 'rotation')
# リモートホストでパスワードをローテーション
success = rotate_remote_ssh_password('new password')
# トランザクションを完了 (コミットかロールバック)
secrets_manager.complete_transaction(secret.uid, rollback=not success)
fieldメソッドを使用してフィールド値を設定します。
複数の値を持つフィールドもあります。このような場合は、値をリストに設定できます。
標準フィールド値を更新
secret.field(field_type, single=False, value=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDレコードで特定のシークレットを取得
secret = secrets_manager.get_secrets(['<RECORD UID>'])[0]
# ログインを更新
secret.field("login", single=True, "My New Login")
# シークレットを保存
secrets_manager.save(secret)
カスタムフィールド値の更新
secret.custom_field(label, field_type=None, single=False, value=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDで特定のシークレットを取得
secret = secrets_manager.get_secrets(['EG6KdJaaLG7esRZbMnfbFA'])[0]
# 標準テンプレートフィールドを取得
password = secret.field('password', single=True)
# カスタムフィールド「API Key」を設定
my_new_api_key = "wKridl2ULt20qGuiP3IY"
secret.custom_field('API Key', single=True, my_new_api_key)
# 変更をシークレットに保存
secrets_manager.save(secret)
ランダムなパスワードを生成
generate_password(length, lowercase, uppercase, digits, specialCharacters)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
from keeper_secrets_manager_core.utils import generate_password
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDで特定のシークレットを取得
secret = secrets_manager.get_secrets(['EG6KdJaaLG7esRZbMnfbFA'])[0]
# ランダムなパスワードを生成
password = generate_password()
# 新しいパスワードでレコードを更新
secret.field('password', value=password)
# 変更をシークレットに保存
secrets_manager.save(secret)
各パラメータは、使用する文字の種類の最小数を示します。たとえば、「uppercase」は、使用する大文字の最小数となります。
ファイルのダウンロード
file.save_file(file_path, create_folders=False)
# すべてのファイルを/tmpフォルダに保存(存在しない場合はフォルダを作成)
for file in secret.files:
print("file: %s" % file)
file.save_file("/tmp/" + file.name, True)
| | | | |
| | | | |
| | | | 存在しない場合はfile_pathにフォルダを作成 |
ファイルのアップロード
ファイルのアップロード
upload_file(owner_record, file: my_file)
Keeperファイルアップロードオブジェクトを作成
KeeperFileUpload.from_file(path, file_name=None, file_title=None, mime_type=None)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
from keeper_secrets_manager_core.core import KeeperFileUpload
secrets_manager = SecretsManager(
config=FileKeyValueStorage('ksm-config.json')
)
# UIDによって個々のシークレットを取得し、ファイルを添付
UID_FILTER = 'XXX'
owner_record= secrets_manager.get_secrets([UID_FILTER])[0]
# アップロード用のファイルデータを準備
my_file = KeeperFileUpload.from_file("./myFile.json", "myfile.json", "My File")
# 所有者のレコードに添付されたファイルをアップロード
upload_file(owner_record, file: my_file)
ファイルのアップロード
ファイルからのKeeperファイルのアップロード
パラメータ | 型 | 必須 | デフォルト | 説明 |
---|
| | | | |
| | | | アップロード後にKeeperに格納されるファイルの名前 |
| | | | アップロード後にKeeperに格納されるファイルのタイトル |
| | | | ファイル内のデータの種類。 何も指定しない場合は、「application/octet-stream」が使用されます。 |
戻り値
型: string
添付ファイルのファイルUID
シークレットの作成
要件
共有フォルダのUID
共有フォルダには、シークレットマネージャーアプリケーションからアクセスできる必要があります。
あなたとシークレットマネージャーアプリケーションには編集権限が必要です。
共有フォルダには、少なくとも1つのレコードが存在する必要があります。
作成されたレコードとレコードのフィールドは正しく書式設定されている必要があります。
レコードタイプごとの適切なフィールド形式については、こちらのページをご参照ください。
TOTPフィールドには、KSM SDK以外で生成されたURLのみを指定できます。
secrets_manager.create_secret(folder_uid, record)
secrets_manager.create_secret_with_options(create_options, record)
この例では、ログイン値と生成されたパスワードを含むログインタイプのレコードを作成します。
例にある[FOLDER UID]
をシークレットマネージャーがアクセスできる共有フォルダのUIDに置き換えます。
# 新しいログインレコードを作成
new_login_record = RecordCreate('login', "Sample KSM Record:Python")
# ログインフィールドとパスワードフィールドに入力
new_login_record.fields = [
RecordField(field_type='login', value='username@email.com'),
RecordField(field_type='password', value=generate_password())
]
# メモに入力
new_login_record.notes = 'This is a Python record creation example'
# 新しいレコードを作成
secrets_manager.create_secret('[FOLDER UID]', new_login_record)
この例では、カスタムのレコードタイプのレコードを作成します。
例にある[FOLDER UID]
をシークレットマネージャーがアクセスできる共有フォルダのUIDに置き換えます。
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
from keeper_secrets_manager_core.dto.dtos import RecordCreate, RecordField
from keeper_secrets_manager_core.utils import generate_password
# setup secrets manger
secrets_manager = SecretsManager(
# token='US:XXXXXX',
config=FileKeyValueStorage('ksm-config.json')
)
custom_login = RecordCreate(record_type='Custom Login', title='Sample Custom Type KSM Record:Python')
custom_login.fields = [
RecordField(field_type='host',
value={'hostName':'127.0.0.1', 'port':'8080'},
label="My Custom Host lbl",
required=True),
RecordField(field_type='login',
value='login@email.com',
label='My Custom Login lbl',
required=True),
RecordField(field_type='password',
value=generate_password(),
label='My Custom Password lbl',
required=True),
RecordField(field_type='url',
value='http://localhost:8080/login',
label='My Login Page',
required=True),
RecordField(field_type='securityQuestion',
value={
'question':'What is one plus one (write just a number)',
'answer':'2'
},
label='My Question 1',
required=True),
RecordField(field_type='phone',
value={
'region':'US',
'number':'510-444-3333',
'ext':'2345',
'type':'Mobile'},
label='My Phone Number'),
RecordField(field_type='date',
value=1641934793000,
label='My Date Lbl',
required=True),
RecordField(field_type='name',
value={
'first':'John',
'middle':'Patrick',
'last':'Smith'},
label="My Custom Name lbl",
required=True),
RecordField(field_type='oneTimeCode',
value='otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example',
label='My TOTP',
required=True)
]
custom_login.custom = [
RecordField(field_type='phone',
value={'region':'US', 'number':'510-222-5555', 'ext':'99887', 'type':'Mobile'},
label='My Custom Phone Lbl 1'),
RecordField(field_type='phone',
value={'region':'US', 'number':'510-111-3333', 'ext':'45674', 'type':'Mobile'},
label='My Custom Phone Lbl 2'),
]
custom_login.notes = "\tThis custom type record was created\n\tvia Python SDK copied from https://docs.keeper.io/secrets-manager/secrets-manager/developer-sdk-library/python-sdk"
record_uid = secrets_manager.create_secret('[FOLDER UID]', custom_login)
戻り値
型: string
新規レコードのレコードUID
シークレットの削除
Python KSM SDKでKeeperボルトのレコードを削除できます。
secrets_manager.delete_secret(record_uid)
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
# Secrets Managerを設定
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json')
)
# UIDレコードで特定のシークレットを削除
secret = secrets_manager.delete_secret('EG6KdJaaLG7esRZbMnfbFA')
キャッシュ
ネットワークアクセスが失われたときにシークレットにアクセスできなる状況を避けるため、Python SDKを使用してシークレットを暗号化されたファイルでローカルマシンにキャッシュできます。
キャッシュの設定と構成
Python SDKでキャッシュを設定するには、SecretsManager
オブジェクトを作成するときにキャッシュポスト関数を含める必要があります。
Python SDKには、KSMCache
クラスにデフォルトのキャッシュ機能が含まれており、キャッシュされたクエリをローカルファイルに保存し、復旧機能として使用できます (ネットワーク接続がある場合は常にネットワークデータを優先し、ウェブボルトにアクセスできない場合にのみキャッシュを使用します)。独自のキャッシュ機能を作成することも可能で、KSMCache
を出発点として利用できます。例えば、ネットワークアクセスよりもローカルキャッシュを優先し、独自のキャッシュ管理を行う (例:キャッシュデータを5分ごとに更新する) 機能を作成できます。
secrets_manager = SecretsManager(
token='<One Time Access Token>',
config=FileKeyValueStorage('ksm-config.json'),
custom_post_function=KSMCache.caching_post_function
)
KSMCache
クラスのデフォルトキャッシュ機能は、常に最後のリクエストのみを保存します。例えば、UID1に対するフィルタリングリクエストがキャッシュされている場合、ネットワーク切断時に同じキャッシュからUID2をリクエストすると、空のレスポンスが返されます (UID2が同じKSMアプリに共有されている場合でも、それがキャッシュされていなければ利用できません)。
キャッシュからのレコード更新 (または新しいレコードの作成) は、キャッシュされたレコードデータを無効にし、同じレコードを連続して更新する操作は失敗します。異なるレコードを修正する場合、バッチ更新は機能します。キャッシュされたレコードを更新した後は、常に get_secrets
関数を呼び出してキャッシュをリフレッシュし、ボルトから新しいレコードリビジョンなどの更新されたメタデータを取得するようにしてください。
フォルダ
フォルダは完全なCRUD (作成、読み取り、更新、削除操作) をサポートしています。
フォルダの読み取り
フォルダの完全な階層構造をダウンロードします。
レスポンス
型: List[KeeperFolder]
使用例
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
secrets_manager = SecretsManager(config=FileKeyValueStorage('ksm-config.json'))
folders = secrets_manager.get_folders()
フォルダの作成
CreateOptions
とフォルダ名の指定が必要です。CreateOptions
はフォルダのUIDパラメータ (共有フォルダのUID) が必須ですが、サブフォルダのUIDはオプションであり、指定されていない場合は、通常の新しいフォルダが親 (共有フォルダ) の直下に作成されます。サブフォルダは、親の共有フォルダの直接の下位オブジェクトである必要はありません。親フォルダから何階層も深い位置にサブフォルダを作成することができます。
create_folder(create_options:CreateOptions, folder_name: str, folders=None)
パラメータ | 型 | 必須 | デフォルト | 説明 |
---|
| | | | |
| | | | |
| | | | CreateOptionsで作成した親とサブフォルダの検索に使用するフォルダのリスト |
使用例
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
secrets_manager = SecretsManager(config=FileKeyValueStorage('ksm-config.json'))
co = CreateOptions(folder_uid="[SHARED_FOLDER_UID]", subfolder_uid="")
new_folder_uid = secrets_manager.create_folder(co, "new_folder")
フォルダの更新
フォルダのメタデータ (現在はフォルダ名のみ) を更新します。
update_folder(folder_uid: str, folder_name: str, folders=None)
使用例
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
secrets_manager = SecretsManager(config=FileKeyValueStorage('ksm-config.json'))
secrets_manager.update_folder("[FOLDER_UID]", "new_folder_name")
フォルダの削除
フォルダのリストを削除します。空でないフォルダを削除するには、force_deletion
フラグを使用します。
forceDeletion
を使用する場合は、親フォルダと子フォルダのUIDを一緒に送信しないようにしてください。削除する順序によっては、エラーが発生する可能性があります。たとえば、親が子を先に強制削除した場合などです。リストが必ずしもFIFO順で処理される保証はありません。
ボルトに存在しないフォルダのUIDやKSMアプリケーションで共有されていないフォルダのUIDはエラーになりません。
delete_folder(folder_uids:List[str], force_deletion: bool = False)
使用例
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_core.storage import FileKeyValueStorage
secrets_manager = SecretsManager(config=FileKeyValueStorage('ksm-config.json'))
secrets_manager.delete_folder(["[FOLDER_UID1]", "[FOLDER_UID2]"], True)