mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-01 13:39:37 +08:00
* Start writing Telemetry docs * Add description of events * Update examples with TELEPORT_ANONYMOUS_TELEMETRY * Add note on Telemetry * Fix SPAG in telemetry docs page * Correct link in guides/ for telemetry page * Fix link on reference index page * Update docs for GH action examples * SPAG Co-authored-by: Zac Bergquist <zac.bergquist@goteleport.com> * kubernetes -> Kubernetes Co-authored-by: Paul Gottschling <paul.gottschling@goteleport.com> * Update docs/pages/machine-id/reference/telemetry.mdx Co-authored-by: Paul Gottschling <paul.gottschling@goteleport.com> * Fix list punctuation * Don't break user reading flow in guides --------- Co-authored-by: Zac Bergquist <zac.bergquist@goteleport.com> Co-authored-by: Paul Gottschling <paul.gottschling@goteleport.com>
336 lines
11 KiB
Plaintext
336 lines
11 KiB
Plaintext
---
|
|
title: Machine ID Getting Started Guide
|
|
description: Getting started with Teleport Machine ID
|
|
---
|
|
|
|
In this getting started guide, you will configure Machine ID to issue
|
|
certificates that enable a bot user to connect to a remote host.
|
|
|
|
Here's an overview of what you will do:
|
|
|
|
1. Download and install `tbot` (=teleport.version=) on the host that will run
|
|
Machine ID.
|
|
2. Create a bot user.
|
|
3. Start Machine ID.
|
|
4. Use certificates issued by Machine ID to connect to a remote machine.
|
|
|
|
## Prerequisites
|
|
|
|
- A host that you wish to assign an identity to using Machine ID.
|
|
|
|
(!docs/pages/includes/edition-prereqs-tabs.mdx!)
|
|
|
|
(!/docs/pages/includes/tctl.mdx!)
|
|
|
|
<Admonition
|
|
type="note"
|
|
title="Machine ID and TLS Routing"
|
|
scopeOnly scope={["oss", "enterprise"]}
|
|
>
|
|
|
|
TLS Routing support was added to Machine ID in [Teleport
|
|
9.3](https://goteleport.com/docs/preview/upcoming-releases/#teleport-93). For
|
|
earlier versions, the Teleport Proxy Server will need to be configured with a
|
|
dedicated SSH listener.
|
|
|
|
```yaml
|
|
version: v1
|
|
proxy_service:
|
|
enabled: "yes"
|
|
listen_addr: "0.0.0.0:3023"
|
|
...
|
|
```
|
|
</Admonition>
|
|
|
|
## Step 1/4. Download and install Teleport (=teleport.version=)
|
|
|
|
In this step, you will be downloading and installing Teleport binaries onto the
|
|
machine you wish to assign an identity to.
|
|
|
|
Each Teleport package hosted on our downloads page ships with several useful
|
|
binaries, including `teleport`, `tctl`, `tsh`, and `tbot`:
|
|
|
|
- `teleport` is the daemon used to initialize a Teleport cluster; this binary is not used in this guide
|
|
- `tctl` is the administrative tool you will use to create the bot user (step 1/4)
|
|
- `tsh` is the client tool you will use to log in to the Teleport Cluster (steps 2/4 and 4/4)
|
|
- `tbot` is the Machine ID tool you will use to associate a bot user with a machine (step 3/4)
|
|
|
|
Machine ID is available starting from the Teleport `9.0.0` release.
|
|
|
|
Download the appropriate Teleport package for your platform:
|
|
|
|
(!docs/pages/includes/install-linux.mdx!)
|
|
|
|
## Step 2/4. Create a bot user
|
|
|
|
Before you create a bot user, you need to determine which role(s) you want to
|
|
assign to it. You can use the `tctl` command below to examine what roles exist
|
|
on your system.
|
|
|
|
<ScopedBlock scope={["cloud"]}>
|
|
On your client machine, log in to Teleport using `tsh`, then use `tctl` to examine
|
|
what roles exist on your system.
|
|
</ScopedBlock>
|
|
<ScopedBlock scope={["oss","enterprise"]}>
|
|
Connect to the Teleport Auth Server and use `tctl` to examine what roles exist on
|
|
your system.
|
|
</ScopedBlock>
|
|
|
|
```code
|
|
$ tctl get roles --format=text
|
|
```
|
|
|
|
You will see something like the output below on a fresh install of Teleport with the
|
|
default roles—your cluster may have different roles. In this example, let's
|
|
assume you want to give the bot the `access` role to allow it to connect to
|
|
machines within your cluster.
|
|
|
|
```
|
|
Role Allowed to login as Node Labels Access to resources
|
|
------- --------------------------------------------- ----------- ----------------------------------------
|
|
access {{internal.logins}} <all nodes> event:list,read,session:read,list
|
|
auditor no-login-6566121f-b602-47f1-a118-c9c618ee5aec session:list,read,event:list,read
|
|
editor user:list,create,read,update,delete,...
|
|
```
|
|
|
|
Machine ID can join with a token or the [IAM Method](https://goteleport.com/docs/setup/guides/joining-nodes-aws) on AWS.
|
|
|
|
Assuming that you are using the default `access` role, ensure that you use the
|
|
`--logins` flag when adding your bot to specify the SSH logins that you wish to
|
|
allow the bot to access on hosts. For our example, we will be using `root`.
|
|
|
|
<Tabs>
|
|
<TabItem label="Token-based Joining">
|
|
```code
|
|
$ tctl bots add robot --roles=access --logins=root
|
|
```
|
|
</TabItem>
|
|
<TabItem label="IAM Method">
|
|
First, create an IAM method token that specifies the AWS account from which
|
|
the bot can join. Create the below file as `iam-token.yaml` then run `tctl
|
|
create -f iam-token.yaml`.
|
|
|
|
```
|
|
kind: token
|
|
version: v2
|
|
metadata:
|
|
# The token name is not a secret because instances must prove that they are
|
|
# running in your AWS account to use this token.
|
|
name: iam-token
|
|
spec:
|
|
# Only allow bots to join using this token.
|
|
roles: [Bot]
|
|
|
|
# Set the join method to be IAM.
|
|
join_method: iam
|
|
|
|
# Define the name of the bot that will be allowed to use this token.
|
|
bot_name: robot
|
|
|
|
allow:
|
|
# Restrict the AWS account and (optionally) ARN that can use this token.
|
|
# This information can be obtained from running the
|
|
# "aws sts get-caller-identity" command from the CLI.
|
|
- aws_account: "111111111111"
|
|
aws_arn: "arn:aws:sts::111111111111:assumed-role/teleport-bot-role/i-*"
|
|
```
|
|
|
|
Next, create the bot user.
|
|
|
|
```
|
|
$ tctl bots add robot --token=iam-token --roles=access --logins=root
|
|
```
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Step 3/4. Start Machine ID
|
|
|
|
Now start Machine ID using the `tbot` binary. The `tbot start` command will
|
|
start running Machine ID in a loop, writing renewable certificates to
|
|
`/var/lib/teleport/bot` and the short-lived certificates your application will
|
|
use to `/opt/machine-id`.
|
|
|
|
In a production environment you will want to run Machine ID in the background
|
|
using a service manager like systemd. However, in this guide you will run it in
|
|
the foreground to better understand how it works.
|
|
|
|
<Tabs>
|
|
<TabItem label="Token-based Joining">
|
|
|
|
<ScopedBlock scope={["oss", "enterprise"]}>
|
|
|
|
```code
|
|
$ export TELEPORT_ANONYMOUS_TELEMETRY=1
|
|
$ tbot start \
|
|
--data-dir=/var/lib/teleport/bot \
|
|
--destination-dir=/opt/machine-id \
|
|
--token=(=presets.tokens.first=) \
|
|
--join-method=token \
|
|
--ca-pin=(=presets.ca_pin=) \
|
|
--auth-server=auth.example.com:3025
|
|
```
|
|
|
|
</ScopedBlock>
|
|
<ScopedBlock scope={["cloud"]}>
|
|
|
|
```code
|
|
$ export TELEPORT_ANONYMOUS_TELEMETRY=1
|
|
$ tbot start \
|
|
--data-dir=/var/lib/teleport/bot \
|
|
--destination-dir=/opt/machine-id \
|
|
--token=(=presets.tokens.first=) \
|
|
--join-method=token \
|
|
--ca-pin=(=presets.ca_pin=) \
|
|
--auth-server=example.teleport.sh:443
|
|
```
|
|
|
|
</ScopedBlock>
|
|
|
|
</TabItem>
|
|
<TabItem label="IAM Method">
|
|
|
|
<ScopedBlock scope={["oss", "enterprise"]}>
|
|
|
|
```code
|
|
$ export TELEPORT_ANONYMOUS_TELEMETRY=1
|
|
$ tbot start \
|
|
--data-dir=/var/lib/teleport/bot \
|
|
--destination-dir=/opt/machine-id \
|
|
--token=iam-token \
|
|
--join-method=iam \
|
|
--ca-pin=(=presets.ca_pin=) \
|
|
--auth-server=auth.example.com:3025
|
|
```
|
|
|
|
</ScopedBlock>
|
|
<ScopedBlock scope={["cloud"]}>
|
|
|
|
```code
|
|
$ export TELEPORT_ANONYMOUS_TELEMETRY=1
|
|
$ tbot start \
|
|
--data-dir=/var/lib/teleport/bot \
|
|
--destination-dir=/opt/machine-id \
|
|
--token=iam-token \
|
|
--join-method=iam \
|
|
--ca-pin=(=presets.ca_pin=) \
|
|
--auth-server=example.teleport.sh:443
|
|
```
|
|
|
|
</ScopedBlock>
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
`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.
|
|
|
|
Replace the following fields with values from your own cluster.
|
|
|
|
<ScopedBlock scope={["cloud"]}>
|
|
|
|
- `token` is the token output by the `tctl bots add` command or the name of your IAM method token.
|
|
- `ca-pin` is the CA Pin for your Teleport cluster, and is output by the `tctl bots add` command.
|
|
- `destination-dir` is where Machine ID writes user certificates that can be used by applications and tools.
|
|
- `data-dir` is where Machine ID writes its private data, including its own short-lived renewable certificates. These should not be used by applications and tools.
|
|
- `auth-server` is the address of your Teleport Cloud Proxy Server, for example `example.teleport.sh:443`.
|
|
|
|
</ScopedBlock>
|
|
<ScopedBlock scope={["oss","enterprise"]}>
|
|
|
|
- `token` is the token output by the `tctl bots add` command or the name of your IAM method token.
|
|
- `ca-pin` is the CA Pin for your Teleport cluster, and is output by the `tctl bots add` command.
|
|
- `destination-dir` is where Machine ID writes user certificates that can be used by applications and tools.
|
|
- `data-dir` is where Machine ID writes its private data, including its own short-lived renewable certificates. These should not be used by applications and tools.
|
|
- `auth-server` is the address of your Teleport Auth Server, for example
|
|
`auth.example.com:3025`. If your Machine ID host is in a different network
|
|
than your Auth Server, use the public web address of your Proxy Service
|
|
instead (e.g., `auth.example.com:443`).
|
|
|
|
</ScopedBlock>
|
|
|
|
Now that Machine ID has successfully started, let's investigate the
|
|
`/opt/machine-id` directory to see what was written to disk.
|
|
|
|
```code
|
|
$ tree /opt/machine-id
|
|
machine-id
|
|
├── key
|
|
├── key.pub
|
|
├── known_hosts
|
|
├── ssh_config
|
|
├── sshcacerts
|
|
├── sshcert
|
|
├── tlscacerts
|
|
└── tlscert
|
|
|
|
0 directories, 8 files
|
|
```
|
|
|
|
This directory contains private key material in the `key.*` files, SSH
|
|
certificates in the `ssh*` files, X.509 certificates in the `tls*` files, and
|
|
OpenSSH configuration in the `ssh_config` and `known_hosts` files to make it easy
|
|
to integrate Machine ID with external applications and tools.
|
|
|
|
## Step 4/4. Use certificates issued by Machine ID
|
|
|
|
To use Machine ID, find a host that you want to connect to within your cluster
|
|
using `tsh ls`. You might see output like the following on your system.
|
|
|
|
```code
|
|
$ tsh ls
|
|
Node Name Address Labels
|
|
--------- -------------- -----------------------------
|
|
node-name 127.0.0.1:3022 arch=x86_64,group=api-servers
|
|
```
|
|
|
|
<Details title="Not seeing Nodes?" opened={false}>
|
|
|
|
(!docs/pages/includes/node-logins.mdx!)
|
|
|
|
</Details>
|
|
|
|
To use Machine ID with the OpenSSH integration, run the following command to
|
|
connect to `node-name` within cluster `example.com`.
|
|
|
|
```
|
|
ssh -F /opt/machine-id/ssh_config root@node-name.example.com
|
|
```
|
|
|
|
<Admonition type="note" title="Roles must have logins defined">
|
|
The below error can occur when the bot does not have permission to log in to
|
|
a node as the requested user:
|
|
|
|
```code
|
|
$ ssh -F /opt/machine-id/ssh_config root@node-name.example.com
|
|
root@node-name: Permission denied (publickey).
|
|
kex_exchange_identification: Connection closed by remote host
|
|
```
|
|
This can happen in two circumstances:
|
|
- The user you are trying to log in as is not specified under `logins` in the
|
|
role you are using
|
|
- If you have used `--logins` when creating the bot user, the role the bot is
|
|
impersonating does not have the `{{ internal.logins }}` variable specified.
|
|
|
|
If you have been following along with the `access` role, do the following.
|
|
|
|
- Export the role by running `tctl get roles/access > access.yaml`
|
|
- Edit the `logins` field in `access.yaml`
|
|
- Update the role by running `tctl create -f access.yaml`
|
|
</Admonition>
|
|
|
|
Now you can replace any invocations of `ssh` with the above command to provide
|
|
your applications and tools a machine identity that can be rotated, audited,
|
|
and controlled with all the familiar Teleport access controls.
|
|
|
|
## Next Steps
|
|
|
|
Now that you know how to create a bot user to access resources in your
|
|
infrastructure, dive deeper into the topics relevant to your Machine ID
|
|
use-case, for example:
|
|
|
|
- [Machine ID with Ansible](./guides/ansible.mdx)
|
|
- [Machine ID with Jenkins](./guides/jenkins.mdx)
|
|
- [Machine ID with Databases](./guides/databases.mdx)
|
|
|
|
[More information about `TELEPORT_ANONYMOUS_TELEMETRY`.](./reference/telemetry.mdx) |