.NET Security

La sicurezza nella applicazioni .NET è uno delle sfide maggiormente impegnative che ogni programmatore affronte quotidianamente. Questa categoria si vuole porre come strumento utile a tutte quelle persone che per passione o per motivi professionali vogliono rendere le loro applicazioni Sicure.
PrincipalPermission - Hacking Windows Impersonation

Essere a casa influenzato non porta solo svantaggi. Solo ora, ho trovato, un errore all'interno di una mia vecchia, ma ancora funzionante applicazione. Ecco la classe   public class ValidateUser { [PrincipalPermission(SecurityAction.Demand, Name=@"mainServer\Administrator")] public void AdminsOperations() { // codice... } } Il codice sembra corretto, e guardandolo così com'è non si nota alcun tipo di errore. In realtà l'errore c'è ma non si vede. Come la maggior...

posted @ lunedì 9 ottobre 2006 19:37 | Feedback (5)

[Security 33] Identity Permissions ed i suoi attributi

Nei precedenti post ho parlato degli oggetti IIDentity e IPrincipal. Quello di cui non abbiamo parlato sono i loro attributi e come utilizzarli per evitare di eseguire codice nel caso in cui l'utente non sia correttamente autorizzato. Nel caso si voglia proprio realizzare una struttura di questo tipo è necessario andare a lavorare sulla permission PrincipalPermission insieme ad alcuni suoi attribiti (PrincipalPermissionAttribute). PrincipalPermission ha tre proprietà da valorizzare. Authenticated Name Role Il loro funzionamento è presto illustrato dallo snippet di codice che segue.  [PrincipalPermission(SecurityAction.Demand, Role="TrustedUsers")] private static void RunTrustedUsersCode() { Console.WriteLine("Waaa appartengo al gruppo TrustedUsers!"); } Il metodo RunTrustedUsersCode può essere eseguito...

posted @ lunedì 9 ottobre 2006 15:37 | Feedback (129)

[Security 31] Windows/Forms/Passport-Identity

Come si può facilmente intendere dal nome, una WindowsIdentity identifica uno specifico utente Windows. La maggiore differenza che si può incontrare facendo la comparazione tra WindowsIdentity e GenericIdentity sta nella costruzione dell'oggetto. Una WindowsIdentity si propone con quattro costruttori, il primo argomento di questi è di tipo IntPtr. IntPtr windowsToken /* =...*/; IIdentity windowsUser = new WindowsIdentity(windowsToken, "NTLM", WindowsAccountType.Normal, true); Questo esempio mostra come il costruttore usi più argomenti. Il secondo argomento è dato dalla tipologia di autentificazione. Il terzo invece è valore di enumerazione di tipo WindowsAccountType, il quale,...

posted @ giovedì 31 agosto 2006 17:59 | Feedback (4)

[Security 32] L'interfaccia IPrincipal

Dando per scontato il nostro skill sul funzionamento delle identità nel mondo Microsoft .NET Framework, andremmo ora a coprire l'importantissimo argomento dell'interfaccia IPrincipal. Formata da due membri: Identity: una proprietà Read-Only legata alla Principal IsInRole:  un metodo che informa se Principal appartiene ad uno specificato gruppo. .NET espone due implementazioni di IPrincipal: GenericPrincipal e WindowsPrincipal, e proprio di queste andremmo a parlare. GenericPrincipal è l'implementazione più semplice di IPrincipal. Per crearne una è necessario sottoporre un oggetto basato su una interfaccia IIdentity accompagnato da una lista di ruoli alla quale essa appartiene. Per esempio.. string[] roles = {"administrators", "developers"}; IIdentity soloNome = new GenericIdentity("amarziali"); GenericPrincipal genericPrincipal = ...

posted @ giovedì 31 agosto 2006 17:59 | Feedback (238)

[Security 30] RSA | Identity Interface

