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 ])
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 ])
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))
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)