Linux Keyring

Linux Keyringからシークレットを保存および取得

概要

Keyring (キーリング) はLinuxのセキュリティ機能で、パスワードやシークレットなどの機密情報を保存し、アプリケーションから安全にアクセスできるようにします。

Keeperからは、Linuxキーリングユーティリティというユーティリティがご利用になれます。このユーティリティは、ネイティブLinux APIと対話し、Secret Service APIを使用してキーリングからシークレットを保存および取得します。このユーティリティは、あらゆる統合、プラグイン、コードベースで使用でき、あらゆるLinuxキーリングに認証情報、シークレット、パスワードを簡単に保存および取得できます。

Linuxキーリングユーティリティのコードベースは、以下から入手できます。

上記のユーティリティを使用するために必要なバイナリは、以下から入手できます。

Linuxキーリングユーティリティを使用するには、以下の方法があります。

  • リリースページからビルド済みのバイナリをデプロイする。

  • コードベースにインポートする。

Linuxキーリングユーティリティ

Linuxキーリングユーティリティは、D-Busシークレットサービスを使用して、Linuxキーリング内のシークレットを取得および設定します。

Linuxキーリングユーティリティは、GNOME KeyringおよびKDE Wallet Managerでテスト済みで、D -Bus Secrets Serviceのどの実装でも動作するはずです。

インタフェース

dbus_secretssecret_collectionの2 つのパッケージがあります。secret_collectionオブジェクトはdbus_secretsの関数を使用します。このオブジェクトは、D-Busの接続、セッション、コレクションサービスオブジェクトを統合し、CLIが利用するシンプルな「取得 (get) / 設定 (set) / 削除 (delete)」インターフェースがご利用になれます。

使用方法 - コードベースへのインポート

Go言語APIにはGet()Set()Delete()の各メソッドが用意されています。最初の2つのメソッドはstringデータを受け取り、返します。

例 (get)

package main

import (
    "os"
    sc "github.com/Keeper-Security/linux-keyring-utility/pkg/secret_collection"
)

func doit() {
    if collection, err := sc.DefaultCollection(); err == nil {
        if err := collection.Unlock(); err == nil {
            if secret, err := collection.Get("myapp", "mysecret"); err == nil {
                print(string(secret))
                os.Exit(0)
            }
        }
    }
    os.Exit(1)
}

.DefaultCollection()は、デフォルトのエイリアスが参照するコレクションを返します。デフォルトのエイリアスが設定されていない場合はエラーが発生します。通常はログインキーリングを指します。ほとんどのLinuxキーリングインターフェイスでは、ユーザーが設定できます。

.NamedCollection(string)メソッドでは、名前によってコレクションへのアクセスします。

例 (Set)

Setはデータをパラメータとして受け取り、エラーまたは成功した場合nilのみを返します。シークレットデータの内容や長さに制限はありません。

if err := collection.Set("myapp", "mysecret", "mysecretdata"); err == nil {
    // success
}

使用方法 - バイナリインターフェイス (CLI)

Linuxバイナリでは以下の3つのサブコマンドがサポートされています。

  1. get

  2. set

  3. del

getdelは1つのパラメータ (name) を必要とします。これパラメータは、 D-Bus API用語ではシークレットラベルを指します。

delは1つ以上のシークレットラベルを受け取り、それらをすべて削除します。エラーが発生した場合はその時点で処理を停止します。

set では第2パラメータとしてデータを単一の文字列で指定する必要があります。たとえば、set foo bar bazはエラーを引き起こしますが、set foo 'bar baz'は正常に動作します。文字列として-を指定した場合、標準入力から文字列を読み込みます。

Base64エンコード

getsetには、-b または --base64 フラグがあり、Base64エンコーディングを自動的に処理します。このフラグを使用すると、setは入力を保存する前にエンコードし、get は出力する前にデコードします。

注意点として、Base64エンコードされていないシークレットに対して get -b を使用するとエラーが発生します。

# set has no output
lkru set root_cred '{
    "username": "root"
    "password": "rand0m."
}'
# get prints (to stdout) whatever was set
lku get root_cred
{
    "username": "root"
    "password": "rand0m."
}
lkru set -b root_cred2 '{"username": "gollum", "password": "MyPrecious"}'
lkru get root_cred2
eyJ1c2VybmFtZSI6ICJnb2xsdW0iLCAicGFzc3dvcmQiOiAiTXlQcmVjaW91cyJ9
lkru get -b root_cred2
{"username": "gollum", "password": "MyPrecious"}
cat ./good_cred.json | lkru set -b root_cred3 -
lkru get root_cred3
ewogICJ1c2VybmFtZSI6ICJhZGFtIiwKICAicGFzc3dvcmQiOiAicGFzc3dvcmQxMjMuIgp9

エラー

エラー出力はstderrに送られるので、コマンドの末尾に2>/dev/nullを追加するとエラーが抑制されます。

キーリングがない

ログインコレクションが存在しない理由は、キーリング自体が存在しないためです。KDEでは、GNOMEのようにloginではなくkdewalletが作成される場合があります。

Unable to get secret 'test_cred': Unable to retrieve secret 'test_cred' for application 'lkru' from collection '/org/freedesktop/secrets/collection/login': Object does not exist at path “/org/freedesktop/secrets/collection/login”

一致するシークレットがない

同じラベルのシークレットが存在する場合でも、シークレットが返されない場合があります。シークレットがlkruで作成されていない場合は、「Agent」、「Application」、「ID」のような属性が一致していない可能性があります。

Unable to get secret 'test_cred': Unable to retrieve secret 'test_cred' for application 'lkru' from collection '/org/freedesktop/secrets/aliases/default': org.freedesktop.Secret.Collection.SearchItems returned nothing

D-Busセッションが存在しない

シークレットサービスをホストする D-Busセッションが存在しない可能性があります。ユーザーがGUIにログインしていない場合に発生します。

Unable to get the default keyring: Unable to open a D-Bus session: The name org.freedesktop.secrets was not provided by any .service files

D-Busが存在しない

システムがD-Busをホストしていない可能性があります。一部の軽量Linuxディストリビューションは、デフォルトでD-Busなしで出荷されます。

Unable to get the default keyring: Unable to connect to the D-Bus Session Bus: exec: "dbus-launch": executable file not found in $PATH

最終更新