SQL Server on Linux에 대한 연결 암호화

적용 대상:SQL Server - Linux

SQL Server on Linux는 TLS(전송 계층 보안)를 사용하여 클라이언트 애플리케이션과 SQL Server 인스턴스 간에 네트워크를 통해 전송되는 데이터를 암호화할 수 있습니다. SQL Server는 Windows 및 Linux에서 동일한 TLS 프로토콜인 TLS 1.2, 1.1 및 1.0을 지원합니다. 그러나 TLS를 구성하는 단계는 SQL Server가 실행 중인 운영 체제와 관련이 있습니다.

인증서에 대한 요구 사항

시작하기 전에 인증서가 다음 요구 사항을 따르는지 확인해야 합니다.

  • 현재 시스템 시간은 인증서의 속성 뒤 Valid from 와 인증서 속성 앞에 Valid to 있어야 합니다.

  • 인증서는 서버 인증용이어야 합니다. 이렇게 하려면 인증서의 Enhanced Key Usage 속성을 지정해야 합니다 Server Authentication (1.3.6.1.5.5.7.3.1).

  • 의 옵션을 AT_KEYEXCHANGE사용하여 인증서를 KeySpec 만들어야 합니다. 일반적으로 인증서의 키 사용 속성(KEY_USAGE)에는 키 암호화(CERT_KEY_ENCIPHERMENT_KEY_USAGE)도 포함됩니다.

  • 인증서의 속성은 Subject CN(일반 이름)이 서버 컴퓨터의 호스트 이름 또는 FQDN(정규화된 do기본 이름)과 동일함을 나타내야 합니다.

    참고 항목

    와일드 카드 인증서가 지원됩니다.

사용할 OpenSSL 라이브러리 구성(선택 사항)

/opt/mssql/lib/ 디렉터리에서 암호화에 사용할 libcrypto.solibssl.so 라이브러리를 참조하는 바로 가기 링크를 만들 수 있습니다. 이는 SQL Server가 시스템에서 제공하는 기본값이 아닌 특정 버전의 OpenSSL을 사용하도록 강제 적용하려는 경우에 유용합니다. 이러한 기호 링크가 없는 경우 SQL Server는 시스템에 구성된 기본 OpenSSL 라이브러리를 로드합니다.

이러한 기호 링크의 이름을 지정 libcrypto.so 하고 libssl.so 디렉터리에 배치 /opt/mssql/lib/ 해야 합니다.

개요

TLS는 클라이언트 애플리케이션에서 SQL Server로의 연결을 암호화하는 데 사용됩니다. 올바르게 구성된 경우 TLS는 클라이언트와 서버 간의 통신에 대한 개인 정보 보호 및 데이터 무결성을 모두 제공합니다. TLS 연결은 클라이언트를 시작하거나 서버를 시작할 수 있습니다.

다음 섹션에서는 클라이언트 시작 암호화 설정에 대해 설명합니다.

인증서 생성

/CN는 SQL Server 호스트의 정규화된 do기본 이름과 일치해야 합니다.

주의

이 예제에서는 자체 서명된 인증서를 사용합니다. 자체 서명된 인증서는 프로덕션 시나리오에 사용하면 안 됩니다. CA 인증서를 사용해야 합니다.

인증서 및 개인 키를 저장하는 폴더가 사용자/그룹에서 액세스할 수 mssql 있고 권한이 (drwx-----)로 700 설정되어 있는지 확인합니다. 사용 권한이 ()로 설정 700 되고 사용자/그룹이 소유한 mssql 폴더를 수동으로 만들거나 다른 사용자가 소유하지만 사용자 그룹에 계속 액세스할 수 있도록 권한을 755 (drwxr-xr-x)로 설정할 수 있습니다mssql.drwx------ 예를 들어 다음 샘플과 같이 경로 /var/opt/mssql/아래에 호출된 sslcert 폴더를 만들고 파일에 600대한 사용 권한이 있는 인증서와 프라이빗 키를 저장할 수 있습니다.

openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=mssql.contoso.com' -keyout mssql.key -out mssql.pem -days 365
sudo chown mssql:mssql mssql.pem mssql.key
sudo chmod 600 mssql.pem mssql.key
#Saving the certificate to the certs folder under /etc/ssl/ which has the following permission 755(drwxr-xr-x)
sudo mv mssql.pem /etc/ssl/certs/ drwxr-xr-x
#Saving the private key to the private folder under /etc/ssl/ with permissions set to 755(drwxr-xr-x)
sudo mv mssql.key /etc/ssl/private/

