다음을 통해 공유


자습서: SQL Server on Linux 컨테이너에서 Active Directory 인증 구성

적용 대상: SQL Server - Linux

이 자습서에서는 통합 인증이라고도 하는 Active Directory 인증을 지원하도록 SQL Server on Linux 컨테이너를 구성하는 방법을 설명합니다. 개요에 대해서는 Linux의 SQL Server에 대한 Active Directory 인증을 참조하세요.

참고 항목

네트워크 구성에 대한 현재 지침은 운영 체제(OS)에 대한 설명서를 참조하세요.

이 자습서는 다음 작업으로 구성됩니다.

  • adutil 설치
  • Linux 호스트를 Active Directory 도메인에 조인
  • adutil 도구를 사용하여 SQL Server의 Active Directory 사용자를 만들고 서비스 사용자 이름(SPN)을 설정합니다
  • SQL Server 서비스 keytab 파일 만들기
  • SQL Server 컨테이너에서 사용할 mssql.confkrb5.conf 파일 만들기
  • 구성 파일 탑재 및 SQL Server 컨테이너 배포
  • Transact-SQL을 사용하여 Active Directory 기반 SQL Server 로그인 만들기
  • Active Directory 인증을 사용하여 SQL Server 연결

사전 요구 사항

Active Directory 인증을 구성하려면 다음 항목이 필요합니다.

  • 네트워크에 Active Directory 도메인 컨트롤러(Windows)가 있습니다.
  • 도메인에 조인된 Linux 호스트 컴퓨터에 adutil를 설치합니다. 자세한 내용은 adutil 설치 섹션을 참조하세요.

컨테이너 배포 및 준비

컨테이너를 설정하려면 호스트의 컨테이너에서 사용할 포트를 미리 알고 있어야 합니다. 기본 포트인 1433은 컨테이너 호스트에서 다르게 매핑될 수 있습니다. 이 자습서에서는 호스트의 포트 5433이 컨테이너의 포트 1433에 매핑됩니다. 자세한 내용은 빠른 시작: Docker에서 SQL Server Linux 컨테이너 이미지 실행을 참조하세요.

SPN(서비스 사용자 이름)을 등록할 때 컴퓨터의 호스트 이름 또는 컨테이너 이름을 사용할 수 있습니다. 그러나 외부에서 컨테이너에 연결할 때 보려는 내용에 따라 구성해야 합니다.

SQL Server 컨테이너의 이름에 매핑되는 Linux 호스트 IP 주소에 대해 Active Directory에서 추가된 전달 호스트(A) 항목이 있는지 확인합니다. 이 자습서에서 sql1 호스트 머신의 IP 주소는 10.0.0.10이고 SQL Server 컨테이너 이름은 sql1입니다. 스크린샷과 같이 Active Directory에서 전달 호스트 항목을 추가합니다. 이 항목은 사용자가 sql1.contoso.com에 연결할 때 올바른 호스트에 연결되도록 합니다.

호스트 레코드 추가 스크린샷.

이 자습서에서는 세 개의 VM(가상 머신)이 포함된 Azure의 환경을 사용하고 있습니다. 하나의 VM은 도메인 이름이 contoso.com인 Windows DC(도메인 컨트롤러) 역할을 합니다. 도메인 컨트롤러의 이름은 adVM.contoso.com입니다. 두 번째 머신은 Windows 10 Desktop이 실행되는 winbox라는 Windows 머신이며, 클라이언트 머신으로 사용되고 SSMS(SQL Server Management Studio)가 설치되어 있습니다. 세 번째 머신은 sql1라는 Ubuntu 18.04 LTS 머신이며 SQL Server 컨테이너를 호스트합니다. 모든 머신이 contoso.com 도메인에 조인됩니다. 자세한 내용은 Linux 호스트의 SQL Server를 Active Directory 도메인에 조인을 참조하세요.

참고 항목

이 문서의 뒷부분에서 볼 수 있듯이 호스트 컨테이너 머신을 도메인에 조인하는 것은 필수가 아닙니다.

adutil 설치

adutil 도구를 설치하려면 도메인에 가입된 호스트 컴퓨터에서 adutil - Active Directory 유틸리티 소개에 설명된 단계를 따릅니다.

Active Directory 사용자, SPN 및 SQL Server 서비스 keytab 만들기

