Сигурност в .net framework

Post on 06-Jan-2016

47 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

DESCRIPTION

Програмиране за .NET Framework. http://www.nakov.com/dotnet/. Сигурност в .NET Framework. Светлин Наков. Национална академия по разработка на софтуер. academy.devbg.org. Необходими знания. Базови познания за .NET Framework Базови познания за езика C# - PowerPoint PPT Presentation

TRANSCRIPT

Сигурност вСигурност в.NET Framework.NET Framework

Програмиране за .NET FrameworkПрограмиране за .NET Frameworkhttp://www.nakov.com/dotnet/http://www.nakov.com/dotnet/

Светлин НаковСветлин НаковНационална академия по Национална академия по разработка на софтуерразработка на софтуерacademy.devbg.orgacademy.devbg.org

Необходими знанияНеобходими знания Базови познания за .NET FrameworkБазови познания за .NET Framework Базови познания за езика C#Базови познания за езика C# Базови познания за работата на Базови познания за работата на CLR, CLR,

асемблита и атрибутиасемблита и атрибути

СъдържаниеСъдържание Сигурността в Сигурността в .NET Framework.NET Framework

Безопасност на типовете и защита на паметтаБезопасност на типовете и защита на паметта Хващане на аритметични грешкиХващане на аритметични грешки Симетрично и асиметрично кодиране. Цифров Симетрично и асиметрично кодиране. Цифров

подписподпис Силно-именувани асемблитаСилно-именувани асемблита Технологията IsolatedStorageТехнологията IsolatedStorage

Code Access SecurityCode Access Security Политиките за сигурност в .NET FrameworkПолитиките за сигурност в .NET Framework .NET .NET Security Policy EditorSecurity Policy Editor Права (Permissions)Права (Permissions) Декларативно Декларативно и програмно и програмно искане на праваискане на права "Stack Walk" и контрол над правата"Stack Walk" и контрол над правата

Съдържание (2)Съдържание (2) Role-Based SecurityRole-Based Security

Автентикация и авторизацияАвтентикация и авторизация Identity и Principal обектиIdentity и Principal обекти Създаване на Identity и Principal обектиСъздаване на Identity и Principal обекти Авторизация по PrincipalАвторизация по Principal

Криптография в .NET FrameworkКриптография в .NET Framework Изчисляване на хеш стойностИзчисляване на хеш стойност Подписване на XML (XMLDSIG)Подписване на XML (XMLDSIG)

Сигурността в Сигурността в .NET Framework.NET Framework .NET Framework .NET Framework е проектиран с мисията е проектиран с мисията

да бъде сигурна и надеждна платформада бъде сигурна и надеждна платформа Управляваният код (Управляваният код (Managed Code)Managed Code) се се

изпълнява контролираноизпълнява контролирано CLR CLR непрекъснато се грижи за сигурносттанепрекъснато се грижи за сигурността

Компоненти, свързани със сигурността:Компоненти, свързани със сигурността: Type checkerType checker – проверка на типовете – проверка на типовете Exception managerException manager – управление на – управление на

изключениятаизключенията Security engineSecurity engine – управление на сигурността – управление на сигурността

на кода (на кода (Code Access Code Access и и Role-Based SecurityRole-Based Security)) Сигурността в Сигурността в .NET .NET разширява и разширява и

допълва сигурността в допълва сигурността в WindowsWindows

Безопасност на типоветеБезопасност на типовете Управляваният код е защитен от Управляваният код е защитен от

неправилна работа с типоветенеправилна работа с типовете Не се използват указатели към паметтаНе се използват указатели към паметта Използват се референции към обектиИзползват се референции към обекти

Референциите са силно типизираниРеференциите са силно типизирани Не можем да присвоим на референция към Не можем да присвоим на референция към

обект референция към несъвместим обектобект референция към несъвместим обект

Ограничава се достъпът до чужди Ограничава се достъпът до чужди обекти и региони от паметтаобекти и региони от паметта

Решен е проблемът "Решен е проблемът "buffer overrunbuffer overrun""

object bytes = new byte[5];object bytes = new byte[5];char[] chars = (char[]) bytes;char[] chars = (char[]) bytes;// System.InvalidCastException is thrown// System.InvalidCastException is thrown

Проблемът Проблемът "Buffer overrun""Buffer overrun" В В .N.NЕТЕТ Framework Framework масивите и символните масивите и символните

низове не могат да се препълнят:низове не могат да се препълнят:

private static void CopyArray(byte[] src,private static void CopyArray(byte[] src, byte[] dest, int size)byte[] dest, int size){{ for (int i=0; i<size; i++)for (int i=0; i<size; i++) dest[i] = src[i];dest[i] = src[i];}}

