📖

Almalinux9.4からSQLサーバー2014にsqlcmdで接続できなかった時のこと

2024/05/08に公開

主旨

解決に結構時間かかったのでメモ。

状況と困りごと

  • 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

参考したページ

Discussion