L'interfaccia IIdentity è usata per definire informazioni relative all'utente. Generalmente, l'utente che sta eseguendo il codice. IIdentity definisce tre proprietà read-only: Name : Una stringa che definisce il nome logico dell'utente nel formato dominio\nome. AuthenticationType : Una stringa che definisce la tipologia di autentificazione usata per verificare l'utente (per esempio Kerebos e Passport). IsAuthenticated : Un valore  booleano che indica lo stato di autentificazione dell'utente. .NET fornisce queste quattro implentazioni di IIdentity: GenericIdentity (sec30) WindowsIdentity (sec31) FormsIdentity (sec32) PassportIdentity (sec33) Per ora parleremo di GenericIdentity. Come specificato dal nome GenericIdentity non è direttamente collegato ad alcun protocollo per...

posted @ mercoledì 30 agosto 2006 18:30 | Feedback (4)

[Security 29] .NET Security vs Operative System Security

  Riapro la serie .NET Security con un post, a mio modo di vedere, importante. Stiamo parlando della sicurezza di .NET ed il suo inevitabile scontro con la sicurezza del sistema operativo. Come abbiamo avuto modo di vedere, .NET ha molto da offrire quando si parla di permessions e di sicurezza in generale, tuttavia questo non significa che .NET sia immune o superiore alle policy di sicurezza definite dal sistema operativo. Ragionando per esempi, inviterei a verificare il funzionamento del seguente metodo. [method: FileIOPermission(SecurityAction.Demand,Write = IMAGE_DIR)]public void SalvaImmagine(string NomeImmagine){     FileName = IMAGE_DIR + NomeImmagine      if(true == File.Exists(NomeImmagine))     {        File.Delete(NomeImmagine));     } ...

posted @ giovedì 17 agosto 2006 10:03 | Feedback (5)

[Security 28] Link Demands

Durante l'analisi di un nuovo progetto, qualcuno (ndr guardandomi) ha posto la seguente domanda."Cosa significa chiedere i permessi per svolgere una determinata azione in un contesto generico applicativo? " La risposta a questa domanda può sembrare decisamente semplice, tuttavia non è proprio così ovvia. Pertanto, ho proposto di aprire un dibattito al riguardo. Ogniuno ha espresso la sua opinione ed il risultato generale è stato che, per richiesta di permessi s'intende il reclamare il permesso ad eseguire una determinata operazione su un determinato componente. La mia reazione è stata piuttosto inusuale, ho chiesto di realizzare un semplice snippet che chiamasse un metodo di...

posted @ martedì 27 giugno 2006 13:30 | Feedback (5334)

security whitepaper #1

Ultimamente sto postando poco, è vero, problemi di grande importanza mi stanno allontanando dal blog. Ma a parte questo, che non è il motivo di questo post, volevo informarvi che da circa quattro giorni sto lavorando ad una whitepaper che rilascerò (spero) la prossima settimana. Il titolo è in fase di definizione, ma i contenuti iniziano ad essere molti. Si parla di sicurezza delle web applications ed in generale dell'amministrazione remota dei contenuti (le famose aree admin). Tutto questo nasce con l'idea di sensibilizzare Programmatori/PM/Clienti riguardo ai problemi derivati da uno sviluppo non orientato alla sicurezza. Attualmente i contenuti sono : Remote Code Execution Come proteggersi dai Google...

posted @ mercoledì 14 giugno 2006 12:41 | Feedback (8)

[Security 27] NamedPermissions Set

Dopo l'introduzione fatta in precedenza, andiamo a scoprire definitivamente il significato dei NamedPermissions Set. Sia chiaro, il loro utilizzo non è che faccia la differenza.. ma sicuramente può aiutarci a sviluppare con maggiore ordine. Dopo essermi fatto le mie personali convinzioni entriamo nel tecnico. Come abbiamo capito, il permissions set ritornato dall'evidence dell'assembly in esecuzione non contiene tutte le permissions che ci sono state assegnate dai code groups. Per esempio, potrei usare l'oggetto FileStream senza problemi, ma l'oggetto FileIOPermissions non verrà mostrato nel permission set associato. Per riuscire a visualizzare tutte le permissions c'è da svolgere un lavoro in più. Il come lo vedremo nel prossimo post....

posted @ sabato 3 giugno 2006 19:00 | Feedback (5416)

