다음을 통해 공유


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

적용 대상: SQL Server - Linux

Linux의 SQL Server는 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_KEYEXCHANGEKeySpec 옵션을 사용하여 만들어야 합니다. 일반적으로 인증서의 키 사용 속성(KEY_USAGE)에는 키 암호화(CERT_KEY_ENCIPHERMENT_KEY_USAGE)이 포함됩니다.

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

    참고 항목

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

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

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

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

개요

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

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

인증서 생성

/CN은 SQL Server 호스트의 정규화된 도메인 이름과 일치해야 합니다.

주의

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

인증서 및 개인 키를 저장하는 폴더가 mssql 사용자/그룹에서 액세스할 수 있고 권한이 700(drwx-----)로 설정되어 있는지 확인합니다. 권한이 700(drwx------)으로 설정되고 mssql 사용자/그룹이 소유하거나, 권한이 755(drwxr-xr-x)로 설정되고 다른 사용자가 소유하지만 mssql 사용자 그룹도 액세스할 수 있는 폴더를 수동으로 만들 수 있습니다. 예를 들어 다음 샘플과 같이 /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로 변경한 다음 dpkg-reconfigure ca-certificates를 사용하여 시스템 CA 인증서로 사용하도록 설정합니다.
  • RHEL: 인증서를 /etc/pki/ca-trust/source/anchors/에 복사하고 update-ca-trust를 사용하여 시스템 CA 인증서로 사용하도록 설정합니다.
  • SUSU: 인증서를 /usr/share/pki/trust/anchors/에 복사하고 update-ca-certificates를 사용하여 시스템 CA 인증서로 사용하도록 설정합니다.
  • 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 /usr/local/etc/openssl/certsdc2dd900.0에 있는지 확인합니다

연결 문자열 예

  • SQL Server Management Studio

    SQL Server Management Studio 의 연결 대화 상자 스크린샷.

  • 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;"

일반적인 연결 오류

오류 메시지 해결
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 배포 릴리스

증상

Linux SQL Server 인스턴스의 가 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가 포함됩니다.