開発者用SDK

Keeperシークレットマネージャー用のサンプルコードとSDKの実装ガイド

概要

KeeperシークレットマネージャーSDKは、すべての主要なプログラミング言語からシークレット管理機能にシンプル・高速・効率的にアクセスできるよう特別に設計されています。

インストール

Mavenのスナップショットリポジトリを参照 repositories { mavenCentral() maven { url "https://s01.oss.sonatype.org/content/groups/public/" } }

プロジェクトに以下の依存関係を追加

  • com.keepersecurity.secrets-manager:core:16.6.4

Java SDKではJDKバージョン8から13.02+8がサポートされています。

認証

シークレットマネージャーSDKは、ボルトへの認証にワンタイムアクセストークンまたはローカル構成ファイル内の生成済みキーのいずれかを使用します。 Commander CLIでワンタイムアクセストークンを1つまたは複数生成するには、secrets-manager client addコマンドを使用します。

$ keeper shell

... login ...

My Vault> secrets-manager client add --app MyApplication --unlock-ip

初期化

シークレットマネージャーSDKは、接続トークンや設定情報を保持するために構成ファイルを使用します。以下のコード例は、シークレットマネージャーSDKとワンタイムアクセストークンを使用して設定ファイルを作成します。

import com.keepersecurity.secretsManager.core.*;
import static com.keepersecurity.secretsManager.core.SecretsManager.*;

public class KSMSample {

    public static void main(String[] args){
        // oneTimeTokenはストレージの初期化に一度だけ使用
        // 初回実行以降の呼び出しでは、ksm-config.jsonを使用
        String oneTimeToken = "[ONE TIME TOKEN]";
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            // 初回の実行後、この行は削除可能
            initializeStorage(storage, oneTimeToken);

            SecretsManagerOptions options = new SecretsManagerOptions(storage);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        // `options`を使用する他のコード
    }
}

この初期化コードでは、以下のキーを含むJSON構成ファイルがデバイスのローカルストレージに作成されます。

キー

説明

hostname

自社テナントが配置されている宛先ホスト:

  • keepersecurity.com

  • keepersecurity.eu

  • keepersecurity.com.au

  • govcloud.keepersecurity.us

clientID

ハッシュ化されたclientKey、ここでclientKeyはクライアントデバイスの一意の識別子

privateKey

クライアントデバイスの秘密鍵

serverPublicKeyId

Keeperインフラストラクチャの公開鍵のID

appKey

アプリケーションの秘密鍵

appOwnerPublicKey

アプリケーション所有者の公開鍵

以下は生成された構成ファイルの例です。

ksm-config.json
{
  "hostname": "keepersecurity.com",
  "clientId": "ab2x3z/Acz0QFTiilm8UxIlqNLlNa25KMj=TpOqznwa4Si-h9tY7n3zvFwlXXDoVWkIs3xrMjcLGwgu3ilmq7Q==",
  "privateKey":"MLSHAgABCDEFGyqGSM49AEGCCqGSM49AwEHBG0wawIWALTARgmcnWx/DH+r7cKh4kokasdasdaDbvHmLABstNbqDwaCWhRANCAARjunta9SJdZE/LVXfVb22lpIfK4YMkJEDaFMOAyoBt0BrQ8aEhvrHN5/Z1BgZ/WpDm9dMR7E5ASIQuYUiAw0t9",
  "serverPublicKeyId":"10",
  "appKey":"RzhSIyKxbpjNu045TUrKaNREYIns+Hk9Kn8YtT+CtK0=",
  "appOwnerPublicKey":"Sq1W1OAnTwi8V/Vs/lhsin2sfSoaRfOwwDDBqoP+EO9bsBMWCzQdl9ClauDiKLXGmlmyx2xmSAdH+hlxvBRs6kU="
}

構成ファイル作成のその他の方法については、構成ファイルのページをご参照ください。

すべてのシークレットを取得

import com.keepersecurity.secretsManager.core.*;
import static com.keepersecurity.secretsManager.core.SecretsManager.*;
import java.io.FileOutputStream;

public class KSMSample {
  
