Büyüteç altındaki mikroprofile, Bölüm 3: JWT Güvenliği

Portakalkafa

Global Mod
Global Mod


  1. Büyüteç altındaki mikroprofile, Bölüm 3: JWT Güvenliği

Güvenlik konusu, güçlü dağıtılmış ve mikro hizmet tabanlı bir ortamda özel bir zorluktur. Son yıllarda, OpenID Connect (OIDC) temelinde JSON Standar (JWT) web tabanlı jeton, rolü temel alan erişim kontrolü için kendilerini oluşturmuştur. Mikroprofil JWT RBAC güvenliğinin (MP-JWT) spesifikasyonu da bu yığındadır.

Bir mikro hizmet nadiren yalnız gelir. Bu bir sır değil, başarı tarifinin bir parçası. Mikro hizmetlere dayanan bir mimarinin amacı, yeterli hizmet tasarımı yoluyla bireysel hizmetlerin mümkün olan maksimum bağımsızlığına ulaşmaktır. Peki ya güvenlik konusu? Mümkün olan en büyük bağımsızlık ilkesi burada da geçerli mi? Ve bu durumda, bir istemci kullanıcının kullanıcılarıyla kullanıcılarıyla kimlik bilgileriyle kullanıcının kimlik bilgileriyle kullanıcının kimlik bilgilerini doğrulamalı ve yetkilendirmeli ve yetkilendirmeli mi?

Hızlı rehber jwt


Bölgede dağıtılan hizmetler, son yıllarda OpenId Connect'e dayanan JSON-Web-Tokens Standardı (ayrıca bkz. Giriş JWT.IO) . Standart kuruldu.

Bu prosedürü ortadan kaldırdı, kimlik doğrulama sunucusuna sahip otantik bir istemci (İhraççı) ve karşılığında geçici bir jeton alır, kişiselleştirilmiş ve genellikle imzalı (JWS ile JWT). Bu bağlamda, kişiselleştirilmiş, güvenlik belirtecinin bu şekilde adlandırılmış ifadeler veya diğer şeylerin yanı sıra anahtar değer çiftleri içerdiği anlamına gelir. Kimlik doğrulamalı kullanıcı hakkında bilgi (Ders).

Jetonun yardımıyla, müşteri artık harici hizmetlerle karşılaşabilir (Kaynak Sunucusu) Taşıyıcı kimlik doğrulamasını kullanarak kimlik doğrulama. Bunu yapmak için, jetonu her istekte otoritenin başlığına gönderir:

GET /resource/123 HTTP/1.1
Host: openknowledge.com
Authorization: Bearer mF_9.B5f-4.1JqM

İmza sayesinde, çağrılan hizmetler jetonun özgünlüğüne ve orijinaline doğrulanmasını doğrulayabilir. Jeton istemci hakkında bilgi içerdiğinden, erişilebilir hizmet de Roll'a (RBAC; Rol'e dayalı erişim kontrolü) dayalı erişim kontrolü gerçekleştirebilir.

Bu prosedürün avantajı açıkça açıktır. Jetonlar ve içerdiği bilgiler sayesinde hizmet, kullanıcı yönetimi veya kimlik hizmeti gibi üçüncü taraf bilgilerini araştırmak zorunda kalmadan hem kimlik doğrulama hem de yetkilendirmeyi gerçekleştirebilir. Bu gereksiz turlardan tasarruf eder. Bu arada, bu hizmet başka bir hizmet için çağrılsa bile geçerlidir (Hizmetin yetersizliği). Bu durumda, başlangıçta erişilebilir hizmet, isteğin başlığında bulunan kullanıcının bilgileri de dahil olmak üzere jetonu genişletir (Güvenlik bağlamının yayılması).

Mikroprofile ve JWT


Sürüm 1.2'den, Micropro-Rumor da JWT spesifik MP-JWT 1.0'a dayanan güvenlik ile desteklendi. Özel, farklı noktalarla başlar ve aşağıdaki görevleri desteklemeye çalışır:

  1. Taleni talepten al,
  2. Jetonu kontrol edin ve doğrulayın,
  3. Jetonun ifadelerini erişilebilir hale getirin e
  4. Javaee-Security-Context oluşturun ve ayarlayın.
