Gizli değerler (secrets)
Fikir
Bir ajanın sık sık bir API anahtarına ihtiyacı olur: Stripe'ı çağırmak, bir kayıt deposuna push etmek, kendi modeline ulaşmak için. Anahtar ortam değişkenlerindeyse ajan (ya da bir prompt injection) onu ekrana basabilir, bir dosyaya yazabilir ya da herhangi bir yere gönderebilir.
Kule ile ajan değeri asla görmez. Bir yer tutucu (placeholder) görür; görevin proxy'si de yer tutucuyu yalnızca sizin belirttiğiniz host'lara giden isteklerde gerçek değerle değiştirir.
Bir gizli değer saklamak
kule secrets add STRIPE_KEY --host api.stripe.com
- Değer terminalden ekrana yansıtılmadan ya da standart girdiden
(
… < key.txt) okunur. Kabuk geçmişinize düşeceği komut satırından asla okunmaz. --hostnereye gidebileceğini belirtir (birden çok host için tekrarlayın).- Varsayılan olarak bir gizli değer, komutu çalıştırdığınız klasör içindir;
başka bir klasör için
--folder PATH, her klasör için--everywherekullanın.
kule secrets # değerleri olmadan listele
kule secrets remove STRIPE_KEY
Uygulamada: Settings → Secrets.
Bir komut ne görür
kule exec TASK -- sh -c 'echo $STRIPE_KEY'
# anahtarınızı değil, bir yer tutucuyu basar
api.stripe.com'a giderken proxy, değeri bir kimlik bilgisi başlığında
(credential header) yer tutucunun yerine koyar: Authorization (Basic
dahil), x-api-key, x-goog-api-key ve benzerleri. Diğer her yerde yer
tutucu olarak kalır:
- URL'de, diğer başlıklarda ve gövdede; böylece değer, onu geri yansıtabilecek bir yere asla ulaşmaz;
- başka bir host'a gönderildiğinde hiçbir şeyi açmayan bir metindir.
O host'a, Kule'nin onun için tutmadığı kimlik bilgileri taşıyan bir istek
reddedilir (403). Değeri geri yansıtan bir yanıtta değer, proxy'nin
okuyabildiği ölçüde * ile karartılır.
Bağlantı kaydı, giden gizli değerlerin adını verir:
net: api.stripe.com:443 · tunneled · with STRIPE_KEY
Bunu yapmak için proxy yalnızca gizli değerin host'larında, başka hiçbir
yerde değil, TLS'in içine bakar. Her çalıştırmada, ad kısıtlamaları
(name constraints) gereği yalnızca o host'lar için geçerli, anahtarı
belleğinden hiç çıkmayan kendi sertifika otoritesini üretir ve
SSL_CERT_FILE, NODE_EXTRA_CA_CERTS, REQUESTS_CA_BUNDLE ve benzerlerini
ona yönlendirir.
Ajanların API anahtarları
Yerleşik ajanlar ANTHROPIC_API_KEY, OPENAI_API_KEY ve GEMINI_API_KEY'i
aynı şekilde alır: ajanın değişkeni çalıştırmaya özgü bir yer tutucu tutar,
proxy de anahtarınızı ajanın kendi API host'u için doldurur. Yazdığınız bir
profil de aynısını keys altında yapabilir (bkz. Ajanlar).
.env dosyaları da maskelenir
Kopyanın .env dosyalarındaki (.env, .env.local, *.env, .envrc;
.env.example değil) adıyla ya da biçimiyle gizli değer gibi görünen
değerler, yer tutucularla değiştirilir:
- görev açıldığında, her commit, rollback ve undo'dan sonra ve her çalıştırmadan önce;
- gerçek değerleri klasör tutar: bir commit onları ajanın değiştirdiği bir ayar dosyasına geri koyar ve gerçek değerlerle birleştirir;
- görev, maskelediği değerleri kendi mühürlü
secrets.jsondosyasında tutar; - aynı zamanda saklı bir gizli değer olan maskelenmiş bir değer, o gizli değerin yer tutucusunu alır ve böylece onun host'larına ulaşır. Diğerleri yer tutucu olarak kalır.
Aynı maskeleme, ev katmanının .zshrc, .profile,
~/.env ve benzerlerinin klonlarına da uygulanır.
Gizli değerler nerede saklanır
Gizli değerler Kule'nin ev dizininde durur ve her sandbox'tan gizlenir.
Değerleri, sisteminizin anahtar zincirinin (macOS keychain) ya da Secret
Service'in (Linux) tuttuğu bir anahtarla mühürlenir. Bunlardan biri
olmayan bir bilgisayar ya da ~/.kule dışında bir Kule ev dizini, anahtarı
yanındaki bir dosyada tutar; Settings → Secrets bunu söyler.
Henüz yapmadıkları
- HTTP/2 (istemciler HTTP/1.1'e geri döner) ve WebSocket yükseltmeleri.
- Bir parça (chunk) sınırıyla bölünmüş ya da 1 MiB'tan büyük bir gövdedeki yer tutucu.
- macOS'ta sertifikaları yalnızca sistemin kendi hizmetleriyle denetleyen
araçlar (
--use-deprecated=legacy-certsolmadan pip 24.2 ve sonrası). Kule kendi otoritesini asla anahtar zincirine eklemez.