def _check_timeout_ssh(self):
        timeout = 0
        sshd_config = get_config_from_file('/etc/ssh/sshd_config', '#')
        timeout_config_min = self.config_data.get('timeout_config_shell_min',
                                                  300)
        timeout_config_max = self.config_data.get('timeout_config_shell_max',
                                                  600)
        if sshd_config and 'ClientAliveInterval' in sshd_config:
            timeout = sshd_config.get('ClientAliveInterval')
        result = 'Incorrecto'
        if timeout:
            result = 'Correcto' if timeout >= timeout_config_min and timeout <= timeout_config_max else 'Incorrecto'
        description = 'El tiempo para el cierre de la sesión por ssh debido a inactividad, debe de estar entre 300 y 600 segundos'
        self.entries_to_display.append([
            'Tiempo para cierre de sesión debido a inactividad en SSH',
            timeout if timeout else 'Indeterminado', result, description
        ])

        result = 'Incorrecto'
        client_alive_count_max = -1
        if 'ClientAliveCountMax' in sshd_config:
            client_alive_count_max = sshd_config['ClientAliveCountMax']
        result = 'Correcto' if client_alive_count_max == 0 else 'Incorrecto'
        description = """
            Número de mensajes que se envían a través de SSH para mantener activa la conexión.
            Debe de ser 0, para que el timeout de la conexión coincida correctamente"""
        self.entries_to_display.append([
            'Número de mensajes Keep Alive antes de finalizar la sesión',
            'Indeterminado' if client_alive_count_max == -1 else
            client_alive_count_max, result, description
        ])
 def _check_partitions_splitted(self):
     partitions_splitted = True
     content = get_config_from_file("/etc/fstab",
                                    "#",
                                    return_full_content=True)
     mount_point_position = 1
     list_mount_point_separated = [
         '/', '/boot', '/usr', '/home', '/tmp', '/var', '/opt'
     ]
     list_mount_point_in_fstab = []
     for line in content:
         if line:
             line_splitted = line.split()
             list_mount_point_in_fstab.append(
                 line_splitted[mount_point_position])
     for mount_point_to_check in list_mount_point_separated:
         if mount_point_to_check not in list_mount_point_in_fstab:
             partitions_splitted = False
             break
     result = 'Correcto' if partitions_splitted else 'Incorrecto'
     description = 'Los puntos de montaje siguientes: /, /boot, /usr, /home, /tmp, /var, /opt, deben de encontrarse en particiones separadas'
     self.entries_to_display.append([
         'Puntos de montaje en diferentes particiones',
         'Sí' if partitions_splitted else 'No', result, description
     ])
Ejemplo n.º 3
0
 def _check_selinux(self):
     selinux_enabled = False
     config_selinux = get_config_from_file('/etc/selinux/config', '#')
     if 'SELINUX' in config_selinux and config_selinux[
             'SELINUX'] != 'disabled':
         selinux_enabled = True
     result = 'Correcto' if selinux_enabled else 'Incorrecto'
     description = 'El módulo SELinux (Módulo de seguridad para el kernel linux) debe de estar activo'
     self.entries_to_display.append([
         'SELinux activo', 'Sí' if selinux_enabled else 'No', result,
         description
     ])
Ejemplo n.º 4
0
 def get_params(self):
     json_data = dict_config = {}
     with open(self.json_file_path, 'r') as file:
         json_data = json.load(file)
     for key in json_data:
         configs_to_check = json_data[key]
         for config in configs_to_check:
             if len(config) != 6:
                 continue
             path_to_check = config[0]
             property = config[1]
             lines_to_ignore = config[2]
             separator = config[3]
             name_in_report = config[4]
             expected_value = config[5]
             if path_to_check not in dict_config:
                 config_file = get_config_from_file(path_to_check,
                                                    lines_to_ignore, True)
                 dict_config[path_to_check] = config_file
                 params_file_config = {}
                 for line in config_file:
                     if separator:
                         line_splitted = line.split(separator)
                     else:
                         line_splitted = line.split()
                     if line_splitted[0] in params_file_config:
                         actual_values_for_key = params_file_config[
                             line_splitted[0]]
                         actual_values_for_key.append(''.join(
                             line_splitted[1:]))
                         params_file_config[
                             line_splitted[0]] = actual_values_for_key
                     else:
                         params_file_config[line_splitted[0]] = [
                             ''.join(line_splitted[1:])
                         ]
                 dict_config[path_to_check] = params_file_config
             result = 'Incorrecto'
             if property in dict_config:
                 for field in dict_config[property]:
                     if expected_value in field:
                         result = 'Correcto'
                     else:
                         result = 'Incorrecto'
                         break
             self.list_config_parsed.append(
                 ('[' + key + '] ' + name_in_report, result))