[Security 26] Permissions Sets

E' vero; avevo detto che avrei parlato di ben altre cose, ma rileggendo la serie di post mi sono    accorto che stavo tralasciando una parte molto importante. I Named Permissions Sets . Cosa sono e come funzionano lo scopriremo nel prossimo post (sec 27). Ho scelto questa scaletta per facilitare la lettura a chi non avesse familiarità con i Permissions Sets.Come si può ben intuire un Set di Permissions è l'unione di due o più Permissions che un assembly può avere. Ricordiamoci sempre che esistono differenti policies, ogniuna delle quali con differenti code groups...

posted @ sabato 3 giugno 2006 16:34 | Feedback (5402)

[Security 25] Introduzione alle Permissions

Dopo un periodo di tempo non proprio breve vorrei ricominciare, o meglio ripartire, con la mia serie di post relativi alla sicurezza nel mondo .NET. Vorrei comunque concedermi il tempo di ringraziare tutte le persone che leggono, ed apprezzano, i post che vengono trattati in questo blog. Grazie.In security 26,27,28 andremo a parlare delle permissions e di altri concetti molto interessanti del mondo .NET Security. Come tutti sappiamo, una permission è una classe che definisce cosa una entità può e non può fare. Come si può notare dal codice che segue: questa classe deve implementare l'interfaccia IPermission, la quale è presente nello spazio...

posted @ mercoledì 24 maggio 2006 21:56 | Feedback (76)

[Security 24] Codificare XML (Encrypting)

Mentre .NET supporta pienamente classi per le specifiche XML in fatto di firme, per la Codifica non esiste nessuna classe specifica.. nemmeno una.Attenzione, questo non significa che operazioni di codifica risultino impossibili.. anzi. Ricordiamoci delle classi di Cryptography viste nei precedenti post. Continuando a prendere come esempio il file xml (Sec22 e Sec23) andiamo a vedere come possiamo trattare questo nodo al fine di codificarlo. Dando per scontato la totale assenza di una chiave, la prima cosa che dobbiamo fare è quella di andarla a creare. Per fare questo avremmo bisogno di creare una chiave simmetrica, codificarla e rendere il risultato codificato in...

posted @ lunedì 17 aprile 2006 15:32 | Feedback (8)

[Security 23] XML Signatures

Per vedere come usare le classi Cryptography.XML per firmare files XML, procediamo a firmare l'elemento Pagamento con una chiave privata RSA. Si suppone che questo file contenga informazioni importanti che non vogliamo rendere leggibili in plain text (testo semplice).Per prima cosa carichiamo l'elemento Pagamento dal file XML interessato. Come tutti sappiamo .NET mette a disposizione strumenti potenti per l'elaborazione dei files XML, questi sono inclusi nello spazio di nomi (namespace) System.XML.Iniziamo con il codice String appPath = Application.StartupPath;XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(appPath + @"\Ordine.XML");XmlNodeList paymentElems = xmlDoc.SelectNodes("Ordine/Pagamento")); Supponendo che la nodelist sia composta da un solo elemento, creiamo un l'oggetto signedXml che andrà a contenere le informazioni sul pagamento grazie ad un data object. SignedXml signedXml = new SignedXml();System.Security.Cryptography.Xml.DataObject paymentInfo =   new System.Security.Cryptography.Xml.DataObject();paymentInfo.Data = paymentElems;paymentInfo.Id = "OrdinePagamento";signedXml.AddObject(paymentInfo); A...

posted @ sabato 15 aprile 2006 21:23 | Feedback (9)

[Security 22] Codificare e firmare files XML (introduzione)

