パラメータへのアクセス

概要

Base64でエンコードされたJSONオブジェクトは、様々なスクリプトやアプリケーションで展開できます。

Linux/MacOSでのパラメータアクセス

LinuxやMacOSにはJSONパーサーが組み込まれていないので、JSONを解析するには、jqのようなツールが必要です。

#!/usr/bin/env bash

# これを指定しないと、スクリプトで何かエラーが発生しても
# 成功と報告する可能性があります
set -o pipefail -e

IFS= read -r params
json=$(echo "$params" | base64 -d)
$( echo "$json" | jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' )

echo "providerRecordUid=$providerRecordUid"
echo "resourceRecordUid=$resourceRecordUid"
echo "userRecordUid=$userRecordUid"
echo "newPassword=$newPassword"
echo "oldPassword=$oldPassword"
echo "user=$user"

# 記録のデータは、別のBase64 JSONです。値は「jq」を使用して取得できます
recordJson=$(echo "$records" | base64 -d)
title=$(echo "$recordJson" | jq -r ".[] | select(.uid==\"$providerRecordUid\").title")
echo "Provider Title=$title"

Keeperではこれを次のように実行します。

history -c && echo "BASE64==" | /path/to/script.sh

MacOSのhistoryはLinuxのhistoryとは異なります。Linuxではhistory -cを使用し、macOSではlocal HISTSIZE=0を使用して履歴を消去します。これは主に、BASHが強制されないSSH接続に影響します。

Windowsでのパラメータアクセス

Begin {
    # パイプラインの最初の項目が処理される前に1回実行
}

Process {
    # エラーの場合は停止します。これを設定しない場合、結果値はTrueとなり
    # 問題がないと見なされます。
    $ErrorActionPreference = "Stop"

    # パイプラインオブジェクトごとに1回実行    
    $JSON = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_))
    $Params=($JSON | ConvertFrom-Json)

    Write-Output "providerRecordUid=$($Params.providerRecordUid)"
    Write-Output "resourceRecordUid=$($Params.resourceRecordUid)"
    Write-Output "userRecordUid=$($Params.userRecordUid)"
    Write-Output "newPassword=$($Params.newPassword)"
    Write-Output "oldPassword=$($Params.oldPassword)"
    Write-Output "user=$($Params.user)"
    
    $recordsJSON = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Params.records))
    $records = ($recordsJSON | ConvertFrom-Json)
    $title = ($records | Where-Object {$_.uid -eq $Params.providerRecordUid}).title
    Write-Output "Provider Title=$title"
}

End {
    # 最後のパイプラインオブジェクトが処理された後に1回実行
}

Keeperではこれを次のように実行します。

"BASE64==" | .\script.ps1; Clear-History

他のアプリケーションでのパラメータアクセス

ポストローテーションスクリプトは、シェルスクリプトに限定されません。アプリケーションは、PythonやC#などの言語で記述して、パイプで渡されたパラメータを取得できます。

ローテーションに関連する記録のUIDはパラメータで渡されるため、アプリケーションはKSM SDKを使用して、記録に関するその他の情報を取得することもできます。

Pythonでのパラメータアクセス

#!/usr/bin/env python3

import sys
import base64
import json

from keeper_secrets_manager_core import SecretsManager

# sys.stdinは配列ではありませんので、サブスクリプトでアクセスできません(つまり、sys.stdin [0])
for base64_params in sys.stdin:
    params = json.loads(base64.b64decode(base64_params).decode())
        
    print(f"providerRecordUid={params.get('providerRecordUid')}")
    print(f"resourceRecordUid={params.get('resourceRecordUid')}")
    print(f"userRecordUid={params.get('userRecordUid')}")
    print(f"newPassword={params.get('newPassword')}")
    print(f"oldPassword={params.get('oldPassword')}")
    print(f"user={params.get('user')}")

    records = json.loads(base64.b64decode(params.get('records')).decode())
    print("Provider Title="
        f"{next((x for x in records if x['uid'] == params.get('providerRecordUid')), None).get('title')}")

    ksm = SecretsManager(config=...)
    resource_records = ksm.get_secrets(params.get('userRecordUid'))[0]
    
    break 

次のページでは、ポストローテーションのスクリプト実行後の結果について解説します。

最終更新