Files
teleport/docs/pages/machine-id/getting-started.mdx
T
85fdb2ce59 Machine ID telemetry docs (#22541)
* 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>
2023-03-06 11:46:30 +00:00

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)