Commit Graph
37 Commits
Author SHA1 Message Date
Zac Bergquist 2ae9d770fc Refactor tctl's dependencies (#22693)
* Move configuration from lib/service to lib/service/servicecfg

The new servicecfg package will hold only configuration for services.
This will allow other packages (like tctl and tsh) to depend on
servicecfg without pulling in all of lib/service (which has a number
of platform-specific details).

This is the first step towards being able to build tctl for Windows.

* Move PAM and BPF config into servicecfg

This breaks a compile-time dependency on BPF/PAM for tctl.
2023-03-09 17:48:36 +00:00
Noah StrideandAlan Parra f3ba5750a8 Make tctl nodes add / tctl tokens add use CreateToken RPC (#21189)
* Start removing generateToken

* Refactor `tokens add` to use `CreateToken` RPC

* Correct deprecation version

* Remove calls to GenerateToken

* Start tests for token crud

* Allow user role rules to be provided wth CreateUserAndRole helper

* Add TestCreateToken to tls_test

* Add TestUpsertToken

* Add GetTokens test

* Add TestGetToken

* Add test for DeleteToken RPC

* Dedupe error assertions

* Add support for emitting trusted cluster token creation events to Create/UpsertToken

* Fix imports

* Change parameter order to appease linter

* Fix broken token expiry test

* Fix token expiry time for TestAuth_RegisterUsingToken

* Remove unnecessary cleanup

* Apply suggestions from code review

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

* Change test comment from deprecation notice

* `make gprc` after code review changes

* Update lib/auth/tls_test.go

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

* Update lib/auth/tls_test.go

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

* Update lib/auth/tls_test.go

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

* Update lib/auth/tls_test.go

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

* Rename tests

* Update lib/auth/tls_test.go

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

* More test cases for GetTokens

* Improve message on duplicate token

---------

Co-authored-by: Alan Parra <alan.parra@goteleport.com>
2023-02-16 09:36:55 +00:00
Vitor Enes 5a4e67027c Improve tsh play JSON & YAML output (#18768)
Before this commit, events in the output of `tsh play --format=yaml` were
separated by a newline. This commit ensures that these events are now
separated by `---`, allowing the command output to play well with `yq`.

For consistency, the output of `tsh play --format=yaml <session-id>`
now mirrors what we get e.g. with `tctl nodes ls --format=yaml`.
The same applies to `tsh play --format json`.
2022-11-28 19:36:04 +00:00
Steven Martin 00728c4f63 spell fixes (#18545) 2022-11-17 16:28:05 +00:00
Jakub Nyckowski 0ee91f6c37 Enable GCI linter (#17894) 2022-10-28 20:20:28 +00:00
Lisa Kim 8bb0636863 Partial delete deprecated code for "DELETE IN 11.0.0" and lower (#16947)
* Deleted 
   - GetAppServers
   - GetApplicationServers 
   - GetDatabaseServers 
   - GetKubeService 
   - UpsertAppServer
   - DeleteAppServer
   - DeleteAllAppServers
   - RotateUserTokenSecrets
* Delete list nodes fallback
* Use AppServer type for heartbeat test
2022-10-04 17:58:30 +00:00
Garrett Watson 68524143ed Remove the "." from the end of the auth token generated by "tctl tokens add" command (#16157) 2022-09-07 10:00:48 +00:00
Brian Joerger b5472d41ec Convert GenerateToken to gRPC. (#9024) 2022-06-14 17:43:39 +00:00
Noah Stride 7e73d1a501 Convert GetDomainName and GetClusterCACert to gRPC (#12937)
* convert GetDomainNAme endpoint to gRPC

* migrate GetClusterCACert from http to grpc

* fix tests failing due to switch to gRPC transport

* Correct mispelt json tag

* remove `GetLocalClusterName` and `UpsertLocalClusterName` which are unused

* remove unused prefix constant from presence
2022-06-01 22:53:42 +00:00
Noah Stride 18558b88e9 thread context.Context from tctl Run() to subcommands (#13029) 2022-06-01 12:49:59 +01:00
Lisa Kim 6116ccf37a Improve error message for resource predicate query (#12262) 2022-04-29 21:29:27 +00:00
Alex McGrath 40200e8536 Reslove comments, move all occurences of teleport.dev to use a constant 2022-03-15 13:22:45 +00:00
Alex McGrath 19270c1e71 Resolve comments 2022-03-15 13:22:45 +00:00
Alex McGrath b6df9a742a Add verbosity to tctl * ls commands and resource get. 2022-03-15 13:22:45 +00:00
Alex McGrath 23731673d9 ls consistency: Make tctl nodes ls output consistent, support yaml
New format:
```
Host UUID                                 Public Address Labels                    Version
---- ------------------------------------ -------------- ------------------------- -------------
corn 7b3ca8d8-710c-4305-aa29-e73628ac572c 127.0.0.1:3022 env=example,hostname=corn 8.0.0-alpha.1
```

With `--yaml`
```yaml
kind: node
metadata:
  expires: "2021-12-16T15:26:44.887862347Z"
  id: 1639667804888460055
  labels:
    env: example
  name: 7b3ca8d8-710c-4305-aa29-e73628ac572c
spec:
  addr: 127.0.0.1:3022
  cmd_labels:
    hostname:
      command:
      - hostname
      period: 1m0s
      result: corn
  hostname: corn
  public_addr: corn.lan:8443
  rotation:
    current_id: ""
    last_rotated: "0001-01-01T00:00:00Z"
    schedule:
      standby: "0001-01-01T00:00:00Z"
      update_clients: "0001-01-01T00:00:00Z"
      update_servers: "0001-01-01T00:00:00Z"
    started: "0001-01-01T00:00:00Z"
  version: 8.0.0-alpha.1
version: v2
```
2022-03-15 13:22:45 +00:00
Lisa Kim 628564c801 Update 'tctl apps/db/nodes ls' to accept filter flags (#11003) 2022-03-11 17:57:40 +00:00
Matheus fe519a3211 Add proxy to instructions when creating a token for a node (#9539)
* Print proxy instead of auth server on join node instructions for Cloud instances
2022-03-02 10:20:35 -03:00
Zac Bergquist 20c04df369 Clean up system role parsing (#9756)
* Add tests for ParseTeleportRoles

Updates #9752

* Be more tolerant when parsing system roles.

Our original attempt at canonicalizing roles didn't work for system
roles using camelcase, resulting in an awkward user experience.

Here we maintain a mapping of allowed inputs to their corresponding
system roles, and perform a case-insensitive lookup. This allows us
to support camelcase roles, and has the advantage of permitting
_ word separators as well.

Fixes #9752

* Refactor *SystemRole.Check()

Rather than having to list each role here, we rely on the new
roleMappings set to validate the role.

Additionally, remove the LegacyClusterTokenType role. This change
is guaranteed to be backwards compatible because we check for
RoleTrustedCluster everywhere we were checking for
LegacyClusterTokenType, and our roleMappings will convert the old
string that represented LegacyClusterTokenType to RoleTrustedCluster.
2022-01-14 00:13:59 +00:00
Nic Klaassen c9fda499de Add support for multiple CA pins (#7905) 2021-08-18 20:13:20 -07:00
Brian Joerger 9b8b9d6d0c rollback - Upgrade api version. (#7751) 2021-07-30 15:34:19 -07:00
Brian Joerger c040aca4c1 Upgrade api version. (#7609) 2021-07-28 13:51:21 -07:00
Brian Joerger 4d36870ff0 Remove remaining API aliases (#7137) 2021-06-08 12:08:55 -07:00
Brian Joerger 7bff7c41bd Remove API aliases (#6983) 2021-06-04 13:29:31 -07:00
Andrew Lytvynov cd2f4fceb7 Remove JSON schema validation (#6685)
* Remove JSON schema validation

Removing JSON schema validation from all resource unmarshalers.

--- what JSON schema gets us

Looking at the JSON schema spec and our usage, here are the supposed benefits:
- type validation - make sure incoming data uses the right types for the right fields
- required fields - make sure that mandatory fields are set
- defaulting - set defaults for fields
- documentation - schema definition for our API objects

Note that it does _not_ do:
- fail on unknown fields in data
- fail on a required field with an empty value

--- what replaces it

Based on the above, it may seem like JSON schema provides value.
But it's not the case, let's break it down one by one:
- type validation - unmarshaling JSON into a typed Go struct does this
- required fields - only checks that the field was provided, doesn't actually check that a value is set (e.g. `"name": ""` will pass the `required` check)
  - so it's pretty useless for any real validation
  - and we already have a separate place for proper validation - `CheckAndSetDefaults` methods
- defaulting - done in `CheckAndSetDefaults` methods
  - `Version` is the only annoying field, had to add it in a bunch of objects
- documentation - protobuf definitions are the source of truth for our API schema

--- the benefits

- performance - schema validation does a few rounds of `json.Marshal/Unmarshal` in addition to actual validation; now we simply skip all that
- maintenance - no need to keep protobuf and JSON schema definitions in sync anymore
- creating new API objects - one error-prone step removed
- (future) fewer dependencies - we can _almost_ remove the Go libraries for schema validation (one transient dependency keeping them around)

* Remove services.SkipValidation

No more JSON schema validation so this option is a noop.
2021-06-01 15:27:20 -07:00
Brian Joerger 9def18cb9f gRPC conversions - Nodes (#6535) 2021-04-28 18:27:12 -07:00
Andrew Lytvynov 5bd66a396e Plumb caller username for CRUD events via contexts
Our auth middleware already attaches a TLS identity as context value.
Plumb contexts through and extract the username when recording events.
If the received context doesn't have an identity attached, use "system"
as username.

Lots of noise here due to missing context.Context plumbing :(
We should eventually plumb contexts to all those RPC interfaces.

Updates #3816
2020-06-18 19:01:35 +00:00
Andrew Lytvynov ae6e57d346 Add missing error checks under tool/... 2020-05-15 16:56:44 +00:00
Andrew Lytvynov 28a7624244 Fix staticcheck findings in integration/ and tool/
Original finding list:
```
tool/tctl/common/node_command.go:163:3: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
		fmt.Printf(string(out))
		^
tool/tctl/common/status_command.go:110:2: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
	fmt.Printf(view())
	^
tool/tctl/common/status_command.go:126:3: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
		fmt.Printf(view())
		^
tool/tctl/common/token_command.go:201:3: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
		fmt.Printf(tokensView())
		^
tool/tctl/common/token_command.go:207:3: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
		fmt.Printf(string(data))
		^
tool/tctl/common/user_command.go:248:2: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
	fmt.Printf(string(out))
	^
tool/tctl/common/user_command.go:294:3: SA1006: printf-style function with dynamic format string and no further arguments should use print-style function instead (staticcheck)
		fmt.Printf(string(out))
		^
integration/helpers.go:200:2: SA4006: this value of `err` is never used (staticcheck)
	cryptoPubKey, err := sshutils.CryptoPublicKey(cfg.Pub)
	^
integration/helpers.go:399:3: SA4006: this value of `roles` is never used (staticcheck)
		roles = append(roles, role)
		^
integration/helpers.go:597:4: SA4006: this value of `roles` is never used (staticcheck)
			roles = append(roles, role)
			^
integration/helpers.go:599:4: SA4006: this value of `roles` is never used (staticcheck)
			roles = user.Roles
			^
integration/integration_test.go:1625:2: SA4006: this value of `err` is never used (staticcheck)
	adminsRole, err := services.NewRole(mainAdmins, services.RoleSpecV3{
	^
integration/integration_test.go:2185:2: SA4006: this value of `output` is never used (staticcheck)
	output, err = runCommand(main, []string{"echo", "hello world"}, cfg, 1)
	^
integration/integration_test.go:2340:2: SA4006: this value of `output` is never used (staticcheck)
	output, err = runCommand(main, []string{"echo", "hello world"}, cfgProxy, 1)
	^
integration/kube_integration_test.go:154:2: SA4006: this value of `err` is never used (staticcheck)
	role, err := services.NewRole("kubemaster", services.RoleSpecV3{
	^
integration/kube_integration_test.go:321:2: SA4006: this value of `err` is never used (staticcheck)
	role, err := services.NewRole("kubemaster", services.RoleSpecV3{
	^
integration/kube_integration_test.go:366:2: SA4006: this value of `err` is never used (staticcheck)
	role, err := services.NewRole("kubemaster", services.RoleSpecV3{
	^
integration/kube_integration_test.go:386:2: SA4006: this value of `err` is never used (staticcheck)
	pods, err := s.CoreV1().Pods(kubeSystemNamespace).List(metav1.ListOptions{
	^
integration/kube_integration_test.go:465:2: SA4006: this value of `err` is never used (staticcheck)
	mainRole, err := services.NewRole("main-kube", services.RoleSpecV3{
	^
integration/kube_integration_test.go:579:2: SA4006: this value of `err` is never used (staticcheck)
	pods, err := proxyClient.CoreV1().Pods(kubeSystemNamespace).List(metav1.ListOptions{
	^
integration/kube_integration_test.go:727:2: SA4006: this value of `err` is never used (staticcheck)
	mainRole, err := services.NewRole("main-kube", services.RoleSpecV3{
	^
integration/kube_integration_test.go:840:2: SA4006: this value of `err` is never used (staticcheck)
	pods, err := proxyClient.CoreV1().Pods(kubeSystemNamespace).List(metav1.ListOptions{
	^
integration/kube_integration_test.go:1008:2: SA4006: this value of `err` is never used (staticcheck)
	role, err := services.NewRole("kubemaster", services.RoleSpecV3{
	^
tool/teleport/common/teleport_test.go:83:2: SA4006: this value of `cmd` is never used (staticcheck)
	cmd, conf := Run(Options{
	^
tool/teleport/common/teleport_test.go:91:2: SA4006: this value of `cmd` is never used (staticcheck)
	cmd, conf = Run(Options{
	^
tool/tsh/tsh.go:170:2: SA4006: this value of `cmdLine` is never used (staticcheck)
	cmdLine := []string{}
	^
integration/helpers.go:399:11: SA4010: this result of append is never used, except maybe in other appends (staticcheck)
		roles = append(roles, role)
		       ^
integration/helpers.go:597:12: SA4010: this result of append is never used, except maybe in other appends (staticcheck)
			roles = append(roles, role)
			       ^
integration/integration_test.go:1092:7: SA4000: identical expressions on the left and right side of the '&&' operator (staticcheck)
		for len(b.Tunnel.GetSites()) < 2 && len(b.Tunnel.GetSites()) < 2 {
		   ^
integration/integration_test.go:1426:6: SA4000: identical expressions on the left and right side of the '&&' operator (staticcheck)
	for len(main.Tunnel.GetSites()) < 2 && len(main.Tunnel.GetSites()) < 2 {
	   ^
integration/integration_test.go:1691:6: SA4000: identical expressions on the left and right side of the '&&' operator (staticcheck)
	for len(main.Tunnel.GetSites()) < 2 && len(main.Tunnel.GetSites()) < 2 {
	   ^
integration/integration_test.go:1895:6: SA4000: identical expressions on the left and right side of the '&&' operator (staticcheck)
	for len(main.Tunnel.GetSites()) < 2 && len(main.Tunnel.GetSites()) < 2 {
	   ^
integration/kube_integration_test.go:548:6: SA4000: identical expressions on the left and right side of the '&&' operator (staticcheck)
	for len(main.Tunnel.GetSites()) < 2 && len(main.Tunnel.GetSites()) < 2 {
	   ^
integration/kube_integration_test.go:814:6: SA4000: identical expressions on the left and right side of the '&&' operator (staticcheck)
	for len(main.Tunnel.GetSites()) < 2 && len(main.Tunnel.GetSites()) < 2 {
	   ^
```
2020-04-29 22:40:15 +00:00
Russell Jones e69e67e372 Add support for CA pinning when joining a cluster. 2018-10-15 16:44:27 -07:00
Russell Jones d98b74d2a6 Updated "tctl tokens ..." command. 2018-09-04 10:16:29 -07:00
Russell Jones ce1c7476b9 Updated dir backend to a flat keyspace. Added UpsertItems endpoint to
all backends to support bulk insertion. Added UpsertNodes endpoint,
which is used by the state cache to speed up GetNodes.
2018-07-13 20:12:34 +00:00
Russell Jones f56ff78238 Always return a list of tokens from "tctl nodes add --format=json ...". 2018-04-04 18:45:23 +00:00
Sasha Klizhentas 5d134b4b50 Add support for custom tokens.
fixes #1546, fixes #1535

This commit fixes error message in case if token
is generated for trusted cluster and allows
admins to provide custom tokens:

tctl nodes add --roles=node --token=custom --ttl=100h
2018-01-18 12:48:18 -08:00
Sasha Klizhentas 0130c6aa41 Mutual TLS Auth server and clients.
This commit introduced mutual TLS authentication
for auth server API server.

Auth server multiplexes HTTP over SSH - existing
protocol and HTTP over TLS - new protocol
on the same listening socket.

Nodes and users authenticate with 2.5.0 Teleport
using TLS mutual TLS except backwards-compatibility
cases.
2017-12-27 11:37:19 -08:00
Ev Kontsevoy e301279b5c Finished tctl refactoring
`tctl` can now be compiled for multiple distributions, with different
features (commands) enabled or disabled.
2017-07-25 22:41:19 -07:00
Ev Kontsevoy 432cb34c91 Migrated 'users' and 'nodes' CLI commands to the new model 2017-07-25 22:13:02 -07:00
Ev Kontsevoy ed06f7285d Refactoring of tctl
This commit prepares TCTL for easier modifications for 2.3
Specifically:

1. CLI commands have been placed in separate go files.
2. Removed some dead code. We had commands that haven't even been hooked
   to CLI!
3. Added comments in a few places.
2017-07-17 22:23:26 -07:00