Objetivos TEMA 8 PROTECCIÓN. Indice. Bibliografía. Estudio de un Sistema Operativo U. D. Sistemas DSIC. "! Matrices de acceso. 1.!



Documentos relacionados
!! Identificar las señales que llegan a la consola.

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Ac A t c itve v e D i D re r c e t c o t r o y r

NTFS (Windows NT) Principales características que se deseaba que tuviera. Manejo de disco: $MFT Master File Table

SEGURIDAD Y PROTECCION DE FICHEROS

WINDOWS : SERVIDOR DHCP

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

7. Manejo de Archivos en C.

Creación y administración de grupos de dominio

Oficina Online. Manual del administrador

El cuadro de mando contiene indicadores e informes que deben actualizarse a partir de la información de su sistema informático.

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

ESCUELA SUPERIOR DE INFORMATICA Prácticas de Estadística UNA SESIÓN EN SPSS

UNIDAD DIDACTICA 3 USUARIOS Y GRUPOS EN REDES WINDOWS 2003 SERVER I

3. CONSIDERACIONES GENERALES

PHPMYADMIN Y MYSQL. Para gestionar la base de datos MySQL, lo haremos desde la aplicación PhpMyAdmin.

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

Gestión de Permisos. Bizagi Suite. Copyright 2014 Bizagi

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Control de accesos autónomo por huella dactilar

GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD

MANUAL DE LA APLICACIÓN HELP DESK

SIIGO Pyme. Templates. Cartilla I

Contenidos. Archivos en C++ Archivos en C++ Introducción

Electrónica: Configuración en Mozilla Firefox

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Administración de portales Joomla (II)

GVisualPDA Módulo de Almacén

Ejercicios - Persistencia en Android: ficheros y SQLite

SOLUCION EXAMEN junio 2006

Base de datos relacional

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

5.2.- Configuración de un Servidor DHCP en Windows 2003 Server

Sistema de Gestión Portuaria Sistema de Gestión Portuaria Uso General del Sistema

Acronis License Server. Guía del usuario

GENERALIDADES DE BASES DE DATOS

TELEPROCESOS Y SISTEMAS DISTRIBUIDOS

UNIDAD DIDACTICA 16 USUARIOS SAMBA EN UN CONTROLADOR DE DOMINIO LINUX SERVER

Manual LiveBox WEB ADMIN.

BANCOS. Manejo de Bancos. Como crear una ficha de Banco? Como modificar los datos de una ficha de Banco? Como borrar una ficha de Banco?

Seguridad de los sistemas de ficheros

Práctica nº Mn-5.1 Mantenimiento de sistemas microinformáticos. Disco Duro.

Examen de Fundamentos de sistemas distribuidos

Manual de usuario de Webmail

MF0952_2: Publicación de páginas web

Accede a su DISCO Virtual del mismo modo como lo Hace a su disco duro, a través de:

PERMISOS DE CARPETA COMPARTIDA Y NTFS

Sistemas de archivos distribuidos. Alvaro Ospina Sanjuan

UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid

Manual de usuario Sistema DeclarINEGI v. 2.0

WINDOWS : COPIAS DE SEGURIDAD

GESTINLIB GESTIÓN PARA LIBRERÍAS, PAPELERÍAS Y KIOSCOS DESCRIPCIÓN DEL MÓDULO DE KIOSCOS

Capítulo 9. Archivos de sintaxis

Manual de Pagos y Transferencias

Con esta nueva versión, si un artículo que está incluido dentro de un Paquete de Ventas tiene precio 0,00, significará gratis.

PANEL DE CONTROL (Zona de Administración) MANUAL DE USO Por conexanet. Revisión 1.1 Fecha

INTRANET: MANUAL DE INSTALACIÓN

Manual del Sistema Extranet de Proveedores. Extranet de Proveedores. Versión 3.0. Manual de Usuario

Creación y administración de grupos locales

3. Modelo relacional: Estructura e integridad.

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

Guía paso a paso para la cumplimentación del formulario de candidatura

Control de presencia para terminal por huella dactilar

1. DML. Las subconsultas

tic Compartir archivos ENPCAC Placydo Torres Prof. Cruz Jorge Fernández

Guía N 1: Fundamentos básicos(i)

CIMA. MANUAL DE USUARIO

Formularios. Formularios Diapositiva 1

Ejercicio 1 Monitorización de aplicaciones con el Administrador de tareas

Estructuras de Sistemas Operativos

LABORATORIO 2. La biblioteca a nivel de usuario semso (semáforos Sistemas Operativos) brinda las siguientes primitivas:

1. CONSIDERACIONES GENERALES

