.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.
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...
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...
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,...
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 =
...
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...
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)); } ...
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...
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...
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....
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...
Full .NET Security Archive