Curso MIT "Seguridad de sistemas informáticos". Lección 4: "Compartir privilegios", Parte 3

Instituto de Tecnología de Massachusetts. Conferencia Curso # 6.858. "Seguridad de los sistemas informáticos". Nikolai Zeldovich, James Mickens. Año 2014


Computer Systems Security es un curso sobre el desarrollo e implementación de sistemas informáticos seguros. Las conferencias cubren modelos de amenazas, ataques que comprometen la seguridad y técnicas de seguridad basadas en trabajos científicos recientes. Los temas incluyen seguridad del sistema operativo (SO), características, gestión del flujo de información, seguridad del idioma, protocolos de red, seguridad de hardware y seguridad de aplicaciones web.

Lección 1: "Introducción: modelos de amenaza" Parte 1 / Parte 2 / Parte 3
Lección 2: "Control de ataques de hackers" Parte 1 / Parte 2 / Parte 3
Lección 3: “Desbordamientos del búfer: exploits y protección” Parte 1 / Parte 2 / Parte 3
Lección 4: “Separación de privilegios” Parte 1 / Parte 2 / Parte 3

Entonces, nuestro dibujo representa una "obra de arte", que sus creadores trataron de proteger de las amenazas. En su caso, creo que estaban muy preocupados, porque al crear el sitio de citas okcupid.com , realmente querían asegurarse de que la reputación de los usuarios del sitio no se vería afectada por la divulgación de datos personales. De una conversación con uno de los desarrolladores del sitio que escribió el artículo sobre esto, se sabe que en realidad no se vieron comprometidos. Al menos, no se produjeron fugas de datos debido al uso de la arquitectura OKWS y en parte debido a la supervisión de la actividad maliciosa.

La razón por la cual las personas no dividen sus aplicaciones en componentes más pequeños es porque este proceso requiere cierto esfuerzo. Es necesario seleccionar todas las partes del código, definir interfaces claras entre ellas y decidir a qué datos debe tener acceso cada componente. Si decide implementar una nueva función, tendrá que cambiar los datos a los que tiene acceso cada componente del programa, para otorgarle nuevos privilegios o seleccionar algunos, y así sucesivamente. Por lo tanto, este es un proceso que consume bastante tiempo.



Intentemos comprender cómo está diseñado el servidor web, y quizás una forma de hacerlo es hacer un seguimiento de cómo el servidor OKWS procesa la solicitud http. Entonces, similar al que se muestra en la figura anterior, tenemos un navegador web que quiere ir a okcupid.com . Los desarrolladores del proyecto del sitio imaginaron que tendrían un montón de máquinas, pero solo veremos la interfaz del sitio donde funcionará OKWS y otra máquina en segundo plano que almacenará la base de datos. Esta segunda máquina usa MySQL porque es un buen software para muchas tareas. Quieren proteger realmente estos datos porque es realmente difícil llegar a un disco o base de datos sin procesar con datagramas sin procesar.

Entonces, ¿cómo funciona la solicitud, cómo la procesa el servidor OKWS ? Primero, llega y es procesado por un proceso llamado okd para el despachador de OKWS . Comprueba que pide esta solicitud y luego hace un par de cosas. Como es posible que primero deba registrar esta solicitud, la redirige a un componente llamado oklogd , después de lo cual deberá crear algunas plantillas, y puede ser necesario crearlas incluso antes de que llegue la solicitud. Y hace otro componente llamado pubd .



Y finalmente, hay un servicio específico al que se envía esta solicitud, por lo que en okd hay una tabla del conjunto de servicios que admite. Presumiblemente, esta solicitud llega a uno de estos servicios, por lo que después de revisar okd redirigirá esta solicitud a un proceso de servicio svc específico. Este servicio hará exactamente lo que la solicitud requiere, por ejemplo, suscribir al usuario al boletín de noticias, o permitir ver el directorio de usuarios de ocupid , usar la base de datos, etc.

