Self IP not locked down-f5-False

error
false
best-practices
f5
Self IP not locked down-f5-False
0

#1

Self IP not locked down-f5-False

Vendor: f5

OS: False

Description:
Best practices dictate that the self IP should be locked down to admin services. indeni will alert if this is not the case.

Remediation Steps:
Unless this is intentionally configured, such as a dedicated cable or VLAN for HA, it is always recommended to have the Self IP configuration set to “Allow None”. Make sure to schedule a service window before configuring this option.

How does this work?
This alert logs into the device through SSH and uses TMSH to retrieve the port lockdown configiguration for all self IP’s.

Why is this important?
Unless this is intentionally configured, such as a dedicated cable or VLAN for HA, it is recommended for security reasons to have the Self IP configuration to be set to “Allow None”. In previous versions the default option when creating a self IP was to allow “Default” and that configuration would follow during upgrades. This metric keeps track of self IP’s listening on any services. Please note that ICMP is implicitly allowed no matter what the port lockdown settings are, and does not need to be specified.

Without Indeni how would you find this?
An administrator could check this metric manually by logging into the device through TMSH and executing the command “list net self”.

f5-rest-net-self

 #! META
name: f5-rest-net-self
description: Determine self ip and network mask
type: monitoring
monitoring_interval: 5 minutes
requires:
    vendor: "f5"
    product: "load-balancer"
    rest-api: "true"

#! COMMENTS
network-interface-ipv4-address:
    why: |
        To be able to search for IP addresses in indeni, this data needs to be stored.
    how: |
        This alert logs into the F5 unit through the iControl REST API and retrieves the IPv4 addresses of all self IP's.
    without-indeni: |
        An administrator could login and manually check the "Self IP" IPv4 addresses by logging into the web interface and clicking on "Network" -> "Self IPs".
    can-with-snmp: true
    can-with-syslog: false
network-interface-ipv4-subnet:
    why: |
        To be able to search for IP addresses in indeni, this data needs to be stored.
    how: |
        This alert logs into the F5 unit through the iControl REST API and retrieves the IPv4 subnets of all self IP's.
    without-indeni: |
        An administrator could login and manually check the "Self IP" subnets by logging into the web interface and clicking on "Network" -> "Self IPs".
    can-with-snmp: true
    can-with-syslog: false
f5-port-lockdown-not-none:
    why: |
        Unless this is intentionally configured, such as a dedicated cable or VLAN for HA, it is recommended for security reasons to have the Self IP configuration to be set to "Allow None". In previous versions the default option when creating a self IP was to allow "Default" and that configuration would follow during upgrades. This metric keeps track of self IP's listening on any services. Please note that ICMP is implicitly allowed no matter what the port lockdown settings are, and does not need to be specified.
    how: |
        This alert logs into the device through SSH and uses TMSH to retrieve the port lockdown configiguration for all self IP's.
    without-indeni: |
        An administrator could check this metric manually by logging into the device through TMSH and executing the command "list net self".
    can-with-snmp: false
    can-with-syslog: false

#! REMOTE::HTTP
url: /mgmt/tm/net/self?$select=fullPath,address,allowService
protocol: HTTPS

#! PARSER::JSON

_metrics:
    - #Get interface address
        _groups:
            "$.items[0:]":
                _tags:
                    "im.name":
                        _constant: "network-interface-ipv4-address"
                    "name":
                        _value: "fullPath"
                _temp:
                    "address":
                        _value: "address"
        _transform:
            _value.complex:
                value: |
                    {
                        address = temp("address")

                        #10.0.2.1%1/23
                        split(address, addressArray, /\//)

                        ip = addressArray[1]

                        #In case of a route domain we need to remove the percentage
                        #10.0.2.1%1/23
                        sub(/%.*$/, "", ip)

                        #  "value" : "10.0.0.1"
                        print ip
                    }
    - #Get interface subnet
        _groups:
            "$.items[0:]":
                _tags:
                    "im.name":
                        _constant: "network-interface-ipv4-subnet"
                    "name":
                        _value: "fullPath"
                _temp:
                    "address":
                        _value: "address"
        _transform:
            _value.complex:
                value: |
                    {
                        address = temp("address")

                        #10.0.2.1/23
                        split(address, addressArray, /\//)

                        #  "value" : "30"
                        print addressArray[2]
                    }
    - #Determine if the self IP is configured to listening to default ports
        _groups:
            "$.items[0:][?('default' in @.allowService[0:])]":
                _tags:
                    "im.name":
                        _constant: "f5-default-port-lockdown"
                    "name":
                        _value: "fullPath"
                    "address":
                        _value: "address"
                _value.complex:
                    value:
                        _constant: "true"
    - #Determine if the self IP is configured to listening to default ports
        _groups:
            "$.items[0:][?('default' nin @.allowService[0:])]":
                _tags:
                    "im.name":
                        _constant: "f5-default-port-lockdown"
                    "name":
                        _value: "fullPath"
                    "address":
                        _value: "address"
                _value.complex:
                    value:
                        _constant: "false"

f5_port_not_locked_down

package com.indeni.server.rules.library.templatebased.f5

import com.indeni.ruleengine.expressions.conditions.{Equals => RuleEquals, Not => RuleNot, Or => RuleOr}
import com.indeni.ruleengine.expressions.data.SnapshotExpression
import com.indeni.server.rules.RuleContext
import com.indeni.server.rules.library._
import com.indeni.server.rules.library.templates.SingleSnapshotValueCheckTemplateRule

/**
  *
  */
case class f5_port_not_locked_down() extends SingleSnapshotValueCheckTemplateRule(
  ruleName = "f5_port_not_locked_down",
  ruleFriendlyName = "F5 Devices: Self IP not locked down",
  ruleDescription = "Best practices dictate that the self IP should be locked down to admin services. indeni will alert if this is not the case.",
  metricName = "f5-port-lockdown-not-none",
  applicableMetricTag = "name",
  alertItemsHeader = "Self IP's affected",
  alertDescription = "There are self IPs configured on this device which are listening to open ports.\n\nThis alert was added per the request of <a target=\"_blank\" href=\"https://se.linkedin.com/in/patrik-jonsson-6527932\">Patrik Jonsson</a>.",
  baseRemediationText = "Unless this is intentionally configured, such as a dedicated cable or VLAN for HA, it is always recommended to have the Self IP configuration set to \"Allow None\". Make sure to schedule a service window before configuring this option.",
  complexCondition = RuleEquals(RuleHelper.createComplexStringConstantExpression("true"), SnapshotExpression("f5-port-lockdown-not-none").asSingle().mostRecent().value().noneable))()