Tramite la contact form mi è stato chiesto come mai molti programmatori parlano ed utilizzano XML per le proprie applicazioni ed il perchè nessuno applica sistemi di protezione su XML. Visto che ho affrontato l'argomento alcuni mesi indietro per un importante progetto.. beh facciamola a modo nostro.. blogghiamoci sopra ;). Prendendo spunto da questo “gradito” messaggio, inauguriamo l’inizio dei post relativi ad XML e Sicurezza. Il tutto sempre trovando il giusto collegamento con .NET. Bene tutti quanti sappiamo come e perché funziona XML, pertanto possiamo subito partire a parlare di cose interessanti. Prendiamo d’esempio questo file XML seguente. <Order>   <Items>      <Item ID="123456789">         <Description>SuperEfficient GC</Description>         <Price>0.99</Price>      </Item>   </Items>   <Payment Method="Credit" Type="HighInterest">      <Number>7890123456789012</Number>      <ExpirationDate>12/12/2003</ExpirationDate>   </Payment></Order> Il problema vero e proprio non...

posted @ mercoledì 12 aprile 2006 23:18 | Feedback (5370)

[Security 21] System.Security.Cryptography.X509Certificates

Con il post [Security 21] entriamo nella zona Certificati Digitali.Come si vedrà più avanti, la classe X509Certificate non crea certificati, ma si limita unicamente ad analizzarli. Tuttavia, per avere un certificato su cui lavorare non è per forza necessario avere una CA (Certification Authority). NET viene distribuito con il Certificate Creation tool (makecert.exe).Creiamo quindi il nostro certificato su cui andremo a lavorare più avanti makecert "c:\IMieiCertificatiSonBelli\UgiCert.cer" Prestate attenzione al fatto che makecert dispone di una considerevole quantità di opzioni di esecuzione disponibili. Possiamo creare i certificati con quasi tutte le informazioni che vogliamo. Per esempio è possibile specificare il Subject Name con il l'opzione di...

posted @ martedì 21 marzo 2006 18:43 | Feedback (5335)

[Security 20] Codifica Decodifica dei Dati

Per codificare\decodificare informazioni, vengono utilizzati i metodi CreateEncryptor() o CreateDecryptor() della classe SymmetricAlgorithm. Esistono due versioni di questi metodi: uno senza alcun tipo di parametro richiesto (parameterless) ed un secondo che richiede due byte di array, i quali, rappresentano il IV e la chiave per il processo di codifica. In entrambe i casi, il valore di ritorno è una interfaccia ICryptoTransform. Al netto di ciò, come segue, possiamo usare direttamente CryptoStream per rendere il nostro lavoro più facile. 1  String adPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;2  FileStream fin = new FileStream(adPath + @"\jcfileIN.txt",3     FileMode.Open, FileAccess.Read);4  MemoryStream mout = new MemoryStream();5  byte[] finData = new byte[fin.Length];6  7  SymmetricAlgorithm rijn = Rijndael.Create();8  CryptoStream coutenc = new CryptoStream(mout, rijn.CreateEncryptor(),9     CryptoStreamMode.Write);10  fin.Read(finData, 0, (int)fin.Length);11  coutenc.Write(finData, 0, (int)fin.Length);12  coutenc.FlushFinalBlock();13  14  FileStream fdec = new FileStream(adPath + @"\jcfileOUT.txt",15      FileMode.OpenOrCreate, FileAccess.Write);16  17  CryptoStream coutdec = new CryptoStream(fdec, rijn.CreateDecryptor(),18      CryptoStreamMode.Write);19  coutdec.Write(mout.GetBuffer(), 0, (int)(mout.Length));20  coutdec.Close();21   Ok parliamoci chiaro, questo codice può sembrare molto simile a quello postato in uno dei precedenti post, tuttavia c'è un particolare che dovrebbe...

posted @ giovedì 16 marzo 2006 17:34 | Feedback (5408)

[Security 19] Creare le Chiavi

Come abbiamo visto nei precedenti post esistono due tipologie di algoritmi di codifica : Simmetrici e Asimmetrici. Vediamo come utilizzarli all'interno del mondo .NET Chiavi Simmetriche Cryptography definisce una classe astratta chiamata SymmetricAlgorithm dalla quale tutte le implementazioni di algoritmi simmetrici dovrebbero discendere. Questa classe viene utilizzata per referenziare un oggetto a runtime come mostrato qui di seguito. SymmetricAlgorithm symAlg = new RijndaelManaged(); .NET 1.1 ha quattro implementazioni di SymmetricAlgorithm. Data Encryption Standart (DAS) TripleDES Rivest Cipher-2 (RC2) Rijndael (il quale deriva dal nome di Vincent Rijmen e Joan Daeman) RC2 ha una chiave a lunghezza variabile, DES ha lunghezza di 56-bit mentre TripleDES è fissa di 112bit. L'algoritmo di Rijndael è il...