Bu amaçla, MP-JWT spesifikasyonları, “isteğe bağlı olmayan” istekler, yani özellikle belirli bir jeton içermesi gereken zorunlu alanlar ifadesini tanımlar:

  • tip: Belirteç biçimi için başlık parametresi (“JWT”)
  • Alg: Şifreleme algoritması için başlık parametresi (“RS256”)
  • delikanlı: Chiara Kimliği için not içeren başlık parametreleri
  • yemek yemek: Token kullanıcısı
  • alt: Jetonun nesnesi (prensip/kullanıcı)
  • Vol: Öngörülen alıcı grubu
  • Exp: Geçerlilik
  • IAT: Serginin zamanı
  • JTI: Alman tanımlayıcısı
  • Upn: Temiz prensip adı (java.security.principple için)
  • grup: Uygulama rolleriyle eşleme için grup adlarının listesi
JSON formatında bir MP-JWT'nin minimum örneği aşağıdaki gibi görünebilir:

{
"typ": "JWT",
"alg": "RS256",
"kid": "abc-1234567890"
}
{
"iss": "https://auth.openknowledge.com",
"aud": "kNowLedGe",
"jti": "ok-12345",
"exp": 1311281970,
"iat": 1311280970,
"sub": "13579",
"upn": "[email protected]",
"groups": ["first-group", "second-group", "admin"],
}

Talep talebinden otomatik bir jeton çıkarması için, JAX-GRE başvurusunun önce MP-JWT Jaspi'nin (kapsayıcılar için kimlik doğrulama Java SPI) kimlik doğrulama ve yetkilendirme için kullanılması gerektiği bildirilmelidir. Bu ek açıklama ile yapılır Logincorefig Paketten Organ.eclipse.microprofile.jwt.


import org.eclipse.microprofile.auth.LoginConfig;

// Sets the authentication method to the MP-JWT for the MicroProfile JWT.
// The optional parameter realName is only needed, if authMethod
// is set to "BASIC" or for vendor specific configurations.
@LoginConfig(authMethod = "MP-JWT", realName="...")
@ApplicationScoped
@ApplicationPath("/myapi")
public class MyJaxrsApp extends Application { }


Not: Dipnot Logincorefig Mikropro -river olası dağıtım formatları hakkında beyanda bulunmadığı ve bu nedenle bir servis konteynerinin veya bir Web.xml Alınabilir. Bir Web.xml Mevcut, ek açıklamanın kullanımına bir alternatif olarak, aynı adı taşıyan öğe de Erişim Yapılandırması İçinde Web.xml-File kullanılabilir.

Jetonun müteakip doğrulaması otomatik olarak arka plandadır. Bu amaçla, Micropro -Philos çalışma zamanı kapının konfigürasyonunda sadece Tokenissuer'ın genel anahtarı ezberlenmelidir. Bir jetonun geçerli bir MP-JWT olarak kabul edilmesi için, en azından aşağıdaki koşulları da tatmin etmelidir:

  • Jose başlığı (javascript nesnesinin imzası), belirtecin Rs256 üzerinden imzalandığını gösterir
  • Micropro-Filropfil-Runtime Conter'da yapılandırıldığı gibi aynı jeton yayıncısını içeren ISS iddiası
CDI entegrasyonu


Çıkarıldıktan ve doğrulandıktan sonra, CDI veya jeton aracılığıyla mikro hizmet içindeki jetona erişebilirsiniz. Erişim ham türler, şikayetler yaratma, javax.enterprise.inject aracılığıyla gerçekleşebilir. Uygulama türleri veya JSON-P:

@Path(/endpoint)
@DenyAll
@RequestScoped
public class SomeEndpoint {
// 1) JWT object with @RequestScoped scoping
@Inject
private JsonWebToken callerPrincipal;

// 2) JWT as raw String
@Inject
@Claim(standard = Claim.raw_token)

private String rawToken;

// 3) IAT claim as Long value
@Inject
@Claim(standard=Claims.iat)

private Long issuedAt;

// 4) ISS claim as ClaimValue of type String
@Inject
@Claim(standard=Claims.iss)

private ClaimValue<String> issuer;

// 5) JTI claim as optional ClaimValue of type String
@Inject
@Claim(standard=Claims.jti)

private ClaimValue<Optional<String>> optJti;

// 6) JTI claim as JsonString
@Inject
@Claim(standard=Claims.jti)

private JsonString jsonJti;

// 7) custom claim "roles" as JsonArray
@Inject
@Claim("roles")

private JsonArray jsonRoles;

// 8) custom claim "customObject" as JsonArray
@Inject
@Claim("customObject")

private JsonObject jsonCustomObject;
...
}


