다음을 통해 공유


자습서: SQL Server on Linux와 Active Directory 인증 사용

적용 대상: SQL Server - Linux

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

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

  • SQL Server 호스트를 Active Directory 도메인 가입
  • SQL Server의 Active Directory 사용자 만들기 및 SPN 설정
  • SQL Server 서비스 keytab 구성
  • Keytab 파일 보호
  • Kerberos 인증에 keytab 파일을 사용하도록 SQL Server 구성
  • Transact-SQL에서 Active Directory 기반 로그인 만들기
  • Active Directory 인증을 사용하여 SQL Server에 연결

사전 요구 사항

Active Directory 인증을 구성하기 전에 다음을 수행해야 합니다.

SQL Server 호스트를 Active Directory 도메인 가입

SQL Server Linux 호스트를 Active Directory 도메인 컨트롤러에 연결합니다. Active Directory 도메인을 가입시키는 방법에 대한 자세한 내용은 Linux 호스트의 SQL Server를 Active Directory 도메인에 가입을 참조하세요.

SQL Server의 Active Directory 사용자 만들기 및 SPN 설정

참고 항목

다음 단계에서는 정규화된 도메인 이름(FQDN)을 사용합니다. Azure에서 계속하기 전에 FQDN을 생성해야 합니다.

  1. 도메인 컨트롤러에서 New-ADUser PowerShell 명령을 실행하여 만료하지 않는 암호를 사용하여 새 Active Directory 사용자를 만듭니다. 다음 예제에서는 계정의 이름을 sqlsvc로 지정하지만 계정 이름은 원하는 대로 지정할 수 있습니다. 계정의 새 암호를 입력하라는 메시지가 표시됩니다.

    Import-Module ActiveDirectory
    
    New-ADUser sqlsvc -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpires $true -Enabled $true
    

    참고 항목

    SQL Server의 전용 Active Directory 계정을 사용하는 것이 보안 모범 사례이므로, SQL Server 인스턴스의 자격 증명은 동일한 계정을 사용하는 다른 서비스와 공유되지 않습니다. 그러나 계정 암호(다음 단계에서 keytab 파일을 생성하는 데 필요함)를 알고 있는 경우 필요에 따라 기존 Active Directory 계정을 다시 사용할 수 있습니다. 또한 사용자 계정에서 128비트 및 256비트 Kerberos AES 암호화(msDS-SupportedEncryptionTypes 특성)를 지원하도록 계정을 활성화해야 합니다. 계정이 AES 암호화에 대해 활성화되었는지 확인하려면 Active Directory 사용자 및 컴퓨터 유틸리티에서 계정을 찾고 속성을 선택합니다. 속성에서 계정 탭을 찾고 다음의 두 확인란이 선택되어 있는지 확인합니다.

    1. 이 계정은 Kerberos AES 128비트 암호화를 지원합니다.

    2. 이 계정은 Kerberos AES 256비트 암호화를 지원합니다.

  2. setspn.exe 도구를 사용하여 이 계정의 SPN(서비스 사용자 이름)을 설정합니다. SPN은 다음 예제에 지정된 대로 정확하게 형식을 지정해야 합니다. SQL Server 호스트에서 hostname --all-fqdns를 실행하여 SQL Server 호스트 머신의 정규화된 도메인 이름을 찾을 수 있습니다. 다른 포트 번호를 사용하도록 SQL Server를 구성한 경우가 아니면 TCP 포트는 1433이어야 합니다.

    setspn -A MSSQLSvc/<fully qualified domain name of host machine>:<tcp port> sqlsvc
    setspn -A MSSQLSvc/<netbios name of the host machine>:<tcp port> sqlsvc
    

    참고

    Insufficient access rights 오류가 표시되면 도메인 관리자와 함께 이 계정의 SPN을 설정할 권한이 있는지 확인합니다. SPN을 등록하는 데 사용되는 계정에 Write servicePrincipalName 쓰기 권한이 있어야 합니다. 자세한 내용은 Kerberos 연결의 서비스 사용자 이름 등록을 참조하세요.

    나중에 TCP 포트를 변경하는 경우 새 포트 번호를 사용하여 setspn 명령을 다시 실행해야 합니다. 다음 섹션의 단계에 따라 SQL Server 서비스 keytab에 새 SPN을 추가해야 합니다.