posted @ lunedì 6 febbraio 2006 13:36 | Feedback (5414)

[Security 18] Alla scoperta delle classi Random Number Generation

Similmente alla gerarchia vista con le classi Hash, Cryptography definisce una classe astratta di nome RandomNumberGenerator, dalla quale tutte le altre classi random number generator devono derivare. Attualmente, .NET mette a disposizione una sola implementazione di RandomNumberGenerator : RNGCryptoServiceProvider. RandombNumberGenerator ha solo due metodi che si possono utilizzare per generare valori random: GetBytes() e GetNonZeroBytes(). Entrambe prendono un array di byte come loro unico argomento. GetNonZeroBytes() fa proprio quello che dice il suo nome: Nessuno degli elementi dell'array conterrà un valore zero (0). Mentre invece, GetBytes() potrà contenerli. Il codice che segue mostra il funzionamento di entrambe i metodi RandomNumberGenerator rng = new RNGCryptoServiceProvider();byte[] randomData = new byte[100];rng.GetBytes(randomData);byte[] randomDataWithNoZeros = new byte[50];rng.GetNonZeroBytes(randomDataWithNoZeros); L'oggetto RandomNumberGenerator legge la lunghezza...

posted @ venerdì 3 febbraio 2006 13:25 | Feedback (5)

[Security 17] Stream Cryptografici

Come la maggior parte delle altre classi, Cryptography supporta lo streaming.  Streaming non è niente altro che un modo per leggere e scrivere informazioni in modalità sincrona ("Chiama ed aspetta") o in modalità asincrona ("Spara e Dimentica"). Come le operazioni criptografiche, sappiamo che il processo può richiedere, in base alla dimensione del messaggio o della chiave, diverso tempo. Di conseguenza, la maggior parte delle classi Cryptography mettono a disposizione un modo per avere lo stream del risultato delle loro operazioni. La classe CryptoStream deriva dalla classe Stream dello spazio di nomi System.IO, quindi tutti i metodi previsti da uno stream sono disponibili...

posted @ venerdì 3 febbraio 2006 12:54 | Feedback (5360)

[Security 16] CryptoConfig e machine.config

CryptoConfig Il primo posto dove le classi di criptografia "guardano" per "nomi" semplici o rilevare i nomi di mappatura è proprio la classe CryptoConfig. Questa classe espone tre metodi statici, ma quella che c'interessa a noi in questo momento è l'overload del metodo CreateFromName(). Questo metodo prende un nome semplice e crea una istanza della classe che è mappata a questo nome. La mappatura funziona unicamente se l'oggetto che sta chiamando il metodo Create() è costruito sulla base dell'algoritmo che vogliamo. Per esempio, se vogliamo eseguire il seguente codice. HashAlgorithm hash = SHA384.Create("SHA384"); Visto che la classe SHA384 è la base di SHA384Managed, la chiamata al metodo Call()...

posted @ giovedì 26 gennaio 2006 13:49 | Feedback (21)

[Security 15] Lavorare con System.Security.Cryptography

Prima d'iniziare è necessario dare uno sguardo veloce allo spazio di nomi System.Security.Cryptography, che da questo punto in poi sarà il nostro punto di rifermento al concetto di Cryptografia. Come la maggior parte degli spazi di nomi di .NET, ci sono molti membri che necessitano di uno occhiata approfondita, Per esempio questo spazio di nomi ha le sue classi stream (CryptoStream), classi hash astratte (HashAlgorithm), algoritmi simmetrici (RijndaelManaged) ed altro. Queste classi sono state create per rendere facile al programmatore per riferirsi ad un oggetto a runtime con una considerevole flessibilità. Come si può vedere questo design permette di utilizzare contemporaneamente...

