Урок за сигурност на уеб услуга (WS) с пример за SOAP

Какво е WS Security?

WS Security е стандарт, който се отнася до сигурността, когато данните се обменят като част от уеб услуга. Това е ключова функция в SOAP, която го прави много популярен за създаване на уеб услуги.

Сигурността е важна характеристика на всяко уеб приложение. Тъй като почти всички уеб приложения са изложени на достъп до интернет, винаги има шанс за заплаха за сигурността на уеб приложенията. Следователно, когато се разработват уеб базирани приложения, винаги се препоръчва да се гарантира, че приложението е проектирано и разработено с мисъл за сигурността.

Заплахи за сигурността и противодействие

За да разберем заплахите за сигурността, които могат да бъдат враждебни към уеб приложение, нека разгледаме прост сценарий на уеб приложение и да видим как работи по отношение на сигурността.

Една от мерките за сигурност, налични за HTTP, е HTTPS протоколът. HTTPS е защитен начин за комуникация между клиента и сървъра през мрежата. HTTPS използва слоя със защитени сокети или SSL за сигурна комуникация. Както клиентът, така и сървърът ще имат цифров сертификат, за да се идентифицират като истински, когато се осъществява комуникация между клиента и сървъра.

Заплахи за сигурността и противодействие

При стандартна HTTPS комуникация между клиента и сървъра се извършват следните стъпки

  1. Клиентът изпраща заявка до сървъра чрез клиентския сертификат. Когато сървърът види клиентския сертификат, той прави бележка в своята кеш система, така че да знае, че отговорът трябва да се върне само към този клиент.
  2. След това сървърът се удостоверява на клиента, като изпраща своя сертификат. Това гарантира, че клиентът комуникира с правилния сървър.
  3. Цялата комуникация след това между клиента и сървъра е криптирана. Това гарантира, че ако други потребители се опитат да пробият защитата и да получат необходимите данни, те няма да могат да ги прочетат, защото ще бъдат криптирани.

Но горният тип сигурност няма да работи във всички ситуации. Може да дойде момент, когато клиентът може да говори с множество сървъри. Пример, даден по-долу, показва клиент, който разговаря едновременно с база данни и уеб сървър. В такива случаи не цялата информация може да премине през https протокола.

Заплахи за сигурността и противодействие

Това е мястото, където SOAP влиза в действие, за да преодолее подобни пречки, като разполага със спецификацията за сигурност на WS. С тази спецификация всички данни, свързани със сигурността, се дефинират в заглавния елемент на SOAP.

Заглавният елемент може да съдържа посочената по-долу информация

  1. Ако съобщението в тялото на SOAP е подписано с който и да е защитен ключ, този ключ може да бъде дефиниран в заглавния елемент.
  2. Ако някой елемент в SOAP тялото е шифрован, заглавката ще съдържа необходимите ключове за шифроване, така че съобщението да може да бъде декриптирано, когато достигне местоназначението.

В среда с множество сървъри горната техника на SOAP удостоверяване помага по следния начин.

  • Тъй като тялото на SOAP е криптирано, то ще може да бъде декриптирано само от уеб сървъра, който хоства уеб услугата. Това се дължи на начина, по който е проектиран SOAP протоколът.
  • Да предположим, че ако съобщението се предаде на сървъра на базата данни в HTTP заявка, то не може да бъде декриптирано, защото базата данни няма правилни механизми за това.
  • Само когато заявката действително достигне уеб сървъра като SOAP протокол, той ще може да дешифрира съобщението и да изпрати съответния отговор обратно на клиента.

Ще видим в следващите теми как може да се използва стандартът WS Security SOAP.

Стандарти за сигурност на уеб услугите

Както беше обсъдено в по-ранния раздел, стандартът WS-Security се върти около включването на дефиницията за сигурност в SOAP Header.

Идентификационните данни в SOAP заглавката се управляват по 2 начина.

Първо, той дефинира специален елемент, наречен UsernameToken. Това се използва за предаване на потребителското име и паролата към уеб услугата.

Другият начин е да използвате двоичен токен чрез BinarySecurityToken. Това се използва в ситуации, в които се използват техники за криптиране като Kerberos или X.509.

Диаграмата по-долу показва потока на начина, по който моделът на защита работи в WS Security

Стандарти за сигурност на уеб услугите

По-долу са стъпките, които се извършват в горния работен процес

  1. Заявка може да бъде изпратена от клиента на уеб услугата до Security Token Service. Тази услуга може да бъде междинна уеб услуга, която е специално създадена да предоставя потребителски имена/пароли или сертификати на действителната SOAP уеб услуга.
  2. След това маркерът за сигурност се предава на клиента на уеб услугата.
  3. След това клиентът на уеб услугата извика уеб услугата, но този път, като се увери, че защитният маркер е вграден в SOAP съобщението.
  4. След това уеб услугата разбира SOAP съобщението с маркера за удостоверяване и след това може да се свърже с услугата Security Token, за да види дали маркерът за сигурност е автентичен или не.