  public static void main(String[] args){
    // 事前に初期化されたストレージを取得
    KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
    try { 
        SecretsManagerOptions options = new SecretsManagerOptions(storage);
        
        // 使用可能なすべてのシークレットを取得
        KeeperSecrets secrets = SecretsManager.getSecrets(options);
        
        // レコードの詳細を出力
        System.out.println(secrets.getRecords());
      } catch (Exception e) {
        System.out.println(e.getMessage());
      } 
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

個々のシークレットを取得

レコードタイトルでシークレットを取得

import com.keepersecurity.secretsManager.core.*;
import java.util.List;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 取得するレコードのタイトル
            String recordTitle = "My Credentials";
            
            // タイトルでレコードを検索
            KeeperRecord myCredentials = secrets.getRecords().getSecretByTitle(recordTitle);

            // レコードの詳細を出力
            System.out.println("Record UID: " + myCredentials.getRecordUid());
            System.out.println("Title: " + myCredentials.getData().getTitle());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

レコードUIDでシークレットを取得

この例では、レコードUIDはXXXになっています。

import com.keepersecurity.secretsManager.core.*;
import java.util.List;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 必要なレコードのUIDを含むフィルタを作成
            List<String> uidFilter = List.of("[XXX]");

            // フィルタを使用してシークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options, uidFilter);

            // 取得結果から目的のシークレットを取得
            KeeperRecord myCredentials = secrets.getRecords().get(0);

            // レコードの詳細を出力
            System.out.println("Record UID: " + myCredentials.getRecordUid());
            System.out.println("Title: " + myCredentials.getData().getTitle());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

パスワードを取得

個々のレコードのパスワードフィールドを取得する例。

この例では、レコードUIDはXXXになっています。

import com.keepersecurity.secretsManager.core.*;
import java.util.List;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 必要なレコードのUIDを含むフィルタを作成
            List<String> uidFilter = List.of("XXX");

            // フィルタを使用してシークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options, uidFilter);

            // 取得結果から目的のシークレットを取得
            KeeperRecord myCredentials = secrets.getRecords().get(0);

            // パスワードを取得して出力
            String pwd = myCredentials.getPassword();
            System.out.println("Password from Keeper: " + pwd);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

添付ファイルのダウンロード

import com.keepersecurity.secretsManager.core.*;

import java.io.FileOutputStream;
import java.util.List;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 必要なレコードのUIDを含むフィルタを作成
            List<String> uidFilter = List.of("XXX");

            // フィルタを使用してシークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options, uidFilter);

            // 取得結果から目的のシークレットを取得
            KeeperRecord myCredentials = secrets.getRecords().get(0);

            // レコードからファイル名によるファイル参照を取得
            KeeperFile file = myCredentials.getFileByName("acme.cer");

            // ファイルをダウンロード
            byte[] fileBytes = SecretsManager.downloadFile(file);
            String filename = file.getData().getName();
            FileOutputStream fos = new FileOutputStream(filename);
            fos.write(fileBytes);
            System.out.println("Downloaded File: " + filename);
        } catch (Exception e) {
            System.out.println("KSM ran into an problem: " + e.getMessage());
        }
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

添付ファイルのアップロード

import com.keepersecurity.secretsManager.core.*;

import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 必要なレコードのUIDを含むフィルタを作成
            List<String> uidFilter = List.of("XXX");

            // フィルタを使用してシークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options, uidFilter);

            // ファイルのアップロード先のシークレットを取得
            KeeperRecord ownerRecord = secrets.getRecords().get(0);
        
            // アップロードするファイルからバイトを取得
            File file = new File("./myFile.json");
            FileInputStream fl = new FileInputStream(file);
            byte[] fileBytes = new byte[(int)file.length()];
            fl.read(fileBytes);
            fl.close();
            
            // アップロードするKeeperファイルを作成
            KeeperFileUpload myFile = new KeeperFileUpload(
                "myFile.json",
                "My File",
                "application/json",
                fileBytes
            );

            // 選択したレコードにファイルをアップロード
            SecretsManager.uploadFile(options, ownerRecord, myFile);
            
        } catch (Exception e) {
            System.out.println("KSM ran into an problem: " + e.getMessage());
        }
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

TOTPコードを取得

import com.keepersecurity.secretsManager.core.*;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // シークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options);

            // 目的のシークレットからtotp urlを取得
            String totpUrl = Notation.getValue(secrets, "XXX/field/oneTimeCode");

            // TOTPコードを取得
            TotpCode totpCode = TotpCode.uriToTotpCode(totpUrl);
            System.out.println("TOTP: " + totpCode.getCode());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

パスワードの更新

