Está en la página 1de 33

Índice

Introducción 5

Consideraciones iniciales para el desarrollo de aplicaciones 6

Metodologías de desarrollo 6

Ambientes de desarrollo 7

Consideraciones para un desarrollo seguro 8

Uso de librerías y frameworks de seguridad 8

Consultas seguras a las bases de datos 8

Codificar y escapar los datos 9

Validación de datos 10

Autenticación nivel 1: Contraseñas 10

Autenticación nivel 2: Multifactor 11

Autenticación nivel 3: Criptográfica 11

Implementar mecanismos de manejo de sesión 12

Uso de cookies para manejo de sesión 12

Uso de tokens de sesión 12

Identificación de datos 13

Datos en tránsito 13

Datos en reposo 13

Manejo de secretos 13

Desarrollo orientado a pruebas 13


Calidad de código 14

Detección preventiva 14

Modelo inicial de datos 14

Seeding de la base de datos 14

Implementar mecanismos de registros o logs 15

Manejo seguro de errores y excepciones 15

Compilación limpia 15

Aseguramiento y certificación de calidad 16

Tecnologías de preferencia 17

Lenguajes de programación 17

Almacenamientos de datos relacionales 18

Almacenamientos de datos no relacionales 18

Tareas de encolamiento 18

Tareas de registro eventos (logging) 18

Despliegue de aplicaciones 18

Para infraestructura como código 18

Uso de tecnologías 19

Lenguaje 19

Almacenamiento 19

Tareas fuera de línea o programadas 19

Formateo de código 20

Repositorios de código 20

Desarrollo y consumo de APIs 21

Ley de Transformación Digital (21.180) 21

Desacoplar clientes y servicios web 21

Uso de HTTP 21
Exposición y autenticación de servicios 22

Definición de URI de recursos 22

Uso del idioma en el código 23

Uso de contenedores en el despliegue 25

Licencias 26

GPLv2 y GPLv3 26

LGPLv3 26

Apache 2.0 26

Dominio Público (Creative Commons 0 y equivalentes) 27

Casos de uso de licencia 27

Buenas prácticas de licenciamiento 28

Actualizaciones a esta guía 29

Ejemplos 30

Ejemplo Dockerfile aplicación PHP 30

Ejemplo Gitlab-ci.yml 30

Ejemplo Github-action.yml 30
I. Introducción
La adopción de buenas prácticas es fundamental para todas las
etapas de desarrollo de un sistema o aplicación informática.

Esta guía técnica entrega los como seguridad, QA y finalmente el


lineamientos generales y deployment, así como su futuro uso en
recomendaciones específicas que producción.
deben seguir los equipos que
Para ello, es fundamental adoptar una
desarrollen software al interior de la
metodología de desarrollo de software
Administración del Estado y los equipos
rápida, flexible e incremental, para
de desarrollo de los proveedores,
minimizar el riesgo de desviaciones en
contribuyendo a la construcción de
su proceso de creación e
sistemas de alta calidad en todas las
implementación, y permitir las
instituciones.
adecuaciones tempranas, basadas en la
La adopción de buenas prácticas es retroalimentación de los usuarios o en
fundamental para todas las etapas de las modificaciones de los requisitos
desarrollo de un sistema o aplicación durante el proyecto.
informática. La mitigación de problemas
Los aspectos que serán abordados en
de software permite un uso correcto e
esta guía son:
íntegro de estos sistemas, ayudando al
usuario final a tener un recurso eficiente, Calidad del software, tanto en servicio
confiable, seguro y privado. Asimismo, implementado, como en código fuente
se minimizan los riesgos y costos de resultante.
mantención del sistema en horas
hombre. Entregas tempranas en base a
productos mínimos viables.
Al desarrollar software, se deben tener
en cuenta diversos factores que Comunicación efectiva dentro del
impactan directa e indirectamente en su equipo de desarrollo y también con los
correcto uso. Estos factores abarcan stakeholders.
desde la comunicación en el equipo de Uso de estándares comunes entre
desarrollo y pruebas, pasando por instituciones.
consideraciones dentro de la calidad del
código fuente, específicamente factores
II. Consideraciones iniciales para
el desarrollo de aplicaciones
Considerando que el ciclo de desarrollo podría no terminar nunca, se
sugiere utilizar todos o algunos de los siguientes ambientes para
cada proyecto: producción, staging (demo o certificación), test y
development (desarrollo), cada uno de ellos representado en una
rama del proyecto en el repositorio de código.

servidores y administración de
1. Metodologías de desarrollo
sistemas.
Para el análisis, desarrollo e
● Minimizar las diferencias entre los
implementación se sugiere utilizar
entornos de desarrollo y producción,
metodologías ágiles, incorporando al
posibilitando un despliegue
menos las recomendaciones de la
continuo para conseguir la máxima
metodología denominada The
agilidad.
Twelve-Factor App, con el objeto de
satisfacer, al menos, los siguientes ● Poder escalar la arquitectura o las
aspectos: prácticas de desarrollo sin cambios
significativos en términos de
● Usar formatos declarativos para la
herramientas.
automatización de la configuración.
Así es posible minimizar el tiempo y Se recomienda al equipo de desarrollo el
coste que supone que nuevos uso de metodologías ágiles, tales como
desarrolladores se unan al proyecto. Scrum o Kanban, Programación
Extrema, Modelamiento Ágil, Feature
● Tener un contrato claro con el
Driven Development (FDD) o cualquier
sistema operativo sobre el que se
otra que considere relevante; o bien
trabaja, ofreciendo la máxima
otras metodologías de desarrollo de
portabilidad entre los diferentes
productos como Shape Up.
entornos de ejecución.
Dado que actualmente las instituciones
● Disponer, por defecto, despliegues
pueden no contar con un equipo con los
en plataformas modernas en la
conocimientos de metodologías de
nube, obviando la necesidad de
desarrollo ágil u otras, se recomienda
iniciar las capacitación para trabajos
futuros y, de esta forma, iniciar los
nuevos proyectos con estas
metodologías y, con el tiempo, adquirir
la experiencia para aplicarla a proyectos
ya existentes.

