티스토리 뷰

Security/System&Tools

Teleport

jacobbaek Jacob_baek 2021. 8. 10. 23:44

Teleport란

Teleport는 CA(Certificate Authority) 와 infrastructure에 접근하는 Plane을 만들어주고 접근을 수행할수 있도록 해준다.
Teleport는 다음과 같은 일반적인 기능을 제공한다.

  • SSO설정과 SSH Server, Kubernetes, Database들, Web App들에 접근할 하나의 서버를 생성
  • Infrastructure에 대한 접근 정책을 다양한 Programming Language로 정의
  • 모든환경의 세션에 대한 Record 및 공유가 가능

Teleport 상세 기능

  • SSH를 이용한 서버 접근
  • application 접근
  • Kubernetes 접근
  • DB 접근
  • Session 기록후 재생가능
  • Session 공유 및 join 가능
  • 웹 UI 상의 terminal 기능 제공

https://goteleport.com/docs/

Teleport 구성

구성요소는 다음과 같은 역할로 나누어진다.

위 3가지 구성요소는 single binary로 제공되어 All-in-one으로도 설치가 가능하다.
(또한 분리 구성도 가능하다.)

Teleport 동작방식

SSH 접근에 대해 먼저 설명하자면 Teleport Auth 서비스에서 자체 CA를 가지고 인증서를 발급 및 폐기를 진행한다.
SSH접근을 예로 들면 위 CA 인증서를 기반으로 OpenSSH certificates 방식으로 인증을 수행하게 된다.

실제 동작은 다음과 같이 수행되어진다.

SSH Certificate 를 사용한 인증방식
아래는 SSH Certificate 의 동작방식에 대한 내용이 나와있는 링크들이다.

Teleport 설치

다음과 같은 방식으로 설치가 가능하다.

설치전 알아두어야할 정보들
아래와 같은 3022~3027,3080 등이 사용되어진다.
하여 방화벽이 서버에 존재시 해당 포트를 open 하는 작업이 필요하다.

rpm 방식으로 teleport server(proxy/auth) 설치

[root@rocky8-server ~]# dnf install https://get.gravitational.com/teleport-6.2.8-1.x86_64.rpm

자동으로 config yaml 파일이 생성되지 않는다. 하여 다음링크에서 yaml 파일 내용을 복사해온다.

혹은 아래 명령을 통해 teleport.yaml 파일을 생성할 수 있다.

teleport configure > /etc/teleport/teleport.yaml

또한 systemd로 자동 등록되지 않기에 이를 추가 해야 한다.

참고
root 계정을 사용하지 말고 그외 계정을 생성해서 사용하기를 권장한다.
https://goteleport.com/docs/admin-guide/

systemd service로 생성후 daemon-reload 및 start를 수행하면 동작이 된다.

teleport.yaml 파일을 원하는 방식으로 동작되도록 설정한다.

아래 ansible-playbook으로 server(proxy,auth) / node에 대한 기본 설치 및 systemd 등록 그리고 teleport.yaml을 생성하는 것을 만들어놓았으니 이를 참고하면 좀더 쉽게 설치/설정을 할수 있을거라 보인다.

node는 아래 node 추가항목을 참고하길 바란다.

teleport 사용

먼저 사용자 생성이 중요하다.

사용자 로그인

login은 tctl을 통해 먼저 계정 생성을 한후 접근이 가능하다.

아래링크를 참고하여 사용자를 생성하자.

실제 tctl 명령어를 이용하여야 하고

[root@rocky8-server etc]# tctl users add dubaek
NOTE: Teleport 6.0 added RBAC in Open Source edition.

In the future, please create a role and use a new format with --roles flag:

$ tctl users add "dubaek" --roles=[add your role here]

We will deprecate the old format in the next release of Teleport.
Meanwhile we are going to assign user "dubaek" to role "admin" created during migration.

User "dubaek" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
https://rocky8-server:3080/web/invite/cdc955154e112eeb1ce23884165545e7

NOTE: Make sure rocky8-server:3080 points at a Teleport proxy which users can access.

