Ejemplo n.º 1
0
    def remove_external_address_block(self, context, cidr):
        LOG.audit(_('Removing ip block from %s'), cidr, context=context)
        cidr = urllib.unquote(cidr).decode()
        # Catch the exception and LOG for improper or malicious inputs.
        # Also return a proper status and message in that case
        failed = {'status': 'Failed', 'message': ' 0 rules deleted'}
        if not utils.is_valid_cidr(cidr):
            msg = 'Improper input. Please provide a valid cidr: ' \
                                                    'e.g. 121.12.10.11/24.'
            failed['message'] = msg + failed['message']
            return failed
        #Normalizing cidr. e.g. '20.20.20.11/24' -> '20.20.20.0/24', so that
        #db values stay in sync with filters' values (e.g. in iptables)
        cidr = str(netaddr.IPNetwork(cidr).cidr)
        rules = db.provider_fw_rule_get_all_by_cidr(context, cidr)

        if not rules:
            msg = 'No such CIDR currently blocked.'
            failed['message'] = msg + failed['message']
            return failed
        else:
            for rule in rules:
                db.provider_fw_rule_destroy(context, rule['id'])
            self.compute_api.trigger_provider_fw_rules_refresh(context)
            return {'status': 'OK', 'message': 'Deleted %s rules' % len(rules)}
Ejemplo n.º 2
0
    def parse_cidr(self, cidr):
        if cidr:
            try:
                cidr = urllib.unquote(cidr).decode()
            except Exception as e:
                self.raise_invalid_cidr(cidr, e)

            if not utils.is_valid_cidr(cidr):
                self.raise_invalid_cidr(cidr)

            return cidr
        else:
            return '0.0.0.0/0'
Ejemplo n.º 3
0
    def parse_cidr(self, cidr):
        if cidr:
            try:
                cidr = urllib.unquote(cidr).decode()
            except Exception as e:
                self.raise_invalid_cidr(cidr, e)

            if not utils.is_valid_cidr(cidr):
                self.raise_invalid_cidr(cidr)

            return cidr
        else:
            return '0.0.0.0/0'
Ejemplo n.º 4
0
 def block_external_addresses(self, context, cidr):
     """Add provider-level firewall rules to block incoming traffic."""
     LOG.audit(_('Blocking traffic to all projects incoming from %s'),
               cidr, context=context)
     cidr = urllib.unquote(cidr).decode()
     failed = {'status': 'Failed', 'message': ' 0 rules added'}
     if not utils.is_valid_cidr(cidr):
         msg = 'Improper input. Please provide a valid cidr: ' \
                                                     'e.g. 121.12.10.11/24.'
         failed['message'] = msg + failed['message']
         return failed
     #Normalizing cidr. e.g. '20.20.20.11/24' -> '20.20.20.0/24', so that
     #db values stay in sync with filters' values (e.g. in iptables)
     cidr = str(netaddr.IPNetwork(cidr).cidr)
     rule = {'cidr': cidr}
     tcp_rule = rule.copy()
     tcp_rule.update({'protocol': 'tcp', 'from_port': 1, 'to_port': 65535})
     udp_rule = rule.copy()
     udp_rule.update({'protocol': 'udp', 'from_port': 1, 'to_port': 65535})
     icmp_rule = rule.copy()
     icmp_rule.update({'protocol': 'icmp', 'from_port': -1,
                       'to_port': None})
     rules_added = 0
     if not self._provider_fw_rule_exists(context, tcp_rule):
         db.provider_fw_rule_create(context, tcp_rule)
         rules_added += 1
     if not self._provider_fw_rule_exists(context, udp_rule):
         db.provider_fw_rule_create(context, udp_rule)
         rules_added += 1
     if not self._provider_fw_rule_exists(context, icmp_rule):
         db.provider_fw_rule_create(context, icmp_rule)
         rules_added += 1
     if not rules_added:
             msg = 'Duplicate Rule.'
             failed['message'] = msg + failed['message']
             return failed
     self.compute_api.trigger_provider_fw_rules_refresh(context)
     return {'status': 'OK', 'message': 'Added %s rules' % rules_added}
