📖
Almalinux9.4からSQLサーバー2014にsqlcmdで接続できなかった時のこと
主旨
解決に結構時間かかったのでメモ。
状況と困りごと
- Almalinux9.4のマシンを新規構築した(以下Appサーバー)。
- リモートのSQLサーバー2014(以下DBサーバー)にsqlcmdで接続したかった。
-
Microsoft ODBC Driver forSQL Serverをインストールする (Linux)
に従って、Microsoft ODBC 18とsqlcmdをインストールした - テストした所、以下の通りエラーとなった
[myusername@MYHOSTNAME ~]$ sqlcmd -S '192.168.10.10' -U user_name -P password -Q "SELECT @@VERSION" -C
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish connection.
- PHP用のSQLサーバードライバーもこの後MicroSoftリポジトリから入れていたが、PHP側からも(当然だが?)接続不可。
一方、できていたこと
ターゲットのDBサーバーのバージョンは以下で、接続不可。
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
一方、Appサーバーからsqlcmdによる接続を試せる別のSQLサーバーが2個あり、それぞれバージョンは以下で、どちらも接続できた。
Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64)
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
解消した方法
- Microsoft ODBC 18とsqlcmdをダウングレードした。
- 具体的には以下の通りで、後1はダメ、後2ならいけた。
前:/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.3.so.2.1
後1:/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.6.1
後2:/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.2.1
- opensslの設定変更や、ダウングレードは、効かなかったみたい。
解消した方法に至るまでに試したことの備忘
疑ったこと、試したこと(順不同)
- sqlcmdのオプションで、-C、-Noなど試したが、有意な結果得られず。
- opensslの設定変更やダウングレードを試したが、効かなかったみたい(たぶん…)。
- SQLサーバー側のリモート接続許可状態、Browserサービス有効状態、ポート開放状態、ファイアーウォールによる接続元IP制限みたいなことを確認したが、問題なさそうだった。
- そもそも、Appサーバーから、telnetでDBサーバーの1433とコネクション張れるか→張れた。
telnet 192.168.10.10 1433
-
この辺りから、特に暗号化通信のサポートプロトコルの違いを疑ったが、そもそもsqlcmdがopensslを使っているのか、その辺りもよくわからなかった。
-
/etc/pki/tls/openssl.cnf を修正し、以下の有効化を試したが、有効ではなかったようだった(なお、記述位置やパラメータもいくつかバリエーションを試したが、だめだった)。
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=0
- nmap結果比較。上がDB。下がApp。両方のサーバーでTLSv1.2暗号化スイートの中のTLS_ECDHE_RSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHAが一致していた。
nmap -sV --script ssl-enum-ciphers -p 1433 192.168.10.10
nmap --script ssl-enum-ciphers 192.168.20.20
- SQLサーバー2014は標準ではTLSv1.2をサポートしておらず、パッチを入れないとないですよ、みたいな記事もあったが、nmap結果を見るに、そのパッチは適用済みたいだった。
- そもそも、TLSv1.2で一致する暗号化方式あるのに、なんでだめなの…。
- その後、17でMicrosoft ODBC 17とsqlcmdをインストールし直した
https://learn.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16&tabs=redhat18-install%2Calpine17-install%2Cdebian8-install%2Credhat7-13-install%2Crhel7-offline#17 - でもだめみたいだった
- 別途あった古いCentOS7に、「/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.2.1z」を含む、17の中でももうちょっと古そうなのがあったので、それを設置してみた
- おそらくこのタイミングくらいでうまくいった…
参考したページ
- https://github.com/microsoft/msphpsql/issues/1453
- https://community.qlik.com/t5/Official-Support-Articles/Replicate-Red-Hat-8-SQL-Server-Source-fails-TCP-Provider-Error/ta-p/2009920
- https://stackoverflow.com/questions/57265913/error-tcp-provider-error-code-0x2746-during-the-sql-setup-in-linux-through-te/74326345#74326345
- https://designetwork.daichi703n.com/entry/2020/10/03/openssl-seclevel-ubuntu-focal
- https://askubuntu.com/questions/1284658/how-to-fix-microsoft-odbc-driver-17-for-sql-server-ssl-provider-ssl-choose-cli#1289910
- https://kazuhira-r.hatenablog.com/entry/2020/11/19/020208
Discussion