450 likes | 629 Views
Novosti na področju varnostnih mehanizmov in kriptografije v .NET Framework 2.0. Dušan Zupančič, KOMPAS Xnet 18.5.2005. Agenda. Novo na področju CAS Novo na področju kriptografije. Začetki - v1.0,1.1 CAS v trenutnem ogrodju .NET. Cilj : omogočanje “ delnega zaupanja ”
E N D
Novosti na področju varnostnih mehanizmov in kriptografije v .NET Framework 2.0 Dušan Zupančič, KOMPAS Xnet 18.5.2005
Agenda • Novo na področju CAS • Novo na področju kriptografije
Začetki - v1.0,1.1CAS v trenutnem ogrodju .NET • Cilj: omogočanje “delnega zaupanja” • Osnovna varnostna ideniteta: • Koda (Zbir - Assembly) • Avtentikacija: • Zbrane informacije o kodi (dokaz - Evidence) • Avtorizacija: • Sistem varnostnih polic glede na identiteto kode omogoči dostop do zahtevanih virov • Zagotavljanje upoštevanja pravil: • Verifikacija, Validacija, preiskovanje sklada (Stackwalks)
Na dokazih bazirana varnost • Dokaz • Se določi (oblikuje) ob nalaganju zbira • Uporablja se za določanje pravic za zbir • Lahko vključuje informacije o zbiru: • Močno ime (Strong) • URL • Zona • Podpis Authenticode • Hash kodo zbira
Call to ReadFile Call to ReadFile Varnostno preverjanje s sprehodom po skladu 1. Nek zbir zahteva dostop do metode v mojem zbiru 2. Moj zbir posreduje zahtevek do zbira, ki je del ogrodja .NET 3. Varnostni sistem poskrbi za to, da imajo vsi vpleteni ustrezne pravice 4. Varnostni sistem dovoli dostop ali pa sproži izjemo Call Stack NekZbir Grant: Execute MojZbir Grant: ReadFile Permission Demand Security System .NET Framework Assembly Security exceptionAccess denied Grant access? Grant: ReadFile
Vrste varnostnih preverjanj • Imperativno • Ustvarjanje objekta vrstePermission • Klicanje metodPermission • Deklarativno • UporabaPermission atributov • Določimo na nivoju razreda ali metode • Prekinitev sprehoda po skladu • Uporabimo metodoAssert Dim MyFileIOPermission As New FileIOPermission (PermissionState.Unrestricted) MyFileIOPermission.Demand() <FileIOPermission(SecurityAction.Demand, Unrestricted := True)> Public Function VcitajBesedilo() As String ...
CAS - kaj je novega v verziji 2.0 • Varnost vezana na identiteto aplikacije • Preglednejše delo z varnostnimi mehanizmi CAS • Izboljšana možnost zaščite javnih API-jev
Varnost je vezana na aplikacijo • Podpora programskemu modelu ClickOnce • Rešitve so samopojasnjujoče • Varnostne zahteve so zapisane v manifestu • Privzeto tečejo rešitve v peskovniku (sandbox) • Včasih ima aplikacija višje varnostne zahteve • Odločitev uporabnika ali prednastavljene varnostne police
Preglednejše obveščanje o varnostnih napakah • Razširjen razred SecurityException • Končno lahko ugotovimo kaj je bilo narobe in zakaj • Vključuje podatke o zbiru, ki je povzročil napako • Vključuje informacijo o dodeljenih pravicah • Varnostna akcija, ki ni prestala preverjanja • Nabor pravic, ki je bil preverjan • Integracija v Visual Studio (omogoča razhroščevanje v zonah)
KONČNO! Sedaj vem kaj je šlo narobe in kaj lahko storim
Orodje PermCalc • Orodje ukazne vrstice • Preveri varnostne zahteve aplikacije • Izpiše predviden minimalni nabor pravic potrebnih za poganjanje aplikacije • Preveri zahteve skupnih knjižnic • Vrnjen je nabor pravic uporabljenih API-jev • Integracija v Visual Studio
Več o PermCalcu • Statično preiskovanje zbira • Analiza pretoka podatkov • Emuliranje izvajanja vseh možnih poti kode Aplikacija Potrebne pravice: P2 Vstopna točka (Main, ...) Zbir 1 Metoda E Metoda A Assert P1 Zbir 2 Metoda B Metoda C Metoda F Demand P1 Demand P2 Metoda D
Izboljšana zaščita javnih metod • V verziji1.0/1.1 je bilo mogoče omejiti dostop do javnih API-jev • Link Demand za omogočanje dostopa na osnovi kriptografskih dokazov • Ni bilo mogoče uporabiti več kot enega nabora informacij za varnostna preverjanja • Nove varnostne akcije (DemandChoice, LinkDemandChoice) omogočajo uporabo večih naborov • Nov tip: PermissionSetCollection
Izboljšana zaščita javnih metod • DemandChoice • Izpolnjen mora biti vsaj eden od navedenih pogojev <method: StrongNameIdentityPermissionAttribute(_ SecurityAction.LinkDemandChoice, PublicKey := “…Ključ 1”)> <method: StrongNameIdentityPermissionAttribute(_ SecurityAction.LinkDemandChoice, PublicKey := “…Ključ 2”)> Public Shared SubJavnaMetoda() As Integer ‘ Do te kode lahko dostopajo samo zbiri ‘ ki so podpisani s ključem 1 ali s ključem 2 End Sub
Demonstracija • Poganjanje aplikacije v VS v drugi varnostni zoni • Obvestila ob varnostnih napakah • Izračun potrebnih pravic v VS za poganjanje aplikacije
.NET Framework V1.0 – V1.1 • Omejena podpora X.509 • Dekodira polja X.509 v1 • Ne omogoča preverjanja poti • Ni integracije s shrambo certifikatov • X.509 ni integriran z XMLDSIG • Brez podpore za CMS (Cryptographic Message Syntax ) / PKCS7 (Public Key Cryptography Standard #7)
Novosti v verziji 2.0 • System.Security.Cryptography.ProtectedData • Razred za dostop do Data Protection API (DPAPI) • Omogoča enostavno kriptografsko zaščito na nivoju uporabnika ali računalnika • System.Security.Cryptography.X509Certificates • Dekodiranje in validacija X.509 certifikatov • Podpora za delo s CryptoAPI certifikatnimi shrambami • System.Security.Cryptography.Pkcs • Šifriranje in odšifriranje CMS/PKCS #7 sporočil • Polna podpora za podpisovanje in šifriranje podatkov • System.Security.Cryptography.XML • Polna podpora za preverjanje X.509 XMLDSIG podpisov • Polna podpora za XMLENC
Razred ProtectedData • Omogoča enostavno kriptografsko zaščito s pomočjo DPAPI • Omogoča zaščito na nivoju: • Uporabnika (DataProtectionScope.CurrentUser) • Računalnika (DataProtectionScope.LocalMachine) • Uporabno za šifriranje priklopnih nizov (connection string) in kritičnih nastavitev • Šifriranje encData = ProtectedData.Protect(data, _ s_aditionalEntropy, _ DataProtectionScope.CurrentUser ) • Odšifriranje data = ProtectedData.Unprotect( encData, _ s_aditionalEntropy, _ DataProtectionScope.CurrentUser )
Dekodiranje X.509 • Dekodiranje certifikatov in ključev iz datoteke ali iz BLOB-ov ‘Odpre binarno ali base64 .cer datoteko Dim x509 As new X509Certificate2(datoteka) ‘Odpre PKCS12 iz blob-a x509 =new X509Certificate2(blob, _ password,X509KeyStorageFlags.UserKeySet) • Tudi izvoz v blob (in pozneje v .pfx datoteko) Dim pfxBlob As Byte() = _x509.Export(X509ContentType.Pfx, geslo)
Certifikatne shrambe • Dostop do pogostih CryptoAPI operacij s certifikatnimi shrambami (dodajanje, odstranjevanje, pregled, itd.) • Odpiranje osebne certifikatne shrambe • Dodajanje ali odstranjevanje certifikata DimmojaShrambaAs new X509Store(“My”) mojaShramba.Open(OpenFlags.ReadOnly) mojaShramba.Add(x509) mojaShramba.Remove(x509)
Zbirke certifikatov • Dostop do vsebine shrambe preko razreda X509Certificate2Collection Dim mojiCertifikati As X509Certificate2Collection = _mojaShramba.Certificates • X509Certificate2Collection se lahko uporabi za delo s PKCS7/CMS zbirko certifikatov (“bag of certificates”) Dim zbirkaCertifikatov =new X509Certificate2Collection() zbirkaCertifikatov.Import(p7imeDatoteke)
Zbirke certifikatov • Iskanje / filtriranje certifikatov po • Imenu subjekta, imenu izdajatelja, SHA1 hash-u, uporabi ključa, razširjeni uporabi ključa, in še več… • Za kompleksnejša iskanja lahko uporabimo verigo zaporednih iskanj // Najdi samo certifikate, katerih ključ se lahko // uporabi za digitalno podpisovanje in imajo // veljavno certifikacijsko pot mojiCertifikati = mojiCertifikati.Find(X509FindType.FindByKeyUsage, _ X509KeyUsageFlags.DigitalSignature, _ True)
Certifikatni dialogi • Dialog za ogled certifikata • Dialog za izbiro certifikata x509.Display() Dim izbrani As X509Certificate2Collection izbrani = mojiCertifikati.Select(“Naslov”, _ “Opisno sporočilo o namenu”, _ X509SelectionFlag.SingleSelection)
Kaj so razširitve v X.509 v3(X.509 extensions) • Podajajo dodatne informacije o certifikatu in dovoljeni vrsti uporabe le tega • Nekaj razširitev: • Key usage – namen uporabe ključa (podpis, šifriranje, …) • SubjectKeyIdentifier – zgostitvena vrednost subjekta • AuthorityKeyIdentifier – zgostitvena vrednost DN izdajatelja certifikata • BasicConstraints – ali gre za CA - več v RFC3280 • SubjectAltName – omogoča dodajanje dodatnih identitet • ExtendedKeyUsage – vsebuje razširjene napotke o dovoljeni uporabi ključa • CertificatePolicy – certifikatna polica, ki podaja pogoje pod katerimi je bil izdan certifikat
Format X.509 razširitev • Vsaka razširitev vsebuje: • Oznaka kritičnosti (Cryticality Flag) Vsaka razširitev je lahko s strani CA proglašena za kritično ali nekritično • OID (object identifier) razširitve • Vrednost
Uporaba razširitev X.509 • Dostop do informacij v razširitvah • Razredi za uporabo ključev, omejitve, identifikacijo subjektov • Ali pa dodamo razširitve po svoji želji For Each extension As X509Extension In x509.Extensions Console.Write(extension.Oid.FriendlyName) If extension.Oid.Value = "2.5.29.15" Then Dim keyUse As X509KeyUsageExtension = _ CType(extension, X509KeyUsageExtension) Console.Write(" = " & keyUse.KeyUsages.ToString()) End If Console.WriteLine() Next Koristna povezava (iskanje OID) : http://asn1.elibel.tm.fr/oid/index.htm
Veljavnost certifikata • Izpolnjeni morajo biti pogoji: • Integriteta: podpis je veljaven • Podpisan s strani zaupanja vredne CA • Ali pa se certifikacijska pot konča z zaupanja vrednim CA • Certifikat je veljaven v tem trenutku: • Čas preverjanja veljavnosti mora biti med vrednostnima “Not Valid Before”in“Not Valid After” • Certifikat ni preklican (Revoked) • Namen uporabe je v skladu s predpisanim namenom uporabe
Preverjanje certifikacijske poti • Preverjanje certifikacijske poti • Enostavno preverjanje certifikacijske poti s privzetimi možnostmi • Za naprednejše možnosti sta na voljo X509Chain in X509ChainPolicy: • Razširjena uporaba ključev • Certifikacijske police • Opcije za razveljavljene certifikate (Revocation options) • Čas preverjanja veljavnosti If x509.Verify() Then _ Console.WriteLine(“Pot je veljavna.") Dim chn As New X509Chain chn.ChainPolicy.RevocationFlag =X509RevocationFlag.EndCertificateOnly If chn.Build(x509) Then …
DEMO • Delo s shrambami in zbirkami certifikatov • Uporaba razširitev X.509 certifikatov • Validacija certifikatne poti
CMS • Podpora CMS (RFC 3369) na Windows 2000 ali višjih verzijah • Starejši odjemalci podpirajo PKCS #7 • Podpora za vsebine tipa • SignedData • EnvelopedData
CMS Certificate Store Data Data SignerCms.ContentInfo.Content ContentInfo object CheckSignature method CmsSigner object SignedCms object SignedCms object ComputeSignature method Signed message Signed message Encode method Decode method
CMS Signed Data • Kodiranje CMS podpisanih podatkov z uporaborazredov SignedCms, CmsSigner in ContentInfo • Podpora za več podpisnikov Dim signerCert As X509Certificate2 = getSignerCert() Dim contInfo As New ContentInfo(msgBytes) Dim signedCms As New SignedCms(contInfo) Dim objCmsSigner As New CmsSigner(signerCert) ' podpis sporočila CMS/PKCS #7. signedCms.ComputeSignature(objCmsSigner) ' sprememba v obliko sporočila CMS/PKCS #7. Dim encodedCms as Byte() = signedCms.Encode()
CMS ovojnice • Kodiranje CMS Enveloped Data z uporabo razredov: • ContentInfo • EnvelopedCMS • CmsRecipient Dim recipientCert As X509Certificate2 = GetRecipientCert() Dim contentInfo As new ContentInfo(msgBytes) Dim recipient As new CmsRecipient( _SubjectIdentifierType.IssuerAndSerialNumber, recipientCert) Dim envelopedCms As new EnvelopedCms(contentInfo) envelopedCms.Encrypt(recipient) Dim encBytes as Byte() = envelopedCms.Encode()
PKI in XML podpisi • SignedXML • SignedXML.CheckSignature je popravljen tako, da podpira validacijo verige certifikatov X.509 • X509Certificate2ponuja vse potrebne informacije za ustvarjanje elementa KeyInfo brez uporabe P/Invoke signedXml.SigningKey = Ctype(x509.PrivateKey, AsymmetricAlgorithm)
PKI in šifriranje XML • XMLENC • Novi razredi ki podpirajo XML šifriranje skladno z W3C • Polna interoperabilnost z ostalimi implementacijami XMLENC • Ne potrebuje XML na vhodu, ampak lahko šifrira samo dele XML dokumenta (lahko tudi z različnimi ključi)
XMLENC • Več vrst šifriranja • Triple DES • AES 128 • AES 192 • AES 256 • RSA • X509CertificateEx • Uporabljen razred • System.Security.Cryptography.Xml.EncryptedXml • Integracija z XMLDSIG • XmlDecryptionTransform
Primer šifriranja XML Dim exml As new EncryptedXml(xmlDoc) ‘Šifriranje kreditne kartice z AES-256 ‘ podatki o ključu so v objektu ccKey exml.AddKeyNameMapping(“ccKey”, ccKey) ‘ podatki za šifriranje so v elementu ccPayData Dim ccEncrypted As EncryptedData= _ exml.Encrypt(ccPayData, “ccKey”) ‘ zamenjava s šifriranim elementom EncryptedXml.ReplaceElement( _ ccPayData, ccEncrypted, true)
Primer šifriranja XML <karticnaTransakcija> <ime>Janez Novak</ime> <placilo> <kartica tip='Visa'>1234 4321 1234 4321</kartica> <znesek valuta='SIT'>32540.00</znesek> </placilo> </ karticnaTransakcija > <karticnaTransakcija> <ime>Janez Novak</ime> <xenc:EncryptedData Type='http://www.w3.org/2001/04/xmlenc#Element'> <xenc:CipherData> <xenc:CipherValue>CxBf9n...</xenc:CipherValue> </xenc:CipherData> </xenc:EncryptedData> </ karticnaTransakcija >
Povzetek • CAS znatno pripomore k večji varnosti aplikacije, s poenostavitvami v novem ogrodju pa je delo poenostavljeno • Kriptografski del je doživel izboljšave v delu, kjer je to najbolj potrebno: boljša podpora delu z X.509 certifikati, podpora CMS in podpisovanje ter šifriranje XML
VPRAŠALNIKI VPRAŠALNIKI VPRAŠALNIKI VPRAŠALNIKI VPRAŠALNIKI IZPOLNITE VPRAŠALNIK Z MALO SREČE DO BOGATIH NAGRAD