InfoGrab DocsInfoGrab Docs

Azure PostgreSQL 및 MySQL을 이용한 데이터베이스 접근

요약

Teleport는 Teleport Database Service를 통해 Azure PostgreSQL or MySQL에 대한 보안 접근을 제공할 수 있습니다. Teleport 데이터베이스 서비스는 Teleport 사용자와 Azure PostgreSQL 및 MySQL 사이의 트래픽을 프록시합니다.

Teleport는 Teleport Database Service를 통해 Azure PostgreSQL or MySQL에 대한 보안 접근을 제공할 수 있습니다. 이를 통해 Teleport의 RBAC를 사용한 세분화된 접근 제어가 가능합니다.

이 가이드에서는 다음을 수행합니다:

  1. Azure PostgreSQL or MySQL 데이터베이스를 구성합니다 with Microsoft Entra ID-based authentication.
  2. 데이터베이스를 Teleport 클러스터에 추가합니다.
  3. Teleport를 통해 데이터베이스에 연결합니다.

작동 방식#

Teleport 데이터베이스 서비스는 Teleport 사용자와 Azure PostgreSQL 및 MySQL 사이의 트래픽을 프록시합니다. 사용자가 Teleport를 통해 데이터베이스에 연결하면, 데이터베이스 서비스는 Microsoft Entra ID(이전의 Azure AD)에서 액세스 토큰을 획득하고, 데이터베이스를 관리할 권한을 가진 프린시펄로서 Azure에 인증합니다.

셀프 호스팅 Teleport 클러스터로 Azure PostgreSQL/MySQL 등록하기

클라우드 호스팅 Teleport 클러스터로 Azure PostgreSQL/MySQL 등록하기

사전 요구 사항#

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.

  • tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Teleport 클러스터의 버전을 확인합니다. tctl and tsh clients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의 /v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다. teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:

      $ TELEPORT_DOMAIN=teleport.example.com:443
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. 사용 중인 플랫폼에 대한 지침에 따라 tctl and tsh clients를 설치합니다:

Mac

     `tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
 
     
Warning
       Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
       Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
       보장할 수 없습니다.
     

Windows - Powershell

     ```code
     $ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
     # Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
     # NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
     # Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
     ```
 
   

 
   

Linux

     Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다.  RPM/DEB
     패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
     [설치 페이지](../installation/installation.mdx)를 참조하세요.
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ cd teleport
     $ sudo ./install
     # Teleport binaries have been copied to /usr/local/bin
     ```
   

 
  • 배포된 Azure Database for PostgreSQL 또는 MySQL 서버.
  • Microsoft Entra ID 관리 권한.
  • Teleport 데이터베이스 서비스를 실행할 호스트(예: Azure VM 인스턴스).

Teleport cluster에 연결할 수 있는지 확인하려면 tsh login으로 로그인한 다음, 현재 자격 증명으로 tctl 명령을 실행할 수 있는지 확인합니다.

예를 들어, teleport.example.com에 cluster 내 Teleport Proxy Service의 도메인 이름을, email@example.com에 Teleport 사용자 이름을 지정하여 다음 명령을 실행합니다:

$ tsh login --proxy=teleport.example.com --user=email@example.com
$ tctl status
# Cluster  (=teleport.url=)
# Version  (=teleport.version=)
# CA pin   (=presets.ca_pin=)

cluster에 연결하여 tctl status 명령을 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 이후의 tctl 명령을 실행할 수 있습니다. 자체 Teleport cluster를 호스팅하는 경우, 전체 권한을 얻기 위해 Teleport Auth Service를 호스팅하는 컴퓨터에서 tctl 명령을 실행할 수도 있습니다.

1/5단계. Azure 서비스 프린시펄 구성#

PostgreSQL 또는 MySQL 데이터베이스에 인증하려면, Teleport 데이터베이스 서비스가 Microsoft Entra ID에서 액세스 토큰을 획득해야 합니다.

Teleport Database Service가 Azure 리소스에 접근하는 방법은 몇 가지가 있습니다:

  • Database Service를 관리 ID(managed identity)가 연결된 Azure VM에서 실행할 수 있습니다. 이 방식은 Azure 자격 증명을 관리할 필요가 없어지므로 프로덕션 환경에서 Database Service를 배포하는 권장 방법입니다.
  • Database Service를 Microsoft Entra ID 애플리케이션으로 등록("App registrations"을 통해)하고 해당 자격 증명으로 구성할 수 있습니다. 이 방식은 Database Service의 환경에 Azure 자격 증명이 존재해야 하므로 개발 및 테스트 목적으로만 권장됩니다.

Using managed identity

Azure 포털의 Managed Identities 페이지로 이동하여 Create를 클릭해 새 사용자 할당 관리 ID(user-assigned managed identity)를 생성합니다:

Managed identities

새 ID의 이름과 리소스 그룹을 지정하고 생성합니다:

New identity

생성된 ID의 Client ID를 기록해 둡니다:

Created identity

다음으로, Database Service 인스턴스를 실행할 Azure VM으로 이동하여 방금 생성한 ID를 추가합니다:

VM identity

Database Service를 실행할 모든 Azure VM에 이 ID를 연결합니다.

Using app registrations

Note
Database Service를 Microsoft Entra ID 애플리케이션으로 등록하는 방식은
테스트 및 개발 시나리오에 적합하거나, Database Service가 Azure VM에서
실행되지 않는 경우에 적합합니다. 프로덕션 시나리오에서는 관리 ID
방식을 사용하는 것이
좋습니다.

Microsoft Entra ID의 App registrations 페이지로 이동하여 New registration을 클릭합니다:

App registrations

이름(예: DatabaseService)을 지정하고 새 애플리케이션을 등록합니다. 앱이 생성되면 Application (client) ID를 기록해 두고 Add a certificate or secret을 클릭합니다:

Registered app

Database Service 에이전트가 Azure API로 인증하는 데 사용할 새 클라이언트 시크릿을 생성합니다:

Registered app secrets

Teleport Database Service는 Azure SDK의 기본 자격 증명 공급자 체인을 사용하여 자격 증명을 찾습니다. 사용 사례에 적합한 방법을 선택하려면 Azure SDK Authorization을 참조하세요. 예를 들어 클라이언트 시크릿을 사용한 환경 기반 인증을 사용하려면 Database Service에 다음 환경 변수가 설정되어 있어야 합니다:

export AZURE_TENANT_ID=
export AZURE_CLIENT_ID=
export AZURE_CLIENT_SECRET=