Not: Yukarıdaki listede gösterilen sınıf Küçük bir uç nokta İmtiyazlı olmayan türlerinde @reqiestscoped amacından zorunlu olmalıdır (Halat VE Uzun) jeton tarafından enjekte edilebilir.

Şu anda kaydedilen arayanı veya ilişkili jetonu kullanabilirsiniz @Lnject jsonwebtoken Bölgeyle @Requestscoped enjekte edilebilir (1). Ki Müdür Türev arayüzü Jsonwebtoken En önemli DES kredilerine (isim, ihraççı, kitle, konu, tokenide, deney, ortaklık ihraççısı, gruplar) erişmek için bir dizi uygun yöntem sunar.

Alternatif olarak, ifadeler doğrudan enjekte edilebilir. Bu, dize (2) veya uzun (3) gibi uygun olmayan bir ham tip olarak gerçekleşirse, çevreleyen fasulye @Requestscoped Olmak. Şikayeti ham tipler olarak enjekte etmek yerine, isteğe bağlı şikayetler ve/veya sarmalayıcı kullanmak da mümkündür (4 ve 5). Ve erişim JSON-P'de tanımlanan türler (6, 7 ve 8) ile de mümkündür.

Yazma hatalarını önlemek için, standart sıralamalara erişirken şikayetlerin numaralandırılması her zaman kullanılmalıdır. Aksine, diziler veya numaralandırmalarınız kişiselleştirilmiş şikayetlere erişmek için kullanılabilir.

Jax-gri konteynerinin entegrasyonu


Artık JSON Web jetonunu talepten otomatik olarak çıkarabildiğimize ve bu nedenle doğrulayabildiğimize göre, JAX-GRIS kaynaklarındaki olağan Javaee güvenlik mekanizmalarına düşebilmemiz iyi olurdu. Bu aynı zamanda MP-JWT özellikleri de sağlar.

Yöntem için bir çağrı GerustPrincipple () sınıf javax.ws.rs.core.securityContext bize akımın bir örneğini sağlar Jsonwebtoken Geriye doğru. Sonuç olarak, yöntemi arayabiliriz Isuerrole (Somerle) Şikayette belirtilen rolü test edin grup jetonun içerdiği veya bulunmadığı. Ayrıca, ek açıklamanın yardımıyla @RollesLowled (…) Belirtilen rol / s) uyarınca bireysel yöntemlere erişimin temizlenmesi veya serbest bırakılması.

Sonuç ve perspektif


Javaee güvenlik bağlamına aktarılması da dahil olmak üzere bir jeton web json'u çıkarmak, doğrulamak ve kontrol etmek için gerekli adımları uygulayabilen herkes, entegre ve standart bir çözümün avantajlarını takdir eder. Bu, özellikle belirteç içinde beklenen şikayetler için de geçerlidir.

Bununla birlikte, tüm konsept, sonunda MP-JWT formatında yer alan yeterli kimlik sağlayıcıları ve hizmet sağlayıcıları olacağı gerçeğine dayanır ve düşer. Olasılığı artırmak için, “isteğe bağlı olmayan” ifadeler seçerken, tekerleği yeniden icat etmek kasıtlı olarak kaçınıldı ve bunun yerine IIANA JWT ödevindeki standartlaştırılmış ifadelerin beşinin bir alt kümesi. Yalnızca “isteğe bağlı olmayan” ifadelerden ikisi – Upn (Kullanıcının prensibinin adı) e grup (Javaee güvenlik rolleriyle eşleştirilen jeton denekleri grupları) – sahiplerdir.

Gelecekteki sürümler için başka bazı ifadeler verilmiştir. O zaman onaylama yardımıyla Resuce_access Servis -Lütfen Özel Roller. Ayrıca düşünülür grup ayrıca bir şikayet Rol Tanıtmak için. Sırasında grup Hedef kaynağın rolü ile eşleştirilen değerlerin Rol İçerik değerleri bire ve içinde @Rolesalted Kullanılabilir.

Biraz şaşırmış olan, örneğin genel anahtardaki Zurgiff'in yapılandırma yolunun, MP yapılandırma arılarını kullanmak yerine kendi çalışma zamanı kapları üreticilerine bırakılmasıdır. Standardizasyon için zaten ilgili hususlar var. Heyecanlı olabilirsin.


()
 
Üst