2. Ambientes de desarrollo

Considerando que el ciclo de desarrollo


podría no terminar nunca, se sugiere
utilizar todos o algunos de los
siguientes ambientes para cada
proyecto: producción, staging (demo o
certificación), test y development
(desarrollo), cada uno de ellos
representado en una rama del proyecto
en el repositorio de código. Y de esta
forma, poder detectar rápidamente cuál
código es el que está en producción.
También se sugiere usar tags en el
repositorio para marcar los releases.

Al contar con los resguardos descritos


en esta guía, cada paso de un ambiente
a otro debiera propender a contar con
procedimientos de calidad de código,
para obtener un código revisado y apto
para su entrega en el ambiente en el que
es requerido.
III. Consideraciones para un
desarrollo seguro
Las librerías y frameworks de terceros confiables que incorporan
mecanismos de seguridad son fundamentales para evitar errores de
implementación en áreas en las que el desarrollador no se encuentre
tan familiarizado.

Algunas librerías y frameworks


1. Uso de librerías y frameworks
recomendados se encuentran en la
de seguridad
sección Tecnologías de Preferencia.
Se deben seleccionar librerías y
frameworks de autores confiables, con 2. Consultas seguras a las bases
mantención y desarrollo activo, y que de datos
sean ampliamente utilizadas (y por
Las vulnerabilidades de tipo SQL
ende, validadas).
injection ocurren cuando datos no
Las librerías y frameworks de terceros confiables son incorporados de forma
confiables que incorporan mecanismos dinámica a una consulta SQL (muchas
de seguridad son fundamentales para veces a través de la concatenación
evitar errores de implementación en directa de dos strings). Este tipo de
áreas en las que el desarrollador no se ataques permite a un adversario extraer,
encuentre tan familiarizado. modificar o eliminar datos desde la base
de datos e, incluso en ocasiones, tomar
Es importante inventariar, catalogar y
total control del sistema comprometido.
versionar dichas librerías y frameworks
para mantenerlas actualizadas y Para mitigar o prevenir este tipo de
prevenir vulnerabilidades en ellas. ataques, se deben implementar
medidas de protección acordes a la
Otra alternativa recomendada es
tecnología y plataforma utilizada:
encapsular la librería y exponer sólo la
funcionalidad requerida en el sistema En el caso de estar utilizando un
que se está desarrollando. lenguaje orientado a objetos, se sugiere
el uso de ORM debidamente probados

División de Gobierno Digital | Lineamientos para desarrollo de software 8


por la comunidad e industria . En el caso reemplazar un carácter por otro, se
de utilizar un ORM, se debe asegurar añade un carácter especial antes del
que la herramienta escogida no tenga dato a escapar, para prevenir
vulnerabilidades de inyección, e interpretaciones erróneas, por ejemplo,
implementar otros mecanismos de añadiendo un “\” antes de caracteres
defensa como codificar y escapar los como [“] (comillas dobles), para que sea
datos, como se explica en la próxima interpretado como texto y no como el
sección de esta guía. Adicionalmente, cierre de un string.
se sugiere validar que el ORM escogido
Es fundamental realizar este escapado
responda adecuadamente ante altas
y/o codificación de datos en un entorno
cantidades de transacciones.
confiable (en el servidor y no en el
En el caso de no utilizar ORM, se deben navegador del usuario), de forma tal, de
utilizar prepared statements para evitar el “doble escapado” que genera
prevenir posibles inyecciones de código errores de despliegue de los datos (por
SQL. ejemplo, si escapamos antes de
almacenar en la base de datos y
En el caso de contar con tecnología de
nuevamente cuando se despliega al
base de datos específica o legacy
usuario).
(Oracle, SQL Server, etc), en la cual se
utilicen procedimientos almacenados Para evitar ataques XSS se deben
directamente en el motor, éstos deben utilizar los mecanismos conocidos
ser securizados de forma correcta, por como Contextual Output Encoding, que
ejemplo, utilizando bind variables. nos permiten prevenir el despliegue de
contenido malicioso en el navegador del
3. Codificar y escapar los datos usuario.

Éstas son técnicas defensivas, cuyo Existen otros tipos de codificación y


objetivo es detener ataques de escape, tales como shell escaping, XML
inyección, ya sean SQL, XSS u otros. escaping, LDAP escaping y otros, que
Codificar consiste en transformar o podrán ser utilizados en la medida que
traducir ciertos caracteres especiales en sea necesario.
otros caracteres equivalentes pero
Un sistema debe considerar como
inofensivos para el intérprete. Por
potencialmente inseguros todos los
ejemplo, el carácter “<” se traduce en
datos que provengan desde fuera de la
“&lt;”.
aplicación, así como también los datos
Escapar caracteres es una técnica que provienen desde la base de datos
similar, con la diferencia que en lugar de (en caso que se haya modificado

División de Gobierno Digital | Lineamientos para desarrollo de software 9


maliciosamente la misma). Por ello, siempre realizados en el servidor y
deben ser correctamente codificados nunca del lado del cliente (por ejemplo,
y/o escapados siempre, pero sin olvidar no se debe realizar en el navegador del
el contexto de los datos, por ejemplo, si usuario). No se debe confundir un aviso
es HTML, datos alfanuméricos u otros. al usuario (por ejemplo, para alertar de
un campo mal ingresado) con la
Se deben considerar también las
validación de datos.
validaciones de datos, descritas a
continuación. La validación de datos no convierte
automáticamente a los datos en
4. Validación de datos seguros, por lo que se debe utilizar en
conjunto con otras defensas, tales
Ésta es una técnica para asegurar que como la parametrización de consultas y
sólo los datos con el formato correcto escapado de datos, mencionados
podrán ingresar al sistema a desarrollar. anteriormente.
Esta validación debe ser correcta, tanto
sintáctica como semánticamente. Por Para la validación de datos, incluyendo
ejemplo, si esperamos que en un campo datos complejos, tales datos
se puedan ingresar sólo dígitos, no serializados, HTML u otros, se deberían
debemos aceptar otro tipo de utilizar librerías apropiadas para ello
caracteres (validación sintáctica). La (HTML Purifier, Bleach, entre otras).
validación semántica es un poco más
compleja y consiste en validar que los 5. Autenticación nivel 1:
datos tengan sentido en el contexto de Contraseñas
la aplicación, por ejemplo, una fecha de
Las aplicaciones deben exigir al usuario
inicio no podría estar después de una
el uso de contraseñas de características
fecha de fin.
y calidad adecuadas, y que no sean
La validación de datos debe ser, como contraseñas previamente filtradas1.
mínimo, a través de mecanismos de Asimismo, se deben implementar
lista negra (datos conocidos como mecanismos seguros de recuperación
maliciosos). Como una mejor práctica de contraseñas, ya sea utilizando un
también se validará a través de lista segundo factor de autenticación o a
blanca (datos conocidos como través de canales diferentes (como
correctos, por ejemplo, una lista de teléfono móvil o correo electrónico).
regiones).
Una contraseña fuerte es aquélla que es
La validación de datos, al igual que la difícil de detectar, tanto por humanos
codificación y escape, deben ser
1
Por ejemplo, las de este link.

