Understanding Application Security Groups

Page last updated:

Introduction

This topic provides an overview of Application Security Groups (ASGs), and describes how to manage and administer them. Many of the steps below require the Cloud Foundry Command Line Interface (cf CLI) tool.

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.

Staging vs. Running ASGs

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 a staging ASG for app and task staging, and a running ASG for app and task runtime.

Platform-wide vs. Space-scoped ASGs

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

Simplifying ASGs with a Services Subnet

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 letting 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, these ASGs 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 cf CLI 6.28.0 or later.

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 that can receive traffic
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. A value of -1 allows all codes.
type ICMP type Required when protocol is icmp. A value of -1 allows all types.
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. Logging is only supported with protocol type tcp
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 Managing ASGs with the cf CLI below.

Task For more information, see
1. Review the existing ASGs. If this is a new deployment, these consist of only the Default ASGs. 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 an ASG, first unbind it, then delete it. Unbind ASGs
Delete ASGs

Managing ASGs with the cf CLI

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

View ASGs

Run the following cf CLI 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": 0
      },
      {
        "protocol": "tcp",
        "destination": "10.0.11.0/24",
        "ports": "80,443",
        "log": true,
        "description": "Allow http and https traffic from ZoneA"
      }
    ]
    
  2. Run cf create-security-group SECURITY-GROUP PATH-TO-RULES-FILE. Replace SECURITY-GROUP with the name of your security group, and PATH-TO-RULES-FILE with the absolute or relative path to a rules file.

In the following example, my-asg is the name of a security group, and ~/workspace/my-asg.json is the path to a rules file.

$ 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 cf bind-staging-security-group SECURITY-GROUP. Replace SECURITY-GROUP with the name of your security group.

Example:

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

To bind an ASG to the platform-wide running ASG set, run cf bind-running-security-group SECURITY-GROUP command. Replace SECURITY-GROUP with the name of your security group.

Example:

$ cf bind-running-security-group my-asg

To bind an ASG to a space-scoped running ASG set, run cf bind-security-group SECURITY-GROUP ORG SPACE. Replace SECURITY-GROUP with the name of your security group. Replace ORG and SPACE with the org and space where you want to bind the ASG set.

Example:

$ cf bind-security-group my-asg my-org my-space

To bind an ASG to a space-scoped staging ASG set, run cf bind-security-group SECURITY-GROUP ORG SPACE --lifecycle staging. Replace SECURITY-GROUP with the name of your security group. Replace ORG and SPACE with the org and space where you want to bind the ASG set.

Update ASGs

To update an existing ASG, perform the following steps.

  1. Edit the ASG rules in the JSON file.

  2. Run cf update-security-group SECURITY-GROUP PATH-TO-RULES-FILE. Replace 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.

In the following example, my-asg is the name of a security group, and ~/workspace/my-asg-v2.json is the path to a rules file.

$ 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 cf unbind-staging-security-group SECURITY-GROUP. Replace SECURITY-GROUP with the name of your security group.

Example:

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

To unbind an ASG from the platform-wide running ASG set, run cf unbind-running-security-group SECURITY-GROUP. Replace SECURITY-GROUP with the name of your security group.

Example:

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

To unbind an ASG from a specific space, run cf unbind-security-group SECURITY-GROUP ORG SPACE --lifecycle running. Replace SECURITY-GROUP with the name of your security group. Replace ORG and SPACE with the org and space where you want to unbind the ASG set, and replace running with staging if you want to unbind from the staging ASG set.

Example:

$ cf unbind-security-group my-asg my-org my-space --lifecycle staging

Delete ASGs

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

To delete an ASG, run cf delete-security-group SECURITY-GROUP. Replace SECURITY-GROUP with the name of your security group.

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

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: You should 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 the Services Overview topics.

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 create-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

ASG Logging

The KB article How to use Application Security Group (ASG) logging describes how you can use ASGs to correlate emitted logs back to an app.

Create a pull request or raise an issue on the source for this page in GitHub