Шифрование подключений к 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------
) и принадлежащими пользователю или группе, или задать разрешение 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. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 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;"
Распространенные ошибки при подключении
Сообщение об ошибке | 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.