No More Backdoors: Know Who Has Access to What, Right Now
Jun 13
Register Today
Teleport logoTry For Free
Fork me on GitHub


Deploying Machine ID on CircleCI

In this guide, you will configure Machine ID's agent, tbot, to run within a CircleCI workflow. The bot will be configured to use the circleci delegated joining method to eliminate the need for long-lived secrets.


  • A running Teleport cluster version 15.3.7 or above. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl admin tool and tsh client tool.

    On Teleport Enterprise, you must use the Enterprise version of tctl, which you can download from your Teleport account workspace. Otherwise, visit Installation for instructions on downloading tctl and tsh for Teleport Community Edition.

  • To check that you can connect to your Teleport cluster, sign in with tsh login, then verify that you can run tctl commands using your current credentials. tctl is supported on macOS and Linux machines. For example:
    tsh login --user=[email protected]
    tctl status


    Version 15.3.7

    CA pin sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    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 CircleCI project connected to a Git repository you can push to.

Step 1/5. Configure CircleCI

In order to configure the rules for which CircleCI workflows will be allowed to connect to your Teleport cluster, you must determine the ID of your CircleCI organization and create a CircleCI context.

Find your organization ID

Open CircleCI and navigate to "Organization settings" from the navbar. You should be presented with an interface titled "Overview" with a section called "Organization ID". Note this value down and substitute $ORGANIZATION_ID in configuration examples with this.

Create a context

CircleCI has an organization-level concept called contexts, which allow you to configure a series of secrets that should be exposed to a workflow job. You can configure CircleCI to control which actors are allowed to trigger jobs associated with a context.

The contexts that a workflow job has been assigned are also encoded in the identity token that CircleCI creates for the job. This makes them an ideal way for Teleport to determine which CircleCI jobs should be granted access to the Teleport cluster.

In this example, you will create a CircleCI context named teleport-access. You will then grant this context access to your Teleport cluster.

To create the CircleCI context, open up "Organization settings" in CircleCI and navigate to "Contexts". Click "Create Context" and provide teleport-access as the name of the context you wish to create. You may substitute this value for a string that makes more sense to your organization, but ensure in future steps of this guide that you replace teleport-access with your value.

Select the context you have just created. You will now be on a page that allows you to configure the context. To determine the ID of the context to use when configuring Teleport, locate the URL of the context settings page, which should have a format similar to the following:

In this case, the context ID is: 00000000-0000-0000-0000-000000000000.

Note this value down and substitute $CONTEXT_ID in configuration examples with this

Step 2/5. Create the Machine ID bot

Next, you need to create a Bot. A Bot is a Teleport identity for a machine or group of machines. Like users, bots have a set of roles and traits which define what they can access.

Create bot.yaml:

kind: bot
version: v1
  # name is a unique identifier for the Bot in the cluster.
  name: example
  # roles is a list of roles to grant to the Bot. Don't worry if you don't know
  # what roles you need to specify here, the Access Guides will walk you through
  # creating and assigning roles to the already created Bot.
  roles: []

Make sure you replace example with a unique, descriptive name for your Bot.

Use tctl to apply this file:

tctl create bot.yaml

Step 3/5. Create the join token for CircleCI

In order to allow your CircleCI workflow to authenticate with your Teleport cluster, you'll first need to create a join token. These tokens set out criteria by which the Auth Server decides whether or not to allow a bot or node to join.

Create a file named bot-token.yaml, ensuring that you replace $ORGANIZATION_ID and $CONTEXT_ID with the values from Step 1.

kind: token
version: v2
  name: example-bot
  roles: [Bot]
  join_method: circleci
  bot_name: example
    organization_id: $ORGANIZATION_ID
    # allow specifies the rules by which the Auth Server determines if `tbot`
    # should be allowed to join.
    - context_id: $CONTEXT_ID

Let's go over the token resource's fields in more detail:

  • defines the name of the token. Note that this value will need to be used in other parts of the configuration later.
  • metadata.expires defines the date that the join token will expire. This example is set to the year 2100.
  • spec.bot_name is the name of the Machine ID bot that this token will grant access to. Note that this value will need to be used in other parts of the configuration later.
  • spec.roles defines which roles that this token will grant access to. The value of [Bot] states that this token grants access to a Machine ID bot.
  • spec.join_method defines the join method the token is applicable for. Since this guide only focuses on CircleCI, you will set this to to circleci.
  • spec.circleci.allow is used to set rules for what CircleCI runs will be able to authenticate by using the token.

Apply this to your Teleport cluster using tctl:

tctl create -f bot-token.yaml

Step 4/5. Configure a CircleCI workflow

With the bot and join token created, you can now configure a CircleCI workflow that can connect to your Teleport cluster.

To configure tbot, a YAML file will be used. In this example we'll store this within the repository itself, but this could be generated or created by the CI pipeline itself.

Create tbot.yaml within your repository:

version: v2
  join_method: circleci
  token: example-bot
oneshot: true
  type: memory
# outputs will be filled in during the completion of an access guide.
outputs: []


  • with the address of your Teleport Proxy or Auth Server. Prefer using the address of a Teleport Proxy.
  • example-bot with the name of the token you created in the second step

Now, the CircleCI pipeline can be defined. Before the pipeline can use tbot, it must be available within the environment. For this example, we'll show downloading tbot as part of the CI step, but in a production implementation you may wish to build a docker image that contains this binary to avoid depending on the Teleport CDN.

Open your Git repository and create a directory called .circleci. Then open a file called config.yml and insert the following configuration:

# See:
version: 2.1
      - image: cimg/base:stable
      - checkout
      - run:
          name: "Install Teleport"
          command: |
            cd /tmp
            curl -O
            tar -xvf teleport-v15.3.7-linux-amd64-bin.tar.gz
            sudo ./teleport/install
      - run:
          name: "Run Machine ID"
          command: |
            tbot start -c tbot.yaml
      - write-run-log:
            - teleport-access

TELEPORT_ANONYMOUS_TELEMETRY enables the submission of anonymous usage telemetry. This helps us shape the future development of tbot. You can disable this by omitting this.

Add, commit, and push these two configuration files to your repository.

Open CircleCI and check the status of the job, wait for it to complete and ensure that no errors are emitted.

A note on security implications and risk

Once tbot start has been used in a job, all successive steps in that job will have access to the credentials that have been produced by tbot. Break your workflow down into multiple jobs to reduce the amount of steps that have access to these credentials.

Ensure that the role you assign to your CircleCI bot has access to only the resources in your Teleport cluster that your CI/CD needs to interact with.

Step 5/5. Configure outputs

You have now prepared the base configuration for tbot. At this point, it identifies itself to the Teleport cluster and renews its own credentials but does not output any credentials for other applications to use.

Follow one of the access guides to configure an output that meets your access needs.

Further steps