CAPITULO 4. Requerimientos, Análisis y Diseño. El presente capítulo explica los pasos que se realizaron antes de implementar

Técnicas de Programación

CONFIGURACIÓN DE RED WINDOWS 2000 PROFESIONAL

Traslado de Copias y Presentación de Escritos. Manual de Usuario V.3.1

Microsoft Dynamics. Migración de FRx 6.7 a Management Reporter for Microsoft Dynamics ERP

Manual Oficina Web de Clubes - Federaciones Autono micas y Delegaciones

Seven ERP Guía De Referencia - Imágenes

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Manual de Usuario Sistema SIGESP 1 de 15 Módulo: Sistema de Seguridad Rev. Nº 00. Revisado Por : Firma: Elaborado Por: ADS. Teresa Andrade Firma

PSI Gestión es un sistema multiusuario que le permite 2 tipos de configuraciones:

GENERACIÓN DE TRANSFERENCIAS

CONVERSOR LIBROS DE REGISTRO (IVA IGIC) Agencia Tributaria DEPARTAMENTO DE INFORMÁTICA TRIBUTARIA

Arranque de la aplicación

El protocolo IMAP ofrece la descarga de correos en modo sólo lectura, es decir descarga sólo una copia del correo y no permite el borrado.

Instalación y mantenimiento de servicios de Internet. U.T.3.- Servicio DNS

Conceptos Generales en Joomla

Práctica 2 Gráficos Vectoriales con SVG (versión )

Ayuda básica relativa al interfaz web

INSTRUCCIONES CIERRE EJERCICIO 2014

El gráfico siguiente muestra un uso básico de DNS, consistente en la búsqueda de la dirección IP de un equipo basada en su nombre.

Tutorial: Primeros Pasos con Subversion

SiteAudit Knowledge Base Programación de Reportes en SiteAudit

Manual del panel. Core-Admin

Controladores de dominio. Redes Microsoft

SISTEMA DE INFORMACIÓN DE LA NATURALEZA DE EUSKADI HERRAMIENTA ACCESS PARA LA GESTIÓN DE REFERENCIAS

Transcripción:

Objetivos TEMA 8 PROTECCIÓN!! Identificar los requerimientos necesarios para controlar el acceso a los recursos!! Describir las funciones necesarias para gestionar la seguridad de los recursos Estudio de un Sistema Operativo U. D. Sistemas DSIC Curso 2009/10 1 Tema 8: Protección 2 Bibliografía Indice!! Johnson M. Hart: Win32 System Programming, 2ª ed., Addison-Wesley, 2001, ISBN 0-201-70310-6, 508 págs. "! Capítulos 2, 3 y 5.!! A. Silberschatz, P. B. Galvin, G. Gagne: Operating System Concepts, 6ª ed., John Wiley & Sons, 2001, ISBN 0-471-25060-0. "! Capítulo 18.!! Microsoft: Win32 SDK (edición 1997). "! Libro Win32 Programmer s Reference. #! Capítulos: Security y Shell Links. 1.! Introducción "! Matrices de acceso 2.! Protección: Gestión 3.! Protección: Llamadas!! Microsoft: MSDN de Visual Studio.NET 2003. "! Seguridad -> Seguridad (General) -> Documentación del SDK -> Authorization. "! Programación en Windows -> Windows Base Services -> Archivos y E/S -> Documentación del SDK -> Storage -> Storage Overview -> File Management. Tema 8: Protección 3 Tema 8: Protección 4

1.- Introducción!! Control de acceso en POSIX "! Concepto de usuario y grupo "! Tripletas: propietario, grupo, otros "! Protección de ficheros!! Control de acceso de Win32 "! Concepto de usuario y grupo "! Listas de control de acceso "! Protección de cualquier objeto del sistema #! Ficheros, procesos, hilos, buzones, tubos, "! Uso de descriptor de seguridad #! En estructura SECURITY_ATTRIBUTES Tema 8: Protección 5 1.- Introducción!! Protección: "! Conjunto de mecanismos del SO "! Garantizar cierto control en el acceso de usuarios (procesos) sobre los recursos del sistema!! Mecanismo: matrices de acceso DOMINIOS D1 D2 D3 Fichero1 Leer* Propietario Fichero2 Leer Escribir Leer Propietario Leer, Escr. Fichero3 Propietario Leer, Escr. RECURSOS Impresora Imprimir Imprimir Cambiar Tema 8: Protección 6 D1 D2 Cambiar D3 1.1.- Matrices de acceso 1.1.- Matrices de acceso DOMINIOS D 1 Fichero1 Leer* Fichero2 Leer Escribir RECURSOS Fichero3 Impresora Propietario Leer, Escr. Imprimir D1 D2 Cambiar D3 Dominio de protección!! En POSIX y en Win32: "! Dominios => usuarios y/o procesos "! Recursos => objetos utilizables. #! POSIX: sólo los ficheros #! Win32: cualquier objeto para el que se obtenga un descriptor D 2 D 3 Propietario recurso Leer Propietario Leer, Escr. Imprimir derechos de acceso Cambiar!! Dependen del tipo de recurso (leer, escribir, imprimir )!! Derechos especiales: Tema 8: Protección 7 "! Copia * -> el derecho indicado puede ser copiado a otros dominios "! Propietario -> dominio propietario del recurso. Podrá otorgar o quitar derechos sobre el recurso a otros dominios cambio dinámico de dominio!! Asignación de dominios puede ser dinámica "! Operación cambio entre dominios #! Añadir tantas columnas como dominios existan #! Cambio en casilla (i,j): proceso del dominio i (fila) podrá cambiar al dominio j (columna) Tema 8: Protección 8