Y para esto, probablemente necesite el servicio para dejar la información de la aplicación en el registro del componente oklogd . Y al final del día, debería "hablar" con la base de datos. Los creadores del sitio han implementado este proceso de "comunicación" de forma un poco diferente de lo que suele ocurrir en Apache , donde simplemente se comunica con la base de datos y emite consultas SQL arbitrarias. Se les ocurrió este concepto de un proxy de base de datos, dbproxy , que se encuentra frente a la base de datos MySQL y acepta solicitudes del servicio svc para ejecutarlos. Creo que esta ilustración básicamente muestra cómo funciona OKWS .



Hay otro componente que inicia todo esto, se llama okld , y es responsable de iniciar todos los procesos en la interfaz de este servidor web. Espero que algunas de estas cosas le resulten familiares, porque esta es exactamente la arquitectura que se consideró en el laboratorio. Parece que es un buen diseño. No tenía pubd , logd y dbproxy en LR , pero tenía okd y svc . ¿Tiene preguntas sobre OKWS ?

Audiencia: ¿entendimos correctamente que dbproxy no acepta consultas SQL, sino un tipo diferente de consulta?

Profesor: sí, claro! ¿Cómo se ve esta interfaz? No describen esto con gran detalle, pero una cosa que podría hacer con este dbproxy es almacenar muchos argumentos para las plantillas de consulta SQL . Por ejemplo, podría ser una plantilla de consulta de búsqueda para sus amigos, seleccionándolos por ID .



Supongamos que hay una plantilla como "seleccione ^ ID de su lista de amigos, donde ^ ID ="% S " . Supongamos que desea encontrar a Alice entre sus amigos y enviar una solicitud S , donde el argumento es " Alice " . Deje que nuestra aplicación, disponible en la interfaz, sepa que dbproxy está listo para ejecutar tres tipos de solicitudes en su nombre. Si desea ejecutar la consulta No. 1, y su argumento es "Alice" , entonces le da acceso a la base de datos.

Audiencia: ¿ puede un usuario externo al nivel de un navegador web enviar dicha solicitud a la base de datos o todo se aplica solo a los usuarios internos de la red?

Profesor: sí, tal vez. Entonces, ¿cómo funciona? De hecho, es extraño que esta base de datos esté en una máquina separada, ¿porque podría conectarse a la base de datos OKWS o al servidor MySQL ? Entonces, ¿qué está deteniendo esto?

Audiencia: cortafuegos?

Profesor: sí, probablemente en algún nivel. Los desarrolladores no describen esto con demasiado detalle, pero es probable que haya alguna red interna en la segunda máquina, y hay un cambio entre la interfaz y la base de datos que no se puede acceder desde el mundo exterior. De hecho, ambas máquinas están en la misma red, pero hay un firewall Fw que tiene ciertas reglas. Quizás sean que solo puede conectarse a esta computadora de interfaz a través del puerto 80, pero no directamente al servidor interno. Esta es una de las opciones de protección.



Otro, probablemente, es que cuando se conecta a este proxy de base de datos dbproxy , debe proporcionar un token o clave criptográfica de 20 bytes, y si no lo proporciona, dbproxy rechazará su conexión. Entonces, la regla es que abra una conexión TCP, envíe sus 20 bytes y, si están equivocados, la conexión se cierra. Este, creo, es el significado de tal diseño de sistema.

Entonces, tratemos de descubrir cómo se aíslan estos diferentes procesos aquí. ¿Cómo puede asegurarse de que todos estos componentes no se abruman entre sí?

Audiencia: ¿ diferentes derechos de root y diferentes ID de usuario?

Profesor: sí, casi cada uno de estos componentes funciona como un uid diferente, así que aquí, en la descripción del sistema, hay una tabla completa que describe para cada componente dónde funciona y con qué uid . Entonces podemos escribir que okd tiene su propio uid , pubd tiene su propio uid y oklogd también tiene su propio uid .

Okld funciona como root , lo cual es bastante infructuoso, pero quizás esto no sea un gran problema. Luego hay un montón de identificadores de usuario asignados dinámicamente para cada servicio, por ejemplo, ID 51001, etc.



Por lo tanto, esto asegura que cada servicio no pueda interferir con los procesos de otros servicios. Chroot también se usa ampliamente aquí, por lo que algunos de estos componentes tienen derechos de chroot en directorios separados. Por ejemplo, okd y svc están dotados de derechos de chroot comunes en algunos directorios. ¿Por qué crees que estos dos componentes tienen un componente separado y no común con otros componentes chroot ?