División de Gobierno Digital | Lineamientos para desarrollo de software 10


como por software, protegiendo recomendado implementar múltiples
efectivamente los datos de un acceso factores de autenticación.
no autorizado.
6. Autenticación nivel 2:
Una contraseña segura consta de al
Multifactor
menos ocho (8) caracteres (y mientras
más caracteres, más fuerte es la Es el uso de múltiples factores de
contraseña), que son una combinación autenticación para verificar al usuario.
de letras, números, símbolos y el uso de Habitualmente se usa una combinación
mayúsculas y minúsculas. Ésta no debe de dos o más de los siguientes factores:
contener palabras que se pueden
encontrar en un diccionario o partes del ● Lo que el usuario sabe (por ejemplo,
nombre del usuario. una contraseña)

Para almacenar las contraseñas, se ● Lo que el usuario tiene (por ejemplo,


deben utilizar algoritmos criptográficos un dispositivo o llaves de seguridad)
especialmente diseñados para este fin, ● Algo que el usuario es (por ejemplo,
tales como bcrypt, PBKDF2 y Argon2. Se la biometría).
debe evitar utilizar algoritmos de hash
“a secas”, tales como SHA-1, SHA-2 y La biometría no se debe considerar
MD5 para el almacenamiento de un dato secreto, puesto que algunas
contraseñas. características biométricas pueden ser
fácilmente reproducibles u obtenidas
También se deben implementar sin conocimiento del usuario, por
mecanismos de limitación de intentos ejemplo, a través de una foto del rostro
de inicio de sesión, ya sea ralentizando o “levantando” huellas digitales de
los intentos de inicio de sesión, objetos, por lo que siempre debe usarse
bloqueando la IP de origen de las en conjunto con otro factor de
pruebas fallidas o bloqueando las autenticación.
cuentas después de un número
predeterminado de intentos fallidos.
7. Autenticación nivel 3:
Esta estrategia no debe bloquear
Criptográfica
permanentemente las cuentas, puesto
que esto podría causar una denegación Se logra a través del uso de módulos de
de servicio a usuarios legítimos. hardware criptográfico seguro, en
conjunto con algún mecanismo de
En el caso de que los ataques de fuerza
autenticación adicional (password,
bruta sean un problema, es
biometría, otros).

División de Gobierno Digital | Lineamientos para desarrollo de software 11


8. Implementar mecanismos de ● Deben tener el flag “HttpOnly”.
manejo de sesión Esto previene su acceso a través de
JavaScript.
Para el manejo de las sesiones, se debe
considerar al menos lo siguiente:
10. Uso de tokens de sesión
● El identificador de sesión debe ser
Cuando sea necesario manejar sesiones
único, suficientemente largo y
stateless, por razones de performance u
aleatorio.
otras, se recomienda el uso de JWT
● Se deben generar (o rotar) los (JSON Web Tokens), puesto que es un
identificadores de sesión durante la mecanismo seguro e interoperable de
autenticación y re-autenticación. manejo de sesión.

● Se debe implementar un timeout Un JWT2 tiene garantías criptográficas


por inactividad que fuerce la re- si es generado de forma segura, para lo
autenticación al usuario. La cual se recomienda utilizar los
duración de este timeout debe ser siguientes parámetros:
inversamente proporcional a la
● Nunca definir, en la configuración, el
sensibilidad de los datos a proteger,
algoritmo para firmar o cifrar como
vale decir, mientras más sensible,
“none”. Esto deshabilita todas las
menor duración.
consideraciones criptográficas. El
parámetro alg es el que permite
9. Uso de cookies para manejo
definir el algoritmo que será
de sesión utilizado para estas tareas.
Para el uso de cookies se debe ● En relación al punto anterior, se
considerar lo siguiente: debe seleccionar un algoritmo lo
● Deben ser accesibles por el mínimo suficientemente fuerte.
de dominios requeridos para el ● Se deben generar los secretos (o
correcto funcionamiento del secrets) de forma
sistema. criptográficamente segura, con una
● Deben caducar al momento en que correcta entropía por parte del
expira la sesión, o luego de un corto servidor que los genere.
período. ● Rotar periódicamente, por ejemplo,
● Deben tener el flag “secure”. Esto cada 3 meses, los secretos
fuerza su transferencia a través de
TLS. 2
https://tools.ietf.org/html/rfc7519

División de Gobierno Digital | Lineamientos para desarrollo de software 12


utilizados para firmar los tokens de las buenas prácticas, mecanismos de
sesión. cifrado y gestión de llaves.

En caso de manejar datos que deban


11. Identificación de datos
considerarse como abiertos, éstos
Los datos sensibles o críticos deben deberán ser manejados y almacenados
estar identificados para poder utilizando formatos estándar que
implementar las protecciones que permitan su fácil exportación a las
requieran de forma correcta. Por plataformas correspondientes, por el
ejemplo, si se manejan datos sensibles portal datos.gob.cl.
de ciudadanos y se requiere
almacenarlos bajo encriptación. 14. Manejo de secretos