1.1.- Matrices de acceso!! Utilización de matrices de acceso "! Complicado implementarlas como matrices #! Requieren excesivo espacio #! Poco manejables "! Opciones: #! listas de control de acceso:! Columna=> lista en el recurso al que gestiona! Componente lista: <dominio, derechos> #! listas de capacidades:! Fila => lista en el dominio al que va asociada! Componente lista: <recurso, derechos> Tema 8: Protección 9 1.1.- Matrices de acceso!! POSIX "! Listas de control de acceso #! Se comprimen y se dejan con sólo tres dominios:! propietario, grupo y otros. #! Sólo hay tres derechos posibles:! lectura, escritura y ejecución. #! Se corresponden con las palabras de protección de los ficheros "! Listas de capacidades #! Tabla de descriptores que mantiene cada proceso! Descriptor: guarda derechos de acceso sobre ese fichero!! Comprobación de permiso: "! Para obtener un descriptor se consulta la palabra de protección del fichero al abrirlo y se contrasta con el usuario y grupo del proceso. Tema 8: Protección 10 1.1.- Matrices de acceso!! Win32 "! Listas de control de acceso #! Asociadas a los objetos #! Sin comprimir : tantas componentes como dominios con acceso Indice 1.! Introducción 2.! Protección: Gestión 3.! Protección: Llamadas "! Listas de capacidades #! Son los descriptores de objeto (handle)!! Comprobación de permiso: "! Se debe comprobar la lista de control de acceso para poder obtener un handle Tema 8: Protección 11 Tema 8: Protección 12

!! Objetos creados en Win32 tienen parámetro SECURITY_ATTRIBUTES en llamada de creación typedef struct _SECURITY_ATTRIBUTES { DWORD nlength; LPVOID lpsecuritydescriptor; BOOL binherithandle; } SECURITY_ATTRIBUTES;!! Estructura SECURITY_DESCRIPTOR "! No podemos declarar variables de este tipo, ni ver su definición "! Se utilizan punteros y funciones que tratan estos punteros!! Utilización del descriptor de seguridad: para determinar "! quién posee el objeto (propietario grupo)!! Campo más importante: descriptor de seguridad lpsecuritydescriptor "! quién puede acceder a él y qué operaciones podrá realizar Tema 8: Protección 13 Tema 8: Protección 14!! Campos estructura SECURITY_DESCRIPTOR "! propietario: de tipo SID (Identificador de seguridad) "! grupo: Tipo SID #! Sólo existen grupos en los equipos pertenecientes a un dominio de red "! lista de control de acceso discrecional (DACL) #! Para decidir si un proceso puede realizar una acción o no #! Implantar matriz de acceso #! Con longitud variable "! lista de control de acceso del sistema (SACL) #! Para decidir si un acceso debe anotarse en el registro del sistema o no.!! Funciones más importantes: "! InitializeSecurityDescriptor() #! inicializarlo con los valores por omisión "! SetSecurityDescriptorOwner() #! establecer el campo del propietario "! SetSecurityDescriptorGroup() #! establecer el campo del grupo "! SetSecurityDescriptorDacl() #! establecer la DACL, una vez creada y rellena "! SetSecurityDescriptorSacl() #! establecer la SACL (creada y rellena)!! Consultar campos anteriores: Get- Tema 8: Protección 15 Tema 8: Protección 16