Фрагментът по-долу показва формата на частта за удостоверяване, която е част от WSDL документа. Сега въз основа на фрагмента по-долу, SOAP съобщението ще съдържа 2 допълнителни елемента, единият е потребителското име, а другият е паролата.

<xs:element name="UsernameToken">  
	<xs:complexType>       
		<xs:sequence>           
			<xs:element ref="Username"/>         
			<xs:element ref="Password" minOccurs="0"/>        
		</xs:sequence>       
	<xs:attribute name="Id" type="xs:ID"/>    
</xs:complexType></xs:element>

Когато SOAP съобщението действително се предава между клиентите и сървъра, частта от съобщението, която съдържа потребителските идентификационни данни, може да изглежда като тази, показана по-горе. Името на елемента wsse е специален елемент, наречен дефиниран за SOAP и означава, че съдържа информация, базирана на сигурността.

Как да изградим сигурни уеб услуги

Сега нека разгледаме примера за сигурност на уеб услугата SOAP. Ние ще изградим защита на уеб услугата върху примера, демонстриран по-рано в главата за SOAP, и ще добавим защитен слой към нея.

В нашия пример ще създадем проста уеб услуга, която ще се използва за връщане на низ към приложението, което извиква уеб услугата. Но този път, когато се извиква уеб услугата, идентификационните данни трябва да бъдат предоставени на извикващата услуга. Нека следваме стъпките по-долу, за да създадем нашата SOAP уеб услуга и да добавим дефиницията за сигурност към нея.

Стъпка 1) Първата стъпка е да създадете празен Asp.Net Уеб приложение. От Visual Studio 2013 щракнете върху опцията от менюто File->New project.

Изградете защитени уеб услуги

След като щракнете върху опцията Нов проект, Visual Studio ще ви даде друг диалогов прозорец за избор на типа проект и за предоставяне на необходимите подробности за проекта. Това е обяснено в следващата стъпка

Стъпка 2) В този етап,

  1. Уверете се, че първо сте избрали C# уеб шаблон за уеб приложение ASP.NET. Проектът трябва да бъде от този тип, за да създадете проект за уеб услуги. Избирайки тази опция, Visual Studio ще извърши необходимите стъпки за добавяне на необходимите файлове, които се изискват от всяко уеб базирано приложение.
  2. Дайте име за вашия проект, което в нашия случай е дадено като „webservice.asmx.След това не забравяйте да посочите място, където ще се съхраняват файловете на проекта.

Изградете защитени уеб услуги

След като приключите, ще видите файла на проекта, създаден във вашия изследовател на решения във Visual Studio 2013.

Изградете защитени уеб услуги

Стъпка 3) В този етап,

Ще добавим файл на уеб услуга към нашия проект

  1. Първо щракнете с десния бутон върху файла на проекта, както е показано по-долу

Изградете защитени уеб услуги

  1. След като щракнете с десния бутон върху файла на проекта, имате възможност да изберете опцията „Добавяне->Уеб услуга (ASMX), за да добавите файл на уеб услуга. Просто предоставете име на Tutorial Service за файла с името на уеб услугата.

    Изградете защитени уеб услуги

Горната стъпка ще изведе диалогов прозорец, в който можете да въведете името на файла на уеб услугата. Така че в диалоговия прозорец по-долу въведете името на TutorialService като име на файл.

Изградете защитени уеб услуги

Стъпка 4) Добавете следния код към вашия asmx файл на Tutorial Service. Кодовият фрагмент по-долу се използва за добавяне на персонализиран клас, който ще се използва за промяна на SOAP Header, когато се генерира SOAP съобщение. Тъй като сега искаме да добавим идентификационни данни за сигурност към SOAP заглавката, тази стъпка е задължителна.

Изградете защитени уеб услуги

		return "This is a Guru99 Web Service";
	}
	
	public class AuthHeader : SoapHeader
	{
		public string UserName;
		public string Password;

	}
}

Обяснение на кода:-

  1. Сега създаваме отделен клас, наречен AuthHeader който е от тип Клас SoapHeader. Всеки път, когато искате да промените това, което се предава в SOAP заглавката, трябва да създадете клас, който използва вградения клас SoapHeader на .Net. Чрез персонализирането на SOAPheader вече имаме възможността да предаваме „Потребителско име“ и „Парола“, когато се извиква уеб услугата.
  2. След това дефинираме променливи на 'UserName' и 'Password', които са от тип string. Те ще се използват за съхраняване на стойностите на потребителското име и паролата, които се предават на уеб услугата.

