Application Security Groups

Page last updated:

This page assumes you are using Cloud Foundry Command Line Interface tool(cf CLI) v6.4 or later.

Introduction

This topic provides an overview of Application Security Groups (ASGs) and describes how to manage and administer them.

Application Security Groups

Application Security Groups (ASGs) are a collections of egress rules that specify the protocols, ports, and IP address ranges where app or task instances send traffic. Because ASGs define allow rules, their order of evaluation is unimportant when multiple ASGs apply to the same space or deployment. The platform sets up rules to filter and log outbound network traffic from app and task instances. ASGs apply to both buildpack-based and Docker-based apps and tasks.

When apps or tasks begin staging, they need traffic rules permissive enough to allow them to pull resources from the network. After an app or task is running, the traffic rules can be more restrictive and secure. To distinguish between these two security requirements, administrators can define one ASG for app and task staging, and another for app and task runtime.

To provide granular control when securing a deployment, an administrator can assign ASGs to apply to all app and task instances for the entire deployment, or assign ASGs to spaces to apply only to apps and tasks in a particular space.

ASGs can be complicated to configure correctly, especially when the specific IP addresses listed in a group change. To simplify securing a deployment while still permitting apps reach external services, operators can deploy the services into a subnet that is separate from their Cloud Foundry deployment. Then the operators can create ASGs for the apps that whitelist those service subnets, while denying access to any virtual machine (VM) hosting other apps.

For examples of typical ASGs, see the Typical Application Security Groups section of this topic.

Default ASGs

Cloud Foundry preconfigures two ASGs: public_networks and dns.

Unless you modify these before your initial deployment, they are applied by default to all containers in your deployment.

  • public_networks: This group allows access to public networks, and blocks access to private networks and link-local addresses. Cloud Foundry blocks outgoing traffic to the following IP address ranges by specifically allowing traffic to all other addresses.

    • 10.0.0.0 - 10.255.255.255
    • 169.254.0.0 - 169.254.255.255
    • 172.16.0.0 - 172.31.255.255
    • 192.168.0.0 - 192.168.255.255
  • dns: This group allows access to DNS on port 53 for any IP address.

The default ASGs are defined in the cf.yml file as follows:

  default_security_group_definitions:
  - name: public_networks
    rules:
    - protocol: all
      destination: 0.0.0.0-9.255.255.255
    - protocol: all
      destination: 11.0.0.0-169.253.255.255
    - protocol: all
      destination:  169.255.0.0-172.15.255.255
    - protocol: all
      destination: 172.32.0.0-192.167.255.255
    - protocol: all
      destination: 192.169.0.0-255.255.255.255
  - name: dns
    rules:
    - protocol: tcp
      destination: 0.0.0.0/0
      ports: '53'
    - protocol: udp
      destination: 0.0.0.0/0
      ports: '53'

You should modify the default ASGs to block outbound traffic as necessary for your installation.

ASG Sets

ASGs are applied by configuring ASG sets differentiated by scope, platform-wide or space specific, and lifecycle, staging or running.

Currently, four ASG sets exist in Cloud Foundry:

  • Platform-wide staging ASG set (also called “default-staging”)
  • Platform-wide running ASG set (also called “default-running”)
  • Space-scoped staging ASG set
  • Space-scoped running ASG set

The following table indicates the differences between the four sets.

When an ASG is bound to the… the ASG rules are applied to…
Platform-wide staging ASG set the staging lifecycle for all apps and tasks.
Platform-wide running ASG set the running lifecycle for all app and task instances.
Space-scoped staging ASG set the staging lifecycle for apps and tasks in a particular space.
Space-scoped running ASG set the running lifecycle for app and task instances in a particular space.

Typically, ASGs applied during the staging lifecycle are more permissive than the ASGs applied during the running lifecycle. This is because staging often requires access to different resources, such as dependencies.

You use different commands to apply an ASG to each of the four sets. For more information, see the Procedures section of this topic.

Note: To apply a staging ASG to apps within a space, you must use the CC API. The cf CLI command cf bind-security-group supports space-scoped running ASGs, but not space-scoped staging ASGs.

The Structure and Attributes of ASGs

ASG rules are specified as a JSON array of ASG objects. An ASG object has the following attributes:

Attribute Description Notes
protocol tcp, udp, icmp, or all Required
destination A single IP address, an IP address range like 192.0.2.0-192.0.2.50, or a CIDR block to allow network access to
ports A single port, multiple comma-separated ports, or a single range of ports that can receive traffic. Examples: 443, 80,8080,8081, 8080-8081 Required when protocol is tcp or udp
code ICMP code Required when protocol is icmp
type ICMP type Required when protocol is icmp
log Set to true to enable logging. For more information about how to configure system logs to be sent to a syslog drain, see the Using Log Management Services topic.
description An optional text field for operators managing security group rules

Process for Administering ASGs

The following table outlines the flow of tasks that the administrator carries out over the lifecycle of ASGs. Procedures for each of these tasks are given in Procedures for Working with ASGs below.

Task For more information, see
1. Review the existing ASGs. If this is a new deployment, probably these are the Default ASGs alone. View ASGs
2. Create new ASGs. Create ASGs
3. Update the existing ASGs. Update ASGs
4. Bind ASGs to an ASG set. Bind ASGs
5. If you need to delete ASGs, unbind and delete them. Unbind ASGs
Delete ASGs

Procedures for Working with ASGs

This section provides the commands you need to create and manage ASGs.

View ASGs

Run the following commands to view information about existing ASGs:

Command Output
cf security-groups All ASGs
cf staging-security-groups All ASGs applied to the platform-wide staging ASG set
cf running-security-groups All ASGs applied to the platform-wide running ASG set
cf security-group SECURITY-GROUP All rules in the ASG named SECURITY-GROUP, for example, cf security-group dns

Create ASGs

To create an ASG, perform the following steps:

  1. Create a rules file: a JSON-formatted single array containing objects that describe the rules. See the following example, which allows ICMP traffic of code 1 and type 0 to all destinations, and TCP traffic to 10.0.11.0/24 on ports 80 and 443. Also see The Structure and Attributes of ASGs.

    [
      {
        "protocol": "icmp",
        "destination": "0.0.0.0/0",
        "type": 0,
        "code": 1
      },
      {
        "protocol": "tcp",
        "destination": "10.0.11.0/24",
        "ports": "80,443",
        "log": true,
        "description": "Allow http and https traffic from ZoneA"
      }
    ]
    
  2. Run the following cf CLI command, replacing SECURITY-GROUP with the name of your security group and PATH-TO-RULES-FILE with the absolute or relative path to a rules file:

     $ cf create-security-group SECURITY-GROUP PATH-TO-RULES-FILE 
    For example,
    $ cf create-security-group my-asg ~/workspace/my-asg.json

After the ASG is created, you must bind it to an ASG set before it takes effect. See Bind ASGs below.

Bind ASGs

Note: Binding an ASG does not affect started apps until you restart them. To restart all of the apps in an org or a space, use the app-restarter cf CLI plugin.

To apply an ASG, you must first bind it to an ASG set.

  • To bind an ASG to the platform-wide staging ASG set, run the following command:

    $ cf bind-staging-security-group SECURITY-GROUP
    
    For example,
    $ cf bind-staging-security-group my-asg
    

  • To bind an ASG to the platform-wide running ASG set, run the following command:

    $ cf bind-running-security-group SECURITY-GROUP
    For example,
     $ cf bind-running-security-group my-asg

  • To bind an ASG to a space-scoped running ASG set, run the following command:

     $ cf bind-security-group SECURITY-GROUP ORG SPACE 
    For example,
    $ cf bind-security-group my-asg my-org my-space 

  • To bind an ASG to a space-scoped staging ASG set, use the following Cloud Controller (CC) API commands:

    GET /v2/security_groups/:guid/staging_spaces
    PUT /v2/spaces/:guid/staging_security_groups/:security_group_guid data
    PUT /v2/security_groups/:guid/staging_spaces/:space_guid
    DELETE /v2/spaces/:guid/staging_security_groups/:security_group_guid  data
    DELETE /v2/security_groups/:guid/staging_spaces/:space_guid
    
    These API calls require administrator access. Additionally, the payload returned from API GET calls to /v2/spaces/ and /v2/spaces/:guid includes a link to the staging_security_groups_url.

    For more information about using these CC API commands, see the Cloud Foundry API documentation.

Update ASGs

To update an existing ASG, perform the following steps.

  1. Edit the ASG rules in the JSON file.

  2. Run the following command, replacing SECURITY-GROUP with the name of the existing ASG you want to change: and PATH-TO-RULES-FILE with the absolute or relative path to a rules file.

     $ cf update-security-group SECURITY-GROUP PATH-TO-RULES-FILE 
    For example,
    $ cf update-security-group my-asg ~/workspace/my-asg-v2.json
    

Note: Updating an ASG does not affect started apps until you restart them. To restart all of the apps in an org or a space, use the app-restarter cf CLI plugin.