import com.keepersecurity.secretsManager.core.*;
import java.util.List;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 必要なレコードのUIDを含むフィルタを作成
            List<String> uidFilter = List.of("XXX");

            // フィルタを使用してシークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options, uidFilter);

            // 取得結果から目的のシークレットを取得
            KeeperRecord myCredentials = secrets.getRecords().get(0);

            // パスワードを更新し、変更をレコードに保存
            myCredentials.updatePassword("aP1$t367QOCvL$eM$bG#");
            SecretsManager.updateSecret(options, myCredentials);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

パスワードの生成

import com.keepersecurity.secretsManager.core.*;
import java.util.List;
import java.util.Arrays;

public class KSMSample {
    public static void main(String[] args){
        // 事前に初期化されたストレージを取得
        KeyValueStorage storage = new LocalConfigStorage("ksm-config.json");
        try {
            SecretsManagerOptions options = new SecretsManagerOptions(storage);

            // 必要なレコードのUIDを含むフィルタを作成
            List<String> uidFilter = Arrays.asList("XXX");

            // フィルタを使用してシークレットを取得
            KeeperSecrets secrets = SecretsManager.getSecrets(options, uidFilter);

            // 取得結果から目的のシークレットを取得
            KeeperRecord myCredentials = secrets.getRecords().get(0);

            // 新しいパスワードを作成
            String password = CryptoUtils.generatePassword();

            // 新しいパスワードをレコードに設定
            myCredentials.updatePassword(password);
            
            // パスワードをKeeperに保存
            SecretsManager.updateSecret(options, myCredentials);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

これらの例では、シークレットマネージャーの構成ファイルがすでに初期化されていることを前提としています。構成ファイルの初期化方法については、初期化のページをご参照ください。

シークレットの作成

シークレットマネージャーSDKでは、Keeperのボルト内にレコードを作成することができます。

レコードを作成するには、シークレットマネージャーアプリケーションがアクセスできる共有フォルダのUIDが必要です。また、その共有フォルダ内での編集権限を持っている必要があり、そのフォルダ内に既存のレコードが1件以上存在している必要もあります。新しいレコードは、そのフォルダ内に作成されます。

以下の例では、[FOLDER UID]を対象の共有フォルダのUIDに置き換えてください。

import com.keepersecurity.secretsManager.core.*;

import java.util.List;

public class KSMSample {
    // 新しいレコードが格納されるフォルダ
    static String folderUid = "[FOLDER UID]";

    public static void addLoginRecord(){
        LocalConfigStorage storage = new LocalConfigStorage("ksm-config.txt");
        SecretsManagerOptions options = new SecretsManagerOptions(storage);

        KeeperSecrets secrets = SecretsManager.getSecrets(options);

        KeeperRecordData newRecordData = new KeeperRecordData(
                "Sample Example KSM Record",
                "login",
                List.of(
                        new Login("username@email.com"),
                        new Password("Pa$$word123")
                ),
                null,
                "\tThis record was created\n\tvia KSM Documentation Java Example"
        );

        SecretsManager.createSecret(options, folderUid, newRecordData, secrets);
    }

    public static void main(String[] args) {
        addLoginRecord();
    }
}

その他のシークレット作成機能やレコードタイプレコードフィールドの検証は、Keeperシークレットマネージャーの今後のリリースで対応予定です。

シークレットの削除

シークレットマネージャーを使用して、Keeperのボルトからレコードを削除することができます。

レコードを削除するには、シークレットマネージャーアプリケーションがそのレコードが属する共有フォルダにアクセスできること、および編集権限を持っていることが必要です。また、レコードを削除するには、シークレットマネージャーSDKにレコードのUIDを指定する必要があります。

// シークレットマネージャーを設定
val storage = LocalConfigStorage("ksm-config.json")
//initializeStorage(storage, "<One Time Access Token>")
val smOptions = SecretsManagerOptions(storage)

// レコードUIDで特定のシークレットを削除
deleteSecret(smOptions, List.of("EG6KdJaaLG7esRZbMnfbFA"));

スクリプトの実装

KeeperシークレットマネージャーCLIは、任意のシステムコマンドを実行するラッパー関数を提供しており、その中で使用される環境変数をKeeperのボルトから取得した値に置き換えることができます。

Secrets Manager CLI Execコマンド

ボルトおよび管理者用SDK

ボルトおよび管理レベルでの高度な機能については、各種開発ツールへのリンクを含むボルトSDKのページをご覧ください。

ボルトのSDK

最終更新