Güvenliğe Genel Bakış
Windows Web Hizmetleri API'sindeki (WWSAPI) güvenlik çerçevesi şunları sağlar:
- Aktarım güvenliğini kullanarak ileti bütünlüğü, gizlilik, yeniden yürütme algılama ve sunucu kimlik doğrulaması.
- SOAP ileti güvenliği veya aktarım güvenliği kullanarak güvenlik belirteci doğrulaması, sertifika güveni ve iptal denetimleri gibi istemci kimlik doğrulaması.
Güvenlik Programlama Modeli
Güvenlik, iletişim kanallarıyla ilişkilendirilir. Kanalın güvenliğini sağlamak aşağıdaki adımlardan oluşur.
- Uygulamanın güvenlik gereksinimlerine uygunbir veya daha fazlagüvenlik bağlaması oluşturun ve başlatın.
- Bu güvenlik bağlamalarını içerengüvenlik açıklaması oluşturun.
- İstemci tarafında bir kanalı veya bir hizmet ara sunucusu oluşturun ya da sunucu tarafında bu güvenlik açıklamasını geçiren bir dinleyici veya bir hizmet ana bilgisayarı oluşturun.
- Aç, Kabul Et, Gönder, Al, Kapat gibi normal kanal programlama adımlarını uygulayın.
Kanalda gönderilen ve alınan iletiler, sağlanan güvenlik açıklamasına göre çalışma zamanı tarafından otomatik olarak güvenlik altına alınır. İsteğe bağlı olarak, bu adımlar, bir güvenlik tanımında kanal genelinde bir veya daha fazla güvenlik ayarı veya bir güvenlik bağlamında bağlama genelinde güvenlik ayarları belirtilerek ince ayar yapılabilir.
Gönderen kimliklerinin gerekli yetkilendirmeleri, alınan her iletiye ekli güvenlik işleme sonuçları kullanılarak uygulama tarafından yapılmalıdır. Yetkilendirme adımları güvenlik açıklamasında belirtilmez ve çalışma zamanı tarafından otomatik olarak gerçekleştirilmez.
Desteklenmeyen bağlamalar, uygulanabilir özellikler/alanlar, gerekli özelliklerin/alanların olmaması veya geçersiz özellik/alan değerleri gibi güvenlik açıklamasındaki hatalar kanal veya dinleyici oluşturma işleminin başarısız olmasına neden olur.
Güvenlik Bağlamalarını Seçme
Bir uygulama için güvenlik tasarlarken, birincil karar güvenlik açıklamasına eklenecek güvenlik bağlamalarının seçilmesidir. Aşağıda, uygulamanın güvenlik senaryosuna uygun güvenlik bağlamalarını seçmeye yönelik bazı yönergeler yer alır. Yararlı bir buluşsal yöntem, önce uygulama için hangi güvenlik kimlik bilgisi türlerinin (X.509 sertifikaları, Windows etki alanı kullanıcı adı/parolaları, uygulama tanımlı kullanıcı adı/parola) kullanılıp kullanılamayacağını anlamak ve ardından bu kimlik bilgisi türünü kullanabilecek bir güvenlik bağlaması seçmektir.
Güvenliğin aktarım bayt akışı düzeyinde (SOAP ileti sınırlarının altında) uygulandığı aktarım güvenliği, göz önünde bulundurulacak ilk seçenektir.
İnternet senaryoları ve sunucuda bir X.509 sertifikasının dağıtılabildiği Intranet senaryoları için uygulama WS_SSL_TRANSPORT_SECURITY_BINDINGkullanabilir. Aşağıdaki örnekte bu seçenek gösterilmektedir. İstemci: HttpClientWithSslExample Sunucusu: HttpServerWithSslExample.
HTTP üst bilgi kimlik doğrulaması aracılığıyla istemci kimlik doğrulaması isteniyorsa, bu işlevselliği sağlamak için bir WS_HTTP_HEADER_AUTH_SECURITY_BINDING eklenebilir.
Kerberos, NTLM ve SPNEGO gibi Windows Tümleşik Kimlik Doğrulama protokollerinin uygun olduğu Intranet senaryolarında, uygulama WS_TCP_SSPI_TRANSPORT_SECURITY_BINDINGkullanabilir. Aşağıdaki örnekte şu seçenek gösterilmektedir: İstemci: RequestReplyTcpClientWithWindowsTransportSecurityExample Sunucu: RequestReplyTcpServerWithWindowsTransportSecurityExample.
Adlandırılmış kanallar üzerindeki istemci: WindowsTransportSecurityExample ile İstemci Yanıt İsteği Adlandırılmış Kanallar
Adlandırılmış borular üzerinden sunucu: RequestReplyNamedPipesServerWithWindowsTransportSecurityExample
Kerberos, NTLM ve SPNEGO gibi Windows Tümleşik Kimlik Doğrulama protokollerinin uygun olduğu yerel makine senaryolarında, uygulama WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING veya WS_NAMEDPIPE_SSPI_TRANSPORT_SECURITY_BINDINGkullanabilir. WS_NAMEDPIPE_CHANNEL_BINDING bu tür senaryolarda tercih edilir çünkü trafiğin makineden ayrılmayacağını garanti eder (bu, WS_NAMEDPIPE_CHANNEL_BINDINGözelliğidir).
Aktarım güvenliğinin bağlantıyı koruduğu ve SOAP iletisindeki bir WS-Security üst bilgisinin istemci kimlik doğrulaması sağladığı karma mod güvenliği, göz önünde bulundurulacak bir sonraki seçenektir. Aşağıdaki bağlamalar, önceki bölümde açıklanan aktarım güvenliği bağlamalarından biriyle birlikte kullanılır.
İstemcinin kimliği uygulama düzeyi kullanıcı adı/parola çifti tarafından doğrulandığında, uygulama kimlik doğrulama verilerini sağlamak için bir WS_USERNAME_MESSAGE_SECURITY_BINDING kullanabilir. Aşağıdaki örneklerde, bu bağlamanın bir WS_SSL_TRANSPORT_SECURITY_BINDINGile birlikte kullanımı gösterilmektedir:
- İstemci: HttpClientWithUsernameOverSslExample
- Sunucu: HttpServerWithUsernameOverSslExample
İstemcinin kimliği bir Kerberos biletiyle doğrulandığında, uygulama kimlik doğrulama verilerini sağlamak için bir WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING kullanabilir.
bir güvenlik bağlamı kullanırken, istemci önce sunucuyla bir güvenlik bağlamı oluşturur ve ardından iletilerin kimliğini doğrulamak için bu bağlamı kullanır. Bu işlevi etkinleştirmek için güvenlik açıklaması bir WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDINGiçermelidir. Güvenlik bağlamları oluşturulduktan sonra basit belirteçler aracılığıyla iletilebilir ve bu da her iletide büyük ve hesaplama açısından pahalı olabilecek istemci kimlik bilgilerini göndermek zorunda kalmamasını sağlar.
federasyon güvenlik senaryosunda, istemci önce bir güvenlik belirteci hizmeti (STS) tarafından verilen bir güvenlik belirtecini alır ve ardından verilen belirteci bir hizmete sunar. İstemci tarafı: Güvenlik belirtecini STS'den almak için uygulama WsRequestSecurityTokenkullanabilir. Alternatif olarak, uygulama CardSpace veya LiveID gibi bir istemci tarafı güvenlik belirteci sağlayıcı kitaplığını kullanabilir ve ardından WsCreateXmlSecurityTokenkullanarak yerel olarak bir güvenlik belirteci oluşturmak için çıktısını kullanabilir. Her iki durumda da, güvenlik belirteci istemci tarafından kullanılabilir olduğunda, WS_XML_TOKEN_MESSAGE_SECURITY_BINDINGiçeren bir güvenlik açıklaması kullanılarak hizmete sunulabilir. Sunucu tarafı: STS tarafından verilen güvenlik belirteci bir SAML belirteciyse, sunucu WS_SAML_MESSAGE_SECURITY_BINDINGile bir güvenlik açıklaması kullanabilir.
Notlar
Windows 7 ve Windows Server 2008 R2: WWSAPI yalnızca, Lightweight Web Services Güvenlik Profili (LWSSP)tarafından tanımlandığı gibi, Ws-Trust ve Ws-SecureConversation 'ü destekler. Microsoft'un uygulamasıyla ilgili ayrıntılar için lütfen LWSSP'nin MESSAGE Sözdizimi bölümüne bakın.
Dikkate alınması gereken son seçenek, WS_SSL_TRANSPORT_SECURITY_BINDINGgibi bir koruma bağlaması kullanmadan kimlik doğrulama bağlamaları kullanmaktır. Bu, kimlik bilgilerinin düz metin olarak iletilmesine neden olur ve güvenlik açısından etkileri olabilir. Sonuç olarak güvenlik açığı olmadığından emin olmak için bu seçeneğin kullanımı dikkatli bir şekilde değerlendirilmelidir. Olası bir kullanım örneği, güvenli bir özel ağ üzerinden arka uç sunucuları arasında ileti alışverişidir. Aşağıdaki yapılandırmalar bu seçeneği destekler.
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING tüm yapılandırmalarda bu seçeneği destekler.
- WS_USERNAME_MESSAGE_SECURITY_BINDING, aktarım olarak HTTP kullanılırken sunucuda bu seçeneği destekler.
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING, aktarım olarak HTTP kullanılırken sunucuda bu seçeneği destekler.
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING, aktarım olarak HTTP kullanılırken sunucuda bu seçeneği destekler.
- WS_SAML_MESSAGE_SECURITY_BINDING, aktarım olarak HTTP kullanılırken sunucuda bu seçeneği destekler.
Bu seçeneğin etkinleştirilmesi için açıkça WS_PROTECTION_LEVELWS_PROTECTION_LEVEL_SIGN_AND_ENCRYPTdışında bir değere ayarlanması gerekir.
Kanallar ve Güvenlik
Yukarıda belirtildiği gibi, güvenlik kanallarla sınırlıdır. Ayrıca, kanal işlemleri tüm güvenlik bağlamalarında tutarlı bir şekilde güvenlik adımlarıyla eşleniyor.
- Kanal oluşturma: Güvenlik açıklamasında belirtilen güvenlik bağlamaları kümesi doğrulanır ve bundan sonra kanal için sabit kalır. WS-Trust tabanlı anlaşmalar için kullanılacak yan kanallar da dahil olmak üzere kanal yığınının şekli de belirlenir.
- Kanal açma: Güvenlik bağlamalarının bir parçası olarak sağlanan tüm kimlik bilgileri yüklenir ve güvenlik oturumları oluşturulur. Genel olarak, açık bir kanal 'aktif' güvenlik durumu barındırır. İstemci kanalını açmak, sunucu kimlik doğrulamasının çalışma zamanınca yapılacağı sunucunun uç adresini de belirtir.
- Kanal açma ve kapatma arasında: İletiler bu aşamada güvenli bir şekilde gönderilebilir ve alınabilir.
- İleti gönderme: Gerektiğinde güvenlik bağlam belirteçleri alınır veya yenilenir ve iletilen her iletiye güvenlik açıklamasına göre güvenlik uygulanır. Güvenlik uygulanırken karşılaşılan hatalar, gönderme hataları olarak uygulamaya döndürülür.
- İleti alma: Alınan her iletide güvenlik açıklamasına göre güvenlik doğrulanır. İleti güvenliği doğrulama hataları, uygulamaya alma hataları olarak döndürülür. Bu iletiye özgü hatalar, kanal durumunu veya sonraki iletilerin alınmasını etkilemez. Uygulama başarısız bir alma işlemini atabilir ve başka bir ileti için bir alma işlemini yeniden başlatabilir.
- Kanal durdurma: Kanaldaki tüm G/Ç'yi durdurmak için kanal istediğiniz zaman durdurulabilir. İptal durumunda kanal hatalı duruma geçer ve daha fazla gönderme veya alma işlemine izin vermez. Ancak, kanal hala bazı 'canlı' güvenlik durumlarını koruyabilir, bu nedenle kanalın kapanması, tüm durumun temiz bir şekilde kaldırılması için gerekli olacaktır.
- Kanal kapatma: Açılışta oluşturulan güvenlik durumu kaldırılır ve oturumlar sonlandırılır. Güvenlik bağlamı belirteçleri iptal edildi. Kanal yığını kalır, ancak "aktif" bir güvenlik durumu veya yüklü kimlik bilgileri içermez.
- Kanal serbest: Oluşturma sırasında oluşturulan kanal yığını ve tüm güvenlik kaynakları serbest bırakılır.
Güvenlik API'leri
Güvenlik için API belgeleri aşağıdaki konulara göre gruplandırılır.
Güvenlik
WWSAPI Güvenlik API'sini kullanırken uygulamalar birkaç güvenlik riskiyle karşı karşıya kalır:
-
yanlışlıkla yanlış yapılandırma
-
WWSAPI, güvenlikle ilgili bir dizi yapılandırma seçeneğini destekler. Örneğin bkz. WS_SECURITY_BINDING_PROPERTY_ID. WS_SECURITY_BINDING_PROPERTY_ALLOW_ANONYMOUS_CLIENTS gibi bu seçeneklerden bazıları, uygulamanın çeşitli Güvenlik Bağlamaları tarafından sağlanan varsayılan güvenlik düzeyini düşürmesine olanak sağlar. Sonuçta ortaya çıkan saldırı vektörleri olmadığından emin olmak için bu tür seçeneklerin kullanımı dikkatli bir şekilde değerlendirilmelidir.
Ayrıca, yukarıda açıklandığı gibi WWSAPI, bir uygulamanın güvenlik kimlik bilgileri iletilmiş olsa bile şifrelemeyi devre dışı bırakma gibi bir ileti değişiminin güvenliğini tamamen sağlamak için gereken belirli adımları kasıtlı olarak devre dışı bırakmasına izin verir. Bu, belirli senaryoları etkinleştirmek için izin verilir ve genel iletişim için kullanılmamalıdır. Bu senaryoları etkinleştirmek için WS_PROTECTION_LEVEL özel olarak azaltılmalıdır ve uygulamalar kesinlikle gerekli olmadıkça bu değeri değiştirmemelidir, bunun yapılması güvenli bir yapılandırma sağlamak için tasarlanmış birçok denetimi devre dışı bırakacaktır.
-
Gizli bilgileri bellekte depolama
-
Bellekte depolanan parolalar gibi gizli bilgiler, ayrıcalıklı bir saldırgan tarafından örneğin sayfa dosyası yoluyla ayıklanmaya karşı savunmasızdır. WWSAPI, sağlanan kimlik bilgilerinin bir kopyasını oluşturur ve bu kopyayı şifreleyerek özgün verileri korumasız bırakır. Özgün örneği korumak uygulamanın sorumluluğundadır. Ayrıca, şifrelenmiş kopya kullanıldığı sırada kısa bir süreliğine şifresi çözülür ve bu durum ayıklama için bir pencere açar.
-
Hizmet reddi
-
Güvenlik işleme önemli kaynakları tüketebilir. Her ek güvenlik bağlaması bu maliyetleri artırır. WWSAPI, bir güvenlik doğrulama hatasıyla karşılaşıldığında güvenlik işlemeyi durdurur, ancak önemli bir çalışma gerçekleştirilinceye kadar yetkilendirme kararları gibi bazı denetimler gerçekleşmeyebilir.
Sunucuda bir ileti işlenirken, güvenlik durumu ileti yığınında depolanır. Uygulama, WS_MESSAGE_PROPERTY_HEAP_PROPERTIES aracılığıyla bu yığının boyutunu azaltarak güvenlik işlemi sırasında bellek tüketimini sınırlayabilir. Ayrıca, WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING gibi bazı güvenlik bağlamaları sunucunun istemci adına kaynak ayırmasına neden olabilir. Bu kaynakların sınırları aşağıdaki WS_SECURITY_BINDING_PROPERTY_ID değerleriyle yapılandırılabilir:
- WS_GÜVENLİK_BAĞLAMA_ÖZELLİĞİ_GÜVENLİK_BAĞLAMI_MAX_BEKLEYEN_BAĞLAMLAR
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_ACTIVE_CONTEXTS
- "WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_RENEWAL_INTERVAL"
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_ROLLOVER_INTERVAL
Bu sınırların düşük değerlere ayarlanması en yüksek bellek tüketimini azaltır, ancak kotaya ulaşıldığında meşru istemcilerin reddedilmesine neden olabilir.