¿Para qué sirve un CISO (aka responsable de seguridad)?

Cuando me preguntan en qué trabajo y contesto que soy responsable de seguridad, lo habitual es que me imaginen organizando a personas que controlan puertas y pasean por pasillos en busca de ladronzuelos.

Cuando digo que soy responsable de seguridad en una empresa de tecnología, lo habitual es que me imaginen evitando que nos roben los móviles, los portátiles o las teles.

Cuando digo que soy responsable de seguridad de la información, lo habitual es que no tengan ni idea de qué les hablo. Entonces les explico que mi tarea es proteger la información valiosa de la compañía contra ataques informáticos de gente mala, fugas de información, malware, … Es entonces cuando me miran con cara de asombro y me dicen «ah, que eres un hacker!!».

Pues no, no me considero un hacker y hago un inciso para explicar lo que yo entiendo por hacker. Me basaré en la definición dada por «The Internet Engineering Task Force (IETF®, muy del gusto de la comunidad de seguridad:

hacker –  A person who delights in having an intimate understanding of the  internal workings of a system, computers and computer networks in particular. The term is often misused in a pejorative context, where «cracker» would be the correct term.

Partiendo de la base de que considero un hacker a una persona apasionada de la tecnología que aprende constantemente con el objetivo de llevarla hasta el límite para poder mejorarla, no me considero hacker ya que no entro en la parte final de la definición. Quizás si un half-hacker, pero para mí los hackers de verdad son gente tan top como los ponentes habituales de los congresos de seguridad, los creadores de tecnología, los que sin formación académica terminan siendo muy importantes dentro de grandes empresas, …

Pero volviendo a lo del principio, al final siempre surgen dudas sobre las tareas que realiza un CISO o responsable de seguridad así que te voy a hacer un pequeño resumen.

El CISO o responsable de seguridad en la norma ISO 27.001

Ahora que estoy trabajando en el contenido del Máster de seguridad y continuidad de negocio del que voy a ser docente, concretamente en la parte relacionada con auditoría 27.001, estoy describiendo cómo no se da como obligatorio el nombramiento de un responsable de seguridad. El motivo es sencillo, la norma se puede ajustar a compañías de cualquier tamaño y las pequeñas normalmente no tendrán recursos para mantener una persona que se encargue únicamente de esas tareas.

Sin embargo, en empresas de más tamaño, es importante que exista esa figura para que pueda realizar las siguientes tareas:

  • Conformidad:
    • Desarrollar la lista de partes interesadas relacionadas con la seguridad de la información.
    • Desarrollar la lista de requisitos de las partes interesadas.
    • Permanecer en contacto continuo con autoridades y grupos de intereses especiales.
    • Coordinar todos los esfuerzos relacionados con la protección de datos personales.
  •  Documentación:
    • Proponer el borrador de los principales documentos de seguridad de la información, por ejemplo, Política de seguridad de la información, Política de clasificación, Política de control de acceso, Uso aceptable de activos, Evaluación del riesgo y metodología de tratamiento de riesgos, Declaración de aplicabilidad, Plan de tratamiento de riesgos, etc.
    • Ser responsable de revisar y actualizar los documentos principales.
  • Gestión de riesgos:
    • Enseñar a los empleados cómo realizar la evaluación de riesgos.
    • Coordinar todo el proceso de evaluación de riesgos.
    • Proponer la selección de salvaguardas.
    • Proponer los plazos para la implementación de salvaguardas.
  • Administración de recursos humanos:
    • Realizar comprobaciones de verificación de antecedentes de candidatos de trabajo.
    • Preparar el plan de capacitación y concientización para la seguridad de la información.
    • Realizar actividades continuas relacionadas con la sensibilización.
    • Realización de capacitación de inducción sobre temas de seguridad para nuevos empleados.
    • Proponer acciones disciplinarias contra empleados que realizaron la infracción de seguridad.
  • Relación con la alta dirección:
    • Comunicar los beneficios de la seguridad de la información.
    • Proponer objetivos de seguridad de información.
    • Informar sobre los resultados de la medición.
    • Proponer mejoras de seguridad y acciones correctivas.
    • Proponer presupuesto y otros recursos requeridos para proteger la información.
    • Informar requisitos importantes de las partes interesadas.
    • Notificar a la alta dirección sobre los principales riesgos.
    • Informar sobre la implementación de salvaguardas.
    • Asesorar a los principales ejecutivos en todos los asuntos de seguridad.
  • Mejoras:
    • Asegurarse de que se realizan todas las acciones correctivas.
    • Verificar si las acciones correctivas han eliminado la causa de las no conformidades.
  • Gestión de activos:
    • Mantener un inventario de todos los activos de información importantes.
    • Eliminar los registros que ya no se necesitan.
    • Desechar los medios y equipos que ya no se usan de forma segura.
  • Terceros:
    • Realizar la evaluación de riesgos para las actividades a subcontratar.
    • Realizar verificación de antecedentes para los candidatos de outsourcing.
    • Definir cláusulas de seguridad que deben formar parte de un acuerdo.
  • Comunicación:
    • Definir qué tipo de canales de comunicación son aceptables y cuáles no.
    • Preparar el equipo de comunicación para ser utilizado en caso de una emergencia o desastre.
  • Gestión de incidentes:
    • Recibir información sobre incidentes de seguridad.
    • Coordinar la respuesta a incidentes de seguridad.
    • Preparar evidencia para la acción legal después de un incidente.
    • Analizar incidentes para evitar su recurrencia.
  • Continuidad del negocio:
    • Coordinar el proceso de análisis del impacto comercial y la creación de planes de respuesta.
    • Coordinar el ejercicio y la prueba.
    • Realizar una revisión posterior al incidente de los planes de recuperación.
  • Técnico:
    • Aprobar los métodos apropiados para la protección de dispositivos móviles, redes de computadoras y otros canales de comunicación.
    • Proponer métodos de autenticación, política de contraseñas, métodos de cifrado, etc.
    • Proponer reglas para el teletrabajo seguro.
    • Definir las características de seguridad requeridas de los servicios de Internet.
    • Definir principios para el desarrollo seguro de los sistemas de información.
    • Revisar los registros de las actividades del usuario para reconocer el comportamiento sospechoso.

Básicamente, en esto consiste mi día a día. Pero no te voy a engañar, también me preocupa la gente que entra por la puerta o anda por los pasillos, sobre todo cuando vienen de visita…

Cuando tomas la decisión de convertirte en un profesional de la seguridad, como es mi caso, te das cuenta de que tienes que vivir en continua semi-paranoia para que no se te escape nada. Aunque mi visión de todo esto es siempre intentar que la seguridad sea lo primero, pero seguido muy de cerca por la usabilidad, ya que si les hago a mis compañeros el trabajo imposible, entonces mal vamos. En este sentido te recomiendo que le eches un vistazo a la entrada en la que cuento cómo ofrezco la seguridad a los departamentos vía API.

Espero haberte ayudado a comprender un poco mejor lo que hace un responsable de seguridad.

¡Hasta la próxima!

security-api

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

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.

 

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!

SecurityInside Live: Check Point Cyber Day 2017

La omnipresente transformación digital y el Internet de las Cosas piden cambios fundamentales en el presente y futuro de la ciberseguridad. Los últimos ataques ocurridos a nivel mundial demuestran la necesidad de implementar estrategias innovadoras para securizar las empresas.

Hoy asistimos al Check Point Cyber Day 2017, una jornada dedicada a los CIOs, CISOs, IT Security Managers y todos los interesados en conocer el futuro de la ciberseguridad de la mano de expertos nacionales e internacionales en esta materia.

Leer más

micro_focus_summit17

SecurityInside Live: Micro Focus Summit 2017

El éxito de mañana está vinculado a la respuesta que hoy se dé a los desafíos de seguridad de nuestro negocio. Por eso, Micro Focus comparte en su Summit 2017 las experiencias de sus clientes y el conocimiento de su equipo.

Leer más

SecurityInside Live: CloudForum 2017

En esta ocasión asisto al CloudForum de IDC orientado a las tecnologías cloud. Expertos de grandes empresas como Fujitsu, Telefónica o IBM (entre otras) nos ofrecen su experiencia de primera mano.

Leer más