Las aplicaciones habitualmente


12. Datos en tránsito
contienen múltiples secretos que son
Las comunicaciones de los necesarios para su operación. Éstos
componentes que transporten pueden incluir certificados digitales,
información de los usuarios entre contraseñas para la base de datos,
sistemas, deberán siempre estar credenciales a otros servicios y llaves
protegidas mediante TLS, idealmente la criptográficas, entre otros. Toda la
versión 1.3, y los sistemas información relacionada a certificados
correctamente configurados para digitales, contraseñas, llaves,
seleccionar el cifrado más fuerte credenciales, incluidas las rutas de
disponible. almacenamiento u otras referencias a
estos objetos, deben quedar
13. Datos en reposo debidamente parametrizadas en un
archivo de variables de entorno y éste
Se debe evitar, cuando sea posible, el debe ser excluido de la herramienta de
almacenamiento de datos sensibles por control de versiones.
parte de la aplicación.

En caso que no se pueda evitar 15. Desarrollo orientado a


almacenar datos sensibles, éstos deben pruebas
ser protegidos mediante encriptación, Para efectos de trabajo con datos o
para prevenir la modificación o acceso ejercicios, el equipo de desarrollo
no autorizado. deberá tener un set de datos no válidos,
Considerando que la encriptación es un escogido para trabajar y cargar el sitio
tema altamente complejo, en particular para efectos de pruebas de integración
continua o pruebas unitarias. Este set

División de Gobierno Digital | Lineamientos para desarrollo de software 13


no debe contener información que sea desarrollo continuo después de una
real y la cantidad de datos debe ser entrega final, la configuración del
reducida, pero suficiente para generar proyecto usado debe quedar
pruebas sobre el código. documentado dentro del código, tanto
para uso futuro como para ser
16. Calidad de código integrada dentro del pipeline de
despliegue/integración continua.
El código deberá ser revisado de forma
continua durante su construcción con
18. Modelo inicial de datos
herramientas de inspección.
Las estructuras de base de datos no
Ejemplos de herramientas son:
deberán contener datos, tan sólo los
● CodeClimate esquemas y, de requerir la carga de
datos externos producto de un proceso
● SonarQube de inicialización, estos datos no deben ir
en el código y serán procesados por una
● Github Advanced Security
vía interna y privada, en el caso que se
El objetivo principal es encontrar requiera.
posibles bugs de seguridad, tanto
dentro del código creado por el equipo 19. Seeding de la base de datos
de desarrollo, como en sus
dependencias. La configuración de La creación de usuarios
ambas, o al menos de una de las administradores iniciales o de cualquier
aplicaciones, debe ser guardada como tipo de información sensible, debe
archivo de configuración dentro del quedar fuera del sistema de
código, para luego ser usado en la versionamiento del código.
integración continua. El proceso de creación de un usuario
inicial de administración, así como
17. Detección preventiva cualquier otro dato sensible para el
funcionamiento de la aplicación cuya
Para todo lo relacionado con las
filtración involucre una merma de
aplicaciones, se debe configurar y usar
seguridad, debe ser documentado,
algún proyecto OWASP (ejemplo:
entregado confidencialmente y nunca
OWASP ZAP) para la búsqueda de
ser registrado en un repositorio de
vulnerabilidades en la aplicación. Esto,
código.
para corregir lo que sea necesario antes
de entregar o desplegar la aplicación.
Sin embargo, como se considera un

División de Gobierno Digital | Lineamientos para desarrollo de software 14


20. Implementar mecanismos de ● Asegurarse de que una excepción o
registros o logs fallo no comprometa la seguridad
por un error de programación en el
Se deben registrar distintos eventos del
sistema. Por ejemplo, causar
sistema para permitir que éstos sean
una denegación de servicio o
monitoreados de forma automatizada
ejecución de código con privilegios
para efectos de seguridad:
incorrectos.
● Utilizar un formato común de
● Registrar las excepciones
registros al interior de la institución.
adecuadamente en los sistemas
Esto permite facilitar la
que correspondan.
configuración y parametrización de
los mecanismos de monitoreo.
22. Compilación limpia
● Registrar la cantidad de información
De ser un lenguaje compilado y no
correcta.
interpretado, no es necesario contar con
● Siempre registrar un timestamp e ningún tipo de alerta en el momento de
información de identificación (IP, compilación. Para conseguir este
usuario, etc). objetivo, lo mejor es dar las opciones al
compilador para tratar las alertas
● Nunca registrar información (warnings) como si fueran errores y, de
sensible en los logs. esta forma, fallar en caso de existir una
Dentro del stack de herramientas alerta (warning) al momento de la
detallado en Tecnologías de Preferencia, compilación.
se encuentran opciones Open Source.

21. Manejo seguro de errores y


excepciones

Se debe desarrollar el sistema, de forma


tal, que aplique el principio de “fallar
seguro”, es decir:

● No exponer información sensible o


privada en los mensajes de error. En
particular, nunca olvidar desactivar
el modo debug al pasar a
producción.

División de Gobierno Digital | Lineamientos para desarrollo de software 15


IV. Aseguramiento y certificación
de calidad
Para facilitar la ejecución y registro de pruebas se recomienda el uso
de herramientas de integración/despliegue continuo (CI/CD) y de
herramientas de revisión del código integradas a este pipeline CI/CD.

Se recomienda que los equipos de


desarrollo de las instituciones cumplan
con una estrategia de aseguramiento de
la calidad, la cual como mínimo debe
incluir:

● Plan de pruebas.

● Diseño de las pruebas.

● Registro de su ejecución y
resultados.

El resultado de la ejecución de las


pruebas sirve como control de calidad
del software desplegado.

Para facilitar la ejecución y registro de


pruebas se recomienda el uso de
herramientas de integración/despliegue
continuo (CI/CD) y de herramientas de
revisión del código integradas a este
pipeline CI/CD.

