Logstash中用mssql-jdbc驱动AD凭据连接MSSQL认证失败求助
问题场景
使用Logstash JDBC输入插件搭配mssql-jdbc-12.6.4.jre11.jar连接MSSQL数据库时,出现Login failed for user 'domain\username'认证错误,但相同的认证参数通过sqlcmd工具可以成功连接。
核心原因与解决办法
1. 配置参数冲突
你的JDBC连接字符串中已经包含user=***\***;password=***参数,同时又单独配置了jdbc_user和jdbc_password字段。Logstash JDBC插件会优先使用单独配置的jdbc_user/jdbc_password,覆盖连接字符串中的对应参数——而你单独配置的jdbc_user仅填写了用户名,缺少域名部分,直接导致认证失败。
解决方式(二选一):
- 方案一:删除连接字符串中的
user和password,保留jdbc_user/jdbc_password并填写完整的域账号格式
input { jdbc { jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" jdbc_driver_library => "/app/logstash/utils/jdbc/mssql-jdbc-12.6.4.jre11.jar" jdbc_connection_string => "jdbc:sqlserver://***:1433;databaseName=***;encrypt=true;trustServerCertificate=true;loginTimeout=30;" jdbc_user => "***\***" jdbc_password => "***" statement => "SELECT 1" schedule => "* * * * *" } }
- 方案二:删除单独的
jdbc_user/jdbc_password配置,确保连接字符串中的user/password参数完整正确
input { jdbc { jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" jdbc_driver_library => "/app/logstash/utils/jdbc/mssql-jdbc-12.6.4.jre11.jar" jdbc_connection_string => "jdbc:sqlserver://***:1433;databaseName=***;user=***\***;password=***;encrypt=true;trustServerCertificate=true;loginTimeout=30;" statement => "SELECT 1" schedule => "* * * * *" } }
2. 反斜杠转义问题
Java环境中,反斜杠\是字符串转义字符。如果直接在连接字符串或jdbc_user中写domain\username,实际传递给JDBC驱动的内容会丢失反斜杠,变成domainusername,导致用户名识别错误。
解决方式:
将反斜杠替换为双反斜杠\\(转义后),或用正斜杠/替代:
- 连接字符串中:
user=***\\***或user=***/*** jdbc_user配置中:jdbc_user => "***\\***"
3. 认证方式不匹配
sqlcmd通过-U传递domain\username时,默认可能使用SQL Server混合认证模式;而JDBC驱动针对域账号的集成认证需要额外配置:
如果你的账号是Windows域账号(而非SQL Server本地账号),需要在连接字符串中添加integratedSecurity=true,并确保对应平台的认证库(Windows为sqljdbc_auth.dll,Linux为sqljdbc_auth.so)在系统加载路径或Logstash可访问路径中。此时无需配置user和password参数。
示例配置:
input { jdbc { jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" jdbc_driver_library => "/app/logstash/utils/jdbc/mssql-jdbc-12.6.4.jre11.jar" jdbc_connection_string => "jdbc:sqlserver://***:1433;databaseName=***;integratedSecurity=true;encrypt=true;trustServerCertificate=true;loginTimeout=30;" statement => "SELECT 1" schedule => "* * * * *" } }
内容的提问来源于stack exchange,提问作者rnv812

