Cargando
SecurityInside.info
  • Sobre SecurityInside
  • GitHub
  • Click to open the search input field Click to open the search input field Buscar
  • Menú Menú
  • Link to X
  • Link to Rss this site
  • Link to Youtube
security-api

Security API – Dale a tus empleados lo que necesitan (de forma segura)

12 julio, 2017/en Desarrollo, Gobierno IT, Hacking, Privacidad/por Cristóbal Espinosa

Hace poco vimos en SecurityInside consejos a tener en cuenta para revisar la seguridad de tu API. Como comentamos, ofrecer servicios de información en el mundo de hoy si no tienes API, te da una desventaja considerable que podría terminar por arruinar tu negocio.

Es por eso que tu departamento de desarrollo debe tener en mente trabajar en una buena api (sencilla y segura) que de servicio tanto a clientes como a las plataformas y herramientas internas.

Hay muchas formas de desarrollar APIs, pero en mi caso me he decantado últimamente por Flask para Python sobre Elastic Beanstalk de Amazon Web Services.

Security API, ¿por qué?

Cada vez que arranco un proyecto de seguridad con una nueva empresa, me presento desde el punto de vista de vida laboral. Cuento mis años como becario, desarrollador, jefe de proyecto, consultor y luego el paso al mundo de la seguridad. Me miran como diciendo «¿para qué todo este rollo?». Sencillo, es la forma de introducir que soy un apasionado de la seguridad y que mi objetivo principal es asegurar los activos de la empresa, pero siempre tratando de hacer la vida sencilla a los compañeros que tienen que lidiar con todas las medidas y controles de seguridad que se implanten.

Conozco profesionales de la seguridad que nunca se han manchado las manos picando código y que aplican medidas maravillosas que fortifican los activos mientras complican el trabajo diario. Lo importante es la seguridad, pero mi perfil de desarrollador me hace pensar siempre en hacerlo de forma que ellos tengan todas las facilidades para trabajar. Seguros, pero trabajando.

Por todo esto, hace no mucho empecé a dar vueltas a la idea de crear una «security api» que diera servicio a determinadas necesidades de los compañeros de los diferentes departamentos. De esta forma, aplico medidas de seguridad generales y les doy la posibilidad de solicitar ciertos permisos, accesos, … de forma automática en base a roles.

¿Cómo funciona?

Básicamente todo funciona en base a usuarios que se autentican con login, password y 2fa (Google Authenticator, Android, iOS). Cada usuario tiene un rol y subrol con el que se indica qué cosas tienen permitidas y todo se gestiona mediante JSON Web Tokens.

Flask api template

Os he dejado en Github un nuevo repositorio que contiene el esqueleto de una api desarrollado en Python utilizando la biblioteca Flask.

Podéis lanzarlo en local para desarrollo y hacer pruebas de forma sencilla utilizando Postman, ya que os he dejado también un fichero con ejemplos de uso. Tendréis queja… 😀

Vamos viéndo cosillas

En el fichero principal (flask_api.py) veréis unas cuantas cosas que os voy a ir explicando.

Al principio, tenéis una función que se lanza tras arrancar el server, ahí se pueden configurar diferentes cosas (dar de alta la ip del server en determinados grupos de seguridad, enviar notificaciones, …):

##########################################################################################
# This function makes initial tasks.
##########################################################################################
@application.before_first_request
def _run_on_start():

    if not DEBUG:
        print "Flask started!"
        
        # Here you can do some initial tasks

##########################################################################################

Después se incluyen dos apartados para la gestión de códigos 404 y 405:

##########################################################################################
# This function returns happy 404.
##########################################################################################
@application.errorhandler(404)
def page_not_found(e):
    
    return redirect("https://goo.gl/LuKygx", code=302)

##########################################################################################

##########################################################################################
# This function returns happy 405.
##########################################################################################
@application.errorhandler(405)
def method_not_allowed(e):
    
    ret_html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>'
    ret_html = ret_html + '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">'
    ret_html = ret_html + '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
    ret_html = ret_html + '<title>Flask API SecurityInside.info Template</title>'
    ret_html = ret_html + '<style type="text/css" media="screen">'
    ret_html = ret_html + 'h1 {text-align:left; color: #444;}'
    ret_html = ret_html + '</style></head><body>'
    ret_html = ret_html + '<h1>Flask API <a href="http://www.securityinside.info" target="blank">SecurityInside.info</a> Template</h1>'
    ret_html = ret_html + 'Method not allowed or missing params, check API doc to solve the problem.'
    ret_html = ret_html + '</body></html>'

    return flask_api_functions.ret_content_type(ret_html, 'html', 405) 

##########################################################################################

