Шифрование подключений к SQL Server на Linux

Применимо к:SQL Server — Linux

SQL Server на Linux может использовать протокол TLS для шифрования данных, передаваемых через сеть между клиентским приложением и экземпляром SQL Server. SQL Server поддерживает одни и те же протоколы TLS в Windows и Linux: 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)свойство сертификата.

  • Сертификат должен быть создан с помощью KeySpec параметра AT_KEYEXCHANGE. Как правило, свойство использования ключа сертификата (KEY_USAGE) также включает в себя шифрование ключей (CERT_KEY_ENCIPHERMENT_KEY_USAGE).

  • Свойство Subject сертификата должно указывать, что общее имя (CN) совпадает с именем узла или полным доменным именем (FQDN) сервера.

    Примечание.

    Поддерживаются групповые сертификаты.

Настройка библиотек OpenSSL для использования (необязательно)

В /opt/mssql/lib/ каталоге можно создать символьные ссылки, указывающие, какие библиотеки libcrypto.so и libssl.so следует использовать для шифрования. Это удобно, если нужно заставить SQL Server использовать определенную версию OpenSSL, отличную от предоставленной системой для использования по умолчанию. Если эти символьные ссылки отсутствуют, SQL Server загружает библиотеки OpenSSL по умолчанию в системе.

Эти символьные ссылки должны называться libcrypto.so и libssl.so и находиться в каталоге /opt/mssql/lib/.

Обзор

TLS используется для шифрования подключений от клиентского приложения к SQL Server. При правильной настройке TLS обеспечивает как конфиденциальность, так и целостность данных при взаимодействии клиента и сервера. Подключения TLS могут инициироваться клиентом или сервером.

В следующем разделе описывается настройка шифрования, инициированного клиентом.

Создание сертификата

/CN должно соответствовать полному доменному имени узла SQL Server.

Внимание

В этом примере используется самозаверяющий сертификат. Самозаверяющий сертификат не должен использоваться для рабочих сценариев. Нужно использовать сертификаты ЦС.

Убедитесь, что папки, в которых сохраняются сертификаты и закрытые ключи, доступны mssql пользователю или группе и имеют разрешение 700 (drwx-----). Вы можете создавать папки вручную с набором 700 разрешений (drwx------) и принадлежащими пользователю или группе, или задать разрешение 755 (drwxr-xr-x), принадлежащие mssql другому пользователю, но по-прежнему доступны для mssql группы пользователей. Например, можно создать папку, вызываемую sslcert по пути /var/opt/mssql/, и сохранить сертификат и закрытый ключ с разрешениями для файлов, заданных 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)

  • Если вы используете подписанный ЦС сертификат, необходимо скопировать сертификат центра сертификации (ЦС) вместо сертификата пользователя на клиентский компьютер.
  • Если вы используете самозаверяющий сертификат, скопируйте .pem файл в следующие папки, соответствующие распространению и выполнению команд, чтобы включить их:
  • Ubuntu: скопируйте сертификат /usr/share/ca-certificates/в, переименуйте его расширение .crtв и используйте dpkg-reconfigure ca-certificates для включения его в качестве сертификата системного ЦС.
  • RHEL: скопируйте сертификат /etc/pki/ca-trust/source/anchors/ и используйте update-ca-trust его для включения в качестве сертификата системного ЦС.
  • SUSE: скопируйте сертификат /usr/share/pki/trust/anchors/ и используйте 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. Эта ошибка возникает, когда клиенты не могут проверить подпись сертификата, представленного SQL Server во время подтверждения TLS. Убедитесь, что клиент доверяет либо сертификату SQL Server напрямую, либо ЦС, который подписал сертификат SQL Server.
The target principal name is incorrect. Убедитесь, что значение в поле общего имени в сертификате SQL Server соответствует имени сервера, указанному в строке подключения клиента.
An existing connection was forcibly closed by the remote host. Эта ошибка может возникать, если клиент не поддерживает версию протокола TLS, необходимую SQL Server. Например, если SQL Server настроен на требование TLS 1.2, убедитесь, что клиенты также поддерживают протокол TLS 1.2.

Ubuntu 20.04 и другие недавние дистрибутивы Linux

Симптом

Когда экземпляр SQL Server на Linux загружает сертификат, созданный с помощью алгоритма подписи, использующий менее 112 бит безопасности (например, MD5, SHA-1), может возникнуть ошибка подключения, как показано в следующем примере:

Соединение с сервером было успешно установлено, но при входе в систему произошла ошибка. (поставщик: поставщик SSL, ошибка: 0 — существующее подключение было принудительно закрыто удаленным узлом.) (Microsoft SQL Server, ошибка: 10054)

Ошибка возникает из-за включения уровня безопасности OpenSSL 2 по умолчанию в Ubuntu 20.04 и более поздних версиях. Уровень безопасности 2 запрещает TLS-подключения, которые имеют менее 112 бит безопасности.

Решение

Установите сертификат с алгоритмом подписи, используя не менее 112 бит безопасности. Алгоритмы подписи, которые соответствуют этому требованию: SHA-224, SHA-256, SHA-384 и SHA-512.