Стъпка 5) Като следваща стъпка към същото трябва да се добави следният код TutorialService.asmx файл. Този код всъщност дефинира функцията на нашата уеб услуга. Тази функция връща низ „Това е уеб услуга на Guru99“ на клиента. Но този път низът ще бъде върнат само ако клиентското приложение предаде идентификационните данни на уеб услугата.

Изградете защитени уеб услуги

public class TutorialService : System.Web.Services.WebService
{ 
	public AuthHeader Credentials; 
	
	[SoapHeader("Credentials")] 
	
	[WebMethod]
	public string Guru99WebService()
	{ 
	
		if (Credentials.UserName.ToLower() != "Guru99" ||
		Credentials.Password.ToLower() != "Guru99Password") 
		{
			throw new SoapException("Unauthorized",
			SoapException.ClientFaultCode);
		}
		eise
		return "This is a Guru99 Web service";
	}

Обяснение на кода:-

  1. Тук създаваме обект от класа AuthHeader, който беше създаден в по-ранната стъпка. Този обект ще бъде предаден на нашия Уеб услуга Guru99 в който потребителското име и паролата могат да бъдат разгледани внимателно.
  2. Атрибутът [SoapHeader] се използва сега, за да се укаже, че когато се извика уеб услугата, тя трябва да има потребителско име и парола.
  3. В този блок код ние всъщност проверяваме потребителското име и паролата, предадени при извикване на уеб услугата. Ако потребителското име е равно на „Guru99“ и паролата е равна на „Guru99Password“, тогава съобщението „Това е уеб услуга на Guru99“ се предава на клиента. В противен случай на клиента ще бъде изпратено съобщение за грешка, ако бъдат предадени грешно потребителско име и парола.

Ако кодът се изпълни успешно, ще се покаже следният изход, когато стартирате кода си в браузъра.

Изход:

Изградете защитени уеб услуги

Горният резултат се показва, когато програмата се изпълнява, което означава, че уеб услугата вече е достъпна. Нека щракнете върху услугата Descriptйонна връзка.

Изградете защитени уеб услуги

От описанието на услугата вече ще можете да видите, че потребителското име и паролата са елементи на wsdl файл. Тези параметри трябва да бъдат изпратени при извикване на уеб услугата.

Най-добри практики за сигурност на уеб услугите

Следват съображенията за сигурност, които трябва да се имат предвид при работа с уеб услуги

1. Одит и управление на регистрационни файлове – Използвайте регистрирането на приложението, за да регистрирате всички заявки, които идват към уеб услугите. Това дава подробен отчет за това кой е извикал уеб услугата и може да помогне при анализ на въздействието, ако възникне някакъв пробив в сигурността.

2. Поток от обаждания към уеб услугата – Опитайте се да забележите потока на повикванията в уеб услугите. По подразбиране едно приложение може да извика заявка за множество уеб услуги с токени за удостоверяване, предавани между тези уеб услуги. Всички обаждания между уеб услуги трябва да се наблюдават и регистрират.

3. Чувствителна информация – Не включвайте поверителна информация във вашите записи в регистрационния файл, като пароли или номера на кредитни карти или всякакъв вид друга поверителна информация. Ако има събитие, което има част от тази информация, то трябва да бъде отхвърлено преди регистриране.

4. Проследете бизнеса Operaции – Проследяване на значими бизнес операции. Например, инструментирайте приложението си, за да записва достъп до особено чувствителни методи и бизнес логика. Да вземем пример за приложение за онлайн пазаруване. Има няколко стъпки в едно типично приложение, като например избор на артикулите за закупуване, артикулите, заредени в количката и след това окончателната покупка. Целият този бизнес процес трябва да бъде проследен от уеб услугата.

5. Правилно удостоверяване – Удостоверяването е механизмът, чрез който клиентите могат да установят своята самоличност с уеб услугата, като използват определен набор от идентификационни данни, които могат да докажат тази самоличност. Човек никога не трябва да съхранява идентификационните данни на потребителя и следователно, ако WS Security се използва за извикване на уеб услугата, трябва да се отбележи, че уеб услугата не трябва да съхранява идентификационните данни, които се изпращат в SOAP заглавката. Те трябва да бъдат изхвърлени от уеб услугата.

Oбобщение

  • SOAP предоставя допълнителен слой, наречен WS Security, за осигуряване на допълнителна сигурност, когато се правят повиквания към уеб услуги.
  • WS Security може да се извика с просто потребителско име или парола или може да се използва с двоични сертификати за удостоверяване
  • Виждали сме това в .Net можем да персонализираме уеб услугата, така че потребителско име и парола да се предават като част от SOAP заглавния елемент.