Keycyte PAM 3.2 · Yönetici Kılavuzu
Secrets API Başvurusu
Bu başvuru, Secrets API’nin (sürüm 1.0.0) iki uç noktasını, istek imzasını ve hata yanıtlarını açıklar. Tüm istekler HTTPS üzerinden Keycyte PAM sunucunuza gider; örneğin https://pam.example.com.
| Yöntem | Yol | Amaç |
|---|---|---|
GET | /api/secrets/accounts | Anahtarın okuyabileceği hesapları sır değerleri olmadan listeler. |
POST | /api/secrets/fetch | Bir hesabın bir sırrını okur. |
İstek İmzası
Her istek iki başlık gerektirir ve her ikisinin de imzada listelenmesi gerekir:
Date: Sat, 30 Aug 2026 17:04:47 GMT
Authorization: Signature keyId="<key-id>",algorithm="hmac-sha256",headers="(request-target) date",signature="<base64-signature>"
İmza, imzalama dizesinin gizli anahtarla hesaplanmış HMAC-SHA256 değerinin Base64 kodlamasıdır. İmzalama dizesi, listelenen başlıkları yeni satır karakteriyle (\n) birleştirir:
(request-target): post /api/secrets/fetch
date: Sat, 30 Aug 2026 17:04:47 GMT
(request-target)içindeki yöntem küçük harfle yazılır; yol, varsa sorgu dizesi dahil tam yoldur.- Yalnızca
hmac-sha256kabul edilir; RSA ve ECDSA reddedilir. Date, sunucu saatinden en fazla yaklaşık 300 saniye farklı olmalıdır.
GET /api/secrets/accounts
Çağıranın kapsamındaki tüm hesapları önce name, ardından accountId değerine göre sıralanmış olarak döndürür. Sayısal kimlikleri koda sabit yazmak yerine hesapları adlarına göre bulmak için bu uç noktayı kullanın. Liste aynı zamanda anahtarın kesin sınırıdır: anahtar sızdırılırsa nelerin açığa çıkacağını gösterir.
Yanıt hiçbir zaman password, privatekey veya passphrase içermez.
Yanıt 200
| Alan | Tip | Açıklama |
|---|---|---|
accounts | array | Kapsamdaki hesaplar (aşağıya bakın). |
count | integer | accounts içindeki girdi sayısı. |
accounts içindeki her girdi:
| Alan | Tip | Açıklama |
|---|---|---|
accountId | integer | Hesabın sayısal kimliği. |
name | string | Hesap adı. /api/secrets/fetch uç noktasına name olarak iletin. |
username | string | Hesabın oturum açma adı. Sır olarak değerlendirilmez. |
domain | string | Hesabın etki alanı. Boşsa yer almaz. |
type | string | Hesap tipi; örneğin linux, windows, mysql. |
description | string | Yöneticinin notu. Boşsa yer almaz. |
Boş liste olağan bir sonuçtur: kimliğin hiçbir parola rolü yoktur veya rollerinin hiçbiri şu anda zaman penceresi içinde değildir.
{
"accounts": [
{ "accountId": 6365, "name": "app-db", "username": "appuser", "type": "mysql" }
],
"count": 1
}
POST /api/secrets/fetch
Bir hesabın tek bir sır değerini döndürür. Hesap, erişim günlüklerinde görünmemesi için URL’de değil istek gövdesinde belirtilir.
İstek gövdesi
accountId veya name alanlarından tam olarak birini gönderin.
| Alan | Tip | Açıklama |
|---|---|---|
accountId | integer | Hesabın sayısal kimliği. Hesabın ömrü boyunca sabittir; ancak hesap silinip yeniden oluşturulursa değişir. |
name | string | Hesap adı. Büyük/küçük harf duyarsız olarak, baştaki ve sondaki boşluklar yok sayılarak ve yalnızca çağıranın kapsamında eşleştirilir. |
field | string | Okunacak sır: password (varsayılan), privatekey veya passphrase. Örneğin bir API anahtarı password alanında, bir TOTP tohumu privatekey alanında saklanır. |
reason | string | Denetim günlüğüne kaydedilen, en fazla 256 baytlık isteğe bağlı metin. Sonucu hiçbir zaman değiştirmez. |
Yanıt 200
| Alan | Tip | Açıklama |
|---|---|---|
accountId | integer | Okunan hesap. name ile sorguladıysanız bu değeri kontrol edin. |
field | string | Döndürülen alan; küçük harfle. |
value | string | Açık metin olarak sır. |
Uyarı
Yanıtı hassas veri olarak ele alın. Günlüğe yazmayın, diskte önbelleğe almayın ve hata raporlarına eklemeyin.
Hata Yanıtları
| Durum | Gövde | Anlamı |
|---|---|---|
400 | {"message": "..."} | accountId ve name alanlarından hiçbiri gönderilmemiş ya da ikisi birden gönderilmiş, field üç addan biri değil veya istenen alan hesapta boş. |
401 | {"error": "unauthorized"} | İmza eksik, hatalı biçimlendirilmiş, süresi dolmuş veya etkin bir anahtarla eşleşmiyor. Gövde hangisi olduğunu belirtmez; neden sunucu günlüğünde yer alır. |
403 | {"error": "forbidden"} veya {"message": "this credential cannot read secrets"} | Çağrı, anahtarın izin listesi dışındaki bir IP adresinden geldi veya anahtarın sahibi olan bir kullanıcı yok. |
404 | {"message": "secret not found"} | Hiçbir sır döndürülmedi. Aynı yanıt; bulunmayan bir hesabı, çağıranın kapsamı dışındaki bir hesabı ve çağıranın görebildiği hiçbir şeyle eşleşmeyen bir adı kapsar. |
Retry-After ile 409 | {"message": "account password is being rotated: ..."} | Hesabın parolası şu anda değiştiriliyor. Retry-After içindeki saniye kadar bekleyin ve yeniden deneyin. Durum birkaç dakika sürerse parola döndürme işlemi yeni parolayı kaydedememiştir ve bir yöneticinin durumu çözmesi gerekir; süresiz olarak yeniden denemek yerine alarm üretin. |
Retry-After olmadan 409 | {"message": "account name is ambiguous: ..."} | name, çağıranın kapsamındaki birden fazla hesapla eşleşiyor. accountId kullanın veya hesaplardan birini yeniden adlandırın. |
500 | {"message": "..."} | Sunucu hatası. |
Not
Kimlik doğrulama katmanından gelen hatalar (401 ve IP kısıtlamaları için 403) error alanını, uç noktalardan gelen hatalar message alanını kullanır. İstemcinizde her ikisini de okuyun.
Örnek
Aşağıdaki kabuk betiği app-db adlı hesabın parolasını okur. Yer tutucuları kendi değerlerinizle değiştirin.
KEY_ID="<key-id>"
KEY_SECRET="<key-secret>"
HOST="pam.example.com"
PATH_="/api/secrets/fetch"
DATE="$(LC_ALL=C date -u '+%a, %d %b %Y %H:%M:%S GMT')"
SIGNING_STRING="$(printf '(request-target): post %s\ndate: %s' "$PATH_" "$DATE")"
SIGNATURE="$(printf '%s' "$SIGNING_STRING" | openssl dgst -sha256 -hmac "$KEY_SECRET" -binary | base64)"
curl -s "https://$HOST$PATH_" \
-H "Date: $DATE" \
-H "Authorization: Signature keyId=\"$KEY_ID\",algorithm=\"hmac-sha256\",headers=\"(request-target) date\",signature=\"$SIGNATURE\"" \
-H "Content-Type: application/json" \
-d '{"name": "app-db", "field": "password", "reason": "nightly backup job"}'
Başarılı bir çağrı şunu döndürür:
{ "accountId": 6365, "field": "password", "value": "<secret-value>" }
HMAC anahtarı, anahtar verildiğinde gösterildiği şekliyle gizli anahtarın kendisidir (kod çözülmeden, metin dizesi olarak kullanılır).