SQL Server 在哪里存储 SA 密码和 SQL Server 密码策略?

Eva*_*oll 2 sql-server linux database-internals sql-server-2017

在Linux上,SQL Server在哪里存储“SQL Server密码策略”和SA用户的密码?我明白了,“密码”不安全。

错误:无法设置系统管理员密码:密码验证失败。该密码不符合 SQL Server 密码策略要求,因为它太短。密码必须至少为 8 个字符..

进而,

错误:无法设置系统管理员密码:密码验证失败。该密码不符合 SQL Server 密码策略要求,因为它不够复杂。密码长度必须至少为 8 个字符,并包含以下四组中的三组字符:大写字母、小写字母、基数 10 的数字和符号。

我猜该策略实际上已编译到数据库中?密码会存储在一个不起眼的位置吗?

Joh*_* N. 5

用户是SQL Server登录名,其密码加密并存储在数据库的saDMV sys.sql_logins数据库管理视图)中。master

参考: sys.sql_logins (Transact-SQL)

您可能会注意到这些视图只能在以下分支中找到:

Server | Databases | master | Views | System Views | .... 
Run Code Online (Sandbox Code Playgroud)

DMV 引用一些可以访问(但不应该)的系统基表:

参考: 系统基表

您正在寻找的策略内置于 SQL Server 代码中,并为每个新帐户默认设置。创建 SQL Server 登录名时,您可以决定关闭默认设置

要强制执行密码策略选项以实现复杂性和强制执行,请选择强制执行密码策略。有关更多信息,请参阅密码策略。当选择SQL Server 身份验证时,这是默认选项。

... 通过CHECK_POLICY=OFF。查看完整语法:

CREATE LOGIN login_name { WITH <option_list1> | FROM <sources> }  

<option_list1> ::=   
    PASSWORD = { 'password' | hashed_password HASHED } [ MUST_CHANGE ]  
    [ , <option_list2> [ ,... ] ]  

<option_list2> ::=    
    SID = sid  
    | DEFAULT_DATABASE = database      
    | DEFAULT_LANGUAGE = language  
    | CHECK_EXPIRATION = { ON | OFF}  
    | CHECK_POLICY = { ON | OFF}  
    | CREDENTIAL = credential_name   

<sources> ::=  
    WINDOWS [ WITH <windows_options>[ ,... ] ]  
    | CERTIFICATE certname  
    | ASYMMETRIC KEY asym_key_name  

<windows_options> ::=        
    DEFAULT_DATABASE = database  
    | DEFAULT_LANGUAGE = language  
Run Code Online (Sandbox Code Playgroud)

参考: 创建登录 (Transact-SQL)

如果 SQL Server 是 Windows 域的成员,那么它将从 Active Directory 检索密码策略。否则默认值是:

密码复杂性策略旨在通过增加可能的密码数量来阻止暴力攻击。强制实施密码复杂性策略时,新密码必须符合以下准则:

  • 密码不包含用户的帐户名。
  • 密码长度至少为八个字符。
  • 密码包含以下四类中三类的字符:
    - 拉丁大写字母(A 到 Z)
    - 拉丁小写字母(a 到 z)
    - 基本 10 位数字(0 到 9)
    - 非字母数字字符,例如:感叹号 ( !)、美元符号 ($)、数字符号 (#) 或百分号 (%)。
    密码最长可达 128 个字符。您应该使用尽可能长且复杂的密码。

参考: 密码政策