{"token_count": 2553}

# Nested Access Lists

Identity Governance is available only with Teleport Enterprise.

Nested Access Lists allow inclusion of an Access List as a member or owner of another Access List. This enables hierarchical permission structures where permissions can be inherited from multiple levels of parent Access Lists.

In this guide, you will:

- Understand how nesting and inheritance work in Access Lists
- Create a nested Access List
- Verify inherited permissions granted through the nested Access List

## How it works

Let's break down inheritance in Access Lists. Imagine two Access Lists you might have in an organization: "Engineering Team" and "Production Access". "Engineering Team" represents a group of engineers, while "Production Access" is a higher-level Access List that grants access to production resources.

- **Membership Inheritance**: If "Engineering Team" is added as a member of "Production Access", all users who are members of "Engineering Team" inherit member grants (roles and traits) from "Production Access".
- **Ownership Inheritance**: If "Engineering Team" is added as an owner of "Production Access", all users who are members of "Engineering Team" inherit owner grants (roles and traits) from "Production Access", and can perform owner actions, such as modifying it or managing its members.

Inheritance is recursive – members of "Engineering Team" can themselves be Access Lists with their own members, and so on. However, circular nesting is not allowed, and nesting is limited to a maximum depth of 10 levels.

For more information, see the [Access Lists reference](https://goteleport.com/docs/reference/access-controls/access-lists.md).

## Prerequisites

- A running Teleport Enterprise (v17.0.1 or higher) cluster accessible at a hostname with a valid TLS certificate. If you want to get started with Teleport, [sign up](https://goteleport.com/signup) for a free trial or [set up a demo environment](https://goteleport.com/docs/get-started/deploy-community.md).

- The `tctl` and `tsh` clients.

  Installing `tctl` and `tsh` clients

  1. Determine the version of your Teleport cluster. The `tctl` and `tsh` clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at `/v1/webapi/find` and use a JSON query tool to obtain your cluster version. Replace teleport.example.com:443 with the web address of your Teleport Proxy Service:

     **Mac/Linux**

     ```
     $ TELEPORT_DOMAIN=teleport.example.com:443
     $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
     ```

     **Windows - Powershell**

     ```
     $ $TELEPORT_DOMAIN = "teleport.example.com:443"
     $ $TELEPORT_VERSION = (Invoke-RestMethod -Uri "https://${TELEPORT_DOMAIN}/v1/webapi/find").server_version
     ```

  2. Follow the instructions for your platform to install `tctl` and `tsh` clients:

     **Mac**

     Download the signed macOS .pkg installer for Teleport, which includes the `tctl` and `tsh` clients:

     ```
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     In Finder double-click the `pkg` file to begin installation.

     ---

     DANGER

     Using Homebrew to install Teleport is not supported. The Teleport package in Homebrew is not maintained by Teleport and we can't guarantee its reliability or security.

     ---

     **Windows - Powershell**

     ```
     $ curl.exe -O https://cdn.teleport.dev/teleport-v$TELEPORT_VERSION-windows-amd64-bin.zip
     Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
     NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
     Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
     ```

     **Linux**

     All of the Teleport binaries in Linux installations include the `tctl` and `tsh` clients. For more options (including RPM/DEB packages and downloads for i386/ARM/ARM64) see our [installation page](https://goteleport.com/docs/installation/single-machine.md).

     ```
     $ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ cd teleport
     $ sudo ./install
     Teleport binaries have been copied to /usr/local/bin
     ```

  Connecting with TLS routing disabled

  This guide's commands assume your Teleport cluster uses TLS routing (`proxy_listener_mode: multiplex`), where the `tctl` and `tsh` clients reach every Teleport service through the Proxy Service's web address on port `443`. If you're not sure whether this applies to your cluster, check with whoever manages it.

  If your cluster uses separate listener ports instead, adjust ports as follows:

  - **`tsh` commands** (e.g., `tsh login --proxy=...`): continue using the Proxy Service web address on port `3080` (or `443` if behind a load balancer). Do not change these to port `3025`.

  - **Direct `tctl` or Auth Service API commands**: use port `3025` for the Auth Service gRPC listener:

    ```
    $ tctl status --auth-server=teleport.example.com:3025
    ```

* Check that you can connect to your Teleport cluster and verify that you can run `tctl` and `tsh` commands using your current credentials.

  1. Assign teleport.example.com to the domain name of the Teleport Proxy Service in your cluster and email\@example.com to your Teleport username.

  2. Authenticate to your Teleport cluster. This depends on whether your shell is interactive or not.

     **In an interactive shell:** Run the following command. By default, this triggers a multi-factor authentication prompt:

     ```
     $ tsh login --proxy=teleport.example.com --user=email@example.com
     $ tctl status
     Cluster  teleport.example.com
     Version  18.10.0
     CA pin   sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
     ```

     **On non-interactive environments:** If you are running `tsh` and `tctl` as an AI agent, in a CI/CD environment, or similar, make sure the `TELEPORT_IDENTITY_FILE` environment variable is assigned to a valid file path with credentials for your cluster. `tsh` and `tctl` read the file path from the environment variable and do not require a separate authentication step. If there is no identity file available, we recommend that you [set up Machine ID](https://goteleport.com/docs/machine-workload-identity/getting-started.md) to provision one automatically.

     When executing `tctl` commands with an identity file, you must pass the `--auth-server` flag to provide the Teleport Auth Service address, which is not included in the identity file. If you provide the Proxy Service address, `tctl` connects to the Proxy Service, which forwards traffic to and from the Teleport Auth Service. Update 443 to `3025` if you are contacting the Auth Service directly with `tctl`:

     ```
     $ tctl status --auth-server=teleport.example.com:443
     ```

     For `tsh` commands that read an identity file, you must pass the `--proxy` flag, which points `tsh` to the address of the Teleport Proxy Service:

     ```
     $ tsh status --proxy=teleport.example.com
     ```

     Ensure client commands can access your identity file. Replace path/to/identity/file with the path to your identity file:

     ```
     $ export TELEPORT_IDENTITY_FILE="${TELEPORT_IDENTITY_FILE:-path/to/identity/file}"
     ```

     Add the `--auth-server` or `--proxy` flags to all subsequent `tctl` and `tsh` commands.

  If you can connect to the cluster and run the `tctl status` command, you can use your current credentials to run subsequent `tctl` commands from your workstation. If you host your own Teleport cluster, you can also run `tctl` commands on the computer that hosts the Teleport Auth Service for full permissions.

* A user with the default `editor` role or equivalent permissions (ability to read, create, and manage Access Lists).

* Familiarity with basic Access List concepts (see the [Getting Started with Access Lists guide](https://goteleport.com/docs/identity-governance/access-lists/guide.md)).

* At least one user with only the `requester` role to add to the Access List.

* At least one application or resource to grant access to.

Let's walk through creating a nested Access List and establishing inheritance. In this example, we'll create a child Access List, "Engineering Team", which inherits permissions from a parent, "Production Access".

## Step 1/3. Create child Access List

In the Teleport Web UI, go to the "Identity" tab and select "Access Lists" from the sidebar. Click on "Create New Access List", and fill in the details:

- **Title**: Engineering Team
- **Deadline for First Review**: Select a future date.
- **Member Grants**: Leave this empty, as the list will inherit the parent's member grants.
- **Owners**: Add yourself or any appropriate users as owners.
- **Members**: Add users who should be part of this Access List, such as `test-user`.

Click "Create Access List" to save the Access List.

## Step 2/3. Create parent Access List

From the "Access Lists" page, click on "Create New Access List" and fill in the details for our parent list:

- **Title**: Production Access
- **Deadline for First Review**: Select a future date.
- **Member Grants**: Add the `access` role.
- **Owners**: Add yourself or any appropriate users as owners.
- **Members**: Select our child Access List, 'Engineering Team', from the dropdown.

Click "Create Access List" to save the Access List.

## Step 3/3. Verifying inherited permissions

To confirm that members of "Engineering Team" have inherited member grants from "Production Access", log in as a user who is a member of the child Access List (e.g., `test-user`). Verify that the user now has access to resources granted by both "Engineering Team" and "Production Access". For example, if a Teleport Application Service instance with the debugging application enabled is set up, and the `access` role is granted through "Production Access", the "dumper" app should be visible to the user.

## Next Steps

- Review the [Access Lists reference](https://goteleport.com/docs/reference/access-controls/access-lists.md) for more detailed information on Access Lists' nesting and inheritance.
- Learn how nested Access Lists work with Okta/SCIM synchronization in [Synchronization with Okta and SCIM](https://goteleport.com/docs/identity-governance/integrations/okta/app-and-group-sync.md).