posted @ giovedì 19 gennaio 2006 12:37 | Feedback (19)

[Security 14] Terminologia di Base [Keys]

Una delle parti essenziali degli algoritmi di Criptaggio sono le chiavi (proprio come Marcello aveva affermato in Security 12). Grazie alle chiavi è possibile mettere in sicurezza interi messaggi, rendendo le operazioni di decrypt (da parte di utenti maleintenzionati) molto più difficili da eseguire. Le chiavi vengono utilizzate per alterare i messaggi durante l'interno processo di criptaggio. La figura che segue ne mostra il funzionamento. ...

posted @ martedì 17 gennaio 2006 16:01 | Feedback (17)

[Security 13] Terminologia di Base [Hashes]

Nel campo IT relativo alla Sicurezza spesso si affrontano discorsi composti di termini, non spesso, propriamente conosciuti. Nel prossimi 3 post passeremo in rassegna i maggiori termini tendando di fornire una descrizione accurata di ogniuno di essi. Per la precisione parleremo di Plaintext Ciphertext Hashes Keys Symmetric Algorithms Asymmetric Algorithms Comparazione tipi di Chiavi Generazione di numeri Random Plaintext - Ciphertext Plaintext (testo semplice) descrive lo stato di un messaggio che può essere letto facilmente da tutti e tutto. Questo può essere un semplice file di testo fino ad arrivare ad un eseguibile. Per "alterare" una informazione di questo tipo si ha la necessità...

posted @ venerdì 13 gennaio 2006 12:35 | Feedback (12)

[Security 12] Essenza della Criptografia

La definizione di Criptografia è abbastanza diretta e intuibile. Si definisce Criptografia la scienza di mantenere i messaggi sicuri. Principalmente è lo studio di algoritmi matematici e funzioni utilizzate per questo scopo. Esistono due macro tipologie di algoritmi : Limitati Aperti Algoritmi Limitati Questi algoritmi sono creati da persone od organizzazioni e non sono disponibili al pubblico generale. Per esempio, un algoritmo limitato può essere utilizzato per nascondere il codice di un oggetto .NET compilato del quale non si vuole fornire la minima possibile di visibilità del codice. Algoritmi Aperti Nascono con l'intenzione di rendere pubblica una tecnologia da condividere con il mondo....

posted @ venerdì 13 gennaio 2006 10:54 | Feedback (27)

[Security 11] Data Access Security - Comunicazioni Sicure

Negli scenari in cui si presenta la necessità di linkare dati, presenti all'interno di un database, e la nostra applicazione dobbiamo sempre poter garantire due fattori importantissimi. Confidenza dei messaggiI dati devono essere codificati e dobbiamo garantire che resteranno privati durante il viaggio. Integrità del messaggioI dati devono essere firmati per assicurarci che siano rimasti inalterati. Esistono due categorie di scenari principali in cui questo dovrebbe essere applicato. Full SecurityIn questo scenario TUTTI i dati trasmessi devono essere messi al sicuro.Es: Internet Home Banking, in questo caso tutte le informazioni devono essere messe al sicuro.Selected SecuritySolo una selezionata parte dei dati viene messa...

posted @ lunedì 28 novembre 2005 19:19 | Feedback (22)

[Security 10] Data Access Security - Authentication

Questo post discute e propone le metodologie da utilizzare quando s'intende utilizzare Microsoft SQL Server come Database e Windows Authentication come metodo di autentificazione. Windows Authentication Windows authentication è decisamente la più sicura metodologia da applicare quando ci si connette a Microsoft SQL Server per i seguenti motivi: 1) Al programmatore non è riservata alcuna operazione di managing relative alle credenziali e sopratutto queste non sono trasmesse in rete.  2) Le credenziali (username e password) non sono inglobate nelle connection strings. 3) Avvalendosi di sistemi di password expiration periods, lunghezza minima ed account lock successivo a multiple richieste invalide, Logon Security fornisce un buon punto di partenza. E'...

posted @ venerdì 18 novembre 2005 11:34 | Feedback (25)

