API güvenliği, çağıranın kim olduğunu ve hangi isteklere izin verildiğini belirler. Lunex’e kullanıcı olarak giriş yapmak, yayımlanmış API’yi çağırma yetkisiyle aynı işlem değildir. API için API access politikasını ayrıca hazırlayın.
Kimlik doğrulama ile yetkilendirme
Kimlik doğrulama, çağıranın sunduğu kullanıcı/parola, API key veya token’ın geçerli olup olmadığını denetler. Yetkilendirme, doğrulanmış kimliğin bu API’ye erişmesine izin verilip verilmediğini belirler. Geçerli bir JWT sahibi olmak, bütün API’leri çağırma hakkı anlamına gelmez; token’ın hedefi ve izinleri policy ile eşleşmelidir.
Örneğin bir uygulama doğru imzalı token sunabilir fakat token başka bir API için üretilmiş olabilir. Başka bir token doğru API’yi hedeflerken gerekli scope’u taşımayabilir. İlkinde audience kontrolü, ikincisinde izin kuralı önemlidir.
Lunex’teki Access policy, projenin yayımlanan API grubunun ayarıdır. Operation formunda ayrı bir kullanıcı/rol yetki matrisi oluşturmazsınız. İşlem veya iş kaydı düzeyinde daha ayrıntılı kurallar gerekiyorsa kapsamı ortam yöneticinizle belirleyin; native policy ve iş akışı sorumluluklarını açıkça ayırın. Örneğin “bu müşteri yalnızca kendi siparişini okuyabilir” kuralı, API key’in mevcut olmasından kendiliğinden çıkmaz.
Üç kimliği ayırın
| Kimlik | Nereden gelir? | Ne için kullanılır? |
|---|---|---|
| Lunex kullanıcı hesabı ve rolleri | Kurumun giriş/kimlik sağlayıcısı | Projeyi görüntüleme, düzenleme ve yönetme |
| API istemcisinin client ID’si ve token’ı | API’ye erişim sağlayan kimlik sağlayıcısındaki uygulama kaydı | API çağrısında kimlik doğrulama ve yetkilendirme |
| İzleme Application ID | Akışta tanımladığınız iş kimliği | Mesaj ve işlem kayıtlarını iş anahtarıyla arama |
İzleme Application ID bir erişim anahtarı değildir. Oluşturma ve arama kullanımı Application ID sayfasındadır. Kullanıcı girişi için kurumsal kimlik bağlantısını izleyin.
Hangi erişim yöntemini kullanmalısınız?
| Yöntem | Uygun olduğu durum | Bilmeniz gereken |
|---|---|---|
| Public | Kimlik istemeden sunmayı seçtiğiniz API | Adresi bilen ve erişebilen istemciden credential istenmez. Exposure ayrı olarak açık olmalıdır. |
| Basic | İstemcinin kullanıcı/parola ile HTTP çağrısı yaptığı entegrasyon | Credential her çağrıda taşınır; taşıma güvenliği için HTTPS kullanın. |
| API key | Uygulamaya verilen bir anahtarla erişim | Anahtarı bilen istemci onu kullanabilir; kullanıcı rolü, token süresi veya scope kendiliğinden oluşmaz. |
| JWT | Kimlik sağlayıcısının verdiği imzalı token ve izin kurallarıyla erişim | Issuer, audience, imza anahtarları ve yetki kuralları ortamda hazırlanmalıdır. |
Bu seçim dışarıdan gelen çağrılar içindir. Route’un SAP’ye veya başka HTTP servisine bağlanırken kullanacağı credential, o bağlantının ayarıdır.
Erişim politikasını seçin
- Projede API design → API access açın.
- Dışarıdan çağrı alınacaksa API exposure → Enabled seçin.
- Public transport alanında ortamınızda hazırlanmış
HTTPSveyaHTTPseçeneğini seçin. - Access policy değerini ihtiyacınıza göre belirleyin.
| Access policy | Hazırlanacak kaynak | İstemci ne gönderir? |
|---|---|---|
| Public · no authentication | Ek credential gerektirmez | Kimlik bilgisi olmadan istek |
| Basic authentication | .htpasswd anahtarı içeren System Secret | HTTP Basic kullanıcı adı/parola |
| API key | Bir veya daha fazla anahtar değeri içeren System Secret | x-api-key header’ı |
| JWT | Ortamda hazırlanmış native SecurityPolicy | Genellikle Authorization: Bearer <token> |
- Basic/API key için Credential reference alanına Secret adını girin veya Select Secret ile seçin. Buraya parola ya da
{{secret:…}}ifadesi yazmayın; alan kaynak adını bekler. - JWT için SecurityPolicy reference alanına ortam yöneticisinin sağladığı policy adını girin.
- Save seçin. Geliştirme hedefinde uygulamak için Run/Reload, deployment’a almak için Commit and push → Build kullanın.