Una siempre interesante función ping para comprobar rápidamente si el server está vivo:

##########################################################################################
# This function shows API alive info. 
##########################################################################################
@application.route('/' + API_VERSION + '/ping', methods=['GET'])
def ping():
    
    response = {'code': 200, 'message': 'pong'}    
    return flask_api_functions.ret_content_type(response, 'json', 200)

##########################################################################################

La parte más interesante del ejemplo, la gestión del login y creación del token:

##########################################################################################
# This function checks auth user and return JWT.
##########################################################################################
@application.route('/' + API_VERSION + '/login', methods=['POST'])
def login():
    
    # Check preconditions
    ##################################################################################
    response = flask_api_functions.check_preconditions(request, False)
    
    if (response['code'] != 200):
        return flask_api_functions.ret_content_type(response, 'json', response['code'])
    ##################################################################################
    
    # Check for user credentials
    ##################################################################################
    response = flask_api_functions.check_auth(request)
    return flask_api_functions.ret_content_type(response, 'json', response['code'])
    ##################################################################################

##########################################################################################

Y la implementación concreta dentro del fichero flask_api_functions.py:

##########################################################################################
# This function checks user authorization header request.
#
# @param request - User request data.
#
# @return Formatted response.
# 
##########################################################################################
def check_auth(request):
    
    try:
        auth = base64.b64decode(request.headers['Authorization'].split()[1])
    
    except:
        response = {'code': 401, 'message': 'Invalid basic authorization header.'}
        return response

    if len(auth.split(':')) != 2:
        response = {'code': 401, 'message': 'Invalid basic authorization header.'}
        return response
    else:
        """
        Here you have to check user credentials and optional totp value.
        """

        # If user credentials is ok, then generate jwt
        if(True): 
            
            # User with valid credentials
            token = jwt.encode({
                'user_id': '<insert_here_user_id>',
                'user_name': '<insert_here_user_name>',
                'user_roles': '<insert_here_user_roles>',
                'other_fields': '<insert_here_other_fields>',
                'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=1)}, 
                SECRET)
                                
            response = {'code': 200, 'message': None, 'token': token}
            return response

        # If user credentials is not ok, then return error message
        else:
            response = {'code': 401, 'message': '(d\'oh!) Wrong user, password, totp value or maybe user is not active.'}
            return response

##########################################################################################

Para entender ciertas cosas como la forma de enviar el header «Authentication», pásate por el README.md del repositorio y ejecuta las pruebas con postman, verás que es la mar de sencillo.

El ejemplo es sólo parte del script completo. Si quieres utilizarlo o modificarlo, puedes descargarlo desde nuestro repositorio en GitHub.

flask-api-template

 

Importante antes de terminar

Flask no está preparado para funcionar directamente en un entorno de producción, para hacerlo tienes que tener en cuenta un par de cosas (está todo en la documentación del repositorio).

En mi caso particular, ya os he dicho que lo tengo montado en Elastic Beanstalk de Amazon Web Services, si queréis os puedo contar cómo lo he hecho en otra entrada.

Por supuesto, si tenéis alguna duda sobre esta entrada, preguntad que estaré encantado de echar una mano.

Saludos!

  • Acerca de
  • Últimas entradas
Cristóbal Espinosa
Cristóbal Espinosa
Head of Cloud & Infra Security en Flywire
Líder en seguridad en la nube con más de 15 años de experiencia en el diseño y la ampliación de la seguridad en entornos de AWS. Actualmente dirijo el área de seguridad en la nube de una empresa global de tecnología financiera.

Me especializo en la creación de arquitecturas en la nube seguras y escalables en entornos regulados (tecnología financiera, banca, salud, industria farmacéutica), combinando una profunda experiencia técnica con liderazgo estratégico.

Ámbito actual:
• Gestión de la seguridad en más de 40 cuentas de AWS en una configuración de múltiples cuentas.
• Dirección de la estrategia, la gobernanza y la arquitectura de seguridad en la nube.
• Impulso de prácticas de DevSecOps y seguridad desde el diseño.

Resultados demostrados:
• Reducción del riesgo de seguridad en un 40%.
• Optimización de los costes de la nube en un 15%.
• Superación con éxito de auditorías sin incidencias (PCI-DSS, SOC2, CSA).

Competencias principales:
• Seguridad de AWS (IAM, GuardDuty, Security Hub, Config, Inspector, Detective, Macie).
• Estrategia de cuentas múltiples, SCP y gobernanza a gran escala.
• Cumplimiento normativo y gestión de riesgos en entornos regulados.

Me gusta trabajar en la intersección entre la seguridad, la ingeniería y los negocios, ayudando a las organizaciones a crecer de forma segura sin frenar la innovación.

Anteriormente trabajé en Accenture (responsable de seguridad de AWS), liderando iniciativas de seguridad en la nube para clientes empresariales.
Cristóbal Espinosa
Últimas entradas de Cristóbal Espinosa (ver todo)
  • Pathfinding Labs: el “parque de atracciones” en AWS Security - 19 mayo, 2026
  • De una credencial olvidada al control total: cómo se materializan los ataques en cloud - 20 abril, 2025
  • HIPAA: Protegiendo la Privacidad y Seguridad de la información médica con AWS - 13 septiembre, 2024

¿Nos ayudas a compartir?

  • Compartir en X (Se abre en una ventana nueva) X
  • Compartir en LinkedIn (Se abre en una ventana nueva) LinkedIn
  • Comparte en Facebook (Se abre en una ventana nueva) Facebook
  • Haz clic en Pinterest (Se abre en una ventana nueva) Pinterest
  • Compartir en Reddit (Se abre en una ventana nueva) Reddit
  • Enviar un enlace a un amigo por correo electrónico (Se abre en una ventana nueva) Correo electrónico

Relacionado

Etiquetas: api, aws, elastic beanstalk, flask, github, Python, security
Compartir esta entrada
  • Compartir en WhatsApp
https://www.securityinside.info/wp-content/uploads/security-api.png 450 800 Cristóbal Espinosa https://securityinside.info/wp-content/uploads/logo.png Cristóbal Espinosa2017-07-12 11:03:422024-11-06 12:21:31Security API – Dale a tus empleados lo que necesitan (de forma segura)
Quizás te interese
Twittor controlando los bots a través de Twitter Twittor: Controla tus bots utilizando Twitter como servidor C&C
SecurityInside Live: OpenExpo Europe 2019
HIPAA: Protegiendo la Privacidad y Seguridad de la información médica con AWS
aws_security 8 Recomendaciones básicas para mejorar la seguridad de tu cuenta AWS
auditar-api Revisando nuestros servicios: auditar API (parte 1)
Controla lo que hacen tus usuarios con Amazon WS IAM (parte 1)
aws-summit-madrid-16 SecurityInside Live: AWS Summit 2017
sftp sFTP en AWS EC2 en 5 minutos

Categorías

  • Anonimato (18)
  • Auditoría (30)
  • Charlas y ponencias (68)
  • Cloud Security (9)
  • Control de acceso (29)
  • Desarrollo (32)
  • Dispositivos (19)
  • Eventos (25)
  • Exploiting (6)
  • Forense (6)
  • Formación (39)
  • Gobierno IT (36)
  • Hacking (20)
  • Herramientas (26)
  • I+D (13)
  • Ingeniería inversa (6)
  • ISO 27001 (10)
  • Live (20)
  • Malware (22)
  • Noticias (54)
  • Pentesting (12)
  • Privacidad (39)
  • Sin categoría (1)
  • Vulnerabilidades (24)

Archivo

  • mayo 2026
  • abril 2025
  • septiembre 2024
  • junio 2024
  • abril 2024
  • marzo 2024
  • enero 2021
  • septiembre 2020
  • abril 2020
  • febrero 2020
  • enero 2020
  • octubre 2019
  • septiembre 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • febrero 2019
  • enero 2019
  • octubre 2018
  • agosto 2018
  • mayo 2018
  • abril 2018
  • marzo 2018
  • febrero 2018
  • diciembre 2017
  • noviembre 2017
  • octubre 2017
  • septiembre 2017
  • julio 2017
  • junio 2017
  • mayo 2017
  • abril 2017
  • marzo 2017
  • febrero 2017
  • enero 2017
  • diciembre 2016
  • noviembre 2016
  • octubre 2016
  • septiembre 2016
  • julio 2016
  • junio 2016
  • mayo 2016
  • abril 2016
  • marzo 2016
  • febrero 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • octubre 2015
  • septiembre 2015
  • agosto 2015
  • julio 2015
  • junio 2015
  • mayo 2015
  • abril 2015
  • marzo 2015
[2015 - 2024] - SecurityInside.info - Segura gracias a Defender Eye
  • Link to X
  • Link to Rss this site
  • Link to Youtube
Link to: ¡Seguro que te interesa! – 47 Link to: ¡Seguro que te interesa! – 47 ¡Seguro que te interesa! – 47seguro-interesa Link to: ¡Seguro que te interesa! – 48 Link to: ¡Seguro que te interesa! – 48 seguro-interesa¡Seguro que te interesa! – 48
Desplazarse hacia arriba Desplazarse hacia arriba Desplazarse hacia arriba