[Security 09] ViewState,Cookies,Connection Strings al sicuro.

In questo post si parlerà di tecniche atte a mettere in sicurezza i vari tipi di stati che una normale web application può trovarsi a gestire. Securing ViewState Se la nostra Web Application utilizza il viewstate è bene considerare di:Assicurarsi dell'integrità del messaggio, per far questo è bene abilitare il direttiva enableViewStateMac a true.<% @ Page enableViewStateMac=true > Questo comporta la generazione di un Message Authentication Code (MAC) da parte di ASP.NET, durante l'evento postback. Configurare l'attributo validation presente nel machine.config , per specificare il tipo di criptaggio che sarà utilizzato per la validazione dei dati. (SHA1- 3DES per esempio). Ricordiamo che SHA1 (Secure Hash Algorithm 1)...

posted @ mercoledì 9 novembre 2005 11:06 | Feedback (39)

[Security 08] Evitare L’overide dei file di configurazione

I vari settings di configurazione sono su base gerarchica.Web.config posizionati in cartelle specifiche possono eseguire overide del Web.Config posizionato nella cartella principale del Virtual Server. Allo stesso modo, quest’ultimi, possono eseguire overide del Machine.Config del server Web. E’ sicuramente utile sapere che è possibile bloccare i sistemi di overide dei livelli più bassi utilizzando l’elemento element in coppia con l’attributo allowOveride.<location path="somepath" allowOverride="false" /> . . . arbitrary configuration settings . . .</location>  E’ da tener nota che la path per cui si vuole agire può essere settata per il WebSite, la Directory Virutale, la directory root o la sottodirectory. Quindi : Settando allowOverride a false, si...

posted @ venerdì 4 novembre 2005 17:38 | Feedback (116)

[Security 07] Impariamo a difendere i nostri segreti

Le web application, per come le conosciamo, spesso necessitano di nascondere alcuni dati che possono essere classificati come segreti. Nel caso in cui essi esistano, è necessario metterli in sicurezza da (li lascio in inglese perchè fa + figo) : rogue administrators web malicious users Le Spie. I Rogue AdministratorsQuesti ed altri utenti privi di scrupoli possono avere la possibilità di leggere segreti.Per esempio, un amministratore WebServer non dovrebbe essere in grado di leggere le credenziali di accesso al Server SQL della rete aziendale. Le mura sono cadute ma posso difendermi ancora.Immaginando FileAuthorizaionModule come una reale protezione alle problematiche relative all'accesso...

posted @ giovedì 27 ottobre 2005 11:39 | Feedback (30)

[Security 06] Windows Authentication : Impersonate di credenziali specificate nel registro di sistema

L'elemento identity nel web.config supporta due attributi opzionali: username password Questi, permettono di specificare le fixed identity da impersonificare nell'applicazione web che abbiamo sviluppato.    userName="registry:HKLM\SOFTWARE\YourSecureApp\             identity\ASPNET_SETREG,userName"   password="registry:HKLM\SOFTWARE\YourSecureApp\             identity\ASPNET_SETREG,password" Il codice sopra riportato mostra come utilizzare delle credenziali archiviate nel registro. Questa operazione è stata resa possibile dall'impiego del tool aspnet_setreg.exe. Il quale può essere scaricato da questo Url .Cosa è aspnet_setreg.exeaspnet_setreg è una utility che può essere utilizzata per codificare ed archiviare questi attributi nel registro di sistema sotto una chiave sicura.Prima di partire è necessario utilizzare la funzione CryptProtectData con la flag CRYPTPROTECT_LOCAL_MACHINE, la quale di fatto codifica le credenziali inserite. Questo passo va effettuato perchè qualunque persona...

posted @ lunedì 24 ottobre 2005 10:31 | Feedback (97)

[Security 05] Sicurezza - Configurabile o Programmatica?