Audiencia: porque okd no tiene privilegios de root.

Profesor: sí, pero ¿por qué no ponen pubd , oklogd y todos los demás en el mismo chroot ?

Público: ¿es posible que si los servicios necesitan compartir una gran cantidad de datos, deberían aislarse unos de otros?

Profesor: tal vez. Creo que deberían compartir algunos datos, pero estos datos no están en los archivos, se transfieren a través de sockets desde okd a los servicios. Pero, de hecho, ninguno de estos componentes almacena nada interesante en el sistema de archivos.

Por lo tanto, no hay nada interesante en el directorio chroot , y creo que los chicos de OKWS simplemente decidieron reducir los gastos improductivos para chroot , como la necesidad de crear una copia del directorio. Quizás también querían deshacerse de algunos gastos generales de administración para cada comando chroot . Pero como no hay archivos reales aquí, entonces todo está en orden.

La razón por la que estos chicos asignaron diferentes chroot para los componentes del entorno es debido a algunas cosas interesantes. Puede haber plantillas, pero aquí, tal vez, hay un archivo de registro, por lo que no querrían que el archivo de registro se lea accidentalmente, y cosas por el estilo.

Público: ¿Estos servicios tienen archivos, por ejemplo, como aspx ?

Profesor: como se describe en el artículo, el servicio es un único binario compilado de C ++ , por lo que, de hecho, no hay archivos adicionales.

Hay plantillas, pero en realidad se transmiten a través de este mecanismo extraño: pubd tiene plantillas en su directorio, las muestra en algún pre-computadora, formulario de inicio en okd , y okd ya proporciona plantillas para todos los servicios a través de llamadas RPC . Por lo tanto, se sientan en la memoria, pero en realidad son inaccesibles directamente a través del sistema de archivos. Este es un diseño algo paranoico cuando ni siquiera puedo leer las plantillas.
Entonces, ¿cuál es el punto de separar todos estos componentes? ¿Por qué necesitamos un oklogd separado?

Audiencia: ¿ eliminar la posibilidad de sobrescribir o recortar el diario?

Profesor: sí, así que realmente queremos asegurarnos de que si algo sale mal, el diario, al menos, no se corromperá. Por lo tanto, hay un archivo de registro separado que este uid puede escribir, y todos los mensajes de registro se envían como RPC para este servicio de registro. E incluso si todo lo demás se arruina, bueno, con la excepción de okld , la revista permanecerá ilesa.

Público: ¿qué sucede si accidentalmente encuentra una manera de leer la revista y no ve lo que otros han hecho con ella?

Profesor: no, creo que si "pirateaste" algún servicio, pubd u otra cosa, puedes escribir cualquier cosa en el diario. Por lo tanto, crear una entrada de oklogd separada tiene sentido. En realidad, oklogd es un proceso separado y no solo se actualiza adjuntando archivos como archivos de solo agregado . Por lo tanto, oklogd no puede agregar información adicional a cada entrada de registro, porque si el sistema operativo admite el archivo de solo agregar , no sabrá que alguien ha escrito en el archivo cuando esto suceda. Mientras que oklogd pone una marca de tiempo para cada mensaje y le permite averiguar qué servicio realizó la grabación o si vino de okd . Por lo tanto, en realidad obtiene información adicional en este archivo de registro porque es un servicio separado.

¿Y cuál es el significado de la separación correcta y por qué debería funcionar con los derechos de root? Creo que hay varias razones para esto.

Audiencia: si no desea que nadie más actúe con privilegios de root, debe delegar la función de autenticación de usuario okld .



Profesor: si. Alguien tiene que configurar todo esto uid chroot , y necesita root para este Unix , por lo que okld proporciona esto. Esta es una de las razones. Algo mas?

Audiencia: ¿definición de 80 puertos?

Profesor: sí, por supuesto! Tienes que enlazar escuchando el puerto 80, que está bien y proporciona algo más?