Ejemplo n.º 5
0
    def _check_sysctl_config(self):
        config_data = {}
        lines = get_config_from_file('/etc/sysctl.conf',
                                     '#',
                                     return_full_content=True)
        for line in lines:
            line_splitted = line.split('=')
            if len(line_splitted) == 2:
                config_data[
                    line_splitted[0].strip()] = line_splitted[1].strip()

        list_properties_to_check = [
            ('Ip Forward activo', 'net.ipv4.ip_forward', '0',
             'Ip Forward debería de estar activo'),
            ('No permitir paquetes enrutados en origen',
             'net.ipv4.conf.default.accept_source_route', '0',
             'Por seguridad no se deben de permitir paquetes enrutados en origen'
             ),
            ('SYN Cookies activadas', 'net.ipv4.tcp_syncookies', '1',
             'SYN Cookies debe de estar activado para prevenir ataques Syn Flooding'
             ),
            ('¿Aceptar paquetes con opción SRR?',
             'net.ipv4.conf.all.accept_source_route', '0',
             'No se deben permitir los paquetes enrutados en origen'),
            ('¿Aceptar redirecciones (IPv4)? ', [
                'net.ipv4.conf.all.accept_redirects',
                'net.ipv4.conf.all.secure_redirects'
            ], ['0', '0'], 'No se deben de aceptar redirecciones IPv4'),
            ('Ignorar todas las peticiones ICPM enviadas a través de broadcast/multicast',
             'net.ipv4.icmp_echo_ignore_broadcasts', '1',
             'Se deben de ignorar todas las peticioens ICPM provenientes de broadcast/multicast'
             ),
            ('Protección SYN-flood activada', 'net.ipv4.tcp_synack_retries',
             '5', 'Se debe de limitar el tamaño máximo de syn ack'),
            ('Protección ante mensajes de error mal formateados',
             'net.ipv4.icmp_ignore_bogus_error_responses', '1',
             'Se debe de proteger antes mensajes que estén mal formateados'),
            ('RFC 1337 fix', 'net.ipv4.tcp_rfc1337', '1',
             'Se debe de activar para aplicar el fix al RFC 1337'),
            ('Funcionamiento como router', [
                'net.ipv4.conf.all.send_redirects',
                'net.ipv4.conf.default.send_redirects'
            ], ['0', '0'], 'Se debe de evitar funcionar como router'),
            ('Reverse Path Filtering activo', [
                'net.ipv4.conf.default.rp_filter',
                'net.ipv4.conf.all.rp_filter'
            ], ['1', '1'], 'Reverse Path Filtering debe de estar activo'),
            ('Funciones SysRq desactivadas', 'kernel.sysrq', '0',
             'Por protección sysrq debe de estar desactivado'),
            ('Protección ExecShield activa',
             ['kernel.exec-shield', 'kernel.randomize_va_space'], ['2', '2'],
             'La protección ExecShield debe de estar activada'),
            ('Reinicio en caso de error interno del sistema', 'kernel.panic',
             '10',
             'Para proteger el sistema y por seguridad, se debe de reiniciar en caso de error interno'
             ),
            ('Protección de vulnerabilidades TOCTOU (Hardlinks)',
             'fs.protected_hardlinks', '1',
             'Debe de estar activado por seguridad para el sistema'),
            ('Protección de vulnerabilidades TOCTOU (Symlinks)',
             'fs.protected_symlinks', '1',
             'Debe de estar activado por seguridad para el sistema')
        ]

        for property in list_properties_to_check:
            title = property[0]
            configured = False
            if isinstance(property[1], list):
                for index in range(len(property[1])):
                    field_to_check = property[1][index]
                    value_expected = property[2][index]
                    if field_to_check in config_data and config_data[
                            field_to_check] == value_expected:
                        configured = True
                    else:
                        configured = False
                    if configured is False:
                        break
            else:
                configured = False
                if property[1] in config_data and config_data[
                        property[1]] == property[2]:
                    configured = True
            result = 'Correcto' if configured else 'Incorrecto'
            description = property[3] if len(property) == 4 else ''
            self.entries_to_display.append(
                [title, result, result, description])
 def _load_system_config_file(self):
     self.config_file = get_config_from_file('/etc/login.defs', '#')
     self.pam_commom_password_config = get_pam_config(
         self.get_real_path_pam_password(), '#')
 def _load_system_config_file(self):
     self.config_file = get_config_from_file('/etc/ssh/sshd_config', '#')
 def _load_sudoers_config(self):
     self.sudoers_config = get_config_from_file('/etc/sudoers',
                                                '#',
                                                return_full_content=True)