자세한 내용은 Kerberos 연결의 서비스 사용자 이름 등록을 참조하세요.

SQL Server 서비스 keytab 구성

SQL Server on Linux Active Directory 인증을 구성하려면 Active Directory 계정 및 이전 섹션에서 만든 SPN이 필요합니다.

Important

Active Directory 계정의 암호를 변경했거나 SPN이 할당된 계정의 암호를 변경한 경우 새 암호와 KVNO(키 버전 번호)를 사용하여 keytab을 업데이트해야 합니다. 일부 서비스에서는 암호를 자동으로 순환시킬 수도 있습니다. 해당하는 계정에 대한 암호 순환 정책을 검토하고 예기치 않은 가동 중지 시간을 방지하기 위해 예약된 유지 관리 작업에 맞게 조정합니다.

SPN keytab 항목

  1. 이전 단계에서 만든 Active Directory 계정의 KVNO(키 버전 번호)를 확인합니다. 일반적으로 2이지만, 계정 암호를 여러 번 변경한 경우에는 다른 정수일 수 있습니다. SQL Server 호스트 머신에서 다음 명령을 실행합니다.

    • 아래 예제에서는 user@CONTOSO.COM 도메인에 있다고 가정합니다. 사용자 및 도메인 이름을 해당 사용자 및 도메인 이름으로 수정합니다.
    kinit user@CONTOSO.COM
    kvno user@CONTOSO.COM
    kvno MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM
    

    참고

    SPN은 도메인을 통해 전파되는 데 몇 분 정도 걸릴 수 있습니다(특히 도메인이 클 경우). kvno: Server not found in Kerberos database while getting credentials for MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM 오류가 표시되면 몇 분 정도 기다린 후 다시 시도하세요.

    위 명령은 이전 섹션에서 설명한 것처럼 서버가 Active Directory 도메인에 가입된 경우에만 작동합니다.

  2. ktpass를 사용하여 Windows 머신 명령 프롬프트에서 다음 명령을 통해 각 SPN의 keytab 항목을 추가합니다.

    • <DomainName>\<UserName> - Active Directory 사용자 계정
    • @CONTOSO.COM - 해당 도메인 이름을 사용합니다.
    • /kvno <#> - <#>을 이전 단계에서 가져온 KVNO로 바꿉니다.
    • <StrongPassword> - 강력한 암호를 사용합니다.
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    

    참고

    위 명령은 Active Directory 인증에 AES 및 RC4 암호화 암호를 모두 허용합니다. RC4는 이전 암호화 암호이며, 더 높은 수준의 보안이 필요한 경우 AES 암호화 암호로만 keytab 항목을 만들도록 선택할 수 있습니다. 마지막 두 UserName 항목은 소문자여야 합니다. 그렇지 않으면 권한 인증에 실패할 수 있습니다.

  3. 위 명령을 실행하면 mssql.keytab이라는 keytab 파일이 생성됩니다. SQL Server 머신의 /var/opt/mssql/secrets 폴더에 파일을 복사합니다.

  4. keytab 파일을 보호합니다.

    이 keytab 파일에 액세스할 수 있는 사용자는 도메인에서 SQL Server를 가장할 수 있으므로 mssql 계정에만 읽기 액세스 권한이 있도록 파일에 대한 액세스를 제한해야 합니다.

    sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab
    sudo chmod 400 /var/opt/mssql/secrets/mssql.keytab
    
  5. mssql-conf 도구로 다음 구성 옵션을 설정하여 keytab 파일에 액세스하는 동안 사용할 계정을 지정해야 합니다.

    sudo mssql-conf set network.privilegedadaccount <username>
    

    참고

    사용자 이름만 포함하고 domainname\username 또는 username@domain을 사용하지 않습니다. SQL Server에서 사용 시 필요한 경우 이 사용자 이름과 함께 도메인 이름을 내부적으로 추가합니다.

  6. 다음 단계를 사용하여 Kerberos 인증에 keytab 파일을 사용하도록 SQL Server를 구성합니다.

    sudo mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    sudo systemctl restart mssql-server
    

    필요에 따라 도메인 컨트롤러에 대한 UDP 연결을 사용하지 않도록 설정하여 성능을 향상합니다. 대부분의 경우 도메인 컨트롤러에 연결할 때 UDP 연결이 지속적으로 실패하므로 /etc/krb5.conf에서 구성 옵션을 설정하여 UDP 호출을 건너뛸 수 있습니다. /etc/krb5.conf를 편집하고 다음 옵션을 설정합니다.

    /etc/krb5.conf
    [libdefaults]
    udp_preference_limit=0
    