Ejemplo n.º 5
0
    def _rule_args_to_dict(self, context, to_port=None, from_port=None,
                                  parent_group_id=None, ip_protocol=None,
                                  cidr=None, group_id=None):
        values = {}

        if group_id is not None:
            try:
                parent_group_id = int(parent_group_id)
                group_id = int(group_id)
            except ValueError:
                msg = _("Parent or group id is not integer")
                raise exception.InvalidInput(reason=msg)

            if parent_group_id == group_id:
                msg = _("Parent group id and group id cannot be same")
                raise exception.InvalidInput(reason=msg)

            values['group_id'] = group_id
            #check if groupId exists
            db.security_group_get(context, group_id)
        elif cidr:
            # If this fails, it throws an exception. This is what we want.
            try:
                cidr = urllib.unquote(cidr).decode()
            except Exception:
                raise exception.InvalidCidr(cidr=cidr)

            if not utils.is_valid_cidr(cidr):
                # Raise exception for non-valid address
                raise exception.InvalidCidr(cidr=cidr)

            values['cidr'] = cidr
        else:
            values['cidr'] = '0.0.0.0/0'

        if ip_protocol and from_port and to_port:

            ip_protocol = str(ip_protocol)
            try:
                from_port = int(from_port)
                to_port = int(to_port)
            except ValueError:
                if ip_protocol.upper() == 'ICMP':
                    raise exception.InvalidInput(reason="Type and"
                         " Code must be integers for ICMP protocol type")
                else:
                    raise exception.InvalidInput(reason="To and From ports "
                          "must be integers")

            if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
                raise exception.InvalidIpProtocol(protocol=ip_protocol)

            # Verify that from_port must always be less than
            # or equal to to_port
            if from_port > to_port:
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="Former value cannot"
                                            " be greater than the later")

            # Verify valid TCP, UDP port ranges
            if (ip_protocol.upper() in ['TCP', 'UDP'] and
                (from_port < 1 or to_port > 65535)):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="Valid TCP ports should"
                                           " be between 1-65535")

            # Verify ICMP type and code
            if (ip_protocol.upper() == "ICMP" and
                (from_port < -1 or to_port > 255)):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="For ICMP, the"
                                           " type:code must be valid")

            values['protocol'] = ip_protocol
            values['from_port'] = from_port
            values['to_port'] = to_port
        else:
            # If cidr based filtering, protocol and ports are mandatory
            if 'cidr' in values:
                return None

        return values
Ejemplo n.º 6
0
    def _rule_args_to_dict(self, context, to_port=None, from_port=None,
                                  parent_group_id=None, ip_protocol=None,
                                  cidr=None, group_id=None):
        values = {}

        if group_id is not None:
            try:
                parent_group_id = int(parent_group_id)
                group_id = int(group_id)
            except ValueError:
                msg = _("Parent or group id is not integer")
                raise exception.InvalidInput(reason=msg)

            values['group_id'] = group_id
            #check if groupId exists
            db.security_group_get(context, group_id)
        elif cidr:
            # If this fails, it throws an exception. This is what we want.
            try:
                cidr = urllib.unquote(cidr).decode()
            except Exception:
                raise exception.InvalidCidr(cidr=cidr)

            if not utils.is_valid_cidr(cidr):
                # Raise exception for non-valid address
                raise exception.InvalidCidr(cidr=cidr)

            values['cidr'] = cidr
        else:
            values['cidr'] = '0.0.0.0/0'

        if group_id:
            # Open everything if an explicit port range or type/code are not
            # specified, but only if a source group was specified.
            ip_proto_upper = ip_protocol.upper() if ip_protocol else ''
            if (ip_proto_upper == 'ICMP' and
                from_port is None and to_port is None):
                from_port = -1
                to_port = -1
            elif (ip_proto_upper in ['TCP', 'UDP'] and from_port is None
                  and to_port is None):
                from_port = 1
                to_port = 65535

        if ip_protocol and from_port is not None and to_port is not None:

            ip_protocol = str(ip_protocol)
            try:
                from_port = int(from_port)
                to_port = int(to_port)
            except ValueError:
                if ip_protocol.upper() == 'ICMP':
                    raise exception.InvalidInput(reason="Type and"
                         " Code must be integers for ICMP protocol type")
                else:
                    raise exception.InvalidInput(reason="To and From ports "
                          "must be integers")

            if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
                raise exception.InvalidIpProtocol(protocol=ip_protocol)

            # Verify that from_port must always be less than
            # or equal to to_port
            if (ip_protocol.upper() in ['TCP', 'UDP'] and
                from_port > to_port):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="Former value cannot"
                                            " be greater than the later")

            # Verify valid TCP, UDP port ranges
            if (ip_protocol.upper() in ['TCP', 'UDP'] and
                (from_port < 1 or to_port > 65535)):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="Valid TCP ports should"
                                           " be between 1-65535")

            # Verify ICMP type and code
            if (ip_protocol.upper() == "ICMP" and
                (from_port < -1 or from_port > 255 or
                to_port < -1 or to_port > 255)):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="For ICMP, the"
                                           " type:code must be valid")

            values['protocol'] = ip_protocol
            values['from_port'] = from_port
            values['to_port'] = to_port
        else:
            # If cidr based filtering, protocol and ports are mandatory
            if 'cidr' in values:
                return None

        return values