SQL Server 구성

systemctl stop mssql-server
sudo cat /var/opt/mssql/mssql.conf
sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0
systemctl restart mssql-server

클라이언트 컴퓨터(Windows, Linux 또는 macOS)에 인증서 등록

  • CA 서명된 인증서를 사용하는 경우 사용자 인증서 대신 CA(인증 기관) 인증서를 클라이언트 컴퓨터에 복사해야 합니다.
  • 자체 서명된 인증서를 사용하는 경우 각 폴더에 파일을 복사 .pem 하여 배포하고 명령을 실행하여 사용하도록 설정합니다.
  • Ubuntu: 인증서를 복사하여 /usr/share/ca-certificates/확장 .crt의 이름을 바꾸고 시스템 CA 인증서로 사용하도록 설정하는 데 사용합니다 dpkg-reconfigure ca-certificates .
  • RHEL: 인증서를 복사하여 /etc/pki/ca-trust/source/anchors/ 시스템 CA 인증서로 사용하도록 설정하는 데 사용합니다 update-ca-trust .
  • SUSE: 인증서를 복사하여 /usr/share/pki/trust/anchors/ 시스템 CA 인증서로 사용하도록 설정하는 데 사용합니다 update-ca-certificates .
  • Windows: 현재 사용자 > 신뢰할 수 있는 루트 인증 기관 > 인증서에서 파일을 인증서로 가져옵니다..pem
  • macOS:
    • 인증서를 에 복사 /usr/local/etc/openssl/certs

    • 다음 명령을 실행하여 해시 값을 가져옵니다.

      /usr/local/Cellar/openssl/1.0.2l/openssl x509 -hash -in mssql.pem -noout
      
    • 인증서 이름을 값으로 바꿉니다. 예: mv mssql.pem dc2dd900.0 에 있는지 확인 dc2dd900.0 합니다. /usr/local/etc/openssl/certs

연결 문자열 예

  • SQL Server Management Studio

    Screenshot of SQL Server Management Studio connection dialog.

  • Sqlcmd

    sqlcmd -S <sqlhostname> -N -U sa -P '<YourPassword>'

  • ADO.NET

    "Encrypt=True; TrustServerCertificate=False;"

  • ODBC

    "Encrypt=Yes; TrustServerCertificate=no;"

  • JDBC

    "encrypt=true; trustServerCertificate=false;"

일반적인 연결 오류

오류 메시지 Fix
The certificate chain was issued by an authority that is not trusted. 이 오류는 클라이언트가 TLS 핸드셰이크 중에 SQL Server에서 제공한 인증서의 서명을 확인할 수 없는 경우에 발생합니다. 클라이언트가 SQL Server 인증서 또는 SQL Server 인증서에 서명한 CA를 직접 신뢰하는지 확인합니다.
The target principal name is incorrect. SQL Server 인증서의 일반 이름 필드가 클라이언트의 연결 문자열에 지정된 서버 이름과 일치하는지 확인합니다.
An existing connection was forcibly closed by the remote host. 이 오류는 클라이언트가 SQL Server에 필요한 TLS 프로토콜 버전을 지원하지 않는 경우에 발생할 수 있습니다. 예를 들어 SQL Server가 TLS 1.2를 요구하도록 구성된 경우 클라이언트도 TLS 1.2 프로토콜을 지원하는지 확인합니다.

Ubuntu 20.04 및 기타 최근 Linux 배포 릴리스

증상

SQL Server on Linux 인스턴스가 112비트 미만의 보안을 사용하여 서명 알고리즘으로 만든 인증서를 로드하는 경우(예: MD5, SHA-1) 다음 예제와 같이 연결 실패 오류가 발생할 수 있습니다.

서버에 연결했지만 로그인하는 동안 오류가 발생했습니다. (공급자: SSL 공급자, 오류: 0 - 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.) (Microsoft SQL Server, 오류: 10054)

이 오류는 OpenSSL 보안 수준 2가 기본적으로 Ubuntu 20.04 이상 버전에서 사용하도록 설정되어 있기 때문입니다. 보안 수준 2에서는 112비트 미만의 보안이 있는 TLS 연결이 설정되지 않도록 합니다.

솔루션

112비트 이상의 보안을 사용하여 서명 알고리즘이 있는 인증서를 설치합니다. 이 요구 사항을 충족하는 서명 알고리즘에는 SHA-224, SHA-256, SHA-384 및 SHA-512가 포함됩니다.