创建SQL Server 身份验证登陆账户

SQL Server中共有四种类型的登陆名:

  • SQL Server 身份验证登录名

  • Windows 身份验证登录名

  • 证书映射登录名

  • 非对称密钥映射登录名

本文主要描述常用的SQL Server 身份验证登录名的创建方式及相关内容。

 

创建SQL Server 身份验证登陆名

 

创建SQL Server身份验证登陆名有两种赋予密码的方式

  1. 以字符串作为密码,这种情形适用于创建一个全新的SQL Server身份验证登陆名。

  2. 使用hash密码,这通常用于数据库服务器升级换代,需要将登陆名转移到新服务器(新实例)上,并保持SQL Server登陆密码一致的情形下使用。

以字符串作为密码

在SSMS中,在服务器安全性下,右击登陆名,选择新建登陆名,弹出“登录名-新建”窗口,如下:

填入登陆名称,选择SQL Server 身份验证方式,输入密码并确认,“强制实施密码策略”、“强制密码过期”、“用户在下次登陆时必须修改密码”三个多选框,勾选表示开启,最后选择默认数据库和默认语言,填写完毕,点击确定,即可以完成SQL Server登陆账户创建。当然,你也可以选择上方“脚本”选项,生成创建SQL Server登陆账户的脚本,具体如下:

--创建SQL Server 登录名
USE master;
go
CREATE LOGIN loginName WITH password='ddA12*,j'
       must_change   --首次登陆需要修改密码,指定此选项check_policy、check_expiration均必须为on
       ,check_policy=ON
       ,check_expiration = ON --启动过期选项,则check_policy必须启动
       ,default_database=master
       ,default_language=简体中文; --不加此选项,则默认服务器的默认语言
       --查看实例当前默认语言
       --select @@LANGUAGE

当然上面的脚本不是直接生成的,增加了一些注释等,算是一个创建SQL Server身份验证登陆账户的样例。

注意:

  • CREATE LOGIN 创建一个登陆账户,并赋予其CONNECT SQL 权限

  • SQL Server登陆名能够使用,要保证

    • 数据库引擎要开启“SQL Server 和 Windows身份验证模式(S)”

    • 登陆账户有CONNECT SQL 权限

    • 登陆账户已经启用

    • 有数据库的对应权限(如果要访问具体数据库的话,在数据库上创建用户,并赋予其对应权限)

  • 生产环境中,检查登陆名过期选项通常是关闭的(即设定 check_expiration=off )。因为一旦我们忘记修改登陆账户,将会导致业务不能正常运行,而遭受不必要的损失。通常的做法是设定check_expiration=off,而选择定期更换账户名和密码,以保障数据库的安全。开启这个选项可以应用于给工作人员开启的临时账户,这样即使忘记回收,一旦账户过期,系统会帮我们自动回收,增加了一重安全性。

  • 密码是区分大小写的。密码应始终至少包含八个字符,并且不能超过 128 个字符。密码可以包含 a-z、A-Z、0-9 和大多数非字母数字字符。密码不能包含单引号或 login_name 。如果check_policy=on, Windows 策略要求强密码,密码必须至少包含以下四个特点中的三个:

    • * 大写字符 (A-Z)。

    • * 小写字符 (a-z)。

    • * 数字 (0-9)。

    • * 一个非字母数字字符,如空格、_、@、*、^、%、!、$、# 或 &。有些字符前端代码不能识别,要和开发人员确定不能识别的字符。

      密码可用使用随机密码生成器,一方面可用减少设置密码的工作量;另一方面可以消除个人设置密码字母数字的选择习惯,增加安全性。

       设置过期(check_expiration=on)的SQL Server 登陆账户,最好建立作业,提前一段时间(如提前一周)通知用户账户过期( 默认过期时间为42天)。可以通过如下脚本查看账户过期时间:

DECLARE @login nvarchar(30)
-- 查询设定密码过期的登陆账号
SELECT @login = name
FROM sys.sql_logins
WHERE is_expiration_checked = 1
      and name = 'dev_temp'
-- 计算登录账户密码已使用天数
SELECT @login AS 'login',
       DATEDIFF(d,
                CAST(LOGINPROPERTY(@login,
                                   'PasswordLastSetTime') AS datetime),
                GETDATE()) AS 'pwd_using_days'
-- 计算密码到期之前的剩余天数
SELECT LOGINPROPERTY(@login, 'DaysUntilExpiration') AS 'days_until_expiration'

hash密码

现在我们使用刚刚创建的账户的hash密码,给出一个使用hash密码创建SQL Server登陆账户的样例,脚本如下:

--查询账户密码的hash值及sid值
SELECT
       password_hash,sid
FROM sys.sql_logins
WHERE name='loginName';
--保存上面查询结果中password_hash及sid的值,删除登陆名
--使用上面的hash密码及SID进行SQL Server账户创建
CREATE LOGIN [loginName]
WITH PASSWORD=0x0200BE90BF0443B2C9D36F47B05BB1C065DD43396C35149B4567981897C5E931AC1CA5522C5079C7EF776C30FEA153B8A7E237327001C09EDB503BDB647D2538F139E19D308A HASHED
       ,SID=0x1843B3D8339FF94E8F06DFB0A18BC273
       , DEFAULT_DATABASE=[master]
       , DEFAULT_LANGUAGE=[简体中文]
       , CHECK_EXPIRATION=ON
       , CHECK_POLICY=ON;
GO

注意:hash密码只能用来创建SQL Server身份验证账户,其他三种形式账户不能使用。SID值在一个实例中是唯一的,如果有重复,会报错,那么修改SID值即可。当然我们也最好不适应SID 选项,这样系统会自动分配唯一SID值给创建登陆名。

总结:本文给出了创建SQL Server登陆验证的登陆名的两种方式及应用场景,后续我们将陆续给出SQL Server登陆账户权限赋予及管理等,敬请期待……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章