[INTRO]Ricordiamo che per impersonificare l'utente chiamate della risorsa attraverso la Windows Authentication è necessario il codice che segue nel Web.config o nel Machine.config < SPAN><><authentication mode="="Windows" />< SPAN>< identity impersonate="true" /> [/INTRO]Quando viene messa in gioco l'autenticazione Windows in accoppiata con Impersonation le seguenti opzioni di sicurezza sono disponibili.Windows ACLsL'utente ha richiesto una risorsa. ASP.NET FileAuthorizaionModule esegue un access check per la tipologia di file richiesto il quale deve essere mappato nella ISAPI ASP.NET. Per fare questo utilizza l'access token dell'utente che ha effettuato la richiesta.Per i file che non sono mappati nella ISAPI, IIS esegue un access check, sempre utilizzando l'access token dell'utente...

posted @ venerdì 21 ottobre 2005 11:20 | Feedback (41)

[Security 04] Porsi le giuste domande

Ideare e realizzare strategie di autorizzazione per applicazioni web distribuite è una delle task più impegnative che si possono presentare in fase di analisi.Come parte una analisi ?Ponendosi domande intelligenti.Che cosa s'intende per domande intelligenti?In un ambiente Enterprise "ideale" le domande da proporsti potrebbero essere le seguenti: Dove dovrei utilizzare sistemi di autorizzazione e con quale meccanismo? Che meccanismo di autentificazione dovrei utilizzare? Dovrei utilizzare Active Directory Service per l'autorizzazione o dovrei utilizzare un sistema di verifica basata su fonte dati (DB)? ...

posted @ giovedì 20 ottobre 2005 16:40 | Feedback (62)

[Security 03] ASP.NET Authorization Options

Nel post precedente abbiamo parlato di Granularità dove abbiamo introdotto i gate che ASP.NET mette a disposizione.Le modalità di autorizzazione di ASP.NET vengono definite "Opzioni di Accesso" e possono essere utilizzate da Web Applications,WebServices e Componenti Remoti.  Le opzioni disponibili sono:URL Authorization . Questo meccanismo di autorizzazione può essere impostato nei file di configurazione dell'applicazione (webconfig) e della macchina (machineconfig). L'Opzione URL permette di ristringere l'accesso a specifici files e cartelle grazie all'utilizzo del namespace URI (Uniform Resource Identifier). Sarà così possibile permettere l'accesso a cartelle o files (percorsi web) a determinati utenti (regole di eccezione). I filtri di accesso possono...

posted @ mercoledì 19 ottobre 2005 14:24 | Feedback (65)

[Security 02] Gatekeepers,Gates e la Granularità

S'identifichi GateKeeper come la tecnologia responsabile di un Gate. Un Gate rappressenta un ACP (Access Control Point) per l'applicazione. Tutte le tecnologie Core IIS ASP.NET Web Services Remoting Enterprise Services Sql Server 2000 Windows 2000 presentano dei GateKeepers. Le richieste devono obbligatoriamente passare per una serie di Gates prima di passare a stato Allowed e quindi venire processate dal sistema. In questo post verranno illustrate la serie di cancelli che vengono attraversati per ogni tecnologia core.Internet Information Services mette a disposizione un Gate quando si autentifica l'utente (è dato per scontato che Anonymous authentication venga disabilitata). IIS Web Permissions può essere utilizzata...

posted @ mercoledì 19 ottobre 2005 13:20 | Feedback (21)

[Security 01] Principi di Sicurezza

Da alcuni mesi ho deciso di approfondire l'aspetto sicurezza nel mondo dello sviluppo di applicazioni .NET. La categoria Security sarà da considerarsi come il mio diario di viaggio verso questo mondo che, per mancanza di tempo, mi sono deciso solo ora ad affrontare. La prima pagina (come d'obbligo) inizia con alcuni fondamenti relativi alla sicurezza. Niente di pratico.. solo raccomandazioni. Utilizzare account con permessi LimitatiProcessi che eseguono script o eseguono cidice dovrebbero girare sotto account (least) per limitare potenziali danni che possono essere eseguiti se il codice è corrotto. L'account ASPNET viene considerato un modello di (least account).Questa decisione è stata presa dal team...

posted @ mercoledì 19 ottobre 2005 12:07 | Feedback (30)