LATEST VERSION: 1.10 - CHANGELOG
Pivotal Cloud Foundry v1.10

Understanding Application Security Groups

Page last updated:

This page assumes you are using 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. Many of the steps below require the Cloud Foundry Command Line Interface (cf CLI) tool.

Note: If you are creating ASGs for the first time, see Restricting App Access to Internal PCF Components.

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

Elastic Runtime defines one default ASG, default_security_group. This group allows all outbound traffic from application containers on public and private networks except for the link-local range, 169.254.0.0/16, which is blocked.

WARNING: For security, Elastic Runtime administrators must modify the default ASGs so that outbound network traffic cannot access internal components.

The ASG is defined in the Cloud Controller configuration as follows:

security_group_definitions:
- name: default_security_group
  rules:
  - protocol: all
    destination: 0.0.0.0-169.253.255.255
  - protocol: all
    destination: 169.255.0.0-255.255.255.255

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 cf bind-security-group command 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. Logging is only supported when the protocol type is 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.

Note: If you are creating ASGs for the first time, see Restricting App Access to Internal PCF Components.

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

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

Note: You can also view ASGs in Apps Manager under the Settings tab of a space or an app.

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

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 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 Elastic Runtime 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 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

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