Unbind ASGs

Note: Unbinding an ASG does not affect started apps until you restart them. To restart all of the apps in an org or a space, use the app-restarter cf CLI plugin.

To unbind an ASG from the platform-wide staging ASG set, run the following command:

 $ cf unbind-staging-security-group SECURITY-GROUP 

For example,

 $ cf unbind-staging-security-group my-asg

To unbind an ASG from the platform-wide running ASG set, run the following command:

 $ cf unbind-running-security-group SECURITY-GROUP 
For example,
 $ cf unbind-running-security-group my-asg

To unbind an ASG from a specific space, run the following command:

 $ cf unbind-security-group SECURITY-GROUP ORG SPACE 
For example,
 $ cf unbind-security-group my-asg my-org my-space

Delete ASGs

Note: You can only delete unbound ASGs. To unbind ASGs, see Unbind ASGs above.

To delete an ASG, run the following command:

 $ cf delete-security-group SECURITY-GROUP 

For example,

 $ cf delete-security-group my-asg 

Typical ASGs

Below are examples of typical ASGs. Configure your ASGs in accordance with your organization’s network access policy for untrusted apps.

ASG For access to
dns DNS, either public or private
public-networks Public networks, excluding IaaS metadata endpoints
private-networks Private networks in accordance with RFC-1918
load-balancers The internal Cloud Foundry load balancer and others
internal-proxies Internal proxies
internal-databases Internal databases

DNS

In order to resolve hostnames to IP addresses, apps require DNS server connectivity, which typically use port 53. Administrators should create or update a dns ASG with appropriate rules. Administrators may further restrict the DNS servers to specific IP addresses or ranges of IP addresses.

Example dns ASG:

[
  {
    "protocol": "tcp",
    "destination": "0.0.0.0/0",
    "ports": "53"
  },
  {
    "protocol": "udp",
    "destination": "0.0.0.0/0",
    "ports": "53"
  }
]

Public Networks

Apps often require public network connectivity to retrieve app dependencies, or to integrate with services available on public networks. Example app dependencies include public Maven repositories, NPM, RubyGems, and Docker registries.

Note: You should exclude IaaS metadata endpoints, such as 169.254.169.254, because the metadata endpoint can expose sensitive environment information to untrusted apps. The public_networks example below accounts for this recommendation.

Example public_networks ASG:

[
  {
    "destination": "0.0.0.0-9.255.255.255",
    "protocol": "all"
  },
  {
    "destination": "11.0.0.0-169.253.255.255",
    "protocol": "all"
  },
  {
    "destination": "169.255.0.0-172.15.255.255",
    "protocol": "all"
  },
  {
    "destination": "172.32.0.0-192.167.255.255",
    "protocol": "all"
  },
  {
    "destination": "192.169.0.0-255.255.255.255",
    "protocol": "all"
  }
]

Private Networks

Network connections that are commonly allowable in private networks include endpoints such as proxy servers, Docker registries, load balancers, databases, messaging servers, directory servers, and file servers. Configure appropriate private network ASGs as appropriate. You may find it helpful to use a naming convention with private_networks as part of the ASG name, such as private_networks_databases.

Note: Be sure to exclude any private networks and IP addresses that app and task instances should not have access to.

Example private_networks ASG:

[
  {
    "protocol": "tcp",
    "destination": "10.0.0.0-10.255.255.255",
    "ports": "443"
  },
  {
    "protocol": "tcp",
    "destination": "172.16.0.0-172.31.255.255",
    "ports": "443"
  },
  {
    "protocol": "tcp",
    "destination": "192.168.0.0-192.168.255.255",
    "ports": "443"
  }
]

Marketplace Services

Each installed Marketplace Service requires its own set of ASG rules to function properly. See the installation instructions for each installed Marketplace Service to determine which ASG rules it requires. For more information about how to provision and integrate services, see Services Overview.

About the ASG Creator Tool

The ASG Creator is a command line tool that you can use to create JSON rules files. The ASG Creator lets you specify IP addresses, CIDRs, and IP address ranges that you want to disallow traffic to, as well as the addresses that you want to allow traffic to. Based on these disallow/allow (exclude/include) lists that you provide as input, the ASG Creator formulates a JSON file of allow rules.

In turn, the JSON file is the input for the cf bind-security-group command that creates an ASG.

You can download the latest release of the ASG Creator from the Cloud Foundry incubator repository on Github: https://github.com/cloudfoundry-incubator/asg-creator/releases/latest

View the source for this page in GitHub