Aaron Bertrand Asked: 2015-05-01 07:28:56 +0800 CST2015-05-01 07:28:56 +0800 CST 2015-05-01 07:28:56 +0800 CST sys.sql_logins.is_policy_checked 是否表示该策略已被检查? 772 当我查看时sys.sql_logins,我看到一个名为is_policy_checked. 我可以相信我的密码策略已经检查了该列值所在的所有登录名1吗? sql-server security 1 个回答 Voted Best Answer Aaron Bertrand 2015-05-01T07:28:56+08:002015-05-01T07:28:56+08:00 ##不。虽然文档目前对该标志的含义有以下可以说是模棱两可的陈述: 检查密码策略。 它真正的意思是,应该说,国旗有两个目的: 密码策略可能已被检查,但前提是 (a) 在上次设置密码时启用了密码策略,并且 (b) 密码以纯文本(不使用哈希)指定。2.下次设置策略时将检查密码策略,但前提是 (a) 当时启用了密码策略,并且 (b) 密码以纯文本(不使用哈希)指定。 (请注意,“策略”还指强制到期以及用户必须在下次登录时更改密码这一事实,但由于复杂性通常是审计操作的重点,我将只关注这方面。 ) 即使当时未检查策略,该is_policy_checked位也会在事件或事件期间设置为1if 。正如您可能从上面收集到的那样,在这些情况下不会发生此检查:CHECK_POLICY = ONCREATE LOGINALTER LOGIN 使用HASHED关键字指定密码(在服务器之间迁移登录名或将登录名复制到日志传送/镜像/AG 辅助服务器时非常常见的策略)。如果您没有预先散列的值,显然不可能检查密码的复杂性。 事件发生时未启用本地密码复杂性策略。 上面我建议的改写没有涵盖,但是您可以ALTER LOGIN不设置新密码,并且仍然更改标志(感谢@AMtwo 说明这一点)。我怀疑这可能是聪明人试图愚弄审计师所做的。 这些问题都很容易证明。 由于与我交谈过的大多数人一直认为这is_policy_checked实际上意味着当前密码符合当前密码策略,因此我认为在这里进行一些更改很重要,这样用户才能有正确的期望并理解这个标志并不一定意味着一切都很好。至少,应该更新文档以反映现实,就像我上面指出的那样。但也有其他事情可以做。 如果CHECK_POLICY = ON指定了,则可能会引发警告,但实际上无法检查该策略(因为密码是用哈希指定的,或者因为密码策略已被禁用,或者因为该命令是一个简单的绕过尝试或设置标志,例如ALTER LOGIN blat WITH CHECK_POLICY = ON;)。 CHECK_POLICY可能会被弃用,赞成,ACTIVELY_CHECK_POLICY也许CHECK_POLICY_ON_NEXT_CHANGE. 中的列sys.sql_logins应该是policy_has_been_checked和policy_will_be_checked。我没有嫁给这些名字,但它们比目前的措辞准确得多。 如果我选择ACTIVELY_CHECK_POLICY = ON并且在命令执行期间无法检查策略,我应该会收到一条错误消息并且标志不应该设置为1(甚至登录创建或密码更改不应该成功)。 我认为在这种情况下继续当前行为没有意义,我可以在其中指定我希望检查策略,但即使不能,也允许密码并创建/更改登录(这很糟糕,恕我直言,不管事后标志的状态如何 - 但至少如果它被设置为0,则可以识别这种绕过)。 今天,没有可靠的方法(无需手动将密码更改为您知道安全的密码)来审核您的 SQL 登录并确信它们都符合您的复杂性策略。在这个数据不断增长的时代,越来越多的数据泄露,显然需要越来越严格地保护系统,这是一个需要解决的问题。我已经写了一篇关于这个的博客并创建了一个关于它的 Connect 项目: 请帮我修复一个大的安全漏洞 CHECK_POLICY 是带有 CREATE LOGIN ... PASSWORD ... HASHED 的无操作 我鼓励您对 Connect 项目进行投票,更重要的是,请确保您不会在审核您的系统时对 DDL 选项和元数据的工作方式有错误的认识。 请不要将此视为“非问题”,因为您对它的工作方式非常满意,并且已经知道该标志是不可信的——您不是我担心的用户;是其他人。
##不。虽然文档目前对该标志的含义有以下可以说是模棱两可的陈述:
它真正的意思是,应该说,国旗有两个目的:
(请注意,“策略”还指强制到期以及用户必须在下次登录时更改密码这一事实,但由于复杂性通常是审计操作的重点,我将只关注这方面。 )
即使当时未检查策略,该
is_policy_checked
位也会在事件或事件期间设置为1
if 。正如您可能从上面收集到的那样,在这些情况下不会发生此检查:CHECK_POLICY = ON
CREATE LOGIN
ALTER LOGIN
HASHED
关键字指定密码(在服务器之间迁移登录名或将登录名复制到日志传送/镜像/AG 辅助服务器时非常常见的策略)。如果您没有预先散列的值,显然不可能检查密码的复杂性。ALTER LOGIN
不设置新密码,并且仍然更改标志(感谢@AMtwo 说明这一点)。我怀疑这可能是聪明人试图愚弄审计师所做的。这些问题都很容易证明。
由于与我交谈过的大多数人一直认为这
is_policy_checked
实际上意味着当前密码符合当前密码策略,因此我认为在这里进行一些更改很重要,这样用户才能有正确的期望并理解这个标志并不一定意味着一切都很好。至少,应该更新文档以反映现实,就像我上面指出的那样。但也有其他事情可以做。CHECK_POLICY = ON
指定了,则可能会引发警告,但实际上无法检查该策略(因为密码是用哈希指定的,或者因为密码策略已被禁用,或者因为该命令是一个简单的绕过尝试或设置标志,例如ALTER LOGIN blat WITH CHECK_POLICY = ON;
)。CHECK_POLICY
可能会被弃用,赞成,ACTIVELY_CHECK_POLICY
也许CHECK_POLICY_ON_NEXT_CHANGE
. 中的列sys.sql_logins
应该是policy_has_been_checked
和policy_will_be_checked
。我没有嫁给这些名字,但它们比目前的措辞准确得多。ACTIVELY_CHECK_POLICY = ON
并且在命令执行期间无法检查策略,我应该会收到一条错误消息并且标志不应该设置为1
(甚至登录创建或密码更改不应该成功)。0
,则可以识别这种绕过)。今天,没有可靠的方法(无需手动将密码更改为您知道安全的密码)来审核您的 SQL 登录并确信它们都符合您的复杂性策略。在这个数据不断增长的时代,越来越多的数据泄露,显然需要越来越严格地保护系统,这是一个需要解决的问题。我已经写了一篇关于这个的博客并创建了一个关于它的 Connect 项目:
我鼓励您对 Connect 项目进行投票,更重要的是,请确保您不会在审核您的系统时对 DDL 选项和元数据的工作方式有错误的认识。
请不要将此视为“非问题”,因为您对它的工作方式非常满意,并且已经知道该标志是不可信的——您不是我担心的用户;是其他人。