컨테이너 호스트를 도메인의 일부로 포함하지 않으려 하거나, 머신을 도메인에 가입시키는 단계를 따르지 않은 경우, 이미 Active Directory 도메인의 일부인 다른 Linux 머신에서 다음 단계를 따르세요.

  1. adutil를 사용하여 SQL Server의 Active Directory 사용자를 만들고 SPN을 설정합니다.

  2. SQL Server 서비스 keytab 파일을 만들고 구성합니다.

생성된 mssql.keytab 파일을 SQL Server 컨테이너를 실행할 호스트 머신에 복사하고 복사된 mssql.keytab을 사용하도록 컨테이너를 구성합니다. 필요에 따라 SQL Server 컨테이너를 실행할 Linux 호스트를 Active Directory 도메인에 조인하고 동일한 머신에서 이러한 단계를 수행할 수도 있습니다.

adutil을 사용하여 SQL Server의 Active Directory 사용자를 만들고 설정합니다

SQL Server on Linux 컨테이너에서 Aftive Directory 인증을 사용하도록 설정하려면 Active Directory 도메인에 포함된 Linux 머신에서 아래에 설명된 단계를 실행해야 합니다.

  1. kinit 명령을 사용하여 Kerberos TGT(Ticket Granting Ticket)를 얻거나 갱신합니다. kinit 명령에 권한 있는 계정을 사용합니다. 이 계정에는 도메인에 연결할 수 있는 권한이 있어야 하며 도메인에 계정 및 SPN을 만들 수도 있어야 합니다.

    이 예제 스크립트에서는 도메인 컨트롤러에 권한 있는 사용자(privilegeduser@CONTOSO.COM)가 이미 생성되었습니다.

    kinit privilegeduser@CONTOSO.COM
    
  2. adutil을 사용하여 SQL Server에서 권한 있는 Active Directory 계정으로 사용할 새 사용자를 만듭니다.

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
    

    암호는 다음 세 가지 방법 중 하나로 지정할 수 있습니다.

    • 암호 플래그: --password <password>
    • 환경 변수 - ADUTIL_ACCOUNT_PWD
    • 대화형 입력

    암호 입력 방법의 우선 순위는 위에 나열된 옵션의 순서를 따릅니다. 권장되는 옵션은 환경 변수나 대화형 입력을 사용하여 암호를 지정하는 것입니다. 이러한 방법은 암호 플래그에 비해 더 안전하기 때문입니다.

    위에 표시된 대로 고유 이름(-distname)을 사용하여 계정의 이름을 지정하거나 OU(조직 구성 단위) 이름을 사용할 수도 있습니다. 둘 다 지정하는 경우 OU 이름(--ou)이 고유 이름보다 우선적으로 적용됩니다. 자세한 내용을 보려면 다음 명령을 실행할 수 있습니다.

    adutil user create --help
    
  3. 위에서 만든 사용자에 대해 SPN을 등록합니다. 외부에서 연결을 표시하려는 방식에 따라 원하는 경우 컨테이너 이름 대신 호스트 머신 이름을 사용할 수 있습니다. 이 자습서에서는 포트 1433대신 5433을 사용합니다. 이는 컨테이너를 매핑하는 포트입니다. 포트 번호는 다를 수 있습니다.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addautokinit 계정에 충분한 권한이 제공된 경우 SPN을 자동으로 만듭니다.
    • -n: SPN을 할당할 계정의 이름입니다.
    • -s: SPN을 생성하는 데 사용할 서비스 이름입니다. 이 경우 SQL Server 서비스용이므로 서비스 이름은 MSSQLSvc입니다.
    • -H: SPN을 생성하는 데 사용할 호스트 이름입니다. 지정하지 않으면 로컬 호스트의 FQDN이 사용됩니다. 컨테이너 이름에 대한 FQDN도 지정합니다. 이 경우 컨테이너 이름은 sql1이고 FQDN은 sql1.contoso.com입니다.
    • -p: SPN을 생성하는 데 사용할 포트입니다. 지정하지 않으면 SPN이 포트 없이 생성됩니다. SQL Server가 기본 포트 1433에서 수신 대기하는 경우에만 연결이 작동합니다.

SQL Server 서비스 keytab 파일 만들기