Público: completa la apertura del archivo de registro de oklogd porque no queremos dejar oklogd abierto para evitar el acceso al archivo de registro.

Profesor: tal vez. Pero no sé si los desarrolladores realmente lo hicieron porque no miraron su código fuente. ¿Crees que okld abre el archivo de registro y lo pasa oklogd ? Posiblemente

Audiencia: porque de lo contrario, un atacante que comprometió oklogd podría borrar todo el registro.

Profesor: sí, es cierto. Tal vez desee abrirlo en modo de agregar y luego pasarlo oklogd , entonces tiene más garantías de seguridad para el registro. Esto es algo que no puede hacer sin privilegios de root.

Entonces, teníamos una pregunta sobre la tarea, qué sucederá cuando este token de 20 bytes se "filtre" para acceder a la base de datos. ¿Qué daño puede causar esto? ¿Deberíamos preocuparnos por esto?

Audiencia: en este caso, un atacante puede tomar el control de un servicio en particular.

Profesor: sí, claro, porque ahora puede conectarse y obtener todas las plantillas de consulta. En realidad parece bastante simple. Probablemente necesite comprometer uno de estos componentes para poder conectarse primero a la base de datos del servidor. Entonces, creo que si tiene este token y puede comprometer uno de estos componentes que se muestran en la figura, entonces podría usar todas estas consultas.

Ahora veamos cómo se puede mejorar este diseño de OKWS . Por ejemplo, podría asignar una unidad de uid separada para cada usuario, excepto para asignar un uid separado para cada servicio. Aquí, cada servicio, por ejemplo, noticias, búsqueda de amigos o creación de una cuenta, tiene un ID de usuario separado, pero cada usuario de OKWS no se representa como un UID de Unix . En realidad, no hay ID de usuario aquí, solo las ID de servicio están presentes aquí. ¿Crees que necesitas tener un uid diferente para cada cliente OKWS ?

Público: en este caso, resulta que si un usuario "piratea" un servicio, podrá acceder a todos los datos de otros usuarios de este servidor.

Profesor: sí, eso es correcto!

Público: pero si tuviera, de hecho, un servicio separado y un dbproxy separado para cada usuario, entonces sería imposible acceder a los datos de otras personas.

Profesor: sí, pero ¿podría ser este un modelo más fuerte? Creo que los desarrolladores de OKWS no dan ese paso por dos razones. El primero es el rendimiento. Si tiene un par de millones de usuarios del sitio okcupid , varios millones de procesos en ejecución y un par de millones de dbproxie , entonces los gastos generales de rendimiento son posibles. Y esto no permitirá lograr el mismo rendimiento que proporciona la arquitectura OKWS existente.

Audiencia: la descripción de OKWS dice que el rendimiento de este sistema es mejor que otros sistemas. ¿Cómo se logró esto?

Profesor: Creo que esto se debe en parte a que ajustaron su diseño a una carga de trabajo específica, además, escribieron todo esto en C ++ . Una alternativa es escribir algunas cosas en PHP , entonces es probable que obtenga beneficios en este frente.

Además, no tienen muchas de las características que tiene Apache . Tiene un diseño de propósito general, por lo que tiene muchos procesos de trabajo y los recarga de vez en cuando. Hay muchas conexiones TTP que aseguran la duración del proceso de conexión y mantienen su actividad. También aumenta el número de procesos que se ejecutan en el sistema. Apache se ha hecho más universal y puede hacer todo lo que le gustaría obtener del servidor de Internet, y los chicos de OKWS están más enfocados en resolver problemas específicos.

Pero creo que hay otros servidores web en estos días que probablemente puedan coincidir con el rendimiento de OKWS . Por ejemplo, Nginx es un servidor web muy optimizado que puede ejecutar en estos días. Si desea aplicaciones de alto rendimiento en el lado del servidor, probablemente desee que el proceso largo sea muy similar al servicio OKWS . Y para que tenga un mecanismo para una interfaz de puerta de enlace CGI común rápida para conectar un programa externo con un servidor web, o un tipo de protocolo que podría usarse en el lado del servidor para implementar esto incluso en Apache o Nginx . Por lo tanto, creo que muchas de estas ideas no son exclusivas de OKWS , sino que pueden implementarse en otros servidores web. Simplemente muestran que mejorar la seguridad no impide el uso de estos "trucos". Creo que comenzaron con un esquema similar a Apache , pero pensaron que no sería lo suficientemente seguro.

