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

62

Upload: wilton

Post on 06-Jan-2016

47 views

Category:

Documents


7 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Сигурност в .NET Framework
Page 2: Сигурност в .NET Framework

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

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

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

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

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

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

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

СъдържаниеСъдържание Сигурността в Сигурността в .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" и контрол над правата

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

Съдържание (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)

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

Сигурността в Сигурността в .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

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

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

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

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

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

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

Решен е проблемът "Решен е проблемът "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

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

Проблемът Проблемът "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}}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Application DomainsApplication Domains Application Domains:Application Domains:

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

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

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

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

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

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

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

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

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

КлючКлюч

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

Оригинален

Оригинален

документ

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

Кодиран

документ

документ

КлючКлюч

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

Оригинален

Оригинален

документ

документ

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

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

(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)

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

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

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

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

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

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

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

Оригинален

Оригинален

документ

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

Кодиран

документ

документ

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

Оригинален

Оригинален

документ

документ

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

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

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

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

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

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

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

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

ключ

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

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

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

(MD5, SHA1, …)

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

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

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

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

= или ≠

Сравняване

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

инсталират в 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

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

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

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

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

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

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

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

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

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

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

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

Технологията Технологията 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);

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

Технологията Технологията 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\...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Политиките за сигурност в Политиките за сигурност в .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)Задава списък с права за всяка група Задава списък с права за всяка група код (свързва правата с групите)код (свързва правата с групите)

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

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

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

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

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

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

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

.NET Security Policy Editor.NET Security Policy Editor

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

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

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

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

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

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

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

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

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

СтандартниСтандартни .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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Какво еКакво е ""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?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);

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

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

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

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

Създаване на Създаване на 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;

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

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

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

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

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

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

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

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

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

Авторизация по Авторизация по 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

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

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

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

Криптография в Криптография в .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 цифрови цифрови

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

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

Изчисляване на хеш стойностИзчисляване на хеш стойност Премятане на Премятане на 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));

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

Подписване на Подписване на 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 – съдържа данните, които ще – съдържа данните, които ще

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

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

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

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

Page 57: Сигурност в .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 на асемблито.

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

УпражненияУпражнения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 попо силното му име.силното му име.

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

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

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

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

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

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

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

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

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

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

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

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

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