- 03/30/2017
- 6 minutes to read
-
- g
- D
- m
- Y
- s
-
+8
Varoitus
Koodin käyttöoikeussuojaus (CAS) ja osittain luotettu koodi
Tämä .NET Framework tarjoaa mekanismin, jonka avulla samassa sovelluksessa suoritettavaan eri koodiin voidaan soveltaa eritasoista luottamusta.
CAS:ia ei tueta .NET Core-, .NET 5- tai uudemmissa versioissa. CAS:ia ei tueta C#:n versioissa, jotka ovat uudempia kuin 7.0.
CAS:ia .NET Frameworkissa ei pitäisi käyttää mekanismina, jolla voidaan panna täytäntöön koodin alkuperään tai muihin identiteettinäkökohtiin perustuvia turvallisuusrajoja. CAS:ia ja Security-Transparent Codea ei tueta tietoturvarajana osittain luotettavan koodin, erityisesti alkuperältään tuntemattoman koodin kanssa. Suosittelemme, ettei tuntemattomasta alkuperästä peräisin olevaa koodia ladata ja suoriteta ilman vaihtoehtoisia turvatoimia. .NET Framework ei julkaise tietoturvakorjauksia CAS-hiekkalaatikkoa vastaan mahdollisesti löytyviä käyttöoikeuksien korotuksia varten.
Tämä käytäntö koskee kaikkia .NET Frameworkin versioita, mutta ei Silverlightin sisältämää .NET Frameworkia.
Turvallisuuteen kuuluu kolme vuorovaikutuksessa toisiinsa vaikuttavaa osaa: hiekkalaatikko, käyttöoikeudet ja valvonta. Hiekkalaatikoinnilla tarkoitetaan käytäntöä, jossa luodaan eristettyjä toimialueita, joissa jotakin koodia käsitellään täysin luotettavana ja muuta koodia rajoitetaan hiekkalaatikolle asetettujen käyttöoikeuksien mukaan. Sovelluskoodia, joka toimii hiekkalaatikon käyttöoikeusjoukon sisällä, pidetään läpinäkyvänä, eli se ei voi suorittaa mitään toimintoja, jotka voivat vaikuttaa turvallisuuteen. Hiekkalaatikon käyttöoikeusjoukko määräytyy todisteiden perusteella (Evidence-luokka). Evidence määrittää, mitä erityisoikeuksia hiekkalaatikot vaativat ja millaisia hiekkalaatikoita voidaan luoda. Enforcement tarkoittaa sitä, että läpinäkyvän koodin sallitaan suorittaa vain sen myöntämisjoukon sisällä.
Tärkeää
Turvakäytäntö oli keskeinen elementti .NET Frameworkin aiemmissa versioissa. .NET Framework 4:stä alkaen turvallisuuspolitiikka on vanhentunut. Turvallisuuspolitiikan poistaminen on erillään turvallisuuden läpinäkyvyydestä. Lisätietoja tämän muutoksen vaikutuksista on kohdassa Koodin käyttöoikeuksien turvallisuuskäytäntöjen yhteensopivuus ja siirtyminen.
Transparenssimallin tarkoitus
Transparenssi on täytäntöönpanomekanismi, joka erottaa sovelluksen osana suoritettavan koodin infrastruktuurin osana suoritettavasta koodista. Läpinäkyvyys piirtää esteen koodin, joka voi tehdä etuoikeutettuja asioita (kriittinen koodi), kuten kutsua natiivikoodia, ja koodin, joka ei voi (läpinäkyvä koodi), välille. Läpinäkyvä koodi voi suorittaa komentoja sen käyttöoikeusjoukon rajoissa, jossa se toimii, mutta se ei voi suorittaa kriittistä koodia, johtaa siitä tai sisältää kriittistä koodia.
Läpinäkyvyyden toteuttamisen ensisijainen tavoite on tarjota yksinkertainen ja tehokas mekanismi eri koodiryhmien eristämiseen käyttöoikeuksien perusteella. Hiekkalaatikkomallin yhteydessä nämä etuoikeusryhmät ovat joko täysin luotettavia (eli niitä ei ole rajoitettu) tai osittain luotettavia (eli ne on rajoitettu hiekkalaatikolle myönnettyyn käyttöoikeusjoukkoon).
Tärkeää
Transparenssimalli ylittää koodin käyttöoikeuksien turvallisuuden. Läpinäkyvyyttä pakottaa just-in-time-kääntäjä, ja se pysyy voimassa riippumatta kokoonpanon käyttöoikeusjoukosta, mukaan lukien täysi luottamus.
Läpinäkyvyys otettiin käyttöön .NET Frameworkin versiossa 2.0 turvallisuusmallin yksinkertaistamiseksi ja turvallisten kirjastojen ja sovellusten kirjoittamisen ja käyttöönoton helpottamiseksi. Läpinäkyvää koodia käytetään myös Microsoft Silverlightissa osittain luotettavien sovellusten kehittämisen yksinkertaistamiseksi.
Huomautus
Kun kehität osittain luotettavaa sovellusta, sinun on oltava tietoinen kohdeisäntien käyttöoikeusvaatimuksista. Voit kehittää sovelluksen, joka käyttää resursseja, joita jotkut isännät eivät saa käyttää. Tämä sovellus kääntyy virheettömästi, mutta epäonnistuu, kun se ladataan isäntäympäristöön. Jos olet kehittänyt sovelluksesi Visual Studion avulla, voit ottaa debuggauksen käyttöön osittaisessa luottamuksessa tai rajoitetussa käyttöoikeusjoukossa kehitysympäristöstä. Lisätietoja on kohdassa Miten: ClickOnce-sovelluksen virheenkorjaus rajoitetuilla käyttöoikeuksilla. ClickOnce-sovelluksille tarjottu Calculate Permissions -toiminto on käytettävissä myös kaikille osittain luotetuille sovelluksille.
Transparenssitason määrittäminen
Kokoonpanotason SecurityRulesAttribute-attribuutilla valitaan yksiselitteisesti SecurityRuleSet-säännöt, joita kokoonpano noudattaa. Säännöt on järjestetty numeerisen tasojärjestelmän mukaisesti, jossa korkeammat tasot tarkoittavat tiukempaa turvallisuussääntöjen noudattamista.
Tasot ovat seuraavat:
-
Taso 2 (Level2) – .NET Framework 4:n läpinäkyvyyssäännöt.
-
Taso 1 (Level1) -tason läpinäkyvyyssäännöt.
Kahden läpinäkyvyystason pääasiallinen ero on se, että taso 1 ei pakota läpinäkyvyyssääntöjä kokoonpanon ulkopuolelta tuleviin kutsuihin, ja se on tarkoitettu vain yhteensopivuuden vuoksi.
Tärkeää
Tason 1 läpinäkyvyys kannattaa määrittää vain yhteensopivuuden vuoksi, eli määritä taso 1 vain koodille, joka on kehitetty .NET Framework 3.5:llä tai sitä aikaisemmalla versiolla, joka käyttää AllowPartiallyTrustedCallersAttribute-attribuuttia tai ei käytä läpinäkyvyysmallia. Käytä esimerkiksi tason 1 avoimuutta .NET Framework 2.0 -kokoonpanoissa, jotka sallivat kutsut osittain luotetuilta soittajilta (APTCA). Käytä .NET Framework 4:lle kehitetyssä koodissa aina tason 2 läpinäkyvyyttä.
Tason 2 läpinäkyvyys
Tason 2 läpinäkyvyys otettiin käyttöön .NET Framework 4:ssä. Tämän mallin kolme periaatetta ovat läpinäkyvä koodi, tietoturvakriittinen koodi ja tietoturvakriittinen koodi.
-
Transparentti koodi voi sille myönnetyistä oikeuksista riippumatta (mukaan lukien täysi luottamus) kutsua vain toista läpinäkyvää koodia tai tietoturvakriittistä koodia. Jos koodi on osittain luotettu, se voi suorittaa vain toimintoja, jotka sallitaan toimialueen käyttöoikeusjoukossa. Läpinäkyvä koodi ei voi tehdä seuraavia toimintoja:
-
Toteuttaa Assert-operaatiota tai oikeuksien korottamista.
-
Sisältää turvatonta tai tarkistamatonta koodia.
-
Kutsu suoraan kriittistä koodia.
-
Kutsu natiivia koodia tai koodia, jolla on SuppressUnmanagedCodeSecurityAttribute-attribuutti.
-
Kutsu jäsentä, joka on suojattu LinkDemandilla.
-
Kutsu jäseniä, jotka on suojattu LinkDemandilla.
-
Periä kriittisiä tyyppejä.
Transparentit metodit eivät voi myöskään ohittaa kriittisiä virtuaalisia metodeja tai toteuttaa kriittisiä rajapintametodeja.
-
-
Turvallisuuden kannalta turvallisen kriittisen koodin toimintaohjelmaan on täydellisesti luotettu, mutta se on kuitenkin kutsuttava läpinäkyvällä ohjelmatyypillä. Se paljastaa rajoitetun pinta-alan täysin luotettavaa koodia. Oikeellisuus- ja tietoturvatarkastukset tapahtuvat turvakriittisessä koodissa.
-
Turvakriittinen koodi voi kutsua mitä tahansa koodia, ja se on täysin luotettavaa, mutta sitä ei voi kutsua läpinäkyvä koodi.
-
Turvallisuuskriittisiin tyyppeihin ja jäseniin, jotka ovat julkisia, pääsee käsiksi turvallisuuskriittisesti läpinäkyvästä koodista.
-
Turvaluokittelumerkinnät pannaan täytäntöön vain kokoonpanon sisällä.
-
Turvakriittisten tyyppien ja jäsenten on käytettävä linkkivaatimuksia turvallisuuden valvomiseksi kokoonpanon ulkopuolelta tuleville kutsuille.
-
Perintösääntöjä ei valvota.
-
Potentiaalisesti läpinäkyvä koodi voi tehdä haitallisia asioita, kun sitä ajetaan täydessä luottamuksessa.
- Turvallista läpinäkyvää koodia, taso 1
- Turvallista läpinäkyvää koodia, taso 2
Tason 1 läpinäkyvyys
Tason 1 läpinäkyvyysmalli otettiin käyttöön .NET Frameworkin versiossa 2.0, jotta kehittäjät voivat pienentää tietoturvatarkastuksen kohteena olevan koodin määrää. Vaikka tason 1 läpinäkyvyys oli julkisesti saatavilla versiossa 2.0, sitä käytettiin pääasiassa vain Microsoftin sisällä tietoturvatarkastuksiin. Kehittäjät voivat merkintöjen avulla ilmoittaa, mitkä tyypit ja jäsenet voivat suorittaa tietoturvan korotuksia ja muita luotettavia toimintoja (tietoturvakriittiset) ja mitkä eivät (tietoturvan läpinäkyvyys). Läpinäkyväksi määritetty koodi ei vaadi suurta tietoturvatarkastusta. Tason 1 läpinäkyvyys tarkoittaa, että läpinäkyvyyden toteuttaminen on rajoitettu kokoonpanon sisäpuolelle. Toisin sanoen kaikki julkiset tyypit tai jäsenet, jotka on määritelty turvallisuuskriittisiksi, ovat turvallisuuskriittisiä vain kokoonpanon sisällä. Jos haluat varmistaa näiden tyyppien ja jäsenten turvallisuuden, kun niitä kutsutaan kokoonpanon ulkopuolelta, sinun on käytettävä linkkivaatimuksia täyttä luottamusta varten. Jos et tee näin, julkisesti näkyviä turvallisuuskriittisiä tyyppejä ja jäseniä käsitellään turvallisuuskriittisinä ja niitä voidaan kutsua kokoonpanon ulkopuolisesta osittain luotetusta koodista.
Tason 1 avoimuusmallilla on seuraavat rajoitukset:
Transparenssin toimeenpano
Transparenssisääntöjä ei toimeenpanna ennen kuin läpinäkyvyys on laskettu. Tuolloin heitetään InvalidOperationException, jos läpinäkyvyyssääntöä rikotaan. Aika, jolloin läpinäkyvyys lasketaan, riippuu useista tekijöistä, eikä sitä voida ennustaa. Se lasketaan mahdollisimman myöhään. .NET Framework 4:ssä kokoonpanotason läpinäkyvyyden laskeminen tapahtuu aikaisemmin kuin .NET Framework 2.0:ssa. Ainoa takuu on, että läpinäkyvyyden laskenta tapahtuu silloin, kun sitä tarvitaan. Tämä on samanlaista kuin se, miten just-in-time (JIT) -kääntäjä voi muuttaa ajankohtaa, jolloin metodi käännetään ja metodin mahdolliset virheet havaitaan. Läpinäkyvyyslaskenta on näkymätöntä, jos koodissasi ei ole läpinäkyvyysvirheitä.