이제 SQL Server에서 Active Directory 기반 로그인을 사용할 수 있습니다.

Transact-SQL에서 Active Directory 기반 로그인 만들기

  1. SQL Server에 연결하고 새 Active Directory 기반 로그인을 만듭니다.

    CREATE LOGIN [CONTOSO\user] FROM WINDOWS;
    
  2. 이제 로그인이 sys.server_principals 시스템 카탈로그 뷰에 나열되는지 확인합니다.

    SELECT name FROM sys.server_principals;
    

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

도메인 자격 증명을 사용하여 클라이언트 머신에 로그인합니다. 이제 Active Directory 인증을 사용하여 암호를 다시 입력하지 않고 SQL Server에 연결할 수 있습니다. Active Directory 그룹에 대한 로그인을 만드는 경우 해당 그룹의 멤버인 모든 Active Directory 사용자는 동일한 방식으로 연결할 수 있습니다.

Active Directory 인증을 사용할 클라이언트의 특정 연결 문자열 매개 변수는 사용 중인 드라이버에 따라 달라집니다. 다음 섹션의 예제를 살펴보세요.

도메인에 가입된 Linux 클라이언트의 sqlcmd

ssh 및 도메인 자격 증명을 사용하여 도메인 조인 Linux 클라이언트에 로그인합니다.

ssh -l user@contoso.com client.contoso.com

mssql-tools 패키지를 설치했는지 확인한 다음, 자격 증명을 지정하지 않고 sqlcmd를 사용하여 연결합니다.

sqlcmd -S mssql-host.contoso.com

SQL Windows와 달리 Kerberos 인증은 SQL Linux의 로컬 연결에서 작동합니다. 그러나 SQL Linux 호스트의 FQDN을 제공해야 하며 ., localhost, 127.0.0.1 등에 연결하려고 하면 Active Directory 인증이 작동하지 않습니다.

도메인에 가입된 Windows 클라이언트의 SSMS

도메인 자격 증명을 사용하여 도메인 조인 Windows 클라이언트에 로그인합니다. SQL Server Management Studio가 설치되어 있는지 확인한 다음 서버에 연결 대화 상자에서 Windows 인증을 지정하여 SQL Server 인스턴스(예: mssql-host.contoso.com)에 연결합니다.

다른 클라이언트 드라이버를 사용하는 Active Directory 인증

다음 표에서는 다른 클라이언트 드라이버에 대한 권장 사항을 설명합니다.

클라이언트 드라이버 권장
JDBC Kerberos 통합 인증을 사용하여 SQL Server 연결
ODBC 통합 인증을 사용합니다.
ADO.NET 연결 문자열 구문입니다.

추가 구성 옵션

PBIS, VAS 또는 Centrify와 같은 타사 유틸리티를 사용하여 Linux 호스트를 Active Directory 도메인에 가입시키며 openLDAP 라이브러리를 직접 사용할 때 SQL Server를 강제 실행하려는 경우 다음과 같이 mssql-conf를 사용하여 disablesssd 옵션을 구성할 수 있습니다.

sudo mssql-conf set network.disablesssd true
systemctl restart mssql-server

참고 항목