이전에 만든 4개의 SPN 각각에 대한 항목을 포함하는 keytab 파일과 사용자에 대한 keytab 파일을 만듭니다. keytab 파일은 컨테이너에 탑재되므로 호스트의 모든 위치에서 만들 수 있습니다. docker/podman을 사용하여 컨테이너를 배포할 때 결과 keytab이 올바르게 탑재되는 한 이 경로를 안전하게 변경할 수 있습니다.

모든 SPN에 대한 keytab을 만들려면 createauto 옵션을 사용할 수 있습니다.

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
  • -k: mssql.keytab 파일을 만들 경로입니다. 이전의 예제에서 /container/sql1/secrets 디렉터리는 이미 호스트에 있어야 합니다.
  • -p: SPN을 생성하는 데 사용할 포트입니다. 지정하지 않으면 SPN이 포트 없이 생성됩니다.
  • -H: SPN을 생성하는 데 사용할 호스트 이름입니다. 지정하지 않으면 로컬 호스트의 FQDN이 사용됩니다. 컨테이너 이름에 대한 FQDN도 지정합니다. 이 경우 컨테이너 이름은 sql1이고 FQDN은 sql1.contoso.com입니다.
  • -s: SPN을 생성하는 데 사용할 서비스 이름입니다. 이 경우 SQL Server 서비스용이므로 서비스 이름은 MSSQLSvc입니다.
  • --password: 앞에서 만든 권한 있는 Active Directory 사용자 계정의 암호입니다.
  • -e 또는 --enctype: keytab 항목의 암호화 유형입니다. 쉼표로 구분된 값 목록을 사용합니다. 지정하지 않으면 대화형 프롬프트가 표시됩니다.

암호화 유형을 선택하는 옵션이 제공되는 경우 둘 이상의 옵션을 선택할 수 있습니다. 이 예제에서는 aes256-cts-hmac-sha1-96arcfour-hmac를 선택했습니다. 호스트 및 도메인에서 지원하는 암호화 유형을 선택해야 합니다.

암호화 유형을 비대화형으로 선택하려는 경우 위의 명령에서 -e 인수를 사용하여 원하는 암호화 유형을 지정할 수 있습니다. adutil 명령에 대한 추가 도움말을 보려면 다음 명령을 실행합니다.

adutil keytab createauto --help

주의

arcfour-hmac는 약한 암호화이며 프로덕션 환경에서 사용하도록 권장되는 암호화 유형은 아닙니다.

사용자에 대한 keytab을 만드는 명령은 다음과 같습니다.

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -k: mssql.keytab 파일을 만들 경로입니다. 이전의 예제에서 /container/sql1/secrets 디렉터리는 이미 호스트에 있어야 합니다.
  • -p: keytab에 추가할 사용자입니다.

adutil keytab create/autocreate는 이전 파일을 덮어쓰지 않으며 이미 있는 파일에 추가됩니다.

컨테이너를 배포할 때 생성된 keytab에 올바른 권한이 설정되어 있는지 확인합니다.

chmod 440 /container/sql1/secrets/mssql.keytab

이때 mssql.keytab을 현재 Linux 호스트에서 SQL Server 컨테이너를 배포할 Linux 호스트로 복사하고 SQL Server 컨테이너를 실행할 Linux 호스트에서 나머지 단계를 수행할 수 있습니다. SQL Server 컨테이너가 배포될 동일한 Linux 호스트에서 위의 단계를 수행한 경우 동일한 호스트에서 다음 단계도 수행합니다.