!!Listas de control de acceso: "! Cada ACL es una lista ordenada de entradas (ACEs) #! Contenido de un ACE:! SID (a quién afecta)! máscara de acceso (operaciones o derechos a asignar) "! 2 tipos de entradas #! Permitir el acceso #! Denegar el acceso Discretionary ACL Access Control Entry (Denied) "! Utilizar función InitializeAcl() para crear la lista y después ir añadiendo ACEs Tema 8: Protección 17 Access Control Entry (Allowed)..!! Listas de control de acceso "! Llamadas para añadir entradas #! AddAccessAllowedAce(): añade una entrada que permite el acceso sobre un objeto en su DACL #! AddAccessDeniedAce(): añade una entrada que deniega el acceso sobre un objeto en su DACL #! AddAuditAccessAce(): añade una entrada para registrar los accesos sobre un objeto en su SACL "! Otras llamadas relacionadas con las ACL #! DeleteAce(): Para eliminar una entrada #! GetAce(): Para consultar una entrada Tema 8: Protección 18!! Uso de las DACL "! Cada proceso tiene un token de acceso #! SID de usuario #! SIDs de los grupos a los que pertenece #! privilegios sobre ciertas operaciones! Si se tiene un privilegio la operación siempre se puede realizar, independientemente de lo que diga la DACL "! Al tratar de acceder a un objeto: Proceso Access Token User SID Group SID Privilegios.. 1.! El sistema comprueba los privilegios del token de acceso del proceso.! Si permiten el acceso, éste puede realizarse. 2.! Si no, se comprueban las entradas de la DACL por orden de inserción. Tema 8: Protección 19!! Uso de las DACL "! Las ACEs del DACL se insertan formando una pila "! Al comprobar permisos de acceso de un proceso, se revisan las ACEs por orden inserción (desde última insertada a primera) hasta que: #! Se acumulan los derechos de acceso necesarios #! Se deniega explícitamente el acceso #! Se llega al final del ACL => Implícitamente, acceso denegado Access Control Entry (Denied) Tema 8: Protección.. 20 Access Control Entry (Allowed)

!! Máscara de acceso "! Define los accesos de un usuario o grupo sobre un objeto. "! Contiene: #! Derechos específicos del objeto #! Derechos estándar (aplicados a todos los objetos)! STANDARD_RIGHTS_EXECUTE, SYNCHRONIZE, WRITE_DAC, STANDARD_RIGHTS_ALL... #! Derechos genéricos (SPECIFIC_RIGHTS_ALL)! GENERIC_READ! GENERIC_WRITE! GENERIC_EXECUTE! GENERIC_ALL Tema 8: Protección 21!! Token de acceso: "! Identificar al proceso al realizar las comprobaciones de protección "! Mantiene los siguientes campos: #! USER: SID del usuario. Representa al usuario del proceso #! GROUPS: SIDs de grupos a los que pertenece el usuario #! PRIVILEGES: Vector con los privilegios otorgados al proceso, indicando cuáles de ellos están habilitados #! OWNER: SID de propietario (asignarlo a los objetos creados) #! PRIMARY_GROUP: SID del grupo primario (asignarlo a los objetos creados) #! DEFAULT_DACL: DACL por defecto a asignar a objetos creados #! SOURCE: Estructura que identifica al servicio generador del token #! TYPE: Indica si el token es primario o de cambio de identidad #! IMPERSONATION_LEVEL: Niveles de cambio de identidad #! STATISTICS: Estadísticas Tema 8: Protección 22!! Privilegios "! Controlar el aceso a un objeto o servicio de forma más estricta que con el DACL "! Usarlos principalmente para acceder a recursos del sistema "! Acceso a servicios raramente necesitados por usuarios. #! Suelen tener acceso no habilitado por defecto "! Ejemplos: #! Realizar operaciones de backup #! Incrementar prioridad base de un proceso #! Cargar o descargar un driver de dispositivo #! Apagar el sistema #! Cambiar hora sistema!! Cambio de identidad (impersonation) "! Un proceso toma los atributos de seguridad de otro proceso "! Ej: un thread de un servidor suplanta al thread del cliente para actuar en su nombre y acceder a objetos o validar accesos "! Niveles de cambio de identidad #! SecurityAnonymous: el cliente no desea que el servidor obtenga información de identidad del cliente #! SecurityIdentification: el servidor puede obtener información del cliente, como SIDs y privilegios, pero no puede suplantarlo. #! SecurityImpersonation: el servidor puede suplantar al cliente en su sistema local "! Ejemplo: servidor de tubo con nombre utiliza función ImpersonateNamedPipeClient Tema 8: Protección 23 Tema 8: Protección 24