SSSD를 설정하는 realmd와 같은 유틸리티가 있지만, PBIS, VAS 및 Centrify와 같은 다른 도구는 SSSD를 설정하지 않습니다. Active Directory 도메인에 가입하는 데 사용되는 유틸리티가 SSSD를 설정하지 않는 경우 disablesssd 옵션을 true로 구성하는 것이 좋습니다. SQL Server는 OpenLDAP 메커니즘으로 대체되기 전에 Active Directory에 SSSD를 사용하려고 시도하므로 이 구성이 필요하지 않지만, 이와 같이 구성하면 SQL Server가 직접 OpenLDAP를 호출하여 SSSD 메커니즘을 무시하므로 성능이 향상됩니다.

도메인 컨트롤러에서 LDAPS를 지원하는 경우 SQL Server에서 도메인 컨트롤러로 모든 연결이 LDAPS를 통해 수행되도록 할 수 있습니다. 클라이언트에서 LDAPS를 통해 도메인 컨트롤러에 연결할 수 있는지 확인하려면 bash 명령 ldapsearch -H ldaps://contoso.com:3269를 실행합니다. LDAPS만 사용하도록 SQL Server를 설정하려면 다음을 실행합니다.

sudo mssql-conf set network.forcesecureldap true
systemctl restart mssql-server

호스트의 Active Directory 도메인 가입이 SSSD 패키지를 통해 수행되었고 disablesssd가 true로 설정되지 않은 경우에는 여기에는 SSSD를 통해 LDAPS가 사용됩니다. disablesssd가 true로 설정되고 forcesecureldap가 true로 설정된 경우에는 SQL Server에서 수행된 OpenLDAP 라이브러리 호출을 통해 LDAPS 프로토콜이 사용됩니다.

Post SQL Server 2017 CU 14

SQL Server 2017 (14.x) CU 14부터, SQL Server가 타사 공급자를 사용하여 Active Directory 도메인 컨트롤러에 가입되었고 disablesssd를 true로 설정하여 일반적인 Active Directory 조회에 OpenLDAP 호출을 사용하도록 구성된 경우에는 enablekdcfromkrb5 옵션을 사용하여 SQL Server에서 KDC 서버에 대한 역방향 DNS 조회 대신에 krb5 라이브러리를 KDC 조회에 사용하도록 할 수 있습니다.

이 방법은 SQL Server가 통신을 시도하는 도메인 컨트롤러를 수동으로 구성하려는 시나리오에 유용할 수 있습니다. 또한 krb5.conf에서 KDC 목록을 사용하여 OpenLDAP 라이브러리 메커니즘을 사용합니다.

먼저 disablesssdenablekdcfromkrb5conf를 TRUE로 설정한 다음 SQL Server를 다시 시작합니다.

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
systemctl restart mssql-server

그런 다음, /etc/krb5.conf에서 다음과 같이 KDC 목록을 구성합니다.

[realms]
CONTOSO.COM = {
  kdc = dcWithGC1.contoso.com
  kdc = dcWithGC2.contoso.com
}

권장하지는 않지만 SQL Server가 Active Directory 관련 호출에 SSSD 대신에 OpenLDAP 호출을 사용하도록 disablesssd를 true로 구성하면서 Linux 호스트를 도메인에 가입시키는 동안 SSSD를 설정하는 realmd와 같은 유틸리티를 사용할 수 있습니다.

참고 항목

FQDN(예: CONTOSO.COM\Username)을 사용하여 SQL Server 로그인하는 것은 지원되지 않습니다. CONTOSO\Username 형식을 사용합니다.

도메인 로컬 그룹의 SQL Server 로그인은 지원되지 않습니다. 대신 글로벌 보안 도메인 그룹을 사용하세요.

SQL 설명서에 참여하세요

SQL 콘텐츠를 직접 편집할 수 있다는 것을 알고 계셨나요? 직접 편집하면 설명서가 개선될 뿐만 아니라 페이지에 참여자로 기입됩니다.

자세한 내용은 SQL Server 설명서에 기여하는 방법을 참조하세요.