인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Teleport을 구성하여 호스트 사용자 생성
Teleport의 SSH 서비스는 로그인 시 로컬 Unix 사용자를 자동으로 생성하도록 구성할 수 있습니다.
이것은 조직의 각 구성원에 대해 사용자를 수동으로 생성할 필요가 없도록 하며, 주어진 호스트에 대한 권한을 더 세밀하게 제어할 수 있도록 합니다. Teleport에서 생성된 호스트 사용자는 휘발성이며 SSH 세션이 끝나면 삭제됩니다.
전제 조건
-
실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.
-
tctl
관리자 도구와tsh
클라이언트 도구.tctl
및tsh
다운로드 방법에 대한 지침은 설치를 방문하십시오.
- Teleport에 등록된 실행 중인 Linux 서버. 서버를 Teleport 클러스터에 추가하는 방법은 서버 접근 시작 가이드를 참조하십시오. 이 가이드의 목적을 위해 데모 환경에서 실행되는 서버를 등록하는 것을 권장합니다.
- Teleport SSH 서비스에서 휘발성 사용자를 생성해야 하므로, 다음 유틸리티가 PATH에서 사용 가능한지 확인하십시오:
useradd
userdel
usermod
groupadd
getent
visudo
- 연결이 가능한지 확인하기 위해
tsh login
으로 로그인한 다음, 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결할 수 있고tsh login --proxy=teleport.example.com --user=email@example.comtctl status클러스터 teleport.example.com
버전 17.0.0-dev
CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
tctl status
명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속tctl
명령어를 실행할 수 있습니다.
자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로tctl
명령어를 실행할 수도 있습니다.
자동 호스트 사용자
이 섹션에서는 Teleport 사용자가 SSH 세션을 시작할 때 로컬 사용자를 생성하도록 Teleport를 구성합니다.
1/4단계. RBAC 구성
사용자가 SSH 서비스 인스턴스에 액세스할 때 Teleport는 인스턴스와 일치하는 사용자의 각 역할을 확인합니다. 인스턴스와 일치하는 역할이 하나 이상 있지만 create_host_user_mode
를 설정하지 않으면 자동 사용자 생성이 비활성화됩니다. 서버와 일치하지 않는 역할은 검사되지 않습니다.
호스트 사용자 생성을 활성화하려면 다음을 수행해야 합니다:
- 서버에 라벨을 부여하여 호스트 사용자 생성을 활성화하는 Teleport 역할과 일치하도록 합니다.
- 추가한 라벨이 있는 서버에 대해 호스트 사용자 생성을 활성화하는 역할을 만듭니다.
- 이 가이드의 목적을 위해, 생성한 역할만을 가진 Teleport 사용자를 만듭니다.
서버에 라벨 추가
-
이 가이드 시작 전에 Teleport에 등록된 서버에 액세스하고, 기본적으로
/etc/teleport.yaml
에 위치한 Teleport 구성 파일을 엽니다. -
구성 파일에 다음 변경을 추가합니다:
labels: + app: "nginx"
-
서버에서 Teleport를 재시작합니다.
Teleport 역할 정의
다음 역할 사양은 사용자가 일치하는 서버에서 nginxrestarter
로 로그인할 수 있도록 합니다. 이 내용을 auto-users.yaml
이라는 파일에 추가하십시오:
kind: role
version: v5
metadata:
name: auto-users
spec:
options:
# 사용자의 자동 생성 허용.
create_host_user_mode: keep
create_host_user_default_shell: /bin/bash
allow:
logins: ["nginxrestarter"]
# 생성된 사용자가 추가될 호스트 그룹의 목록. 이미 존재하지 않는 경우 생성됩니다.
host_groups: [ubuntu, nginx, other]
# /etc/sudoers.d에 생성된 임시 sudoers 파일에 포함될 항목의 목록
host_sudoers: [
# 이 줄은 `nginxrestarter` 사용자가
# root로서 비밀번호 없이 `systemctl restart nginx.service` 를 실행할 수 있도록 허용합니다.
# 이 경우 sudoers 항목은 `nginxrestarter` 로 접두사가 붙습니다.
# sudoers 파일 참조 문서: https://www.sudo.ws/docs/man/1.8.17/sudoers.man/
"ALL = (root) NOPASSWD: /usr/bin/systemctl restart nginx.service",
]
node_labels:
"app": "nginx"
create_host_user_mode
필드는 값이 keep
일 때 호스트 사용자 생성을 활성화합니다. auto-users
역할을 가진 사용자가 app:nginx
라벨을 가진 서버에 로그인하면, Teleport SSH 서비스가 호스트 사용자를 생성하고, 이를 host_groups
에 나열된 그룹에 추가하며, host_sudoers
필드에 지정된 sudoer 권한을 부여합니다. 이 경우 새 사용자는 root로서 Nginx 서비스를 재시작할 수 있는 권한을 받습니다. Teleport 16.4.0 이상에서는 생성된 사용자의 기본 셸을 create_host_user_default_shell
로 구성할 수 있습니다. 그렇지 않으면 호스트의 기본 셸이 사용됩니다.
logins
필드의 각 값은 사용 중인 Linux 배포의 사용자 이름 요구 사항을 준수해야 합니다. 일반 배포의 요구 사항은 User/Group Name Syntax를 참조하십시오.
여러 역할이 host_sudoers
항목을 포함하는 경우 sudoers 파일에는 역할 이름에 따라 작성된 항목이 순서대로 기록됩니다.
역할에 deny
규칙이 포함되어 있어 host_sudoers
를 '*'
로 설정하면, 사용자가 일치하는 노드에 액세스할 때 모든 sudoers 항목이 제거됩니다. 그렇지 않으면 deny
규칙이 필터링할 때 문자 그대로 매치됩니다:
kind: role
version: v5
metadata:
name: auto-users
spec:
options:
create_host_user_mode: keep
deny:
host_sudoers: [
"*" # 이 역할의 사용자에게는 호스트 노드에서 sudoers 파일이 생성되지 않도록 합니다.
"ALL=(ALL) NOPASSWD: ALL" # 이와 일치하는 host_sudoers 항목은 필터링됩니다.
]
node_labels:
"app": "nginx"
서버가 결코 휘발성 Unix 사용자의 자동 생성을 허용해서는 안 되는 경우, 노드 구성에서 disable_create_host_user
를 true
로 설정할 수 있습니다:
# teleport.yaml
teleport:
nodename: node
ssh_service:
enabled: true
# 이 노드에서 역할 권한과 관계없이 자동 호스트 사용자 생성을 비활성화합니다.
disable_create_host_user: true
보안이 낮은 환경에서는 create_host_user_mode
를 insecure-drop
으로 설정하여 세션이 끝나면 사용자를 삭제할 수도 있습니다. 그러나 이 모드에서는 생성된 사용자가 이전에 삭제된 사용자와 동일한 UID를 가질 수 있어, 해당 사용자의 파일이 삭제되지 않으면 새 사용자가 모든 파일에 접근할 수 있게 됩니다. 필요하지 않는 한 keep
모드를 사용하십시오.
역할를 생성하십시오:
tctl create -f auto-users.yaml역할 'auto-users'가 생성되었습니다.
Teleport 사용자 생성
-
다음 명령어를 실행하여
auto-users
역할이 있는 Teleport 사용자를 생성합니다:tctl users add demo-user --roles=auto-users --logins=nginxrestarter -
터미널의 지침을 따라 Teleport Web UI를 방문해 사용자를 생성합니다.
2/4단계. [선택 사항] 생성된 사용자의 UID 및 GID 구성
사용자에게 host_user_uid
및 host_user_gid
속성이 지정된 경우, 호스트 사용자가 생성될 때 UID 및 GID가 해당 값으로 설정됩니다.
이 값들은 tctl
을 통해 사용자를 생성하거나 업데이트할 때 수동으로 설정하거나 같은 이름의 SSO 속성을 통해 설정할 수 있습니다.
지정된 GID를 가진 그룹이 이미 존재하지 않을 경우, 생성 중인 사용자와 동일한 로그인 이름으로 그룹이 생성됩니다.
kind: user
metadata:
name: demo-user
spec:
...
traits:
logins:
- nginxrestarter
host_user_gid:
# gid 및 uid 값은 인용부호로 묶어야 합니다.
- "1234"
host_user_uid:
- "5678"
Warning
host_user_uid
또는 host_user_gid
에 여러 항목이 지정된 경우, 첫 번째 항목만 사용됩니다.
3/4단계. Linux 서버에서 sudoers 구성
Teleport 호스트 사용자 생성은 새로운 사용자를 위해 sudoers.d
디렉터리를 활용합니다.
CentOS 빌드의 경우, 다음 줄이 sudoers 파일에 존재하는지 확인하십시오. 다른 Linux 배포판은 무시하십시오:
#includedir /etc/sudoers.d
sudoers 파일에서 #
기호는 일반적으로 주석을 나타내는 데 사용됩니다. 그러나 이 경우 #includedir
은 주석이 아닌 지시어입니다.
Debian 기반 시스템에서는 @includedir /etc/sudoers.d
를 사용할 수 있으며, 이는 유사한 목적을 위해 사용됩니다. 운영 체제에 따라 올바른 지시어가 사용되었는지 확인하십시오.
4단계/4단계 호스트 사용자 생성 테스트
tsh
를 통해 원격 노드에 연결하면, 호스트 사용자 생성이 활성화되어 있는 경우 Teleport SSH 서비스가 호스트에 자동으로 사용자를 생성합니다:
tsh logintsh ssh nginxrestarter@develnodegrep "nginxrestarter" /etc/passwdnginxrestarter:x:1001:1003::/home/nginxrestarter:/bin/bash
grep "other" /etc/groupother:x:1002:nginxrestarter
exittsh ssh admin@develnode # 로그아웃 후 사용자가 삭제되었는지 확인grep "nginxrestarter" /etc/passwdecho $?1
위의 사용자가 로그인하면, nginxrestarter
사용자와 아직 존재하지 않는 모든 그룹이 호스트에 생성됩니다. nginxrestarter
사용자 는 host_groups
필드에 지정된 ubuntu
, nginx
, 및 other
그룹에 추가됩니다.
정적 호스트 사용자
이 섹션에서는 Teleport를 구성하여 SSH 세션과 독립적으로 로컬 사용자를 생성합니다. 정적 호스트 사용자는 인증 서버, SSH 서비스 및 tctl
에서 Teleport 버전 >=16.3.0이 필요합니다.
1/3단계. RBAC 구성
서버에 레이블 지정
-
이 가이드를 시작하기 전에 Teleport에 등록한 서버에 접근하여
/etc/teleport.yaml
의 Teleport 구성 파일을 엽니다. -
구성 파일에 다음과 같이 변경합니다:
labels: + app: "nginx"
-
서버에서 Teleport를 재시작합니다.
Teleport 역할 정의
다음 역할 사양은 사용자가 일치하는 서버에서 nginxrestarter
로 로그인할 수 있도록 허용합니다. 이 내용을 auto-users.yaml
이라는 파일에 추가합니다:
kind: role
version: v5
metadata:
name: auto-users
spec:
allow:
logins: ["nginxrestarter"]
node_labels:
"app": "nginx"
역할을 생성합니다:
tctl create -f auto-users.yaml역할 'auto-users'가 생성되었습니다
Teleport 사용자 생성
-
다음 명령어를 실행하여
auto-users
역할을 가진 Teleport 사용자를 생성합니다:tctl users add demo-user --roles=auto-users --logins=nginxrestarter -
터미널에 나타나는 지침에 따라 Teleport 웹 UI를 방문하여 사용자를 생성합니다.
2/3단계. 정적 호스트 사용자 생성
nginxrestarter.yaml
이라는 파일에 다음 내용을 추가합니다:
kind: static_host_user
metadata:
name: nginxrestarter
spec:
matchers:
# node_labels 또는 node_labels_expression을 사용하여 호스트 사용자를 생성할 서버를 선택합니다.
# 둘 중 하나만 필요합니다.
- node_labels:
- name: app
values: ["nginx"]
node_labels_expression: 'labels["app"] == "nginx"'
# 생성된 사용자가 추가될 호스트 그룹 목록입니다. 이미 존재하지 않는 그룹은 생성됩니다.
groups: [ubuntu, nginx, other]
# /etc/sudoers.d에 생성된 임시 sudoers 파일에 포함할 항목 목록입니다.
sudoers: [
# 이 줄은 `nginxrestarter` 사용자가
# root 권한으로 `systemctl restart nginx.service` 를 실행할 수 있게 합니다.
# 경우에 따라 sudoers 항목은 `nginxrestarter` 로 접두사가 붙습니다.
# sudoers 파일 참조 문서: https://www.sudo.ws/docs/man/1.8.17/sudoers.man/
"ALL = (root) NOPASSWD: /usr/bin/systemctl restart nginx.service",
]
# 호스트 사용자의 UID. 선택 사항입니다.
# uid: 1234
# 호스트 사용자의 GID. 선택 사항입니다.
# gid: 1234
# 생성된 사용자의 기본 쉘. 선택 사항입니다.
# default_shell: /bin/bash
# 정적 호스트 사용자 프로비저닝이 Teleport 외부에서 생성된 기존 사용자의 소유권을 자동으로 가져와야 하는지 여부
# 선택 사항입니다.
# take_ownership_if_user_exists: true
# 필요에 따라 nginxrestarter를 다르게 구성하기 위해 추가 매처를 추가합니다.
# - node_labels:
# ...
정적 호스트 사용자 리소스의 이름은 생성할 사용자의 로그인과 일치해야 합니다. 단일 정의 매처가 충족되는 경우에만 서버가 사용자를 프로비저닝합니다. 단일 정적 호스트 사용자 리소스에 대해 여러 매치가 있거나 사용자가 이미 존재하고 take_ownership_if_user_exists
가 true
로 설정되어 있지 않은 경우, 서버는 사용자를 프로비저닝하지 않습니다.
정적 호스트 사용자를 생성합니다:
tctl create -f nginxrestarter.yamlstatic_host_user 'nginxrestarter'가 생성되었습니다
Note
정적 호스트 사용자 리소스를 삭제해도 적용된 서버에서 호스트 사용자는 제거되지 않습니다.
3/3단계. 테스트
원격 노드에 tsh
를 통해 연결하여 호스트 사용자가 생성되었는지 확인합니다:
tsh logintsh ssh nginxrestarter@develnodegrep "nginxrestarter" /etc/passwdnginxrestarter:x:1001:1003::/home/nginxrestarter:/bin/bash
grep "other" /etc/groupother:x:1002:nginxrestarter
내부 작동
Teleport SSH 서비스는 호스트에서 새로운 사용자를 생성하기 위해 useradd
를 실행하며,
useradd
이진 파일을 찾을 수 없는 경우 오류를 반환합니다. useradd
명령은
사용자를 Teleport 사용자 역할에 지정된 그룹에 추가하며, Teleport는 새 호스트 사용자 이름으로
새로운 홈 디렉토리를 별도로 생성합니다.
SSH 서비스는 사용자 추가 시
useradd --no-create-home --home-dir <home> <username> --groups <groups> --uid <uid> --gid <gid>
를 실행하며, 다른 모든 옵션은 시스템 기본값을 사용합니다. 예를 들어, 해당 사용자는 호스트의 기본 로그인 셸과 연결되며, 이는 /etc/default/useradd
의 SHELL
필드를 설정하여 지정할 수 있습니다. 기본 동작에 대한 전체 설명은 시스템의 useradd
매뉴얼을 참조하십시오.
Teleport SSH 서비스는 또한 로그인한 사용자의 사용자 이름 앞에 고유한 항목을 추가하여 host_sudoers
파일의 내용을 사용하여 /etc/sudoers.d
에 파일을 생성합니다.
세션은 정상적으로 진행될 수 있습니다. SSH 세션이 종료되면 사용자와 홈 디렉토리가 기계에 유지됩니다.
create_host_user_mode
를 역할 정의에서 insecure-drop
으로 설정하면 자동 호스트 사용자를 제거할 수 있습니다. 그러나 사용자 ID가 시스템에서 재사용될 가능성은 여러 보안 위험을 초래할 수 있으므로, 특정 필요가 있지 않고 그 가능성을 이해하지 못하는 경우 keep
모드를 사용하는 것을 권장합니다.
텔레포트 SSH 인스턴스가 세션 진행 중에 재시작될 경우, 사용자는 다음 Teleport 재시작 시 정리됩니다.
관리되지 않는 사용자 마이그레이션
이전 버전의 Teleport에서 keep
모드 사용자
v14.3.24
, v15.4.16
, 및 v16.1.8
이전에 create_host_user_mode: keep
으로 생성된 자동 호스트 사용자는
이후 버전의 Teleport에 의해 관리되지 않습니다. 이 사용자를 다음 세션에서 자동으로 마이그레이션하려면
역할의 host_groups
에 teleport-keep
를 추가할 수 있습니다. 호스트에서 직접 teleport-keep
그룹에
추가하여 호스트 사용자를 수동으로 마이그레이션할 수도 있습니다.
정적 호스트 사용자
기본적으로 정적 호스트 사용자 프로비저닝은 Teleport 외부에서 생성된 기존 사용자의 소유권을
가져오지 않습니다. 정적 호스트 사용자와 충돌하는 모든 관리되지 않는 사용자의 소유권을
자동으로 가져오도록 Teleport를 구성하려면, 정적 호스트 사용자 리소스에서 take_ownership_if_user_exists
플래그를 true
로 설정할 수 있습니다. 이를 통해 기존 사용자가 Teleport의 관리 하에 들어가고,
그 사용자에게 할당된 그룹이 무시됩니다. teleport-keep
사용자 마이그레이션과 유사하게,
사용자를 호스트에서 직접 teleport-static
그룹에 추가하여 수동으로 마이그레이션할 수 있습니다.
다음 단계
terraform 프로바이더를 사용할 때 이 가이드에 설명된 것과 다를 수 있는 값이 있음을 유의하십시오.