!! Token de acceso: funciones relacionadas "! OpenProcessToken(): obtener un descriptor al token del proceso #! OpenThreadToken(): Como el anterior, pero referido a un hilo "! GetTokenInformation(): obtener los campos (uno en cada invocación) que componen un token "! SetTokenInformation(): modificar los campos que componen el token (uno en cada invocación) "! AdjustTokenGroups(): modificar el campo de los grupos "! AdjustTokenPrivileges(): modificar los privilegios del token "! DuplicateToken(): Duplica un token, que podrá ser empleado para realizar cambios de identidad "! SetThreadToken(): Asigna un nuevo token a un hilo, consiguiendo así que trabaje para otro usuario. #! Realiza un cambio de identidad Tema 8: Protección 25!! Asignación de ACLs a objetos: 1.! Crear un nuevo descriptor de seguridad: InitializeSecurityDescriptor() 2.! Obtener el SID del usuario y/o grupo con LookupAccountName() #! Nombre del usuario para el que trabaja el proceso: GetUserName() 3.! Fijar SIDs en descriptor de seguridad: SetSecurityDescriptorOwner() y/o SetSecurityDescriptorGroup() 4.! Crear ACLs con InitializeAcl() #! ACL vacía == deniega acceso sobre todas las operaciones a todos!! 9.! Añadir entradas al ACL con AddAccessAllowedAce() y/o AddAccessDeniedAce() 10.!Instalar el ACL en el descriptor con SetSecurityDescriptorDacl() #! Si no se instala (no tiene DACL) => ACCESO PERMITIDO A TODOS!! 11.!Instalar el descriptor de seguridad en la estructura SECURITY_ATTRIBUTES empleada en la creación del objeto Tema 8: Protección 26!! Ejemplo: Programa que asigna una DACL para un fichero de nueva creación. Sólo funcionará en NTFS. Hay que denegar explícitamente a los usuarios o grupos que no van a tener acceso. "! En el ejemplo se deniega el acceso al usuario User2. #include <windows.h> #include <stdio.h> #include <malloc.h> #define DSZ 50 #define USZ 80 void fatal(char *msg) { DWORD dwmsglen; LPTSTR lpvmessage; dwmsglen = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpvmessage, 0, NULL); fprintf(stderr, "%s: %s", msg, lpvmessage); LocalFree(lpvMessage); ExitProcess(1); } Tema 8: Protección 27 Dacl.c parauladacl.c int main(void) { TCHAR szdomain[dsz], szuser[usz]; DWORD cbdomainsize=dsz, cbsidsize=dsz, cbusersize=usz; PSID psid,psid2; PACL pacl; HANDLE hfile; SID_NAME_USE snutype; SECURITY_DESCRIPTOR sd; SECURITY_ATTRIBUTES sa={sizeof(security_attributes), &sd, TRUE}; /* Primer paso: Crear el descriptor de seguridad. */ if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) ) fatal("error al inicilizar el descriptor de seguridad"); /* Segundo paso: Obtener el SID del usuario y de User2. */ psid = malloc(dsz); psid2 = malloc(dsz); if (psid==null psid2==null) fprintf(stderr, "Fallo al obtener memoria.\n"); Tema 8: Protección 28