SQL Server 컨테이너에서 사용할 구성 파일 만들기

  1. Active Directory에 대한 설정을 사용하여 mssql.conf 파일을 만듭니다. 이 파일은 호스트의 어디에나 만들 수 있으며 docker run 명령을 실행하는 동안 올바르게 탑재해야 합니다. 이 예제에서는 이 mssql.conf 파일을 컨테이너 디렉터리인 /container/sql1 아래에 배치했습니다. mssql.conf의 내용은 다음과 같습니다.

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount: Active Directory 인증에 사용할 권한 있는 Active Directory 사용자입니다.
    • kerberoskeytabfile: mssql.keytab 파일이 배치될 컨테이너의 경로입니다.
  2. 다음 샘플과 같은 krb5.conf 파일을 만듭니다. 이러한 파일에서는 대/소문자 구분이 중요합니다.

    [libdefaults]
    default_realm = CONTOSO.COM
    default_keytab_name = /var/opt/mssql/secrets/mssql.keytab
    default_ccache_name = ""
    
    [realms]
    CONTOSO.COM = {
        kdc = adVM.contoso.com
        admin_server = adVM.contoso.com
        default_domain = CONTOSO.COM
    }
    
    [domain_realm]
    .contoso.com = CONTOSO.COM
    contoso.com = CONTOSO.COM
    
  3. 모든 파일, 즉 mssql.conf, krb5.confmssql.keytab을 SQL Server 컨테이너에 탑재될 위치로 복사합니다. 이 예제에서 이 파일들은 /container/sql1/mssql.confkrb5.conf에 있는 호스트에 배치됩니다. mssql.keytab/container/sql1/secrets/에 배치됩니다.

  4. 폴더에 사용자가 Docker/Podman 명령을 사용하기에 충분한 권한이 있는지 확인하세요. 컨테이너가 시작되면 사용자에게 생성된 폴더 경로에 대한 액세스 권한이 있어야 합니다. 이 예제에서는 폴더 경로에 다음 권한을 제공했습니다.

    sudo chmod 755 /container/sql1/
    

구성 파일 탑재 및 SQL Server 컨테이너 배포

SQL Server 컨테이너를 실행하고 이전에 만든 올바른 Active Directory 구성 파일을 탑재합니다.

Important

SA_PASSWORD 환경 변수는 사용되지 않습니다. 대신 MSSQL_SA_PASSWORD를 사용하세요.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest

주의

암호는 SQL Server 기본 암호 정책을 따라야 합니다. 기본적으로 암호는 8자 이상이어야 하며 대문자, 소문자, 0~9까지의 숫자 및 기호 네 가지 집합 중 세 집합의 문자를 포함해야 합니다. 암호 길이는 128자까지 가능하며 되도록 길고 복잡한 암호를 사용합니다.

SELinux 사용 호스트와 같은 LSM(Linux 보안 모듈)에서 컨테이너를 실행하는 경우 비공유 프라이빗 레이블로 콘텐츠의 레이블을 지정하도록 docker에 알려 주는 Z 옵션을 사용하여 볼륨을 탑재해야 합니다. 자세한 내용은 configure the SE Linux label(SE Linux 레이블 구성)을 참조하세요.

이 예제에는 다음 명령이 포함됩니다.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest
  • mssql.confkrb5.conf 파일은 호스트 파일 경로 /container/sql1에 있습니다.
  • 생성된 mssql.keytab은 호스트 파일 경로 /container/sql1/secrets에 있습니다.
  • 호스트 머신이 Azure에 있기 때문에 Active Directory 세부 정보를 동일한 순서로 docker run 명령에 추가해야 합니다. 이 예제에서 도메인 컨트롤러 adVMcontoso.com 도메인에 있으며 IP 주소는 10.0.0.4입니다. 도메인 컨트롤러는 DNS 및 KDC를 실행합니다.

Transact-SQL을 사용하여 Active Directory 기반 SQL Server 로그인 만들기

컨테이너에서 Linux SQL Server에 연결. 다음 명령을 사용하여 로그인을 만들고 해당 로그인이 있는지 확인합니다. 이 명령은 SSMS, Azure Data Studio 또는 다른 모든 CLI(명령줄 인터페이스) 도구를 실행하는 클라이언트 머신(Windows 또는 Linux)에서 실행할 수 있습니다.

CREATE LOGIN [contoso\amvin]
    FROM WINDOWS;

SELECT name
FROM sys.server_principals;

Active Directory 인증을 사용하여 SQL Server 연결

SQL Server Management Studio(SSMS) 또는 Azure Data Studio를 사용하여 연결하려면 SQL Server 이름(이름은 컨테이너 이름 또는 호스트 이름일 수 있음) 및 포트 번호를 사용하는 Windows 자격 증명을 사용하여 SQL Server에 로그인합니다. 이 예제에서 서버 이름은 sql1.contoso.com,5433입니다.

sqlcmd와 같은 도구를 사용하여 컨테이너의 SQL Server에 연결할 수도 있습니다.

sqlcmd -E -S 'sql1.contoso.com,5433'

리소스