Práctica de codificación segura: la experiencia de aprendizaje de un desarrollador en el desarrollo de software seguro

El artículo original apareció en el blog de OpenSSF. El autor, Harimohan Rajamohanan, es arquitecto de soluciones y desarrollador full-stack en Wipro Limited. Obtenga más información sobre el curso Desarrollo de software seguro (LFD121) de Linux Foundation. Cualquier software en estos días está bajo constante ataque, por lo que los arquitectos y desarrolladores de software deben centrarse en pasos prácticos para mejorar la seguridad de la información. Hay muchos materiales disponibles en línea que abordan varios aspectos de las prácticas de desarrollo seguro, pero están dispersos en varios artículos y libros. Recientemente me encontré con un curso desarrollado por Open Source Security Foundation (OpenSSF), que es parte de Linux Foundation, y está dirigido a desarrolladores de software, profesionales de DevOps, desarrolladores de aplicaciones web y otras personas interesadas en usar las mejores prácticas para aprender de desarrollo de software seguro. Mi experiencia de aprendizaje en el curso DESARROLLO DE SOFTWARE SEGURO (LFD121) fue positiva e inmediatamente comencé a aplicar estos aprendizajes en mi trabajo como arquitecto y desarrollador de software. «Un truco útil para crear sistemas seguros es pensar como un atacante antes de escribir el código o realizar un cambio en el código» – DESARROLLO DE SOFTWARE SEGURO (LFD121)
Mi comprensión anterior de la seguridad del software se centró principalmente en la autenticación y autorización del usuario. En este contexto, las prácticas de codificación segura que seguí se limitaron a: ninguna lectura no autorizada, ninguna modificación no autorizada, posibilidad de probar que alguien hizo algo, auditoría y registro. Casi todo el desarrollo de aplicaciones hoy en día depende del software de código abierto, y es importante que los desarrolladores validen la seguridad de la cadena de colaboradores de código abierto y sus dependencias. Las recientes revelaciones de vulnerabilidades y ataques a la cadena de suministro me han abierto los ojos sobre la posibilidad de que existan vulnerabilidades en el software de código abierto. El enfoque natural de la mayoría de los desarrolladores es lograr que la lógica comercial funcione e implementar el código sin errores funcionales. El curso me brindó una descripción general completa de las prácticas de desarrollo seguro que se deben seguir para defenderse contra los tipos de ataques que se encuentran en el software moderno.

Contenidos

¿Qué significa realmente la gestión de riesgos?

El curso proporciona consejos prácticos detallados sobre cómo considerar la seguridad como parte de los requisitos de un sistema. Como parte de varios integradores de sistemas globales durante más de una década, se me ha asignado la tarea de desarrollar software de aplicación para mis clientes. Los requisitos funcionales generalmente se escribieron en dichos proyectos, pero cubrieron solo algunos aspectos de seguridad relacionados con la autenticación y autorización del usuario. La documentación detallada de los requisitos de seguridad ayuda a los desarrolladores y futuros mantenedores del software a tener una idea de lo que el sistema está tratando de lograr en materia de seguridad.

Hallazgos clave para la evaluación de riesgos:

Analice los fundamentos de seguridad, incluida la gestión de riesgos, la tríada «CIA» y los requisitos. Aplicar principios de diseño seguro, como actualizar dicho software, documentar los requisitos de alta seguridad en un solo lugar

Principios de diseño seguro al diseñar una solución de software

Los principios de diseño son pautas basadas en la experiencia y la práctica. El software es generalmente seguro si aplica principios de diseño seguro. Este curso cubre una amplia gama de principios de diseño relacionados con los componentes en los que confía y los componentes en los que no confía. Los principios clave que aprendí en el curso y que me guían en mis áreas de diseño de software hoy en día son: El usuario y el programa deben operar con los mínimos privilegios. Esto limitará el daño de errores o ataques. Cualquier acceso a los datos o intento de manipulación debe ser verificado y autorizado mediante un mecanismo ineludible. El acceso a los sistemas debe basarse en más de una condición. ¿Cómo prueba que la identidad del usuario autenticado es quien dice ser? El software debe admitir la autenticación de dos factores. La interfaz de usuario debe estar diseñada para ser fácil de usar para garantizar que los usuarios utilicen los mecanismos de protección de forma rutinaria y automática correctamente. Es importante comprender con qué tipo de atacantes espera luchar.