Al final de este documento se presentan


algunos ejemplos de archivos de
configuración de un pipeline CI/CD en
las herramientas Gitlab y Github.

División de Gobierno Digital | Lineamientos para desarrollo de software 16


V. Tecnologías de preferencia
Para facilitar la ejecución y registro de pruebas se recomienda el uso
de herramientas de integración/despliegue continuo (CI/CD) y de
herramientas de revisión del código integradas a este pipeline CI/CD.

Se recomienda el uso de las siguientes ● Los frameworks y bibliotecas


tecnologías de desarrollo y para desarrollo recomendados
arquitectura del software. son:

➢ PHP: Laravel, Symfony,


1. Lenguajes de programación
CodeIgniter
● Sistemas de información:
➢ Python: Django y Flask
➢ Python 3.6+
➢ Ruby: Ruby on Rails
➢ PHP 7.1
➢ Go: Revel, Gin, Martini
➢ Java 11+
➢ Java: Spring Boot, Splunk
➢ C# 7.3+
➢ C#: .NET Core Framework
➢ Ruby 2.4.9+
➢ ReactNative
➢ Go Language 1.13+
➢ ExpressJS
● Microservicios:
● Bibliotecas gráficas y
➢ Python 3.6+ herramientas:

➢ NodeJS 8+ ➢ Bootstrap

➢ Go Language 1.13+ ➢ D3JS

➢ Java 11+ ➢ Sass, Less

➢ C# 7.3+ ➢ Grunt

➢ NPM

● Frameworks Javascript

División de Gobierno Digital | Lineamientos para desarrollo de software 17


➢ VueJS 6. Despliegue de aplicaciones

➢ AngularJS ● Kubernetes

➢ ReactJS ● Helm

➢ JQuery ● Docker

● CloudFoundry
2. Almacenamientos de datos
relacionales

● PostgreSQL 10 o superior.
7. Para infraestructura como
● MySQL 5.7 o superior. código

● MSSQL 2016 o superior. ● Terraform

● Oracle 12c Release 2 o superior.

3. Almacenamientos de datos
no relacionales

● MongoDB 4 o superior

● Elasticsearch 5.5 o superior

● Redis 5.0 o superior

4. Tareas de encolamiento

● RabbitMQ

● ZeroMQ

5. Tareas de registro eventos


(logging)

● Elasticsearch 5.5 o superior

● Logstash

● Kibana

● Sentry

División de Gobierno Digital | Lineamientos para desarrollo de software 18


VI. Uso de tecnologías
Para facilitar la ejecución y registro de pruebas se recomienda el uso
de herramientas de integración/despliegue continuo (CI/CD) y de
herramientas de revisión del código integradas a este pipeline CI/CD.

apropiados, al momento de crear las


1. Lenguaje
consultas y hacer uso de las mismas.
Al escoger el lenguaje de programación,
En el caso de las bases de datos
se recomienda hacer uso de un
relacionales, se debe considerar, entre
framework para desarrollar bajo el
otros:
paradigma de la programación
orientada a objetos y utilizar un ● Tiempo de respuesta; puede variar
patrón de arquitectura tales como si un cluster es muy grande.
Modelo-Vista-Controlador (MVC),
● No tener referencias circulares.
Microservicios u orientada al dominio (
Hexagonal, Onion o Clean), según las Con respecto al uso de bases de datos
necesidades del negocio y los atributos no relacionales, se debe tener cuidado
de calidad del software. en la elección del driver, debiendo ser
capaz de conectarse a más de un nodo
Algunos ejemplos de frameworks que
del cluster a la vez para, de esta forma,
soportan este paradigma en diversos
mantener el paradigma de un sistema
lenguajes son: Laravel, Symfony,
en cluster y capaz de crecer de forma
CodeIgniter, Flask, Django, Beego, Revel,
horizontal.
Spring Boot, etc.

3. Tareas fuera de línea o


2. Almacenamiento
programadas
Para la gestión de datos, tanto
Para las tareas asíncronas o que tengan
relacionales como no relacionales, se
la característica de una tarea
sugiere instalar las bases de datos en
programada diaria o de tiempo definido,
modo cluster. Además, se deben tomar
éstas deben usar tecnologías de
las precauciones necesarias, por
encolamiento, como las que se
ejemplo, haber creado los índices
mencionan en Tecnologías de

División de Gobierno Digital | Lineamientos para desarrollo de software 19


Preferencia. El consumo de las colas
debe ser con procesos que no tengan
relación con el sitio y debe ser posible
desarrollarlos e implementarlos como
un servicio separado.

4. Formateo de código

Para una mejor lectura del código por


personas en la organización y para el
futuro, se recomienda de sobremanera
el uso de los formateadores de texto.

Éstas son herramientas que permiten


limitar el largo de las líneas, lugares de
llaves y paréntesis, así como también
ayudan a ordenar el código , lo que debe
ser una tarea constante.

Estas herramientas pueden ser


configuradas en el editor de texto
preferido de los programadores. Para
lenguajes como Python, se sugiere
PEP8, sin embargo, el estilo y formateo
de una organización debe ser elegido
por la misma y se sugieren los
estándares propuestos para cada
lenguaje por sus creadores.

5. Repositorios de código

Se debe utilizar repositorios para


almacenar el código de las aplicaciones,
ya sea on premise o mediante algún
servicio en la nube. Github, Gitlab y
Bitbucket son algunos ejemplos de
servicios de repositorio de código.

División de Gobierno Digital | Lineamientos para desarrollo de software 20


VII. Desarrollo y consumo de APIs
La exposición de los servicios API REST debe utilizar mecanismos de
autenticación para su consumo privado, ya sea tokens (JWT u otros),
certificados o llaves criptográficas, u otros como medios de
autenticación entre puntos.

Para cumplir esto, se deben desacoplar