static void Main()static void Main(){{ byte[] arr1 = new byte[10];byte[] arr1 = new byte[10]; byte[] arr2 = new byte[5];byte[] arr2 = new byte[5]; CopyArray(arr1, arr2, 10);CopyArray(arr1, arr2, 10); // System.IndexOutOfRangeException is thrown// System.IndexOutOfRangeException is thrown}}

Защита на паметтаЗащита на паметта CLR CLR автоматично управлява паметтаавтоматично управлява паметта

Динамично-заделените обекти се Динамично-заделените обекти се разполагат в т. нар. разполагат в т. нар. Managed heapManaged heap

Неизползваните обекти се почистват Неизползваните обекти се почистват автоматично от т. нар. автоматично от т. нар. Garbage CollectorGarbage Collector

Някои от най-неприятните проблеми Някои от най-неприятните проблеми в програмирането са почти в програмирането са почти невъзможни:невъзможни: Загуба на памет (Загуба на памет (memory leaks)memory leaks) Достъп до освободена паметДостъп до освободена памет Използване на неинициализирана паметИзползване на неинициализирана памет

Хващане на аритметични грешкиХващане на аритметични грешки

При работа с аритметични операции са При работа с аритметични операции са възможни препълвания на типоветевъзможни препълвания на типовете При получаване на резултат, който не се При получаване на резултат, който не се

събира в типа, който е използвансъбира в типа, който е използван При преобразуване на типовеПри преобразуване на типове

В .В .NET Framework NET Framework има вграден механизъм има вграден механизъм за прихващане на аритметични за прихващане на аритметични препълвания за целочислените типовепрепълвания за целочислените типове

В В C# C# се използва ключовата дума се използва ключовата дума checkedchecked

checkedchecked{{ int square = a*a;int square = a*a;}}

Хващане на аритметични грешкиХващане на аритметични грешки

Ключови думи Ключови думи checkedchecked и и uncheckedunchecked ВключватВключват / / изключват проверката за изключват проверката за

препълване за даден програмен блокапрепълване за даден програмен блока

По подразбиране проверката за По подразбиране проверката за препълване е изключенапрепълване е изключена

Може да се включва/изключва с опции на Може да се включва/изключва с опции на C# C# компилатора и с настройки във компилатора и с настройки във VS.NETVS.NET::

csc /checked+ SomeFile.cscsc /checked+ SomeFile.cs

Демонстрация #1Демонстрация #1 Безопасност на типовете и Безопасност на типовете и

аритметичните операцииаритметичните операции

Application DomainsApplication Domains Application Domains:Application Domains:

Позволяват няколко Позволяват няколко .NET.NET приложения приложения да работят в един процес на ОСда работят в един процес на ОС

Application DomainsApplication Domains са изолирани един са изолирани един от друг по памет, данни и кодот друг по памет, данни и код

Подобрена производителностПодобрена производителност Не е необходима междупроцесна Не е необходима междупроцесна

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

дадено асемблидадено асембли Може фино да се настройваМоже фино да се настройва

Възможно е стартиране на Възможно е стартиране на .NET .NET приложения с ограничени праваприложения с ограничени права

Симетрично кодиранеСиметрично кодиране Симетричните кодиращи схеми:Симетричните кодиращи схеми:

Кодират и декодират с един и същ ключКодират и декодират с един и същ ключ Работят бързоРаботят бързо Могат да обработват потоци от данниМогат да обработват потоци от данни Алгоритми: Алгоритми: DES, 3DES, RC2, RC4, IDEADES, 3DES, RC2, RC4, IDEA Кодиране и декодиране:Кодиране и декодиране:

КлючКлюч

КодиранеКодиране

Оригинален

Оригинален

документ

документ Кодиран

Кодиран

документ

документ

КлючКлюч

ДекодиранеДекодиране

Оригинален

Оригинален

документ

документ

Асиметрично кодиранеАсиметрично кодиране Криптографията с публични ключове Криптографията с публични ключове

(Public Key Cryptography):(Public Key Cryptography): Използва асиметрични ключовеИзползва асиметрични ключове

Двойка съответни публичен / личен Двойка съответни публичен / личен ключ (public/private key pair)ключ (public/private key pair)

От единия ключ не може да се извлече От единия ключ не може да се извлече другиятдругият

Работи много по-бавно от симетричната Работи много по-бавно от симетричната криптографиякриптография

Не работи добре с потоци от данниНе работи добре с потоци от данни Алгоритми: RSA, DSA, Diffie-Hellman, Алгоритми: RSA, DSA, Diffie-Hellman,

ECDSA (Elliptic-Curves DSA)ECDSA (Elliptic-Curves DSA)

Асиметрично кодиранеАсиметрично кодиране Криптографията с публични ключове:Криптографията с публични ключове:

Може да използва инфраструктурата на Може да използва инфраструктурата на публичния ключ (публичния ключ (PKI)PKI) TT. нар. сертифициращи организации. нар. сертифициращи организации чрез чрез

цифрови сертификати гарантират че даден цифрови сертификати гарантират че даден публичен ключ е свързан с дадено лицепубличен ключ е свързан с дадено лице

Кодиране и декодиране:Кодиране и декодиране:

ПубличенПубличенключключ

КодиранеКодиране

Оригинален

Оригинален

документ

документ Кодиран

Кодиран

документ

документ

ДекодиранеДекодиране

Оригинален

Оригинален

документ

документ

ЛиченЛиченключключ

Цифров подписЦифров подпис

Алгоритъм за хеширане

Входно съобщение

Хеш-стойност(MD5, SHA1, …)

Алгоритъм за цифров подпис (DSA, RSA, …)

Цифров подписЛичен

ключ

Алгоритъм за хеширане

Подписано съобщение

Хеш-стойност (текуща)

(MD5, SHA1, …)

Дешифриране (DSA, RSA, …)

Цифров подпис

Публичен ключ

Хеш-стойност (оригинална)

= или ≠

Сравняване

Силно-именувани асемблитаСилно-именувани асемблита Силното име на асембли:Силното име на асембли:

Уникално идентифицира асемблитоУникално идентифицира асемблито Съдържа цифров подпис и съответен Съдържа цифров подпис и съответен

на него публичен ключна него публичен ключ Състои се от:Състои се от:

Име (напр. Име (напр. System.Windows.FormsSystem.Windows.Forms)) Версия (напр. Версия (напр. 1.0.5000.01.0.5000.0)) Култура (напр. Култура (напр. neutralneutral)) Публичен ключ (напр. bПубличен ключ (напр. b77a5c5...4e08977a5c5...4e089)) Цифров подписЦифров подпис

Съответства на публичния ключСъответства на публичния ключ Проверява се от CLR при зареждане на Проверява се от CLR при зареждане на

асемблитоасемблито

Силно-именувани асемблитаСилно-именувани асемблита Силно-именуваните асемблита:Силно-именуваните асемблита:

Не позволяват промяна / подправянеНе позволяват промяна / подправяне Потвърждават идентичността на Потвърждават идентичността на

производителяпроизводителя Позволяват няколко версии на едно и Позволяват няколко версии на едно и

също асембли да се инсталират и също асембли да се инсталират и използват независимоизползват независимо

Генериране на двойка ключове:Генериране на двойка ключове:

Подписване на асембли:Подписване на асембли:sn –k MyKeysn –k MyKeyPairPair.snk.snk

[assembly: AssemblyKeyFile(@"..\..\[assembly: AssemblyKeyFile(@"..\..\MyKeyMyKeyPairPair.snk.snk ")]")]

Силно-именувани асемблитаСилно-именувани асемблита Силно-именуваните асемблита могат да се Силно-именуваните асемблита могат да се

инсталират в Global Assembly Cache:инсталират в Global Assembly Cache: Инсталиране и деинсталиране от GAC:Инсталиране и деинсталиране от GAC:

При добавяне на референция от някое При добавяне на референция от някое асембли (асембли (A.dllA.dll) към силно-именувано ) към силно-именувано асембли (асембли (S.dllS.dll):): Публичният ключ на Публичният ключ на S.dllS.dll се записва в се записва в

компилираното асембли компилираното асембли A.dllA.dll Така Така A.dllA.dll се свързва само с конкретната се свързва само с конкретната

версия на асемблито версия на асемблито S.dllS.dll

gacutil –i MyAssembly.dllgacutil –i MyAssembly.dll

gacutil –u MyAssemblygacutil –u MyAssembly

Демонстрация #2Демонстрация #2 Създаване на асембли със силно Създаване на асембли със силно

име и инсталиране в име и инсталиране в GACGAC

Технологията Технологията IsolatedStorageIsolatedStorage Технологията Технологията IsolatedStorageIsolatedStorage::

Позволява приложение, което няма права Позволява приложение, което няма права за достъп до локалния твърд диск, да за достъп до локалния твърд диск, да съхранява работни файловесъхранява работни файлове

IsolatedStorageIsolatedStorage предоставя изолирана предоставя изолирана виртуална файлова система:виртуална файлова система: ограничена по обемограничена по обем без да позволява на приложението достъп без да позволява на приложението достъп

до останалите файлове на твърдия дискдо останалите файлове на твърдия диск Често се използва от приложения, Често се използва от приложения,

работещи с намалени права:работещи с намалени права: Например: Например: Windows Forms Windows Forms контроли, контроли,

стартирани от Web-страница в Интернетстартирани от Web-страница в Интернет

Технологията Технологията IsolatedStorageIsolatedStorage Хранилищата за данни (IsolatedStorage) Хранилищата за данни (IsolatedStorage)

могат да имат обхват:могат да имат обхват: IsolatedStorageScope.UserIsolatedStorageScope.User – –

хранилището е за текущия потребителхранилището е за текущия потребител IsolatedStorageScope.AssemblyIsolatedStorageScope.Assembly – –

хранилището е за текущото асемблихранилището е за текущото асембли Обхватите могат да се комбиниратОбхватите могат да се комбинират

Получаване на Получаване на IsolatedStorageIsolatedStorage::

IsolatedStorageFile IsolatedStorageFile sstore = tore = IsolatedStorageFile.GetStore(IsolatedStorageFile.GetStore( IsolatedStorageScope.User |IsolatedStorageScope.User | IsolatedStorageScope.Assembly, IsolatedStorageScope.Assembly, null, null);null, null);

Технологията Технологията IsolatedStorageIsolatedStorage Отваряне на файл от IsolatedStorage:Отваряне на файл от IsolatedStorage:

Местоположение на файловете:Местоположение на файловете:

Операции с файлове и директории:Операции с файлове и директории: GetDirectoryNames()GetDirectoryNames(), , GetFileNames()GetFileNames(), ,

DeleteFile(…)DeleteFile(…), , CreateDirectory(…)CreateDirectory(…), , DeleteDirectory(…)DeleteDirectory(…)

IsolatedStorageFileStream stream = IsolatedStorageFileStream stream = new IsolatedStorageFileStream(new IsolatedStorageFileStream( "notes.txt", FileMode.Open, "notes.txt", FileMode.Open, FileAccess.Read, isoStore);FileAccess.Read, isoStore);

C:\Documents and Settings\C:\Documents and Settings\<username><username>\Local \Local Settings\Application Data\IsolatedStorage\...Settings\Application Data\IsolatedStorage\...

Демонстрация #Демонстрация #33 Работа с Работа с IsolatedStorageIsolatedStorage от от

потребителска контрола в IEпотребителска контрола в IE

Сигурност на кодаСигурност на кода Концепцията "сигурност на кода" Концепцията "сигурност на кода" (Code (Code

Access Security) Access Security) е фундаментален принцип е фундаментален принцип при дизайна напри дизайна на .NET Framework .NET Framework Надгражда системата за сигурност на Надгражда системата за сигурност на

операционната системаоперационната система Сигурността се управлява отСигурността се управлява от::

политикполитикaaта за сигурност (та за сигурност (.NET Framework .NET Framework Security PolicySecurity Policy) чрез) чрез права права (permissions)(permissions) доказателства за произход (доказателства за произход (evidencesevidences))

Политиката задава с какви праваПолитиката задава с какви права се се изпълнява всяко асембли според изпълнява всяко асембли според неговите доказателства за произходнеговите доказателства за произход

Сигурност на кодаСигурност на кода Code Access SecurityCode Access Security позволява позволява CLR CLR да да

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

За всяко асембли За всяко асембли CLR CLR събира съвкупност събира съвкупност от доказателства за произход от доказателства за произход (evidences)(evidences) Силно име на асемблиСилно име на асембли URLURL, от където идва асемблито, от където идва асемблито Интернет зона, от където идва асемблитоИнтернет зона, от където идва асемблито AuthenticodeAuthenticode цифров подпис цифров подпис Хеш-код на асемблитоХеш-код на асемблито

CLR CLR не може да даде на никое асембли не може да даде на никое асембли права, по-високи от правата на текущия права, по-високи от правата на текущия потребител в ОСпотребител в ОС

Политиките за сигурност в Политиките за сигурност в .NET.NETТерминТермин ОписаниеОписание

Именуван Именуван списък с правасписък с права(Permission Set)(Permission Set)

Представлява именуван списък с праваПредставлява именуван списък с праваПримери:Примери:

FullTrust (всички права)FullTrust (всички права)[User Interface; Printing; Web Access][User Interface; Printing; Web Access]

Група кодГрупа код(Code Group)(Code Group)

Базира се на доказателстваБазира се на доказателстваОбединява асемблита с еднакви Обединява асемблита с еднакви доказателства, напр. всички асемблита, доказателства, напр. всички асемблита, идващи от идващи от http://www.devbg.org/http://www.devbg.org/Групите се наследяват йерархичноГрупите се наследяват йерархично

Политика за Политика за сигурностсигурност

(Security Policy)(Security Policy)

Задава се от администраторитеЗадава се от администраторитеПрилага се по време на изпълнениеПрилага се по време на изпълнениеДефинира именуваните списъци с права Дефинира именуваните списъци с права (Permission Sets)(Permission Sets)Дефинира групите код (Code Groups)Дефинира групите код (Code Groups)Задава списък с права за всяка група Задава списък с права за всяка група код (свързва правата с групите)код (свързва правата с групите)

Нива на политиките за сигурностНива на политиките за сигурност Има няколко нива на политиките:Има няколко нива на политиките:

Enterprise: политика за организацията Enterprise: политика за организацията (за (за Windows Windows домейна)домейна)

Machine: политика за всички Machine: политика за всички потребители на машинатапотребители на машината

User: политика за текущия потребителUser: политика за текущия потребител

Ефективната политика е сечението Ефективната политика е сечението на правата, дадени от трите нивана правата, дадени от трите нива

.NET Security Policy Editor.NET Security Policy Editor

Демонстрация #4Демонстрация #4 .NET Security Policy Editor.NET Security Policy Editor – –

настройка на правата на дадено настройка на правата на дадено асембли по асембли по SHA1 SHA1 хеш кодхеш код

Права (Права (Permissions)Permissions) Permission Permission обектите представляват обектите представляват

специфично право (разрешение) за специфично право (разрешение) за достъп до ресурс или извършване на достъп до ресурс или извършване на някаква операциянякаква операция, , например:например: право за печатане на принтерправо за печатане на принтер право за достъп до право за достъп до SQL ServerSQL Server

Даването на право (Даването на право (permission grantpermission grant) ) разрешава на дадено асембли (код) да разрешава на дадено асембли (код) да го използваго използва

Изискването на право (Изискването на право (permission permission demanddemand) проверява дали извикващият ) проверява дали извикващият код има дадено правокод има дадено право

СтандартниСтандартни .NET .NET праваправа .NET Framework .NET Framework дефинира стандартни дефинира стандартни

класове за правата за достъп до ресурси:класове за правата за достъп до ресурси:

ПравоПраво ОписаниеОписание

FileIOPermission FileIOPermission Четене / писане по файловата системаЧетене / писане по файловата система

IsolatedStorageFilePIsolatedStorageFilePermissionermission

Достъп до изолирана виртуална файлова Достъп до изолирана виртуална файлова система тип "IsolatedStorage"система тип "IsolatedStorage"

UIPermissionUIPermission Използване на Windows Forms GUIИзползване на Windows Forms GUI

FileDialogPermissionFileDialogPermission Достъп до диалога за избор на файлДостъп до диалога за избор на файл

PrintingPermissionPrintingPermission Печатане на принтерПечатане на принтер

WebPermissionWebPermission Достъп до Web ресурсиДостъп до Web ресурси

SocketPermissionSocketPermission Работа със сокетиРабота със сокети

OleDbPermission, OleDbPermission, SqlClientPermissionSqlClientPermission

Достъп до база данни през OleDb или Достъп до база данни през OleDb или SQLClient Data Provider-итеSQLClient Data Provider-ите

RegistryPermissionRegistryPermission Достъп до Достъп до Windows RegistryWindows Registry

ReflectionPermissionReflectionPermission Достъп до Достъп до ReflectionReflection

Декларативно искане на праваДекларативно искане на права Искането на право (permission request)Искането на право (permission request)

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

Задава се дЗадава се декларативно – чрез атрибути:екларативно – чрез атрибути:

Ако поисканото право не може да бъде Ако поисканото право не може да бъде дадено, се хвърля дадено, се хвърля SecurityExceptionSecurityException

Ако поисканото право за дадено асембли Ако поисканото право за дадено асембли не бъде дадено, асемблито не се зареждане бъде дадено, асемблито не се зарежда

Използва се най-често от клиентски кодИзползва се най-често от клиентски код

[assembly: PrintingPermission([assembly: PrintingPermission( SecurityAction.RequestMinimum,SecurityAction.RequestMinimum, Level=PrintingPermissionLevel.SafePrinting)]Level=PrintingPermissionLevel.SafePrinting)]

Декларативно искане на праваДекларативно искане на права При декларативното искане на права се При декларативното искане на права се

задава параметър задава параметър SecurityActionSecurityAction::

RequestMinimumRequestMinimum – указва, че асемблито не – указва, че асемблито не може да работи без съответното правоможе да работи без съответното право

RequestRefuseRequestRefuse – указва, че асемблито иска – указва, че асемблито иска зададеното право да му бъде отнетозададеното право да му бъде отнето

DemandDemand – указва, че всички асемблита от стека – указва, че всички асемблита от стека на извикване трябва да имат зададеното правона извикване трябва да имат зададеното право

AssertAssert, , DenyDeny, , PermitOnlyPermitOnly – отнасят се за – отнасят се за класове и методикласове и методи Управляват сигурността на извиквания код Управляват сигурността на извиквания код

чрез контролиране на т. нар. "Stack Walk"чрез контролиране на т. нар. "Stack Walk"

[assembly:FileIOPermission([assembly:FileIOPermission( SecurityAction.RequestSecurityAction.RequestRefuseRefuse, All="C:\\")], All="C:\\")]

Демонстрация #5Демонстрация #5 Декларативно искане на праваДекларативно искане на права

Програмно искане на праваПрограмно искане на права Програмното искане на праваПрограмното искане на права

Позволява даден код да поиска дадено Позволява даден код да поиска дадено право по време на изпълнениеправо по време на изпълнение

Използва се най-вече при разработка на Използва се най-вече при разработка на библиотеки с класове и сървърски кодбиблиотеки с класове и сървърски код

Пример:Пример:

Методът Методът Demand()Demand() проверява дали проверява дали текущото асембли и всички извикващи го текущото асембли и всички извикващи го асемблита по стека имат поисканото правоасемблита по стека имат поисканото право Предизвиква изключение при неуспехПредизвиква изключение при неуспех

FileDialogPermission fdFileDialogPermission fdpp = = new FileDialogPermission(new FileDialogPermission( PermissionState.Unrestricted);PermissionState.Unrestricted);fdPerm.Demand();fdPerm.Demand();

Какво еКакво е ""Stack WalkStack Walk"?"?

Стек на извикваниятаСтек на извикванията

Security SystemSecurity System

YourAssemblyYourAssemblyYourAssemblyYourAssembly

SomeAssemblySomeAssemblySomeAssemblySomeAssembly

.NET Framework .NET Framework AssemblyAssembly

.NET Framework .NET Framework AssemblyAssembly

Извиква се ReadFile()Извиква се ReadFile()

Извиква се ReadFile()Извиква се ReadFile()

Grant: ExecuteGrant: Execute

1. 1. Някое асембли иска достъп до Някое асембли иска достъп до метод в нашето асемблиметод в нашето асембли

2. 2. Нашето асембли препраща Нашето асембли препраща заявката до някое системно заявката до някое системно асембли отасембли от .NET Framework .NET Framework

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

4. 4. При неуспех системата за При неуспех системата за сигурност хвърля изключениесигурност хвърля изключение

Grant: ReadFileGrant: ReadFileGrant: ReadFileGrant: ReadFile

Grant: ReadFileGrant: ReadFile

Permission DemandPermission Demand

Security exceptionSecurity exception Access deniedAccess denied

Security exceptionSecurity exception Access deniedAccess deniedGrant access?Grant access?Grant access?Grant access?

Демонстрация #Демонстрация #66 Програмно искане на праваПрограмно искане на права

Контрол над праватаКонтрол над правата Правата за достъп до кода Правата за достъп до кода (code-access (code-access

permissions) permissions) имат имат "Stack Walk""Stack Walk" семантика семантика За да се даде дадено право на едно асембли, За да се даде дадено право на едно асембли,

трябва всички извикващи асемблита по стека трябва всички извикващи асемблита по стека също да го иматсъщо да го имат

"Stack Walk" "Stack Walk" механизмът не позволява механизмът не позволява асембли с ниски права да извършва асембли с ниски права да извършва непозволени действия през асембли с високинепозволени действия през асембли с високи

Възможно е програмно въздействие Възможно е програмно въздействие върху върху "Stack Walk" "Stack Walk" процедурата:процедурата: надолу по стека – дали да се проверяват надолу по стека – дали да се проверяват

правата на извикващите методиправата на извикващите методи нагоре по стека – какви права да се дават нагоре по стека – какви права да се дават

на извиканите методина извиканите методи

Контрол над праватаКонтрол над правата При писане на компоненти се налага едно При писане на компоненти се налага едно

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

Следните методи контролират "Stack Следните методи контролират "Stack Walk" процедуратаWalk" процедурата Assert()Assert() – позволява текущия метод да – позволява текущия метод да

ползва пълните права на асемблито си, ползва пълните права на асемблито си, независимо от правата на извикващите го независимо от правата на извикващите го асемблитаасемблита

Deny()Deny() – временно отнема даденото право – временно отнема даденото право за всички методи извикани от текущияза всички методи извикани от текущия

PermitOnly()PermitOnly() – временно отнема всички – временно отнема всички права без даденото за всички методи права без даденото за всички методи извикани от текущияизвикани от текущия

Демонстрация #Демонстрация #77 Контрол над Контрол над "Stack Walk" "Stack Walk"

процедуратапроцедурата чрез чрез Assert()Assert()

Сигурност базирана на ролиСигурност базирана на роли Сигурност, базирана на роли (Сигурност, базирана на роли (Role-Role-

Based Security)Based Security) Стандартно средство за контрол на Стандартно средство за контрол на

достъпа в достъпа в .NET Framework.NET Framework Може да се използва програмно и Може да се използва програмно и

декларативнодекларативно Базира се на потребители и роли Базира се на потребители и роли

((Identities Identities и и PrincipalsPrincipals)) Всяка нишка в Всяка нишка в .NET Framework .NET Framework си има си има

потребител и роля, свързани с неяпотребител и роля, свързани с нея

Автентикация и авторизацияАвтентикация и авторизация Автентикация (Автентикация (authenticationauthentication))

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

Може да става с парола, със сертификат, Може да става с парола, със сертификат, със смарт-карта или по друг начинсъс смарт-карта или по друг начин

Авторизация (Авторизация (authorization)authorization) Процесът на проверка дали даден Процесът на проверка дали даден

потребител има право да извърши дадено потребител има право да извърши дадено действиедействие

Предполага се че потребителят е успешно Предполага се че потребителят е успешно автентикиранавтентикиран

Role-Based Security Role-Based Security осигурява механизми осигурява механизми за авторизация в за авторизация в .NET .NET приложениятаприложенията

Identity Identity ии Principal Principal обектиобекти Identity (Identity (самоличностсамоличност)) – потребител – потребител

Съдържа информация за потребителя, в Съдържа информация за потребителя, в контекста на който се изпълнява кода:контекста на който се изпълнява кода: Съдържа: име на потребител, домейн, дали Съдържа: име на потребител, домейн, дали

е автентикиран и др.е автентикиран и др.

Principal (Principal (принципалпринципал)) – роли – роли Съдържа контекста за сигурност на Съдържа контекста за сигурност на

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

участваучаства Съдържа Съдържа IdentityIdentity информацията за информацията за

потребителяпотребителя

Identity Identity ии Principal Principal обектиобекти В .NET Framework има два типа В .NET Framework има два типа

Identity и Principal обекти:Identity и Principal обекти: WindowsIdentityWindowsIdentity и и WindowsPrincipalWindowsPrincipal

Свързани са с потребителите и техните Свързани са с потребителите и техните роли в контекста на Microsoft Windowsроли в контекста на Microsoft Windows

Съдържат Съдържат Windows Windows специфична специфична информацияинформация

GenericIdentityGenericIdentity и и GenericPrincipalGenericPrincipal Дават възможност за организиране на Дават възможност за организиране на

собствени системи за авторизация собствени системи за авторизация Съдържат информация, зададена от Съдържат информация, зададена от

програмиста, която не е обвързана с програмиста, която не е обвързана с WindowsWindows

WindowsWindowsPrincipalPrincipal – пример – пример Извличане на текущия Извличане на текущия Windows Windows

потребител и информация за него:потребител и информация за него:

WindowsIdentity winIdentity =WindowsIdentity winIdentity = WindowsIdentity.GetCurrent();WindowsIdentity.GetCurrent();Console.WriteLine("Windows Console.WriteLine("Windows loginlogin: {0}", : {0}", winIdentity.Name);winIdentity.Name);

WindowsPrincipal winPrincipal = WindowsPrincipal winPrincipal = new WindowsPrincipal(winIdentity);new WindowsPrincipal(winIdentity);

bool isAdmin = winPrincipal.IsInRole(bool isAdmin = winPrincipal.IsInRole( WindowsBuiltInRole.Administrator);WindowsBuiltInRole.Administrator);Console.WriteLine("Administrator: {0}", isAdmin);Console.WriteLine("Administrator: {0}", isAdmin);

bool isGuest = winPrincipal.IsInRole(bool isGuest = winPrincipal.IsInRole( WindowsBuiltInRole.Guest);WindowsBuiltInRole.Guest);Console.WriteLine("Guest: {0}", isGuest);Console.WriteLine("Guest: {0}", isGuest);

Демонстрация #Демонстрация #88 Извличане на текущия Извличане на текущия Windows Windows

потребител и информация за негопотребител и информация за него

Създаване на Създаване на GenericPrincipalGenericPrincipal

Стъпки при реализация на собствена Стъпки при реализация на собствена автентикация и авторизация:автентикация и авторизация:1.1. Автентикиране на потребителяАвтентикиране на потребителя

2.2. Създаване на Създаване на GenericIdentityGenericIdentity и и GenericPrincipalGenericPrincipal обекти обекти

3.3. Закачане на Закачане на Principal Principal обекта за текущата обекта за текущата нишка:нишка:

if (ValidLogin(user,if (ValidLogin(user, pass))pass)){ { // // UUser authenticatedser authenticated } }

GenericIdentity id = new GenericIdentity("some user");GenericIdentity id = new GenericIdentity("some user");string[] roles = {"Manager", "Developer", "QA"};string[] roles = {"Manager", "Developer", "QA"};GenericPrincipal prin = new GenericPrincipal(id, GenericPrincipal prin = new GenericPrincipal(id, roles);roles);

System.Threading.Thread.CurrentPrincipal = prin;System.Threading.Thread.CurrentPrincipal = prin;

Декларативна проверка:Декларативна проверка:

Ако текущата нишка не отговаря на Ако текущата нишка не отговаря на посочения потребител или роля, се посочения потребител или роля, се хвърля хвърля SecurityExceptionSecurityException

В имената на потребителите и ролите не В имената на потребителите и ролите не се различават малки от главни буквисе различават малки от главни букви

Авторизация по Авторизация по PrincipalPrincipal

[PrincipalPermission(SecurityAction.Demand,[PrincipalPermission(SecurityAction.Demand,Role="Role="DeveloperDeveloper", Authenticated=true)]", Authenticated=true)]

[PrincipalPermission(SecurityAction.Demand,[PrincipalPermission(SecurityAction.Demand,Name="Бай Киро")]Name="Бай Киро")]

Програмна проверка:Програмна проверка:

Авторизация по Авторизация по PrincipalPrincipal

if (principif (principaal.IsInRole("Administrators"))l.IsInRole("Administrators")){{ // Perform some action// Perform some action}}

if (principif (principaal.Identity.Name == "Пешо")l.Identity.Name == "Пешо"){{ // Perform some action// Perform some action}}

PrincipalPermission prinPerm = newPrincipalPermission prinPerm = new PrincipalPermission("Пешо", "Tester");PrincipalPermission("Пешо", "Tester");prinPerm.Demand();prinPerm.Demand();// Throws SecurityException if the check fails// Throws SecurityException if the check fails

Демонстрация #Демонстрация #99 Авторизация с потребители и ролиАвторизация с потребители и роли

Криптография в Криптография в .NET Framework.NET Framework ..NET Framework има силна поддръжка на NET Framework има силна поддръжка на

криптографски алгоритми и технологиикриптографски алгоритми и технологии В В System.Security.CryptographySystem.Security.Cryptography са са

имплементирани:имплементирани: Алгоритми за извличане на хеш:Алгоритми за извличане на хеш:

MD5, SHA1, SHA256, SHA384, SHA512MD5, SHA1, SHA256, SHA384, SHA512 Симетрични кодиращи алгоритми:Симетрични кодиращи алгоритми:

DES, 3DES, RC2, Rijndael/AESDES, 3DES, RC2, Rijndael/AES Асиметрични кодиращи алгоритми:Асиметрични кодиращи алгоритми:

RSA, DSARSA, DSA Класове за работа с Класове за работа с X.509 X.509 цифрови цифрови

сертификатисертификати

Изчисляване на хеш стойностИзчисляване на хеш стойност Премятане на Премятане на SHA1 SHA1 хеш стойност:хеш стойност:

using using System.Security.CryptographySystem.Security.Cryptography;;using using System.TextSystem.Text;;

……

Console.Write("Enter some text: ");Console.Write("Enter some text: ");string s = Console.ReadLine();string s = Console.ReadLine();byte[] data =byte[] data = Encoding. Encoding.ASCII.GetBytes(s);ASCII.GetBytes(s);

SHA1CryptoServiceProvider sha1 =SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();new SHA1CryptoServiceProvider();byte[] sha1hash = sha1.ComputeHash(data);byte[] sha1hash = sha1.ComputeHash(data);

Console.WriteLine("SHA1 Hash: {0}",Console.WriteLine("SHA1 Hash: {0}", BitConverter.ToString(sha1hash));BitConverter.ToString(sha1hash));

Подписване на Подписване на XML (XMLDSIG)XML (XMLDSIG) Подписването на XML документи става по Подписването на XML документи става по

стандарта на W3Cстандарта на W3C "XML-Signature Syntax and Processing""XML-Signature Syntax and Processing" http://www.w3.org/TR/xmldsig-core/http://www.w3.org/TR/xmldsig-core/

В .NET Framework има пълна В .NET Framework има пълна имплементация на стандарта в пакета имплементация на стандарта в пакета System.Security.Cryptography.XSystem.Security.Cryptography.Xmlml Подписване и проверка на подписПодписване и проверка на подпис

Основни класове:Основни класове: SignedXSignedXmlml – осигурява изготвяне и проверка – осигурява изготвяне и проверка

на XML сигнатурина XML сигнатури DataObjectDataObject – съдържа данните, които ще – съдържа данните, които ще

бъдат подписанибъдат подписани

Сигурност вСигурност в.NET Framework.NET Framework

Въпроси?Въпроси?

УпражненияУпражнения1.1. Опишете ключовите характеристики на Опишете ключовите характеристики на

сигурността в .NET Framework – безопасност на сигурността в .NET Framework – безопасност на типовете, защита на паметта, защита от типовете, защита на паметта, защита от аритметични грешки, подписване на асемблитата, аритметични грешки, подписване на асемблитата, IsolatedStorage, Code Access Security, Role Based IsolatedStorage, Code Access Security, Role Based Security и др.Security и др.

2.2. Напишете библиотека (Class Library проект във Напишете библиотека (Class Library проект във VS.NET), която съдържа клас със статичен метод VS.NET), която съдържа клас със статичен метод PrintVersion()PrintVersion(), който отпечатва на конзолата , който отпечатва на конзолата версията на асемблито, от което е зареден класа. версията на асемблито, от което е зареден класа. Компилирайте асемблито в 2 различни версии Компилирайте асемблито в 2 различни версии (1.0 и 2.0), подпишете ги, направете ги със силни (1.0 и 2.0), подпишете ги, направете ги със силни имена и ги инсталирайте в GAC. Реализирайте 2 имена и ги инсталирайте в GAC. Реализирайте 2 конзолни приложения, които ползват съответно конзолни приложения, които ползват съответно версия 1.0 и 2.0 на асемблито.версия 1.0 и 2.0 на асемблито.

УпражненияУпражнения3.3. Напишете Windows Forms контрола за IE, която Напишете Windows Forms контрола за IE, която

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

4.4. Създайте Създайте Windows Forms Windows Forms контрола за контрола за IE, IE, която която може да отваря, редактира и записва текстови може да отваря, редактира и записва текстови файлове на локалния диск на потребителя. По файлове на локалния диск на потребителя. По подразбиране отварянето на локален файл няма подразбиране отварянето на локален файл няма да работи. Направете асемблито на контролата да работи. Направете асемблито на контролата да има силно име. Чрез да има силно име. Чрез Security Policy EditorSecurity Policy Editor дайте права за четене и писане на асемблито на дайте права за четене и писане на асемблито на контролата, като създадете контролата, като създадете Code Group Code Group попо силното му име.силното му име.

УпражненияУпражнения5.5. Напишете Windows Forms приложение, което Напишете Windows Forms приложение, което

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

6.6. Напишете библиотека Напишете библиотека (DLL)(DLL), която поддържа , която поддържа функционалност за регистриране на потребител функционалност за регистриране на потребител по по username username и и password password и проверка на и проверка на валидността на двойка валидността на двойка username/password. username/password. Библиотеката трябва съхранява данните си в Библиотеката трябва съхранява данните си в XMLXML файл и да използва собствените си права за файл и да използва собствените си права за достъп до файла. Клиенти с ниски права, които достъп до файла. Клиенти с ниски права, които не могат да четат файла, трябва да могат да не могат да четат файла, трябва да могат да ползват функционалността на библиотеката.ползват функционалността на библиотеката.

УпражненияУпражнения7.7. С помощта на Role Based Security направете С помощта на Role Based Security направете

приложение, което управлява потребителите в приложение, което управлява потребителите в дадена система. Потребителите, техните пароли и дадена система. Потребителите, техните пароли и ролите на всеки потребител трябва да се ролите на всеки потребител трябва да се съхраняват в XML файл. Възможните роли за съхраняват в XML файл. Възможните роли за всеки потребител са Guest, User и Admin. Гостите всеки потребител са Guest, User и Admin. Гостите в системата имат право да се регистрират и нищо в системата имат право да се регистрират и нищо друго. Потребителите в системата имат право да друго. Потребителите в системата имат право да извличат списъка от всички регистрирани извличат списъка от всички регистрирани потребители. Администраторите имат право да потребители. Администраторите имат право да редактират данните и ролите на всички редактират данните и ролите на всички потребители. При начално стартиране системата потребители. При начално стартиране системата трябва да предлага форма за автентикация, която трябва да предлага форма за автентикация, която позволява влизане като някакъв потребител или позволява влизане като някакъв потребител или влизане като гост без парола. Проверката на влизане като гост без парола. Проверката на ролите да се реализира чрез ролите да се реализира чрез GenericGenericPrincipalPrincipal..

УпражненияУпражнения8.8. Реализирайте приложението от предходната Реализирайте приложението от предходната

задача, като съхранявате паролите на задача, като съхранявате паролите на потребителите не като чист текст, а като потребителите не като чист текст, а като SHA1 SHA1 хеш стойност. Дава ли това по-голяма сигурност хеш стойност. Дава ли това по-голяма сигурност за системата?за системата?

Svetlin Svetlin Nakov, Implementing Application Security Nakov, Implementing Application Security Using the Microsoft .NET Framework – Lecture Using the Microsoft .NET Framework – Lecture atat the the National Conference "Information Technologies in National Conference "Information Technologies in the Education –the Education – A Necessary Investment for the A Necessary Investment for the Future of Bulgaria", Sofia, April 2004Future of Bulgaria", Sofia, April 2004

MSDN Lectures, Implementing Application Security MSDN Lectures, Implementing Application Security Using the Microsoft .NET Framework – Using the Microsoft .NET Framework – http://downloads.microsoft.co.za/MSDNEssentials/20http://downloads.microsoft.co.za/MSDNEssentials/20040402/AppSecurity.ppt040402/AppSecurity.ppt

Understanding .NET Code Access SecurityUnderstanding .NET Code Access Security – – http://http:// www.thecodeproject.com/dotnet/UB_CAS_NET.aspwww.thecodeproject.com/dotnet/UB_CAS_NET.asp

MSDN Library – MSDN Library – http://msdn.microsoft.comhttp://msdn.microsoft.com

Използвана литератураИзползвана литература

top related