Шифрование подключений к 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/
.
Примечание.
Пример использования Let's Encrypt для создания сертификата см. в блог-посте о раскрытии потенциала данных в Azure с помощью SQL Server на Linux, виртуальных машинах Azure и поисковых возможностях ИИ Azure.
Обзор
TLS используется для шифрования подключений от клиентского приложения к SQL Server. При правильной настройке TLS обеспечивает как конфиденциальность, так и целостность данных при взаимодействии клиента и сервера. Подключения TLS могут инициироваться клиентом или сервером.
В следующем разделе описывается настройка шифрования, инициированного клиентом.
Создание сертификата
/CN
должно соответствовать полностью квалифицированному доменному имени узла SQL Server.
Внимание
В этом примере используется самозаверяющий сертификат. Самоподписанные сертификаты не следует использовать в производственных окружениях. Нужно использовать сертификаты ЦС.
Убедитесь, что папки, в которых сохраняются сертификаты и закрытые ключи, доступны mssql
пользователю или группе и имеют разрешение 700
(drwx-----
). Вы можете вручную создавать папки с разрешением 700
(drwx------
), принадлежащие пользователю/группе mssql
, или установить разрешение 755
(drwxr-xr-x
), которые принадлежат другому пользователю, но по-прежнему доступны для группы пользователей 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. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
SQL Server Management Studio
sqlcmd
sqlcmd -S <sqlhostname> -N -U sa -P '<password>'
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. |
Эта ошибка возникает, когда клиенты не могут проверить подпись сертификата, представленного 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.