Así que creo que una de las razones por las cuales los creadores de OKWS no querían introducir privilegios separados para los usuarios fue una posible degradación del rendimiento.



Otra razón es que su modelo de aplicación completo "gira" en torno a un servicio que intenta acceder a los datos de cada usuario, como encontrar amigos en Okcupid o alguien a quien pueda invitar a una cita. Como resultado, este modelo de aislamiento de usuarios no tiene mucho sentido, porque, en última instancia, debe haber un servicio para el que envíe una solicitud, y examinará todos los demás datos para encontrar una coincidencia para su solicitud. Entonces, incluso si tiene identificadores de usuario o algún mecanismo para aislarlos, aún tiene que abrir el acceso al servicio para cada usuario.

Para otros servicios, como Gmail o Dropbox , que están mucho más centrados en un usuario específico y no ofrecen una capacidad abierta para compartir sus archivos, aislar a los usuarios puede proporcionar más ventajas. Por ejemplo, en el servidor de Dropbox hay un ID de usuario para cada cliente de Dropbox . Y si hay un proceso ejecutándose para usted y un proceso ejecutándose para otra persona, incluso utilizando un exploit malicioso, no podrá obtener la información de otras personas.
Ahora veamos si OKWS realmente logró mejorar la seguridad en dicho modelo de servidor. Para evaluar la seguridad, debe considerar cada componente del sistema y determinar qué tipo de ataques podrían dañarlo.

Comencemos con okd . Puede ser atacado con solicitudes a través del navegador, por ejemplo, causando un desbordamiento del búfer. c++, , - , okd . ?



: ?

: , , . ?

: , .

: , . , , , http , , , . , .

: ?

: , . , , , , , match.com . , , OkCupid . , - ? ?

: , , okd . , ?

: . , okd .

: , ?

: ! , , , , , . , , , , . , , . «» okd , , , .

: DOS-?

: , , , «» «» , DOS- - .

: okd , , …

: , . , , okd , okd , . okd , . , okd , , , , .

: .

: , . , okd . , oklogd ? ?

: .

: , , , ? pubd , , , - .

: , , «» oklogd .

: , . , , append-only , .

: , …

: , , . .

svc ? , , . , , okd oklogd . , , .

svc - -, , , . , , , .

okld ? , root. ? , . dbproxy . okld ? «»? ?

: , - ?

: , . , , . , , - , , , - . - . root- .

: -, , - dbproxy .

: !

: , , , RPC , , , , , ! .



: , . dbproxy ? , . , «» , dbproxy - .

: , svc

: , svc , !

: , , !

: , , «» , …

: dbproxy .

: . , dbproxy , .

Espero que entiendas lo que nos da compartir privilegios de aplicaciones. Y como podemos ver, esto no es perfecto. Hay muchas más cosas que pueden salir mal. Pero parece que esta solución es, en cualquier caso, mejor que diseñar aplicaciones individuales sin privilegios de acceso, donde comenzamos.


La versión completa del curso está disponible aquí .

Gracias por quedarte con nosotros. ¿Te gustan nuestros artículos? ¿Quieres ver más materiales interesantes? Apóyenos haciendo un pedido o recomendándolo a sus amigos, un descuento del 30% para los usuarios de Habr en un análogo único de servidores de nivel de entrada que inventamos para usted: toda la verdad sobre VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD 1Gbps de $ 20 o cómo dividir el servidor? (las opciones están disponibles con RAID1 y RAID10, hasta 24 núcleos y hasta 40GB DDR4).

Dell R730xd 2 veces más barato? ¡Solo tenemos 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV desde $ 249 en los Países Bajos y los Estados Unidos! Lea sobre Cómo construir un edificio de infraestructura. clase utilizando servidores Dell R730xd E5-2650 v4 que cuestan 9,000 euros por un centavo?

Source: https://habr.com/ru/post/es418211/


All Articles