if (!GetUserName(szUser, &cbusersize)) fatal("error al obtener el nombre de usuario"); if (!LookupAccountName(NULL, szuser, psid, &cbsidsize, szdomain, &cbdomainsize,&snutype)) { printf( "Sid size: %d. Dom size: %d.\n", cbsidsize, cbdomainsize); fatal("error en LookupAccountName"); } cbsidsize=dsz;cbdomainsize=dsz; if (!LookupAccountName(NULL, User2", psid2, &cbsidsize, szdomain, &cbdomainsize,&snutype)) {printf( "Sid size: %d. Dom size: %d.\n", cbsidsize, cbdomainsize); fatal("error en LookupAccountName 2"); } /* Tercer paso: Establecer el propietario en el descriptor. */ if (!SetSecurityDescriptorOwner(&sd, psid, FALSE) ) return 1; else printf("propietario fijado correctamente.\n"); /* Cuarto paso: Crear ACL. */ pacl = malloc(1024); if (!InitializeAcl(pacl, 1024, ACL_REVISION)) fatal("error en InitializeAcl()"); /* Quinto paso: Añadir entradas en DACL. Otorgamos derechos de lectura y escritura al propietario. Y denegamos el acceso a User2 */ if (!AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_READ GENERIC_WRITE, psid)) fatal("error en AddAccessAllowedAce()"); if (!AddAccessDeniedAce(pacl, ACL_REVISION, STANDARD_RIGHTS_ALL SPECIFIC_RIGHTS_ALL, psid2)) fatal("error en AddAccessDeniedAce()"); /* Sexto paso: Instalar la DACL en el descriptor. */ if (SetSecurityDescriptorDacl(&sd, TRUE, pacl, FALSE)) printf("dacl instalada correctamente.\n"); else return 1; Tema 8: Protección 29 Tema 8: Protección 30 Indice /* Séptimo paso: Instalar el descriptor en la estruct. SECURITY_ATTRIBUTES. Esto ya se hizo al declararla. */ // sa={sizeof(security_attributes), &sd, TRUE}; } /* Paso final. Crear el fichero y dejarlo vacío. */ hfile=createfile("nuevo", 0, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hfile==invalid_handle_value) fatal("error al crear el fichero"); CloseHandle(hFile); return 0; 1.! Introducción 2.! Protección: Gestión 3.! Protección: Llamadas Tema 8: Protección 31 Tema 8: Protección 32

!! InitializeSecurityDescriptor BOOL InitializeSecurityDescriptor( DWORD dwrevision);!! Inicializa un nuevo descriptor de seguridad, dejándolo completamente vacío.!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad "! dwrevision: Número de versión. Debe ser igual a SECURITY_DESCRIPTOR_REVISION!! GetUserName BOOL GetUserName( LPTSTR lpbuffer, //nombre usuario LPDWORD nsize); //tamaño buffer!! Devuelve el nombre del usuario asociado al hilo de ejecución actual "! lpbuffer: cadena donde dejará el nombre del usuario "! nsize: indica el tamaño máximo del buffer. Nos devuelve el tamaño real de la cadena devuelta!! Devuelve TRUE si éxito; FALSE si error (ej. buffer no suficientemente grande) Tema 8: Protección 33 Tema 8: Protección 34!! LookupAccountName: obtener el identificador de seguridad BOOL LookupAccountName( LPCTSTR lpsystemname, //nombre sistema (gestor cuentas) LPCTSTR lpaccountname, //nombre cuenta (usuario/grupo) PSID Sid, //identificador seguridad LPDWORD cbsid, //tamaño identificador LPTSTR ReferencedDomainName, //dominio de la cuenta LPDWORD cbreferenceddomainname, //tamaño buffer PSID_NAME_USE peuse); //tipo de SID!! Devuelve TRUE si éxito, FALSE si error!! Parámetros de entrada: nombre de sistema y un nombre de cuenta!! Salidas: SID asociado a dicha cuenta y el nombre del dominio donde existe la cuenta "! Grupos: sólo usarse en dominios de red "! Cuentas de usuario: usarse en dominios, en máquinas aisladas y grupos de trabajo Tema 8: Protección 35 "! Entradas #! lpsystemname: Nombre del sistema. Si NULL== máquina local #! lpaccountname: Nombre de la cuenta #! cbsid: tamaño máximo del buffer apuntado por Sid #! cbreferenceddomainname: tamaño máximo de ReferencedDomainName "! Salidas devueltas #! Sid: Puntero a estructura SID (identificador seguridad) #! cbsid: tamaño devuelto por el sistema en Sid, o el tamaño requerido si hubo error #! ReferencedDomainName: cadena donde se deja el nombre del dominio en el que existe la cuenta #! cbreferenceddomainname: tamaño del buffer anterior #! peuse: Puntero a un SID_NAME_USE en el que se devuelve el tipo de SID retornado (usuario, grupo, dominio, alias, ). Tema 8: Protección 36

!! SetSecurityDescriptorOwner BOOL SetSecurityDescriptorOwner( PSID powner, BOOL bownerdefaulted);!! Establece la información relativa al propietario en un descriptor de seguridad!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! powner: Puntero a estructura SID con la información del nuevo propietario "! bownerdefaulted: indica si el SID ha sido obtenido vía algún mecanismo por omisión!! GetSecurityDescriptorOwner BOOL GetSecurityDescriptorOwner( PSID *powner, LPBOOL lpbownerdefaulted);!! Obtiene la información relativa al propietario en un descriptor de seguridad!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! powner: Puntero a una estructura SID con la información del propietario "! lpbownerdefaulted: Puntero a un valor booleano que indica si el SID fue obtenido vía algún mecanismo por omisión Tema 8: Protección 37 Tema 8: Protección 38!! SetSecurityDescriptorGroup BOOL SetSecurityDescriptorGroup( PSID pgroup, BOOL bgroupdefaulted);!! Establece la información relativa al grupo en un descriptor de seguridad!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! pgroup: Puntero a una estructura SID con la información del nuevo grupo "! bgroupdefaulted: Valor booleano que indica si el SID ha sido obtenido vía algún mecanismo por omisión Tema 8: Protección 39 BOOL GetSecurityDescriptorGroup( PSID *pgroup, LPBOOL lpbgroupdefaulted);!! Obtiene la información relativa al grupo en un descriptor de seguridad!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! pgroup: Puntero a una estructura SID con la información del grupo "! lpbgroupdefaulted: Puntero a un valor booleano que indica si el SID fue obtenido vía algún mecanismo por omisión Tema 8: Protección 40

!! SetSecurityDescriptorDacl BOOL SetSecurityDescriptorDacl( BOOL bdaclpresent, PACL pdacl, BOOL bdacldefaulted);!! Instala una DACL en un descriptor de seguridad "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! bdaclpresent: indica si el descriptor de seguridad tiene una DACL #! Si TRUE => se instalará la DACL indicada en el tercer parámetro #! Si FALSE => se eliminará cualquier DACL existente en el descriptor. Resto de parámetros no serán tenidos en cuenta "! pdacl: Puntero a la DACL a instalar #! Si NULL, se asigna una DACL por omisión que permite cualquier acceso a cualquier proceso "! bdacldefaulted: Flag que indica si la DACL fue obtenida gracias a algún mecanismo por omisión Tema 8: Protección 41!! GetSecurityDescriptorDacl BOOL GetSecurityDescriptorDacl( LPBOOL lpbdaclpresent, PACL *pdacl, LPBOOL lpbdacldefaulted);!! Obtiene la DACL existente en un descriptor de seguridad!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! Resto parámetros igual que función anterior Tema 8: Protección 42!! SetSecurityDescriptorSacl BOOL SetSecurityDescriptorSacl( BOOL bsaclpresent, PACL psacl, BOOL bsacldefaulted);!! Instala una SACL en un descriptor de seguridad!! Devuelve TRUE si éxito; FALSE si error "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! bsaclpresent: Valor booleano que indica si el descriptor de seguridad tiene una SACL o no. #! Si TRUE se instala la SACL dada en el tercer parámetro #! Si FALSE, se elimina cualquier SACL existente en el descriptor. Resto de parámetros no cuentan "! psacl: Puntero a la SACL a instalar #! Si NULL se asigna una SACL nula "! bsacldefaulted: indica si la SACL fue obtenida con algún mecanismo por omisión Tema 8: Protección 43!! GetSecurityDescriptorSacl BOOL GetSecurityDescriptorSacl( LPBOOL lpbsaclpresent, PACL *psacl, LPBOOL lpbsacldefaulted);!! Obtiene la SACL existente en un descriptor de seguridad "! psecuritydescriptor: Puntero al descriptor de seguridad a modificar "! Resto parámetros obtienen la información establecida en la llamada anterior Tema 8: Protección 44

!! InitializeAcl BOOL InitializeAcl( PACL pacl, DWORD nacllength, DWORD dwaclrevision);!! Crea una nueva estructura de tipo ACL "! pacl: Puntero al buffer donde se creará la ACL "! nacllength: Tamaño del buffer #! Valor superior al que requerirá la estructura inicial y todas las entradas que se añadan posteriormente a la lista #! Normalmente un valor de 1 KB suele ser suficiente "! dwaclrevision: versión de soporte a ACLs (ACL_REVISION)!! AddAccessAllowedAce BOOL AddAccessAllowedAce( PACL pacl, DWORD dwacerevision, DWORD AccessMask, PSID psid);!! Añade una entrada que concede derechos de acceso a una DACL "! pacl: Puntero a la DACL a ampliar "! dwacerevision: Versión de la gestión de ACLs (ACL_REVISION) "! AccessMask: Máscara con los derechos de acceso a otorgar en esta entrada "! psid: Puntero a un SID que identifica al usuario o grupo que recibirá los derechos de acceso Tema 8: Protección 45 Tema 8: Protección 46!! AddAccessDeniedAce BOOL AddAccessDeniedAce( PACL pacl, DWORD dwacerevision, DWORD AccessMask, PSID psid);!! Añade una entrada que deniega derechos de acceso a una DACL "! pacl: Puntero a la DACL a ampliar "! dwacerevision: Versión de la gestión de ACLs (ACL_REVISION) "! AccessMask: Máscara con los derechos de acceso a denegar en esta entrada "! psid: Puntero a un SID que identifica al usuario o grupo que no podrá utilizar los derechos de acceso Tema 8: Protección 47!! AddAuditAccessAce BOOL AddAuditAccessAce( PACL pacl, //puntero a SACL DWORD dwacerevision, //versión DWORD dwaccessmask, //derechos acceso a filtrar PSID psid, //SID usuario o grupo BOOL bauditsuccess, //auditar acceso con éxito?? BOOL bauditfailure); //auditar acceso fallido??!! Añade una entrada a una SACL "! dwacerevision: Versión de la gestión de ACLs (ACL_REVISION) "! AccessMask: Máscara con los derechos de acceso a filtrar en esta entrada "! bauditsuccess: indica si serán registrados (TRUE) o no (FALSE) los accesos con éxito "! bauditfailure: indica si serán registrados o no los accesos fallidos!! Administrador: utilizar EVENT VIEWER (eventvwr.exe) para obtener el log y manipularlo (Aplicación Visor de Sucesos ) Tema 8: Protección 48

!! AddAce BOOL AddAce( PACL pacl, DWORD dwacerevision, //revisión (ACL_REVISION) DWORD dwstartingaceindex, //posición donde añadir LPVOID pacelist, //listado de ACEs DWORD nacelistlength ); //tamaño del listado!! Añade una o más entradas de una ACL de cualquier tipo "! pacl: Puntero a la ACL donde se añaden las entradas "! dwstartingaceindex: posición inicial donde añadir las entradas #! Valor 0 => inicio de la lista #! Valor MAXDWORD => final de la lista "! pcacelist: puntero al listado de ACEs a añadir!! DeleteAce BOOL DeleteAce( PACL pacl, DWORD dwaceindex);!! Elimina una entrada de una ACL de cualquier tipo "! pacl: Puntero a la ACL donde se efectuará el borrado "! dwaceindex: Indica el número de entrada a eliminar #! Numeración se inicia en cero #! Usar función GetAclInformation() para averiguar cuántas entradas tiene una ACL Tema 8: Protección 49 Tema 8: Protección 50!! GetAce BOOL GetAce( PACL pacl, DWORD dwaceindex, LPVOID *pace);!! Obtiene una entrada de una ACL de cualquier tipo "! pacl: Puntero a la ACL a consultar "! dwaceindex: número de entrada a obtener "! pace: Puntero que será modificado por el sistema para que haga referencia a la entrada pedida!! Llamadas analizadas permiten realizar el mismo trabajo que la palabra de protección en POSIX "! Último parámetro de función open() de POSIX cuando creaba un nuevo fichero "! Asignar una palabra de protección (lista de control de acceso) a un objeto!! LLamadas para permitir implantar algo similar al chmod() y un chown() de POSIX "! GetFileSecurity() "! SetFileSecurity() Tema 8: Protección 51 Tema 8: Protección 52

!! GetFileSecurity BOOL GetFileSecurity( LPCTSTR lpfilename, SECURITY_INFORMATION RequestedInformation, DWORD nlength, LPDWORD lpnlengthneeded);!! Obtiene la información especificada sobre la protección de un fichero o directorio. "! Proceso invocante con derecho READ_CONTROL sobre el fichero o directorio "! lpfilename: Nombre del fichero o directorio "! RequestedInformation: Tipo de información solicitada. Especificar como un o lógico de los siguientes valores: #! OWNER_SECURITY_INFORMATION #! GROUP_SECURITY_INFORMATION #! DACL_SECURITY_INFORMATION #! SACL_SECURITY_INFORMATION Tema 8: Protección 53!! Parámetros (cont.): "! psecuritydescriptor: Puntero a un buffer que mantiene un descriptor de seguridad. #! El sistema lo rellena con la información solicitada "! nlength: Tamaño del buffer anterior "! lpnlengthneeded: indica #! si la copia se realizó con éxito (valor 0) #! el tamaño necesario en caso de no haber podido realizar la copia Tema 8: Protección 54!! SetFileSecurity BOOL SetFileSecurity( LPCTSTR lpfilename, SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR psecuritydescriptor);!! Modifica la información de protección de un fichero o directorio. "! Proceso debe tener los siguientes derechos sobre el fichero o directorio: #! WRITE_OWNER: Para modificar el propietario #! WRITE_DAC: Para modificar la DACL #! SE_SECURITY_NAME: Para modificar la SACL "! lpfilename: Nombre del fichero o directorio "! RequestedInformation: Tipo de información a modificar. #! OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION #! DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION "! psecuritydescriptor: descriptor de seguridad con la información a modificar Tema 8: Protección 55 Proceso Access Token User SID Group SID Privilegios.. Protección Atributos de seguridad Objeto Discretionary ACL Access Control Entry (Denied) Access Control Entry (Allowed).. Atributos Seguridad Owner SID Group SID DACL SACL SECURITY_DESCRIPTOR sd; sa={sizeof(security_attributes), &sd, TRUE}; Security Descriptor 1)! InitializeSecurityDescriptor 2)! SetSecurityDescriptorOwner 3)! SetSecurityDescriptorGroup 4)! InitializeAcl Construcción de un Security Descriptor 5)! AddAccessDeniedAce... 6)! AddAccessAllowedAce... 7)! SetSecurityDescriptorDacl Tema 8: Protección 56

Ejemplos Tema 8: Protección 57