Algunos ejemplos de cómo he aplicado los principios de diseño seguro en mis diseños de soluciones:

Las soluciones que creo a menudo usan una base de datos. Usé el comando SQL GRANT para limitar el permiso que obtiene el programa. En particular, a ningún programa se le concede el privilegio DELETE. E implementé un mecanismo de eliminación temporal en el programa que establece la columna active=false en la tabla de casos de uso de eliminación. Los diseños de software recientes que he realizado se basan en una arquitectura de microservicios, donde existe una clara separación entre la GUI y los servicios de back-end. Cada parte de la solución total se autentica por separado. Esto minimiza la superficie de ataque. La validación de entrada del lado del cliente se limita a contrarrestar errores accidentales. Sin embargo, la validación de entrada real se lleva a cabo en el lado del servidor. Los puntos finales de la API validan minuciosamente todas las entradas antes de procesarlas. Por ejemplo, una API PUT no solo valida las entradas de cambios de recursos, sino que también garantiza que el recurso exista en la base de datos antes de continuar con la actualización. Las actualizaciones solo están permitidas si el usuario que usa la API tiene permiso para hacerlo. No se puede acceder directamente a las bases de datos para que las utilice una aplicación cliente. Todos los secretos, como las claves criptográficas y las contraseñas, se mantienen fuera del programa en una bóveda segura. Esto es principalmente para evitar la filtración de secretos del código fuente en los sistemas de control de versiones. Comencé a buscar la insignia de mejores prácticas de OpenSSF mientras elegía bibliotecas y software de código abierto en mis programas. También busco el estado de seguridad del software de código abierto comprobando la puntuación de los cuadros de mando de OpenSSF. Otra práctica que sigo cuando uso software de código abierto es comprobar si se mantiene el software. ¿Hay lanzamientos o anuncios recientes de la comunidad?

Prácticas de codificación seguras

En mi opinión, este curso cubre casi todos los aspectos de las prácticas de codificación segura en las que debe centrarse un desarrollador. Las áreas clave de enfoque incluyen: Validación de entrada Cómo se validan los números Problemas clave con el texto, incluidos Unicode y locales Uso de expresiones regulares para validar la entrada de texto Importancia de minimizar las superficies de ataque Valores predeterminados seguros y arranque seguro. Por ejemplo, aplique la validación de entrada de API a los ID para garantizar que existan registros correspondientes a esos ID en la base de datos. Esto reduce la superficie de ataque. Además, primero asegúrese de que el objeto en la solicitud de cambio de objeto exista en la base de datos. Procesar los datos de forma segura. Es importante tratar los datos que no son de confianza como peligrosos. Evitar las credenciales predeterminadas y codificadas. programas OS-Command-Injection Manejar de forma segura los nombres y las rutas de los archivos Enviar resultados de forma segura Enviar resultados de forma segura Cómo contrarrestar los ataques y las plantillas Cross-Site Scripting (XSS).

Conclusión

“La seguridad es un proceso, un viaje, y no un simple punto final” – DESARROLLO DE SOFTWARE SEGURO (LFD121)
Este curso le brinda una guía práctica para desarrollar software seguro teniendo en cuenta los requisitos de seguridad, los principios de diseño seguro, los errores comunes de implementación, las herramientas para detectar problemas antes de que se envíe el código y tratar los informes de vulnerabilidad de inmediato. Recomiendo este curso y certificación a todos los desarrolladores.

Sobre el Autor

Harimohan Rajamohanan es Arquitecto de Soluciones y Desarrollador Full Stack, Open Source Program Office, Lab45, Wipro Limited. Es un entusiasta del software de código abierto y ha trabajado en áreas como la modernización de aplicaciones, la transformación digital y la computación nativa en la nube. El enfoque principal está en la seguridad y la observabilidad de las cadenas de suministro de software.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.