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 3Lección 2: "Control de ataques de hackers"
Parte 1 /
Parte 2 /
Parte 3Lección 3: “Desbordamientos del búfer: exploits y protección”
Parte 1 /
Parte 2 /
Parte 3Lecció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?