1. Ley de Transformación Digital
las implementaciones de clientes y
(21.180)
servicios, y poner a disposición sus
Actualmente, en el marco de la Ley de métodos y operaciones.
Transformación Digital (21.180) se está
elaborando una Norma Técnica de 3. Uso de HTTP
Interoperabilidad. Esta Norma Técnica
Las operaciones de las interfaces
consignará los estándares de
programables (APIs) deben tender a
interoperabilidad que deberán cumplir
utilizar el protocolo HTTP3 , ser
las instituciones.
procesadas en tiempo real y entregar
Mientras esta Norma Técnica se elabora una respuesta según la codificación
y publica, a continuación, se mencionan establecida en el protocolo HTTP:
algunas buenas prácticas para aquellas
● GET: Solicitar un recurso.
instituciones que están utilizando
arquitectura REST en sus servicios web. ● POST: Crear un nuevo recurso
subordinado dentro de una URL
2. Desacoplar clientes y existente.
servicios web
● DELETE: Eliminar un recurso.
Las aplicaciones construidas bajo los
● PUT: Crear un nuevo recurso a una
lineamientos expuestos hasta acá,
nueva URL o modificar un recurso
deberán propender a cumplir con dos
existente en una URL.
características fundamentales:

● Independencia de la plataforma.
3
● Evolución del servicio.
https://www.w3.org/Protocols/rfc2616/rfc2616-
sec9.html

División de Gobierno Digital | Lineamientos para desarrollo de software 21


● HEAD: Idéntica a GET, excepto que 5. Definición de URI de recursos
no se retorna un cuerpo del mensaje
La definición de URI de recursos debe
en la respuesta.
propender a seguir las prácticas
● CONNECT: Establece un túnel hacia expresadas a continuación como
el servidor identificado por el ejemplo:
recurso.
● Usar sustantivos para describir los
● OPTIONS: Utilizado para describir recursos:
las opciones de comunicación para
➢ GET /usuarios/ lista todos los usuarios
el recurso de destino.
➢ GET /usuarios/12 muestra detalle del
● TRACE: Realiza una prueba de bucle usuario con id 12
de retorno de mensaje a lo largo de
➢ POST /usuarios crear usuario
la ruta al recurso de destino.
➢ PUT /usuarios/12 actualiza usuario con
● PATCH: Es utilizado para aplicar id 12
modificaciones parciales a un
recurso. ➢ PATCH /usuarios/12 actualiza
parcialmente usuario con id 12
Es importante identificar que, de los
➢ DELETE /usuarios/12 borra usuario con
métodos precedentes, los cuatro id 12
primeros son los más utilizados, en
particular para atender las operaciones ● Usar “/” para indicar la relación de
CRUD (create, read, update y delete). jerarquía:

➢ GET/ usuarios/12/mensajes muestra


4. Exposición y autenticación de mensajes del usuario con id 12
servicios
➢ GET/usuarios/12/mensajes/93 obtiene
mensaje con id 93 del usuario con id 12
La exposición de los servicios API REST
debe utilizar mecanismos de ➢ POST /usuarios/12/mensajes crear
autenticación para su consumo privado, mensaje para usuario con id 12
ya sea tokens (JWT u otros), ➢ DELETE /usuarios/12/mensajes/3
certificados o llaves criptográficas, u elimina mensaje 3 de usuario con id 12
otros como medios de autenticación
entre puntos. ● Usar parámetros de consulta (query
strings) para realizar operaciones de
filtro, ordenamiento, paginación y/o
búsqueda:

División de Gobierno Digital | Lineamientos para desarrollo de software 22


➢ GET /instituciones/ GET /v2/oficinas/134/como-llegar
buscar?nombre=ministerio* busca
organizaciones cuyo nombre comienza ● No usar extensiones de archivos.
con “ministerio”
/instituciones/2/descripcion
➢ GET /instituciones/2/
usuarios?estado=inactivo lista todos los /instituciones/2/descripcion.txt
usuarios de la institución 2 con estado
/instituciones/2/descripcion.json
inactivo
Para la descripción de servicios se
● Formato de las URIs:
recomienda utilizar el estándar OpenAPI
➢ No usar “/” al final de la URI. Specification (OAS) v3.0+, siendo este
punto un requisito fundamental en la
➢ No usar mayúsculas.
documentación entregable de un
/instituciones/2/usuarios proyecto.
/Instituciones/2/Usuarios/
6. Uso del idioma en el código
● Usar guión “-” (y no guión bajo “_”),
más conocido como kebab-case, Se recomienda utilizar de la siguiente
para facilitar la comprensión de la forma el uso de idioma castellano e
URI en los casos en que sea más de inglés a nivel de programación y
una palabra para el servicio. definición de esquemas para la
construcción de servicios:
/oficinas/134/como-llegar
Castellano
/oficinas/134/como_llegar
● Variables y contenido
● Usar sólo letras en minúscula dentro
de la URI. No utilizar caracteres ● Construcción de las URIs
especiales ni acentos.
● Documentación
● Versionamiento de los servicios. Se
sugiere contar con un número de ● Metadatos
versión en la URI, el cual deberá ser
● Tablas de bases de datos
incrementado en la medida en que
el servicio se vea modificado en su Inglés
naturaleza o los datos que entrega.
● Operaciones, por ejemplo, métodos
URI Versión 1 antigua: get, create, delete, etc.
GET /v1/oficinas/134/como-llegar

URI Version 2 actual:

División de Gobierno Digital | Lineamientos para desarrollo de software 23


● Campos de auditorías en base de
datos, por ejemplo, created_at,
updated_at y deleted_at, etc.

● Encabezados

División de Gobierno Digital | Lineamientos para desarrollo de software 24


VIII. Uso de contenedores en el
despliegue
Para el despliegue de las aplicaciones es altamente recomendado el
uso de contenedores, debido a la facilidad de movilidad de los
mismos y replicación de los distintos ambientes. Dada su
característica de idempotente, nos permiten replicar en una
plataforma para crecer de forma horizontal.

Para el despliegue de las aplicaciones provistas por cada uno es suficiente