2/5단계. Teleport용 IAM 권한 구성#

사용자 지정 역할 생성#

Teleport는 MySQL 및 PostgreSQL 데이터베이스를 검색하고 등록하려면 Azure IAM 권한이 필요합니다. Teleport가 검색해야 할 모든 데이터베이스를 포함하는 할당 가능한 범위(assignable scope)를 가진 역할을 생성합니다. 예를 들면:

{
    "properties": {
        "roleName": "TeleportDiscovery",
        "description": "Allows Teleport to discover MySQL and PostgreSQL databases",
        "assignableScopes": [
            "/subscriptions/11111111-2222-3333-4444-555555555555"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.DBforMySQL/servers/read",
                    "Microsoft.DBforPostgreSQL/servers/read",
                    "Microsoft.DBforMySQL/flexibleServers/read",
                    "Microsoft.DBforPostgreSQL/flexibleServers/read"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
    }
}

이 역할 정의는 Teleport가 MySQL 및 PostgreSQL 데이터베이스를 검색할 수 있도록 하지만, Teleport는 실제로 사용 중인 데이터베이스 유형에 대한 권한만 필요로 합니다. 할당 가능한 범위에는 구독이 포함되어 있으므로, 해당 구독 내의 모든 리소스 범위에 역할을 할당하거나, 구독 범위 자체를 사용해 할당할 수 있습니다.

Custom role assignable scope

사용자 지정 역할은 Azure 기본 제공 역할과 달리, 루트 할당 가능 범위를 가질 수 없습니다. 사용자 지정 역할에서 사용할 수 있는 가장 높은 할당 가능 범위는 구독 범위입니다. 관리 그룹 범위 사용은 현재 Azure의 미리 보기 기능이며, 역할 정의의 "assignableScopes"에 단일 관리 그룹만 허용됩니다. 자세한 내용은 Azure RBAC 사용자 지정 역할을 참고하십시오.

구독 페이지로 이동하여 구독을 선택합니다.

구독에서 *액세스 제어(IAM)*를 클릭하고 추가 > 사용자 지정 역할 추가를 선택합니다: IAM 사용자 지정 역할

사용자 지정 역할 생성 페이지에서 JSON 탭을 클릭하고 편집을 클릭한 다음, JSON 예시를 붙여넣고 "assignableScopes"의 구독을 자신의 구독 ID로 바꿉니다: JSON에서 역할 생성

Teleport 데이터베이스 서비스 프린시펄에 대한 역할 할당 생성#

Teleport에 권한을 부여하려면 생성한 사용자 지정 역할을 Teleport 서비스 주체 - 즉 앞서 생성한 관리 ID 또는 앱 등록 -에 할당해야 합니다.

역할 할당을 수행할 리소스 범위로 이동합니다. *Access control (IAM)*을 클릭하고 Add > Add role assignment을 선택합니다. 생성한 사용자 지정 역할을 역할로 선택하고 Teleport 서비스 주체를 멤버로 선택합니다.

Assign role

Note

역할 할당은 Teleport Database Service가 일치하는 모든 데이터베이스를 검색할 수 있을 만큼 충분히 높은 범위여야 합니다. Azure 범위와 역할 할당 생성에 대한 자세한 내용은 Identify the needed scope를 참고하십시오.

3/5단계. Azure 데이터베이스 사용자 생성#

Teleport가 서비스 프린시펄로 인증하여 Azure 데이터베이스에 연결할 수 있도록 하려면, 데이터베이스에서 해당 프린시펄로 인증되는 Entra ID 사용자를 생성해야 합니다.

Entra ID 관리자 할당#

데이터베이스의 Entra ID 관리자만 데이터베이스에 연결하고 Entra ID 사용자를 생성할 수 있습니다.

데이터베이스의 인증 페이지로 이동하여 편집 버튼을 사용해 AD 관리자를 설정합니다:

AD 관리자 설정

데이터베이스의 인증 페이지로 이동하여 + Entra ID 관리자 추가를 선택해 AD 관리자를 설정합니다:

AD 관리자 설정

데이터베이스의 Active Directory 관리자 페이지로 이동하여 관리자 설정 버튼을 사용해 AD 관리자를 설정합니다:

AD 관리자 설정

Entra ID Admin

데이터베이스에는 하나의 Azure 사용자(또는 그룹)만 Entra ID 관리자로 설정할 수 있습니다. Entra ID 관리자가 서버에서 제거되면, 해당 서버의 모든 Entra ID 로그인이 비활성화됩니다. 동일한 테넌트에서 새 Entra ID 관리자를 추가하면 Entra ID 로그인이 다시 활성화됩니다. 자세한 내용은 PostgreSQL 인증에 Microsoft Entra ID 사용하기를 참고하십시오.

AD 관리자로 데이터베이스에 연결#

다음으로, AD 관리자 사용자로 데이터베이스에 연결해야 합니다.

Azure az CLI 유틸리티를 사용하여 AD 관리자로 설정한 사용자로 로그인하고, 액세스 토큰을 가져와 데이터베이스 연결 시 비밀번호로 사용합니다:

$ az login -u ad@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ PGPASSWORD=$TOKEN psql "host=example.postgres.database.azure.com user=ad@example.com sslmode=require dbname=postgres"
$ az login -u ad@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ PGPASSWORD=$TOKEN psql "host=example.postgres.database.azure.com user=ad@example.com@instance-name sslmode=require dbname=postgres"
$ az login -u ad-admin@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ mysql -h example.mysql.database.azure.com -P 3306 -u ad@example.com --enable-cleartext-plugin --password=$TOKEN
$ az login -u ad-admin@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ mysql -h example.mysql.database.azure.com -P 3306 -u ad@example.com@instance-name --enable-cleartext-plugin --password=$TOKEN

데이터베이스 사용자 이름에는 연결하려는 Azure 데이터베이스 인스턴스 이름을 포함한 @instance-name 접미사가 포함되어야 합니다.

AD 사용자 생성#

AD 관리자로 데이터베이스에 연결한 후, Teleport 데이터베이스 서비스가 사용할 서비스 프린시펄에 대한 데이터베이스 사용자를 생성합니다. 관리형 아이덴티티를 사용하는 경우 Client ID를, 앱 등록을 사용하는 경우 Application (client) ID를 사용합니다:

postgres=> SET aad_validate_oids_in_tenant = off;
SET
postgres=> CREATE ROLE teleport WITH LOGIN PASSWORD '11111111-2222-3333-4444-555555555555' IN ROLE azure_ad_user;
CREATE ROLE
postgres=> SELECT * FROM pgaadauth_create_principal_with_oid('teleport', '11111111-2222-3333-4444-555555555555', 'service', false, false);
-------------------------------------
 Created role for teleport
(1 row)
mysql> SET aad_auth_validate_oids_in_tenant = OFF;
mysql> CREATE AADUSER 'teleport' IDENTIFIED BY '11111111-2222-3333-4444-555555555555';
Query OK, 0 rows affected (0.92 sec)

생성된 사용자는 기본적으로 아무것에도 접근 권한이 없을 수 있으므로, 몇 가지 권한을 부여해줍니다:

GRANT ALL ON `%`.* TO 'teleport'@'%';

동일한 서비스 프린시펄로 인증되는 여러 데이터베이스 사용자를 생성할 수 있습니다.

4/5단계. Teleport 데이터베이스 서비스 설치#

Database Service가 Teleport 클러스터에 조인하려면 유효한 조인 토큰이 필요합니다. 다음 tctl 명령을 실행하고 Database Service를 실행할 서버에서 토큰 출력을 /tmp/token에 저장합니다:

$ tctl tokens add --type=db --format=text
(=presets.tokens.first=)

Teleport 데이터베이스 서비스를 실행할 호스트에 Teleport를 설치합니다:

Linux 서버에 Teleport Agent를 설치하려면:

권장 설치 방법은 클러스터 설치 스크립트입니다. 이 스크립트는 클러스터에 맞는 올바른 버전, 에디션, 설치 모드를 선택합니다.

  1. teleport.example.com:443에 Teleport 클러스터의 호스트명과 포트를 할당하되, 스킴(https://)은 포함하지 마십시오.

  2. 클러스터의 설치 스크립트를 실행하십시오:

    $ curl "https://teleport.example.com:443/scripts/install.sh" | sudo bash
    

데이터베이스 서비스 구성을 생성합니다.

  • --azure-postgres-discovery에 데이터베이스의 리전을 지정합니다.

  • --proxy 값을 Teleport 프록시 서비스 주소 또는 Teleport Enterprise (Cloud) URI(예: example.teleport.sh:443)로 바꿉니다:

    $ sudo teleport db configure create \
      -o file \
      --proxy=teleport.example.com:443 \
      --token=/tmp/token \
      --azure-postgres-discovery=eastus
    
  • --azure-mysql-discovery에 데이터베이스의 리전을 지정합니다.

  • --proxy 값을 Teleport 프록시 서비스 주소 또는 Teleport Enterprise (Cloud) URI(예: example.teleport.sh:443)로 바꿉니다:

    $ sudo teleport db configure create \
      -o file \
      --proxy=teleport.example.com:443 \
      --token=/tmp/token \
      --azure-mysql-discovery=eastus
    

데이터베이스 서비스 호스트에서 다음 명령을 실행합니다:

$ sudo teleport db configure create \
  -o file \
  --proxy=teleport.example.com:443 \
  --token=/tmp/token \
  --azure-mysql-discovery=eastus \
  --azure-postgres-discovery=eastus

이렇게 하면 teleport.yaml에 각 데이터베이스 유형에 대해 하나씩, 두 개의 types 엔터티가 생성됩니다. 이는 각 데이터베이스 유형에 대해 서로 다른 리전, 태그, 또는 라벨을 원할 때 유용합니다.

또는 teleport.yaml을 편집하여 하나의 항목에 두 데이터베이스 유형을 모두 포함시킬 수도 있습니다:

db_service:
  azure:
  - types: ["mysql", "postgres"]
  ...

이 명령은 eastus 리전에서 Azure MySQL/Postgres 데이터베이스 자동 검색이 활성화된 데이터베이스 서비스 구성을 생성하여 /etc/teleport.yaml 위치에 배치합니다.

Teleport 역할 생성#

tsh로 Teleport 클러스터에 로그인한 워크스테이션에서, Azure 데이터베이스에 대한 접근을 제공하는 새 역할을 정의합니다. 다음 내용으로 azure-database-role.yaml 파일을 생성합니다:

version: v7
kind: role
metadata:
  name: azure-database-access
spec:
  allow:
    db_labels:
      'engine':
        - "Microsoft.DBforMySQL/servers"
        - "Microsoft.DBforMySQL/flexibleServers"
        - "Microsoft.DBforPostgreSQL/servers"
        - "Microsoft.DBforPostgreSQL/flexibleServers"
    db_names:
    - '*'
    db_users:
    - teleport
Flag Description
--db-users 사용자가 데이터베이스에 연결할 때 사용할 수 있는 데이터베이스 사용자 이름 목록입니다. 와일드카드는 모든 사용자를 허용합니다.
--db-names 사용자가 데이터베이스 서버 내에서 연결할 수 있는 논리적 데이터베이스(스키마)의 목록입니다. 와일드카드는 모든 데이터베이스를 허용합니다.
--db-labels 사용자가 접근할 수 있는 데이터베이스에 할당된 라벨 목록입니다. 와일드카드 항목은 모든 데이터베이스를 허용합니다.

이 파일을 저장하고 Teleport 클러스터에 적용합니다:

$ tctl create -f azure-database-role.yaml
role 'azure-database-access' has been created
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

인증 공급자에 맞는 적절한 명령을 실행하여 azure-database-access 역할을 your Teleport user에게 할당하십시오:

Local User

  1. 로컬 사용자의 역할을 쉼표로 구분된 목록으로 가져옵니다:

    $ ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    
  2. 로컬 사용자를 편집하여 새 역할을 추가합니다:

    $ tctl users update $(tsh status -f json | jq -r '.active.username') \
      --set-roles "${ROLES?},azure-database-access"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

  1. 텍스트 편집기에서 github 인증 커넥터를 엽니다:

    $ tctl edit github/github
    
  2. github 커넥터를 편집하여 teams_to_roles 섹션에 azure-database-access을 추가합니다.

    이 역할에 매핑해야 할 팀은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 팀은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 팀이어야 합니다.

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - azure-database-access
    
  3. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

SAML

  1. saml 구성 리소스를 가져옵니다:

    $ tctl get --with-secrets saml/mysaml > saml.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 saml.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 saml.yaml 파일을 삭제해야 합니다.

  2. saml.yaml을 편집하여 attributes_to_roles 섹션에 azure-database-access을 추가합니다.

    이 역할에 매핑해야 할 속성은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - azure-database-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f saml.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

OIDC

  1. oidc 구성 리소스를 가져옵니다:

    $ tctl get oidc/myoidc --with-secrets > oidc.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 oidc.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 oidc.yaml 파일을 삭제해야 합니다.

  2. oidc.yaml을 편집하여 claims_to_roles 섹션에 azure-database-access을 추가합니다.

    이 역할에 매핑해야 할 클레임은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - azure-database-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f oidc.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

Teleport 데이터베이스 서비스 시작#

systemd 서비스를 생성하여 호스트가 부팅될 때 the Teleport Database Service이 자동으로 시작되도록 구성합니다. 지침은 the Teleport Database Service을 어떻게 설치했는지에 따라 다릅니다.

Package Manager

the Teleport Database Service을 실행할 호스트에서 Teleport를 활성화하고 시작합니다:

$ sudo systemctl enable teleport
$ sudo systemctl start teleport

TAR Archive

the Teleport Database Service을 실행할 호스트에서 Teleport용 systemd 서비스 구성을 생성하고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:

$ sudo teleport install systemd -o /etc/systemd/system/teleport.service
$ sudo systemctl enable teleport
$ sudo systemctl start teleport

systemctl status teleport로 the Teleport Database Service의 상태를 확인하고 journalctl -fu teleport로 로그를 볼 수 있습니다.

Tip

하나의 Teleport 프로세스는 여러 개의 서로 다른 서비스를 실행할 수 있습니다. 예를 들어 여러 데이터베이스 서비스 에이전트와 함께 SSH 서비스나 애플리케이션 서비스를 함께 실행할 수 있습니다.

5/5단계. 연결#

Teleport 클러스터에 로그인합니다. 사용 가능한 데이터베이스 목록에 Azure 데이터베이스가 표시되어야 합니다:

$ tsh login --proxy=teleport.example.com --user=alice
$ tsh db ls
# Name     Description         Labels
# -------- ------------------- -------
# azure-db                     env=dev
$ tsh login --proxy=mytenant.teleport.sh --user=alice
$ tsh db ls
# Name     Description         Labels
# -------- ------------------- -------
# azure-db                     env=dev

MySQL/MariaDB

데이터베이스의 자격 증명을 가져와 teleport 사용자로 데이터베이스에 연결합니다:

$ tsh db connect --db-user=teleport --db-name=mysql azure-db
Note

연결하려면 mysql 또는 mariadb 클라이언트 중 하나가 PATH에서 사용 가능해야 합니다.

Tip
[Web UI를 사용하여 MySQL or MariaDB 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.

PostgreSQL

데이터베이스의 자격 증명을 가져와 teleport 사용자로 데이터베이스에 연결합니다:

$ tsh db connect --db-user=teleport --db-name=postgres azure-db
Note

연결하려면 psql 클라이언트가 PATH에서 사용 가능해야 합니다.

Tip
[Web UI를 사용하여 PostgreSQL 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.

데이터베이스에서 로그아웃하고 자격 증명을 제거하려면:

$ tsh db logout azure-db

문제 해결#

No credential providers error#

Database Service 로그에서 DefaultAzureCredential: failed to acquire a token. 오류가 보인다면, Teleport가 Azure SDK에 연결하는 데 필요한 자격 증명을 감지하지 못하는 것입니다. Teleport Database Service가 실행 중인 머신에 자격 증명이 적용되었는지 확인하고 Teleport Database Service를 재시작하십시오. 자세한 내용은 Azure SDK Authorization을 참조하십시오.

Timeout errors#

Teleport Database Service는 데이터베이스 엔드포인트에 연결할 수 있어야 합니다. 이를 위해 동일한 VPC의 Database Service에서 데이터베이스로 들어오는 인바운드 트래픽을 허용하거나 다른 VPC로부터의 라우팅 규칙이 필요할 수 있습니다. nc 프로그램을 사용하여 데이터베이스 연결을 확인할 수 있습니다:

$ nc -zv server-name.postgres.database.azure.com 5432
# Connection to server-name.postgres.database.azure.com 5432 port [tcp/postgresql] succeeded!

쿼리를 취소할 수 없음#

psql과 같은 PostgreSQL CLI 클라이언트를 사용하여 Ctrl+C로 쿼리를 취소하려고 했으나 쿼리가 취소되지 않는다면, 대신 tsh 로컬 프록시를 사용하여 연결해야 합니다. psql이 쿼리를 취소할 때는 TLS 인증서 없이 새 연결을 설정하지만, Teleport는 인증 뿐만 아니라 데이터베이스 연결을 라우팅하는 데에도 TLS 인증서를 필요로 합니다.

Teleport에서 TLS Routing을 활성화 하면 tsh db connect가 모든 연결에 대해 로컬 프록시를 자동으로 시작합니다. 또는 마찬가지로 로컬 프록시를 사용하는 Teleport Connect를 통해 연결할 수도 있습니다. 그 외의 경우에는 tsh proxy db를 사용하여 tsh 로컬 프록시를 수동으로 시작하고 로컬 프록시를 통해 연결해야 합니다.

Ctrl+C로 취소할 수 없는 장기 실행 쿼리를 psql 세션에서 이미 시작한 경우, 새 클라이언트 세션을 시작하여 해당 쿼리를 수동으로 취소할 수 있습니다:

먼저 쿼리의 프로세스 식별자(PID)를 찾습니다:

SELECT pid,usename,backend_start,query FROM pg_stat_activity WHERE state = 'active';

다음으로, PID를 사용하여 쿼리를 정상적으로 취소합니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGINT 시그널을 보냅니다:

SELECT pg_cancel_backend(<PID>);

항상 먼저 쿼리를 정상적으로 종료하려고 시도해야 하지만, 정상적인 취소가 너무 오래 걸린다면 대신 쿼리를 강제로 종료할 수 있습니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGTERM 시그널을 보냅니다:

SELECT pg_terminate_backend(<PID>);

pg_cancel_backendpg_terminate_backend 함수에 대한 자세한 내용은 PostgreSQL 문서의 관리 함수를 참조하십시오.

SSL SYSCALL error#

로컬 psql이 최신 버전의 OpenSSL과 호환되지 않는 경우 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-user postgres --db-name postgres postgres
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 12345 failed: SSL SYSCALL error: Undefined error: 0

로컬 psql을 최신 버전으로 업그레이드하십시오.

다음 단계#

Azure PostgreSQL 및 MySQL을 이용한 데이터베이스 접근

Teleport v18.9
원문 보기
요약

Teleport는 Teleport Database Service를 통해 Azure PostgreSQL or MySQL에 대한 보안 접근을 제공할 수 있습니다. Teleport 데이터베이스 서비스는 Teleport 사용자와 Azure PostgreSQL 및 MySQL 사이의 트래픽을 프록시합니다.

Teleport는 Teleport Database Service를 통해 Azure PostgreSQL or MySQL에 대한 보안 접근을 제공할 수 있습니다. 이를 통해 Teleport의 RBAC를 사용한 세분화된 접근 제어가 가능합니다.

이 가이드에서는 다음을 수행합니다:

  1. Azure PostgreSQL or MySQL 데이터베이스를 구성합니다 with Microsoft Entra ID-based authentication.
  2. 데이터베이스를 Teleport 클러스터에 추가합니다.
  3. Teleport를 통해 데이터베이스에 연결합니다.

작동 방식#

Teleport 데이터베이스 서비스는 Teleport 사용자와 Azure PostgreSQL 및 MySQL 사이의 트래픽을 프록시합니다. 사용자가 Teleport를 통해 데이터베이스에 연결하면, 데이터베이스 서비스는 Microsoft Entra ID(이전의 Azure AD)에서 액세스 토큰을 획득하고, 데이터베이스를 관리할 권한을 가진 프린시펄로서 Azure에 인증합니다.

셀프 호스팅 Teleport 클러스터로 Azure PostgreSQL/MySQL 등록하기

클라우드 호스팅 Teleport 클러스터로 Azure PostgreSQL/MySQL 등록하기

사전 요구 사항#

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.

  • tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Teleport 클러스터의 버전을 확인합니다. tctl and tsh clients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의 /v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다. teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:

      $ TELEPORT_DOMAIN=teleport.example.com:443
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. 사용 중인 플랫폼에 대한 지침에 따라 tctl and tsh clients를 설치합니다:

Mac

     `tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
 
     
Warning
       Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
       Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
       보장할 수 없습니다.
     

Windows - Powershell

     ```code
     $ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
     # Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
     # NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
     # Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
     ```
 
   

 
   

Linux

     Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다.  RPM/DEB
     패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
     [설치 페이지](../installation/installation.mdx)를 참조하세요.
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ cd teleport
     $ sudo ./install
     # Teleport binaries have been copied to /usr/local/bin
     ```
   

 
  • 배포된 Azure Database for PostgreSQL 또는 MySQL 서버.
  • Microsoft Entra ID 관리 권한.
  • Teleport 데이터베이스 서비스를 실행할 호스트(예: Azure VM 인스턴스).

Teleport cluster에 연결할 수 있는지 확인하려면 tsh login으로 로그인한 다음, 현재 자격 증명으로 tctl 명령을 실행할 수 있는지 확인합니다.

예를 들어, teleport.example.com에 cluster 내 Teleport Proxy Service의 도메인 이름을, email@example.com에 Teleport 사용자 이름을 지정하여 다음 명령을 실행합니다:

$ tsh login --proxy=teleport.example.com --user=email@example.com
$ tctl status
# Cluster  (=teleport.url=)
# Version  (=teleport.version=)
# CA pin   (=presets.ca_pin=)

cluster에 연결하여 tctl status 명령을 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 이후의 tctl 명령을 실행할 수 있습니다. 자체 Teleport cluster를 호스팅하는 경우, 전체 권한을 얻기 위해 Teleport Auth Service를 호스팅하는 컴퓨터에서 tctl 명령을 실행할 수도 있습니다.

1/5단계. Azure 서비스 프린시펄 구성#

PostgreSQL 또는 MySQL 데이터베이스에 인증하려면, Teleport 데이터베이스 서비스가 Microsoft Entra ID에서 액세스 토큰을 획득해야 합니다.

Teleport Database Service가 Azure 리소스에 접근하는 방법은 몇 가지가 있습니다:

  • Database Service를 관리 ID(managed identity)가 연결된 Azure VM에서 실행할 수 있습니다. 이 방식은 Azure 자격 증명을 관리할 필요가 없어지므로 프로덕션 환경에서 Database Service를 배포하는 권장 방법입니다.
  • Database Service를 Microsoft Entra ID 애플리케이션으로 등록("App registrations"을 통해)하고 해당 자격 증명으로 구성할 수 있습니다. 이 방식은 Database Service의 환경에 Azure 자격 증명이 존재해야 하므로 개발 및 테스트 목적으로만 권장됩니다.

Using managed identity

Azure 포털의 Managed Identities 페이지로 이동하여 Create를 클릭해 새 사용자 할당 관리 ID(user-assigned managed identity)를 생성합니다:

Managed identities

새 ID의 이름과 리소스 그룹을 지정하고 생성합니다:

New identity

생성된 ID의 Client ID를 기록해 둡니다:

Created identity

다음으로, Database Service 인스턴스를 실행할 Azure VM으로 이동하여 방금 생성한 ID를 추가합니다:

VM identity

Database Service를 실행할 모든 Azure VM에 이 ID를 연결합니다.

Using app registrations

Note
Database Service를 Microsoft Entra ID 애플리케이션으로 등록하는 방식은
테스트 및 개발 시나리오에 적합하거나, Database Service가 Azure VM에서
실행되지 않는 경우에 적합합니다. 프로덕션 시나리오에서는 관리 ID
방식을 사용하는 것이
좋습니다.

Microsoft Entra ID의 App registrations 페이지로 이동하여 New registration을 클릭합니다:

App registrations

이름(예: DatabaseService)을 지정하고 새 애플리케이션을 등록합니다. 앱이 생성되면 Application (client) ID를 기록해 두고 Add a certificate or secret을 클릭합니다:

Registered app

Database Service 에이전트가 Azure API로 인증하는 데 사용할 새 클라이언트 시크릿을 생성합니다:

Registered app secrets

Teleport Database Service는 Azure SDK의 기본 자격 증명 공급자 체인을 사용하여 자격 증명을 찾습니다. 사용 사례에 적합한 방법을 선택하려면 Azure SDK Authorization을 참조하세요. 예를 들어 클라이언트 시크릿을 사용한 환경 기반 인증을 사용하려면 Database Service에 다음 환경 변수가 설정되어 있어야 합니다:

export AZURE_TENANT_ID=
export AZURE_CLIENT_ID=
export AZURE_CLIENT_SECRET=

2/5단계. Teleport용 IAM 권한 구성#

사용자 지정 역할 생성#

Teleport는 MySQL 및 PostgreSQL 데이터베이스를 검색하고 등록하려면 Azure IAM 권한이 필요합니다. Teleport가 검색해야 할 모든 데이터베이스를 포함하는 할당 가능한 범위(assignable scope)를 가진 역할을 생성합니다. 예를 들면:

{
    "properties": {
        "roleName": "TeleportDiscovery",
        "description": "Allows Teleport to discover MySQL and PostgreSQL databases",
        "assignableScopes": [
            "/subscriptions/11111111-2222-3333-4444-555555555555"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.DBforMySQL/servers/read",
                    "Microsoft.DBforPostgreSQL/servers/read",
                    "Microsoft.DBforMySQL/flexibleServers/read",
                    "Microsoft.DBforPostgreSQL/flexibleServers/read"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
    }
}

이 역할 정의는 Teleport가 MySQL 및 PostgreSQL 데이터베이스를 검색할 수 있도록 하지만, Teleport는 실제로 사용 중인 데이터베이스 유형에 대한 권한만 필요로 합니다. 할당 가능한 범위에는 구독이 포함되어 있으므로, 해당 구독 내의 모든 리소스 범위에 역할을 할당하거나, 구독 범위 자체를 사용해 할당할 수 있습니다.

Custom role assignable scope

사용자 지정 역할은 Azure 기본 제공 역할과 달리, 루트 할당 가능 범위를 가질 수 없습니다. 사용자 지정 역할에서 사용할 수 있는 가장 높은 할당 가능 범위는 구독 범위입니다. 관리 그룹 범위 사용은 현재 Azure의 미리 보기 기능이며, 역할 정의의 "assignableScopes"에 단일 관리 그룹만 허용됩니다. 자세한 내용은 Azure RBAC 사용자 지정 역할을 참고하십시오.

구독 페이지로 이동하여 구독을 선택합니다.

구독에서 *액세스 제어(IAM)*를 클릭하고 추가 > 사용자 지정 역할 추가를 선택합니다: IAM 사용자 지정 역할

사용자 지정 역할 생성 페이지에서 JSON 탭을 클릭하고 편집을 클릭한 다음, JSON 예시를 붙여넣고 "assignableScopes"의 구독을 자신의 구독 ID로 바꿉니다: JSON에서 역할 생성

Teleport 데이터베이스 서비스 프린시펄에 대한 역할 할당 생성#

Teleport에 권한을 부여하려면 생성한 사용자 지정 역할을 Teleport 서비스 주체 - 즉 앞서 생성한 관리 ID 또는 앱 등록 -에 할당해야 합니다.

역할 할당을 수행할 리소스 범위로 이동합니다. *Access control (IAM)*을 클릭하고 Add > Add role assignment을 선택합니다. 생성한 사용자 지정 역할을 역할로 선택하고 Teleport 서비스 주체를 멤버로 선택합니다.

Assign role

Note

역할 할당은 Teleport Database Service가 일치하는 모든 데이터베이스를 검색할 수 있을 만큼 충분히 높은 범위여야 합니다. Azure 범위와 역할 할당 생성에 대한 자세한 내용은 Identify the needed scope를 참고하십시오.

3/5단계. Azure 데이터베이스 사용자 생성#

Teleport가 서비스 프린시펄로 인증하여 Azure 데이터베이스에 연결할 수 있도록 하려면, 데이터베이스에서 해당 프린시펄로 인증되는 Entra ID 사용자를 생성해야 합니다.

Entra ID 관리자 할당#

데이터베이스의 Entra ID 관리자만 데이터베이스에 연결하고 Entra ID 사용자를 생성할 수 있습니다.

데이터베이스의 인증 페이지로 이동하여 편집 버튼을 사용해 AD 관리자를 설정합니다:

AD 관리자 설정

데이터베이스의 인증 페이지로 이동하여 + Entra ID 관리자 추가를 선택해 AD 관리자를 설정합니다:

AD 관리자 설정

데이터베이스의 Active Directory 관리자 페이지로 이동하여 관리자 설정 버튼을 사용해 AD 관리자를 설정합니다:

AD 관리자 설정

Entra ID Admin

데이터베이스에는 하나의 Azure 사용자(또는 그룹)만 Entra ID 관리자로 설정할 수 있습니다. Entra ID 관리자가 서버에서 제거되면, 해당 서버의 모든 Entra ID 로그인이 비활성화됩니다. 동일한 테넌트에서 새 Entra ID 관리자를 추가하면 Entra ID 로그인이 다시 활성화됩니다. 자세한 내용은 PostgreSQL 인증에 Microsoft Entra ID 사용하기를 참고하십시오.

AD 관리자로 데이터베이스에 연결#

다음으로, AD 관리자 사용자로 데이터베이스에 연결해야 합니다.

Azure az CLI 유틸리티를 사용하여 AD 관리자로 설정한 사용자로 로그인하고, 액세스 토큰을 가져와 데이터베이스 연결 시 비밀번호로 사용합니다:

$ az login -u ad@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ PGPASSWORD=$TOKEN psql "host=example.postgres.database.azure.com user=ad@example.com sslmode=require dbname=postgres"
$ az login -u ad@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ PGPASSWORD=$TOKEN psql "host=example.postgres.database.azure.com user=ad@example.com@instance-name sslmode=require dbname=postgres"
$ az login -u ad-admin@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ mysql -h example.mysql.database.azure.com -P 3306 -u ad@example.com --enable-cleartext-plugin --password=$TOKEN
$ az login -u ad-admin@example.com
$ TOKEN=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
$ mysql -h example.mysql.database.azure.com -P 3306 -u ad@example.com@instance-name --enable-cleartext-plugin --password=$TOKEN

데이터베이스 사용자 이름에는 연결하려는 Azure 데이터베이스 인스턴스 이름을 포함한 @instance-name 접미사가 포함되어야 합니다.

AD 사용자 생성#

AD 관리자로 데이터베이스에 연결한 후, Teleport 데이터베이스 서비스가 사용할 서비스 프린시펄에 대한 데이터베이스 사용자를 생성합니다. 관리형 아이덴티티를 사용하는 경우 Client ID를, 앱 등록을 사용하는 경우 Application (client) ID를 사용합니다:

postgres=> SET aad_validate_oids_in_tenant = off;
SET
postgres=> CREATE ROLE teleport WITH LOGIN PASSWORD '11111111-2222-3333-4444-555555555555' IN ROLE azure_ad_user;
CREATE ROLE
postgres=> SELECT * FROM pgaadauth_create_principal_with_oid('teleport', '11111111-2222-3333-4444-555555555555', 'service', false, false);
-------------------------------------
 Created role for teleport
(1 row)
mysql> SET aad_auth_validate_oids_in_tenant = OFF;
mysql> CREATE AADUSER 'teleport' IDENTIFIED BY '11111111-2222-3333-4444-555555555555';
Query OK, 0 rows affected (0.92 sec)

생성된 사용자는 기본적으로 아무것에도 접근 권한이 없을 수 있으므로, 몇 가지 권한을 부여해줍니다:

GRANT ALL ON `%`.* TO 'teleport'@'%';

동일한 서비스 프린시펄로 인증되는 여러 데이터베이스 사용자를 생성할 수 있습니다.

4/5단계. Teleport 데이터베이스 서비스 설치#

Database Service가 Teleport 클러스터에 조인하려면 유효한 조인 토큰이 필요합니다. 다음 tctl 명령을 실행하고 Database Service를 실행할 서버에서 토큰 출력을 /tmp/token에 저장합니다:

$ tctl tokens add --type=db --format=text
(=presets.tokens.first=)

Teleport 데이터베이스 서비스를 실행할 호스트에 Teleport를 설치합니다:

Linux 서버에 Teleport Agent를 설치하려면:

권장 설치 방법은 클러스터 설치 스크립트입니다. 이 스크립트는 클러스터에 맞는 올바른 버전, 에디션, 설치 모드를 선택합니다.

  1. teleport.example.com:443에 Teleport 클러스터의 호스트명과 포트를 할당하되, 스킴(https://)은 포함하지 마십시오.

  2. 클러스터의 설치 스크립트를 실행하십시오:

    $ curl "https://teleport.example.com:443/scripts/install.sh" | sudo bash
    

데이터베이스 서비스 구성을 생성합니다.

  • --azure-postgres-discovery에 데이터베이스의 리전을 지정합니다.

  • --proxy 값을 Teleport 프록시 서비스 주소 또는 Teleport Enterprise (Cloud) URI(예: example.teleport.sh:443)로 바꿉니다:

    $ sudo teleport db configure create \
      -o file \
      --proxy=teleport.example.com:443 \
      --token=/tmp/token \
      --azure-postgres-discovery=eastus
    
  • --azure-mysql-discovery에 데이터베이스의 리전을 지정합니다.

  • --proxy 값을 Teleport 프록시 서비스 주소 또는 Teleport Enterprise (Cloud) URI(예: example.teleport.sh:443)로 바꿉니다:

    $ sudo teleport db configure create \
      -o file \
      --proxy=teleport.example.com:443 \
      --token=/tmp/token \
      --azure-mysql-discovery=eastus
    

데이터베이스 서비스 호스트에서 다음 명령을 실행합니다:

$ sudo teleport db configure create \
  -o file \
  --proxy=teleport.example.com:443 \
  --token=/tmp/token \
  --azure-mysql-discovery=eastus \
  --azure-postgres-discovery=eastus

이렇게 하면 teleport.yaml에 각 데이터베이스 유형에 대해 하나씩, 두 개의 types 엔터티가 생성됩니다. 이는 각 데이터베이스 유형에 대해 서로 다른 리전, 태그, 또는 라벨을 원할 때 유용합니다.

또는 teleport.yaml을 편집하여 하나의 항목에 두 데이터베이스 유형을 모두 포함시킬 수도 있습니다:

db_service:
  azure:
  - types: ["mysql", "postgres"]
  ...

이 명령은 eastus 리전에서 Azure MySQL/Postgres 데이터베이스 자동 검색이 활성화된 데이터베이스 서비스 구성을 생성하여 /etc/teleport.yaml 위치에 배치합니다.

Teleport 역할 생성#

tsh로 Teleport 클러스터에 로그인한 워크스테이션에서, Azure 데이터베이스에 대한 접근을 제공하는 새 역할을 정의합니다. 다음 내용으로 azure-database-role.yaml 파일을 생성합니다:

version: v7
kind: role
metadata:
  name: azure-database-access
spec:
  allow:
    db_labels:
      'engine':
        - "Microsoft.DBforMySQL/servers"
        - "Microsoft.DBforMySQL/flexibleServers"
        - "Microsoft.DBforPostgreSQL/servers"
        - "Microsoft.DBforPostgreSQL/flexibleServers"
    db_names:
    - '*'
    db_users:
    - teleport
Flag Description
--db-users 사용자가 데이터베이스에 연결할 때 사용할 수 있는 데이터베이스 사용자 이름 목록입니다. 와일드카드는 모든 사용자를 허용합니다.
--db-names 사용자가 데이터베이스 서버 내에서 연결할 수 있는 논리적 데이터베이스(스키마)의 목록입니다. 와일드카드는 모든 데이터베이스를 허용합니다.
--db-labels 사용자가 접근할 수 있는 데이터베이스에 할당된 라벨 목록입니다. 와일드카드 항목은 모든 데이터베이스를 허용합니다.

이 파일을 저장하고 Teleport 클러스터에 적용합니다:

$ tctl create -f azure-database-role.yaml
role 'azure-database-access' has been created
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

인증 공급자에 맞는 적절한 명령을 실행하여 azure-database-access 역할을 your Teleport user에게 할당하십시오:

Local User

  1. 로컬 사용자의 역할을 쉼표로 구분된 목록으로 가져옵니다:

    $ ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    
  2. 로컬 사용자를 편집하여 새 역할을 추가합니다:

    $ tctl users update $(tsh status -f json | jq -r '.active.username') \
      --set-roles "${ROLES?},azure-database-access"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

  1. 텍스트 편집기에서 github 인증 커넥터를 엽니다:

    $ tctl edit github/github
    
  2. github 커넥터를 편집하여 teams_to_roles 섹션에 azure-database-access을 추가합니다.

    이 역할에 매핑해야 할 팀은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 팀은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 팀이어야 합니다.

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - azure-database-access
    
  3. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

SAML

  1. saml 구성 리소스를 가져옵니다:

    $ tctl get --with-secrets saml/mysaml > saml.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 saml.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 saml.yaml 파일을 삭제해야 합니다.

  2. saml.yaml을 편집하여 attributes_to_roles 섹션에 azure-database-access을 추가합니다.

    이 역할에 매핑해야 할 속성은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - azure-database-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f saml.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

OIDC

  1. oidc 구성 리소스를 가져옵니다:

    $ tctl get oidc/myoidc --with-secrets > oidc.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 oidc.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 oidc.yaml 파일을 삭제해야 합니다.

  2. oidc.yaml을 편집하여 claims_to_roles 섹션에 azure-database-access을 추가합니다.

    이 역할에 매핑해야 할 클레임은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - azure-database-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f oidc.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

Teleport 데이터베이스 서비스 시작#

systemd 서비스를 생성하여 호스트가 부팅될 때 the Teleport Database Service이 자동으로 시작되도록 구성합니다. 지침은 the Teleport Database Service을 어떻게 설치했는지에 따라 다릅니다.

Package Manager

the Teleport Database Service을 실행할 호스트에서 Teleport를 활성화하고 시작합니다:

$ sudo systemctl enable teleport
$ sudo systemctl start teleport

TAR Archive

the Teleport Database Service을 실행할 호스트에서 Teleport용 systemd 서비스 구성을 생성하고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:

$ sudo teleport install systemd -o /etc/systemd/system/teleport.service
$ sudo systemctl enable teleport
$ sudo systemctl start teleport

systemctl status teleport로 the Teleport Database Service의 상태를 확인하고 journalctl -fu teleport로 로그를 볼 수 있습니다.

Tip

하나의 Teleport 프로세스는 여러 개의 서로 다른 서비스를 실행할 수 있습니다. 예를 들어 여러 데이터베이스 서비스 에이전트와 함께 SSH 서비스나 애플리케이션 서비스를 함께 실행할 수 있습니다.

5/5단계. 연결#

Teleport 클러스터에 로그인합니다. 사용 가능한 데이터베이스 목록에 Azure 데이터베이스가 표시되어야 합니다:

$ tsh login --proxy=teleport.example.com --user=alice
$ tsh db ls
# Name     Description         Labels
# -------- ------------------- -------
# azure-db                     env=dev
$ tsh login --proxy=mytenant.teleport.sh --user=alice
$ tsh db ls
# Name     Description         Labels
# -------- ------------------- -------
# azure-db                     env=dev

MySQL/MariaDB

데이터베이스의 자격 증명을 가져와 teleport 사용자로 데이터베이스에 연결합니다:

$ tsh db connect --db-user=teleport --db-name=mysql azure-db
Note

연결하려면 mysql 또는 mariadb 클라이언트 중 하나가 PATH에서 사용 가능해야 합니다.

Tip
[Web UI를 사용하여 MySQL or MariaDB 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.

PostgreSQL

데이터베이스의 자격 증명을 가져와 teleport 사용자로 데이터베이스에 연결합니다:

$ tsh db connect --db-user=teleport --db-name=postgres azure-db
Note

연결하려면 psql 클라이언트가 PATH에서 사용 가능해야 합니다.

Tip
[Web UI를 사용하여 PostgreSQL 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.

데이터베이스에서 로그아웃하고 자격 증명을 제거하려면:

$ tsh db logout azure-db

문제 해결#

No credential providers error#

Database Service 로그에서 DefaultAzureCredential: failed to acquire a token. 오류가 보인다면, Teleport가 Azure SDK에 연결하는 데 필요한 자격 증명을 감지하지 못하는 것입니다. Teleport Database Service가 실행 중인 머신에 자격 증명이 적용되었는지 확인하고 Teleport Database Service를 재시작하십시오. 자세한 내용은 Azure SDK Authorization을 참조하십시오.

Timeout errors#

Teleport Database Service는 데이터베이스 엔드포인트에 연결할 수 있어야 합니다. 이를 위해 동일한 VPC의 Database Service에서 데이터베이스로 들어오는 인바운드 트래픽을 허용하거나 다른 VPC로부터의 라우팅 규칙이 필요할 수 있습니다. nc 프로그램을 사용하여 데이터베이스 연결을 확인할 수 있습니다:

$ nc -zv server-name.postgres.database.azure.com 5432
# Connection to server-name.postgres.database.azure.com 5432 port [tcp/postgresql] succeeded!

쿼리를 취소할 수 없음#

psql과 같은 PostgreSQL CLI 클라이언트를 사용하여 Ctrl+C로 쿼리를 취소하려고 했으나 쿼리가 취소되지 않는다면, 대신 tsh 로컬 프록시를 사용하여 연결해야 합니다. psql이 쿼리를 취소할 때는 TLS 인증서 없이 새 연결을 설정하지만, Teleport는 인증 뿐만 아니라 데이터베이스 연결을 라우팅하는 데에도 TLS 인증서를 필요로 합니다.

Teleport에서 TLS Routing을 활성화 하면 tsh db connect가 모든 연결에 대해 로컬 프록시를 자동으로 시작합니다. 또는 마찬가지로 로컬 프록시를 사용하는 Teleport Connect를 통해 연결할 수도 있습니다. 그 외의 경우에는 tsh proxy db를 사용하여 tsh 로컬 프록시를 수동으로 시작하고 로컬 프록시를 통해 연결해야 합니다.

Ctrl+C로 취소할 수 없는 장기 실행 쿼리를 psql 세션에서 이미 시작한 경우, 새 클라이언트 세션을 시작하여 해당 쿼리를 수동으로 취소할 수 있습니다:

먼저 쿼리의 프로세스 식별자(PID)를 찾습니다:

SELECT pid,usename,backend_start,query FROM pg_stat_activity WHERE state = 'active';

다음으로, PID를 사용하여 쿼리를 정상적으로 취소합니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGINT 시그널을 보냅니다:

SELECT pg_cancel_backend(<PID>);

항상 먼저 쿼리를 정상적으로 종료하려고 시도해야 하지만, 정상적인 취소가 너무 오래 걸린다면 대신 쿼리를 강제로 종료할 수 있습니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGTERM 시그널을 보냅니다:

SELECT pg_terminate_backend(<PID>);

pg_cancel_backendpg_terminate_backend 함수에 대한 자세한 내용은 PostgreSQL 문서의 관리 함수를 참조하십시오.

SSL SYSCALL error#

로컬 psql이 최신 버전의 OpenSSL과 호환되지 않는 경우 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-user postgres --db-name postgres postgres
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 12345 failed: SSL SYSCALL error: Undefined error: 0

로컬 psql을 최신 버전으로 업그레이드하십시오.

다음 단계#