Görsel, JWT alanlarının nasıl doldurulduğunu gösterir. Unsaved işareti değişikliğin taslak olduğunu, Disabled seçimi dış erişimin kapalı tutulduğunu belirtir. orders-jwt bir policy adıdır; token veya client secret değildir. Gerçek kullanımda hazır policy’yi seçip exposure ve uygulama adımlarını ayrıca tamamlayın.
Politika projenin yayımlanan API grubuna uygulanır. Public seçimi kimlik doğrulamayı kaldırır. Hassas veri veya credential taşıyan çağrılarda ortam yöneticinizin hazırladığı HTTPS adresini kullanın; HTTP seçimi kendiliğinden HTTPS yönlendirmesi oluşturmaz.
Basic ve API key kaynaklarını hazırlayın
Ortam yöneticisi credential’ı çalışma ortamındaki System Secret olarak hazırlamalıdır. Basic için .htpasswd içeriği gerekir; düz metin kullanıcı/parola listesi yerine gateway’in kabul ettiği parola hash biçimini kullanın. .htpasswd anahtarını ortamın Kubernetes Secret hazırlama yöntemiyle oluşturun; System ekranının yeni key alanı noktayla başlayan adları kabul etmez. API key Secret’ında her istemci için ayrı bir anahtar değeri tutabilirsiniz.
Select Secret içinde Basic kaynağı Requires .htpasswd key durumundaysa doğru anahtar henüz yoktur. API key kaynağı boşsa en az bir credential eklenmelidir. Seçim ekranı uygun anahtarın varlığını gösterir; gerçek erişimi yayınlanan adres üzerinde doğrulayın.
Secret değerleri openapi.json, route URI’leri veya Git’e gönderilen properties dosyalarında bulunmamalıdır. Kaynak hazırlama ve akışta Secret kullanma yöntemi yapılandırma sayfasındadır.
Kaynak adı, anahtar adı ve gizli değer
Örneğin API key için orders-clients adlı Secret seçtiğinizi varsayın. Credential reference alanı orders-clients değerini tutar. Secret içindeki kayıt adları istemcileri ayırır; HTTP çağrısında x-api-key ile gönderilen değer ise ilgili kaydın gizli içeriğidir. Secret adı veya kayıt adı, gizli değerin yerine geçmez.
Birden çok istemci aynı anahtarı paylaşırsa bir istemciyi kaldırmak diğerlerini de etkileyebilir. Ayrı kayıtlarla hangi anahtarın hangi istemciye verildiğini ortam yönetiminde takip edin. Lunex bu kayıtları bir tüketici üyelik portalına dönüştürmez.
Anahtar değiştirme sırasında yeni değerle erişimi doğrulayın, istemciyi güncelleyin, sonra eski değeri ortam kaynağından kaldırıp artık kabul edilmediğini sınayın. Mevcut Secret’ın değeri ile projedeki Credential reference farklı değişikliklerdir: referans adı değişirse proje ayarını da Save ve ilgili çalışma/yayınlama adımıyla uygulayın.
Basic çağrısını denemek için aşağıdaki komut kullanıcı adını gönderir ve parolayı etkileşimli ister:
curl --include --user orders-client \
https://lunex.example.com/orders-api/api/orders
Adres ve kullanıcıyı kendi ortamınızla değiştirin. Basic için gereken .htpasswd dosyası gateway’in desteklediği hash biçiminde hazırlanmalıdır; bir hash aracının varsayılanının otomatik olarak uygun olduğunu varsaymayın. Yönetici native Basic hazırlığını esas alabilir.
Kendi kimlik sağlayıcınızla JWT kullanın
Lunex token üretmez. Kurumunuzun kimlik sağlayıcısındaki API/uygulama kaydı, token edinme yöntemi ve token içeriği sizin erişim tasarımınıza bağlıdır.
JWT alanlarını anlayın
| Kavram | Örnek | Kontrol ettiği şey |
|---|---|---|
| Client ID | order-reporting-client | Token isteyen uygulamanın kimliği |
Issuer / iss | https://identity.example.com/realms/orders | Token’ı hangi kimlik sağlayıcısının ürettiği |
Audience / aud | orders-api | Token’ın hangi API için geçerli olduğu |
Subject / sub | Sağlayıcının verdiği kimlik | Token’ın temsil ettiği kullanıcı veya servis kimliği |
| Scope | orders.read | Verilen izinlerden biri; policy bu izni isteyebilir |
Expiration / exp | Token’ın son kullanım zamanı | Süresi dolmuş token’ın kullanılmaması |
| JWKS | Sağlayıcının açık imza anahtarları adresi | Token imzasının doğrulanması |
Client ID ile audience aynı olmak zorunda değildir. Client secret token edinme aşamasında kimlik sağlayıcısına ait bir credential’dır; API çağrısında Bearer token yerine gönderilmez. JWT içeriğini okuyabilmek, imzasını doğruladığınız anlamına gelmez.
Kurulum sorumluluklarını paylaşın
| Sorumlu | Hazırlayacağı bilgi/iş |
|---|---|
| Kimlik yöneticisi | API audience’ı, istemci kaydı, token alma yöntemi ve verilecek izinler |
| Ortam yöneticisi | Issuer/audience/JWKS kontrolü, yetki kuralları, native SecurityPolicy ve API koruma bileşeni |
| API geliştiricisi | Policy referansı, OpenAPI güvenlik açıklaması ve izinli/izinsiz çağrı denemeleri |
| API tüketicisi | Uygun access token edinme, süre dolunca yenileme ve çağrıda Bearer gönderme |
- Kimlik sağlayıcınızda bu API için bir kaynak/audience ve gerekiyorsa scope’lar tanımlayın; örneğin audience
orders-api, scopeorders.read. - Çağıracak uygulama için istemci kaydı oluşturun. Client ID bu kayıttan alınır. Makineden makineye erişimde sağlayıcının uygun servis hesabı akışını kullanın; client secret’ı Secret yönetiminde saklayın.
- Ortam yöneticinize token’ın tam
issuer, beklenenaudience, imza anahtarlarının JWKS adresi ve izin kurallarını verin. - Yönetici aynı runtime namespace’inde native bir
SecurityPolicyhazırlar. Policy adı örneğinorders-jwtise route seçicisiio.etzel.lunex/api-policy: orders-jwtetiketiyle eşleşmelidir. - Policy, Lunex kurulumunun API koruma kurallarıyla birlikte uygulanmalıdır. Ortam Git’inde sağlanan
api-protectionKustomize bileşeni, yönetim yollarını engelleyen kuralları ekler. Yalnızca JWT tanımlı ham policy dosyasını uygulamak yeterli değildir. - Projede Access policy → JWT, SecurityPolicy reference → orders-jwt seçin ve değişikliği ilgili runtime’a uygulayın.
- İstemcinin edindiği token ile yayımlanan API adresini çağırın. Token yokken, yanlış audience ile ve gerekli scope eksikken de deneme yapın.
Projede saklanan bağlantı şu şekildedir:
version: 1
enabled: true
protocols: [https]
authentication:
type: jwt
policyRef: orders-jwt
Issuer/JWKS ve yetki kuralları ortamın policy kaynağında kalır. Ortam policy’sindeki değişiklikler için iş route’larını yeniden derlemek gerekmez. Policy bulunamıyor veya bağlanamıyorsa erişim hazır kabul edilmemelidir; Publication → Detail ile ortam durumunu kontrol edin.
Örneğin ortam yöneticisinin native policy’sindeki aşağıdaki parça, orders adlı JWT sağlayıcısından doğrulanan token’da orders.read scope’unu arar:
authorization:
defaultAction: Deny
rules:
- name: orders-read
action: Allow
principal:
jwt:
provider: orders
scopes:
- orders.read
Bu parça tek başına uygulanacak tam bir policy değildir. Aynı kaynağın JWT sağlayıcısı, hedef seçicisi ve kurulumun API koruma kurallarıyla birlikte hazırlanır. orders.read adını yazmanız kimlik sağlayıcısının bu izni otomatik vereceği anlamına gelmez. Native kapsamın ayrıntıları JWT izin kurallarında bulunur.
Makineden makineye kullanımda sağlayıcınızın servis istemcisi için tanımladığı yöntemle access token alın. Kullanıcı girişini bildiren ID token’ı veya client secret’ı bunun yerine göndermeyin. Token endpoint’i, istenebilecek scope’lar ve istemci doğrulama yöntemi kimlik sağlayıcısının kaydından öğrenilir; Lunex bu bilgileri otomatik oluşturmaz.
OpenAPI’de güvenliği belgeleyin
İstemcilere beklenen kimlik bilgisini anlatmak için Source içinde components.securitySchemes ve security kullanabilirsiniz. Örneğin JWT Bearer açıklaması:
{
"components": {
"securitySchemes": {
"BearerAuth": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT"
}
}
},
"security": [{"BearerAuth": []}]
}
Bu, mevcut sözleşmeye eklenecek bir parçadır; diğer components tanımlarınızı koruyun. OAuth2/OpenID Connect bilgileri gibi formda ayrı alanı olmayan tanımlar da Source’ta tutulabilir.
OpenAPI güvenlik tanımı istemciye sözleşmeyi anlatır. Gerçek dış erişim API access politikası ve ortam güvenlik kaynağıyla uygulanır. İkisinin aynı gereksinimi anlattığını kontrol edin.
Örneğin sözleşmede Bearer tanımı bulunurken Access policy Public kalırsa yalnızca belgeye bakarak API’nin korunduğunu söyleyemezsiniz. Tersine, gateway API key isterken sözleşme bunu açıklamıyorsa tüketici eksik bilgiyle çağrı yapar. Global veya operation düzeyindeki security tanımını değiştirmek, Lunex’in proje erişim politikasını otomatik değiştirmez.
Erişimi gerçek adres üzerinden sınayın
Try it → Running project, geliştirme container’ına istek gönderir; public gateway’in Basic/API key/JWT kontrolünü sınamaz. API access içindeki adresi bir HTTP istemcisinde kullanın.
API key örneği, shell’de daha önce tanımlanmış API_KEY değişkenini kullanır:
curl --include \
--header "x-api-key: $API_KEY" \
https://lunex.example.com/orders-api/api/orders
JWT örneği:
curl --include \
--header "Authorization: Bearer $ACCESS_TOKEN" \
https://lunex.example.com/orders-api/api/orders
Adresleri kendi Copy operation address değerinizle değiştirin. Aynı isteği credential olmadan ve geçersiz credential ile de çalıştırın; korunan veri dönmemelidir. Geçerli token hâlâ reddediliyorsa issuer, audience, süre, scope, JWKS erişimi ve policy seçicisini ortam yöneticinizle kontrol edin.
İzinleri bir deneme tablosuyla doğrulayın
| Deneme | Beklenti | Kanıtladığı şey |
|---|---|---|
| Doğru credential + doğru istek | İşlemin beklenen başarı yanıtı | Erişim ve iş çağrısı birlikte çalışıyor. |
| Credential yok | Korunan API’de erişim reddi | Kimlik doğrulama zorunlu. |
| Yanlış API key veya Basic parolası | Erişim reddi | Secret’taki değer gerçekten kontrol ediliyor. |
| Süresi dolmuş veya yanlış audience’lı JWT | Erişim reddi | Token sadece varlığına göre kabul edilmiyor. |
| Geçerli JWT, gerekli scope yok | Policy o scope’u istiyorsa erişim reddi | Yetkilendirme kuralı uygulanıyor. |
| Doğru credential + hatalı body | Request doğrulama hatası | Kimlik kontrolünden sonra veri kontrolü de uygulanıyor. |
Yanıt kodu ve açıklamasını birlikte değerlendirin; ortam policy’si veya hazır olmayan bir kaynak farklı hata sonucu verebilir. Publication → Ready, kaynakların hazır olduğunu gösterir; bu denemelerin yapıldığını söylemez. API hata teşhisi erişim ile veri hatasını ayırmanıza yardımcı olur.