언급된 주소(https://rocky8-server:3080/web/invite/xxxxx)로%EB%A1%9C) 연결하여 아래와 같은 password 변경을 수행한다.
(이때 google OTP를 이용하여 token을 발행해야 한다.)

실제 생성된 계정에는 앞서 생성시 추가했던 root,dubaek,ubuntu 등이 logins에 추가 되어 있다.

[root@rocky8-server log]# tctl get user
kind: user
metadata:
  id: 1627887255392573657
  name: dubaek
spec:
  created_by:
    time: "2021-08-02T06:54:15.392197653Z"
    user:
      name: 7c3e1de2-e8cc-407e-a046-774e8ce2f26f.rocky8-server
  expires: "0001-01-01T00:00:00Z"
  roles:
  - admin
  status:
    is_locked: false
    lock_expires: "0001-01-01T00:00:00Z"
    locked_time: "0001-01-01T00:00:00Z"
  traits:
    kubernetes_groups:
    - ""
    kubernetes_users:
    - dubaek
    logins:
    - dubaek
    - root
    - ubuntu
version: v2

만약 user의 logins 에 다른 계정을 추가하고자 할 경우 다음과 같은 방식으로 수정 및 업데이트가 가능하다.

[root@rocky8-server log]# tctl get user/dubaek > dubaek.yaml
[root@rocky8-server log]# vim dubaek.yaml
[root@rocky8-server log]# tctl create -f dubaek.yaml
user "dubaek" has been updated

node 추가

node 추가에는 invite 하는 방식과 token을 발행하여 join 하는 방식 두가지가 있다.

invite 방식의 node 추가
[root@rocky8-server etc]# tctl nodes add
The invite token: 217d9e2757b28c8c74e3efa808f72977
This token will expire in 30 minutes

Run this on the new node to join the cluster:

> teleport start \
   --roles=node \
   --token=217d9e2757b28c8c74e3efa808f72977 \
   --ca-pin=sha256:817e4eb920cbfe46c0549623e871b4b1e9805dc18cbd5db96514fbe16ea5746f \
   --auth-server=10.0.2.15:3025

Please note:

  - This invitation token will expire in 30 minutes
  - 10.0.2.15:3025 must be reachable from the new node
token발행과 cluster join을 통한 node 추가

아래 링크를 참고하여 노드 추가가 가능하다.

역할별 접근 권한 관리

다음과 같이 4개의 role이 기본으로 제공된다.

[root@rocky8-server log]# tctl get role | grep -E "^  name"
  name: access
  name: admin
  name: auditor
  name: editor

서버별 접근을 제어하기 위해서는 role내에 label을 통한 제어를 수행해야 한다.

먼저 role template을 다음 명령어로 생성한다.(기존 양식을 가져와 수정하여 적용하는 방식이다.)

[root@rocky8-server ~]# tctl get role/access > dev-role.yaml
[root@rocky8-server ~]# vim dev-role.yaml

여기서 metadata id는 제거하고 name은 생성하려는 role name으로 지정한다.
또한 아래와 같이 spec내에 접근을 하고자 하는 teleport node의 label을 등록해주면
지정된 label을 보유한 node들만 해당 role을 할당받은 사용자들에게 출력된다.

spec:
  allow:
    ...
    node_labels:
      'env': 'prd'

수정이 완료되면 다음과 같이 role을 생성한다.

[root@rocky8-server ~]# tctl create -f dev-role.yaml
role 'dev' has been created
[root@rocky8-server ~]# tctl get role | grep "^  name"
  name: access
  name: admin
  name: auditor
  name: dev
  name: editor

dev role이 생성된것을 확인할 수 있다.

이후 해당 role로 접근을 시도해보면 앞서 지정한 label에 매핑되는 node들이 출력되고 접근이 될수 있게 된다.

jacob@dubaekPC:~$ tsh login --insecure --proxy=rocky8-server --user=testuser
Enter password for Teleport user testuser:
Enter your OTP token:
194164
WARNING: You are using insecure connection to SSH proxy https://rocky8-server:3080
> Profile URL:        https://rocky8-server:3080
  Logged in as:       testuser
  Cluster:            rocky8-server
  Roles:              dev
  Logins:             -teleport-nologin-76b845e0-f75e-4e51-8176-a42bb600f277
  Kubernetes:         disabled
  Valid until:        2021-08-04 12:30:46 +0900 KST [valid for 1h0m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty
jacob@dubaekPC:~$ tsh ls
Node Name Address            Labels
--------- ------------------ -------
ubuntu20  192.168.56.20:3022 env=prd

기능 확인

SSH Proxy

아래와 같이 tsh ssh 명령을 통해 등록된 서버에 모두 접근이 가능하다.

jacob@dubaekPC:~/temp/teleport/examples$ tsh ls
Node Name     Address            Labels
------------- ------------------ -----------------------------------
rocky8-server 127.0.0.1:3022     env=example, hostname=rocky8-server
ubuntu20      192.168.56.20:3022

jacob@dubaekPC:~/temp/teleport/examples$ tsh ssh root@ubuntu20
root@ubuntu20:~#
root@ubuntu20:~# exit
logout
the connection was closed on the remote side on  02 Aug 21 16:31 KST
jacob@dubaekPC:~/temp/teleport/examples$ tsh ssh ubuntu@ubuntu20
ubuntu@ubuntu20:~$
ubuntu@ubuntu20:~$ exit
logout
the connection was closed on the remote side on  02 Aug 21 16:31 KST
jacob@dubaekPC:~/temp/teleport/examples$ tsh ssh root@rocky8-server
[root@rocky8-server ~]#

참고
아래와 같이 x509 인증서 에러가 나오는경우는 로그인과정상에 인증실패가 된것이라 보면 된다.

jacob@dubaekPC:~$ tsh ssh -p 22 root@ubuntu20
ERROR: Get "https://rocky8-server:3080/webapi/ping": x509: certificate signed by unknown authority

Access Kubernetes

WIP..

Access Application

WIP..

Access Database

WIP..

Session Recording and joining

아래와 같이 UI를 통해 recording 된 리스트를 확인할 수 있고 play 버튼을 클릭하여 실제 영상으로 재생해볼수 있다.

추가로

Agentless 방식의 SSH

Bastion Host 형태로 제공되는 Teleport를 사용하는 경우 Teleport Node에서 동작되는 Teleport Agent가 종료된 경우
접근이 불가능한 상황이 초래될수 있다. 이러한 경우 이를 우회하여 접근할 수 있는 방법에 대하여 알아보도록 하자.

아래 링크에서는 agentless 방식으로 접근이 가능하다고 한다.

실제로는 openssh 방식을 통한 접근을 사용하게 되면 Teleport Agent가 예기치 않게 종료되어도 접근을 수행할 수 있다.

Teleport Server(Proxy/Auth)에서 아래 명령을 입력하여 CA를 export 하고

sudo tctl auth export --type=user > teleport_user_ca.pub

이를 각 Teleport Node의 /etc/ssh 디렉토리로 복사한뒤 아래 설정을 넣어준후 sshd를 재시작하게 되면 Teleport Server의 CA를 인지하고 인증이 이루어질수 있다.

TrustedUserCAKeys /etc/ssh/teleport_user_ca.pub

certificate rotate

일반적으로 아래와 같은 rotated 상태이다.

[root@rocky8-server ~]# tctl status
Cluster  rocky8-server
Version  6.2.8
Host CA  rotated Aug  4 10:34:44 UTC
User CA  rotated Aug  4 10:34:44 UTC
Jwt CA   rotated Aug  4 10:34:44 UTC
CA pin   sha256:817e4eb920cbfe46c0549623e871b4b1e9805dc18cbd5db96514fbe16ea5746f

만약 initialize나 다른 상태이며 아래와 같은 명령으로 이를 정상화 시킬수 있다.

[root@rocky8-server ~]# tctl auth rotate --manual --phase=standby
Updated rotation phase to "standby". To check status use 'tctl status'

Audit

Audit log는 다음 3가지 방식으로 제공이 된다.

  1. SSH Event : login 성공/실패
  2. Recorded Sessions : SSH shell session에 대한 record 된 영상
  3. Enhanced Session Recording : BPF 기반으로 사용했던 명령들을 json 형태로 남기고 이를 encoding 하여 만약의 해킹과 같은 위험 상황에 손쉽게 확인되지 않도록 함.

2번 Recorded Session의 경우 영상 기반으로 재생이되는 방식으로 아래와 같이 tsh 명령을 이용해 해당 영상을 재생하거나 UI를 통해 확인해볼수 있다.

tsh play [session_record_id]

3번의 경우 enhanced recording session 이라는 기능이며 최신버전에서 제공하고 있으며 커널버전이 5.8이상으로 최신 OS사용에 대한 제한이 있다. 다만 해당 기능을 통해 SSH로 연결하여 수행했던 history를 좀더 편리하게 확인할 수 있다.

아무래도 영상 기반의 파일이라 향후 추적을 위한 검색기능을 구현해야할 경우 이를 활용하기는 어려워 보인다.
하여 text 기반으로 남겨지는 session recording 데이터가 없는지 확인해본 결과 chunks 파일을 통해 확인할 수 있었다.
다만, 해당 chunks 파일은 tsh play를 한번이라도 한 경우 남게 되어 매번 이를 수행하는 cron job 같은게 필요할 것으로 보인다.

root@service1:/var/lib/teleport/log/playbacks/sessions# tree
.
└── default
    ├── 820bee91-e7e9-4627-8af6-1213be477906-0.chunks
    ├── 820bee91-e7e9-4627-8af6-1213be477906-0.chunks.gz
    ├── 820bee91-e7e9-4627-8af6-1213be477906-0.events.gz
    ├── 820bee91-e7e9-4627-8af6-1213be477906.index
    ├── 820bee91-e7e9-4627-8af6-1213be477906.tar
    ├── bb03fa95-cd98-4745-af7f-b054a8898583-0.chunks
    ├── bb03fa95-cd98-4745-af7f-b054a8898583-0.chunks.gz
    ├── bb03fa95-cd98-4745-af7f-b054a8898583-0.events.gz
    ├── bb03fa95-cd98-4745-af7f-b054a8898583.index
    ├── bb03fa95-cd98-4745-af7f-b054a8898583.tar
    ├── e3a74e05-8192-440a-8be6-eda12d16dfcc-0.chunks
    ├── e3a74e05-8192-440a-8be6-eda12d16dfcc-0.chunks.gz
    ├── e3a74e05-8192-440a-8be6-eda12d16dfcc-0.events.gz
    ├── e3a74e05-8192-440a-8be6-eda12d16dfcc.index
    └── e3a74e05-8192-440a-8be6-eda12d16dfcc.tar

1 directory, 15 files

tsh play 명령 (혹은 UI상에서 play 버튼을 클릭한 경우) 수행후 위와 같은 파일이 남게 되고
여기서 *.chunks 파일을 확인해보면 다음과 같은 history를 확인할 수 있다.

root@service1:/var/lib/teleport/log/playbacks/sessions# cat default/e3a74e05-8192-440a-8be6-eda12d16dfcc-0.chunks
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@service2:~$ ls
ubuntu@service2:~$ pwd
/home/ubuntu
ubuntu@service2:~$ exit
logout

위 audit log들에 대한 설정은 아래 링크에서 session_recording 를 검색하여 해당 설정에 대한 설명을 읽어보길 바란다.

Pros/Cons

아래 blog에 teleport에 대한 장/단점 요약이 잘되어 있다.

참고사이트

'Security > System&Tools' 카테고리의 다른 글

Teleport  (0) 2021.08.10
Grafana login using Keycloak OAuth  (0) 2021.06.15
Wireguard  (0) 2020.07.02
metasploit  (0) 2013.06.10
댓글
댓글쓰기 폼