es altamente recomendado el uso de para el despliegue, ya que estas
contenedores, debido a la facilidad de herramientas están preparadas para la
movilidad de los mismos y replicación gestión, replicación y respaldo de los
de los distintos ambientes. Dada su ambientes, y es posible generar más de
característica de idempotente, nos un ambiente usando las herramientas
permiten replicar en una plataforma que ofrecen para ello
para crecer de forma horizontal.
Se entiende también que muchas veces
En plataformas con contenedores las aplicaciones no pueden ingresar a
Docker, el uso de herramientas para la un contenedor, o por su carácter legacy
gestión y automatización es muy no es posible introducirlas en estos
recomendable. En este caso, se sugiere contenedores idempotentes. Sin
usar Ansible, Chef o Puppet para la embargo, se sugiere considerar su uso
administración de los servidores y en los futuros desarrollos y, de esta
levantar los contenedores en los forma, ir avanzando hacia
mismos, utilizando la herramienta infraestructuras más flexibles y que
docker-compose provista por Docker. pueden crecer de forma horizontal.
Este set de herramientas permite su
fácil y rápida replicación.

Para situaciones en las cuales se puede


contar con cluster Kubernetes o
CloudFoundry, las herramientas

División de Gobierno Digital | Lineamientos para desarrollo de software 25


IX. Licencias
Todo desarrollo realizado al interior del Estado debe propender a
estar licenciado, acorde a las necesidades de uso con que fue
creado.

Todo desarrollo realizado al interior del aportar a las mejoras del software y,
Estado debe propender a estar aquellas que no tengan la capacidad de
licenciado, acorde a las necesidades desarrollo, puedan usarlo sin problemas
de uso con que fue creado. Para el futuros.
Estado es fundamental la colaboración
Para todos los desarrollos, se
entre instituciones, por lo que se sugiere
recomienda el uso de la licencia GPLv3,
la construcción de software cuyo código
pero también se puede utilizar la
fuente sea accesible por otras
licencia GPLv2 en caso de que alguna
instituciones, así como también para
institución requiera modificar software
estar frente al escrutinio de los
que utilice dicha licencia y no pueda
ciudadanos y que éstos puedan realizar
apelar a re-licenciar la misma a partir de
los aportes que consideren necesarios
una fecha específica.
para mejorar el código de aplicaciones
que ellos mismos pueden usar.
2. LGPLv3
Para estos efectos, están a disposición
Esta licencia sirve cuando el software
las siguientes licencias:
debe ser enlazado con módulos que son
privativos o no compatibles con alguna
1. GPLv2 y GPLv3
de las versiones de GPL.
Este conjunto de licencias es conocido
como copyleft, es decir, requiere que las 3. Apache 2.0
modificaciones realizadas al software,
Esta licencia, compatible con GPLv3
incluyendo cambios efectuados por
(no inferiores), supone muchas ventajas
terceros, sean puestos a disposición de
para mantener el código libre y también
los receptores del software utilizando la
permite trabajos secundarios y uso del
misma licencia. Esto impulsa la
código en otros proyectos. Se
colaboración entre instituciones y da la
recomienda su uso en todo proyecto
posibilidad de que todas ellas puedan
que requiera de una cierta interacción

División de Gobierno Digital | Lineamientos para desarrollo de software 26


con el mundo privado y cuando esta Sin embargo, al usar una licencia GPLv3
interacción sea a largo tiempo. Un esto se puede evitar, ya que fuerza a que
ejemplo de esto último es cuando se los cambios mayores realizados al
genera un producto complementario código sean contribuidos al proyecto
que podría llegar a ser usado por otros principal y, de esta forma, mantener
gobiernos e, incluso, por el mundo todo cambio en el código libre en el
privado. tiempo.

Al dejar el código en dominio público,


4. Dominio Público (Creative
sin licencia o usando una licencia
Commons 0 y equivalentes)
clásica Creative Commons, no se está
Estas licencias actúan como el buscando que los cambios al código
equivalente a poner en dominio público vuelvan a la base sino, más bien,
el trabajo realizado. Son eficaces para mantener la autoría del mismo. De esta
compartir datos que puedan ser forma, toda persona dentro de la
utilizados por la comunidad científica, comunidad puede tomar el código y
medios audiovisuales y otros datos que realizarle cambios, cerrarlo y utilizarlo
requieran una distribución lo más para prestar servicios al Estado, usando
amplia posible. el código del Estado. Es por ello que
estas licencias no son recomendadas
Habitualmente, esta licencia se aplica a para software de carácter crítico o que
los datos generados por un software y su uso pueda masificarse de forma
no al software en sí, salvo algunas importante en el tiempo.
excepciones.
Por otro lado, es necesario considerar
5. Casos de uso de licencia que muchas veces el software podría
estar usando módulos con licencias
Al momento de aplicar las licencias se no compatibles con una GPLv3 o GPLv2.
debe tener especial consideración en Por esto, el uso de LGPLv3 es
cómo se desea perpetuar el código en el recomendado, ya que permite incorporar
tiempo, es decir, cuando el código sea módulos propietarios. Este caso se da
un proyecto relevante, éste debe para aplicaciones que son compiladas y
considerar que al estar público da lugar enlazadas con otros módulos. No aplica
a que la comunidad tome el código y para lenguajes interpretados.
pueda hacer cambios en el mismo, para
uso propio o para vender de vuelta estos
cambios al Estado.

División de Gobierno Digital | Lineamientos para desarrollo de software 27


6. Buenas prácticas de You should have received a copy of the
licenciamiento GNU General Public License along with
this program. If not, see
Al momento de licenciar el software es
<https://www.gnu.org/licenses/>.
necesario agregar el texto exacto de la
licencia usada en un archivo llamado
LICENSE, COPYING, LICENSE.TXT o

COPYING.TXT. Este texto no debe ser


modificado ni alterado de forma alguna,
ya que vivirá con el código y será
transportado por todo medio al
momento de desplegar el mismo.

Es deseable, pero no mandatorio, incluir


al principio de cada archivo del código
un aviso de licenciamiento (copyright
notice) con un extracto sugerido en la
licencia. En el caso de la licencia GPLv3,
debe ser de la siguiente forma:

Nombre de aplicación

Copyright (C) 2021 División de Gobierno


Digital

This program is free software: you can


redistribute it and/or modify it under the
terms of the GNU General Public License
as published by the Free Software
Foundation, either version 3 of the
License, or (at your option) any later
version.

This program is distributed in the hope


that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied
warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for
more details.

División de Gobierno Digital | Lineamientos para desarrollo de software 28


X. Actualizaciones a esta guía
Dado que el mundo de la tecnología avanza cada vez a pasos más y
más agigantados, esta guía será sometida a revisión una vez al año,
en busca de las actualizaciones que puedan ocurrir, de forma de
mantenerse actualizada.

Dado que el mundo de la tecnología esperar a la revisión anual pública antes


avanza cada vez a pasos más y más mencionada.
agigantados, esta guía será sometida a
revisión una vez al año, en busca de las
actualizaciones que puedan ocurrir, de
forma de mantenerse actualizada. Esta
revisión será realizada por la División de
Gobierno Digital en colaboración con
todas las instituciones que deseen
participar. Con esto se espera incluir
todas las mejoras y aprendizajes de las
instituciones conforme han seguido
esta guía y pudieran encontrar mejoras
a la misma.

Con respecto a la revisión por parte de


la sociedad civil, se generarán
instancias en las cuales la sociedad civil
podrá realizar una revisión y evaluación
para integrar nuevas mejoras a la guía,
según su propia opinión y experiencia
en el mundo de las tecnologías.

Sin desmedro de lo anterior, la guía a


futuro podrá contener un anexo con fe
de erratas apropiadas, que serán
incorporadas en la medida que éstas
sean detectadas, sin la necesidad de

División de Gobierno Digital | Lineamientos para desarrollo de software 29


XI. Ejemplos
1. Ejemplo Dockerfile aplicación
PHP

El archivo Dockerfile es el que da el


inicio a la construcción de la imagen
que será cargada en un servicio de
registry de imágenes para su posterior
uso. A continuación se muestra un
Dockerfile de ejemplo de una aplicación
PHP.

2. Ejemplo Gitlab-ci.yml

El archivo gitlab-ci.yml es un archivo


YAML que se encuentra en la raíz del
proyecto, y que se ejecuta
automáticamente cada vez que se
ejecuta un commit. Este archivo hace
que un runner procese las tareas
especificadas en el mismo archivo.

3. Ejemplo Github-action.yml

El mismo concepto que el gitlab-ci.yml,


pero para Github actions

División de Gobierno Digital | Lineamientos para desarrollo de software 30


Ejemplo Dockerfile aplicación PHP

División de Gobierno Digital | Lineamientos para desarrollo de software 31


Ejemplo gitlab-ci.yml utilizando el registry de gitlab y con stage de
code_quality
xxxxxxxxxx
image: docker:stable

stages:
- build
- code_quality

build:
stage: build
variables:
DOCKER_DRIVER: overlay2
services:
- docker:stable-dind
script:
- docker login git.gob.cl:4567 -u gitlab-ci-token -p $CI_BUILD_TOKEN
- docker build -t git.gob.cl:4567/chileatiende/chileatiende:$CI_COMMIT_REF_NAME .
- docker push git.gob.cl:4567/chileatiende/chileatiende:$CI_COMMIT_REF_NAME
only:
- master
- staging

code_quality:
stage: code_quality
variables:
DOCKER_DRIVER: overlay2
allow_failure: true
services:
- docker:stable-dind
script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed
's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2- stable/')
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
artifacts:
paths: [gl-code-quality-report.json]

build site:
stage: build
image: node:10-stretch
script:
- apt-get update
- apt-get -y install libpng16-16 libpng-tools libpng-dev
- npm i npm@latest -g
- npm install
- npm audit fix --force
- npm run prod
artifacts:
expire_in: 30 days
paths:
- public/*

División de Gobierno Digital | Lineamientos para desarrollo de software 32


Ejemplo github-actions.yml de deploy en un cluster AWS EKS utilizando el
registry de AWS (ECR)
- name: app_name
- env:
- AWS_ACCOUNT_ID:
- REPOSITORY:
- NAMESPACE:
- ENVIRONMENT:
- APP_NAME:
- CLUSTER_NAME:
- on:
- workflow_dispatch:
- push:
- branches:
- - "main"
- - "develop"
- tags:
- - 'prod-*'
- - 'develop-*'
-
- jobs:
- deploy:
- runs-on: RUNNER_NAME
- steps:
- - uses: actions/checkout@v2
-
- - name: set env
- run: echo "TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
-
- - name: commit-sha para tag de imagen
- run: echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c 1-8`" >> $GITHUB_ENV
-
- - name: build
- run: |
- docker build -t
${AWS_ACCOUNT_ID}.dkr.ecr.us-east-2.amazonaws.com/${REPOSITORY}:latest
-t
${AWS_ACCOUNT_ID}.dkr.ecr.us-east-2.amazonaws.com/${REPOSITORY}:${SHOR
T_SHA} .
- - name: upload image
- run: |
- aws ecr get-login-password --region us-east-2 | docker login
--username AWS_USERNAME --password-stdin
${AWS_ACCOUNT_ID}.dkr.ecr.us-east-2.amazonaws.com
- docker push
${AWS_ACCOUNT_ID}.dkr.ecr.us-east-2.amazonaws.com/${REPOSITORY}:latest
- docker push
${AWS_ACCOUNT_ID}.dkr.ecr.us-east-2.amazonaws.com/${REPOSITORY}:${SHOR
T_SHA}
- - name: kubernetes deploy
- run: |
- aws eks update-kubeconfig --name ${CLUSTER_NAME} --region us-east-2
- kubectl set image deploy/$APP_NAME
$APP_NAME=${AWS_ACCOUNT_ID}.dkr.ecr.us-east-2.amazonaws.com/${REPOSITORY}:${SHORT_SHA
} -n ${NAMESPACE} --record

División de Gobierno Digital | Lineamientos para desarrollo de software 33

También podría gustarte