第7章 身份认证与连接加密
272
·
SQL
Authentication – Admin can change the password, but cannot see the old one.
·
Windows
Authentication
o
NTLM
– 简单、有限
NT
LAN Manager (NTLM) is a suite of Microsoft security protocols that provides authentication,
integrity, and confidentiality to users。
o
Kerberos
– 但并非所有的SQL Server都能支持Kerberos。
Kerberos is a computer network authentication protocol which works on the basis of 'tickets' to allow nodes communicating over a
non-secure network to prove their identity to one another in a secure manner.
Its designers aimed it primarily at a client–server model and it
provides mutual
authentication—both the user and
the server verify each other's identity.
7.1. SQL Server的认证方式 273
7.1.1.
SQL
Server认证模式和密码管理 273
·
Find
all SQL Logins: SELECT * FROM sys.sql_logins
·
密码复杂性策略
·
密码过期策略
7.1.2.
windows认证模式 274
·
客户端和SQL
Server在同一机器上:使用本机账号
·
客户端和SQL
Server在2个机器上:可以用Pass
Through(在SQL Server上创建与客户端一样的账号包括密码),但不安全。
·
Domain:
让客户端和SQL Server处于同一个domain中,另外还要有Domain Controller。Domain accounts 有2种认证方式:NTLM和Kerberos。
·
NTLM: Challenge Response 模式
·
Kerberos –
the Trusted Third-Party架构 (the
Authentication Server)
o
要求
ü
客户端和服务器一定要加入Domain,如在2个不同的Domains中,2个域要存在Trusted
Relationship.
ü
要为SQL Server的服务注册一个SPN
ü
网络协议 – SQL Server 2000/2005客户端必须使用TCP/IP才能使用Kerberos.
o
优点
ü
安全
ü
有些必须要用Kerberos
ü
NTLM只支持单跃点 (Single Hop, one server, one client), Kerberos再次或多次认证。
·
那SQL Server 中的Windows认证到底是用了NTLM还是Kerberos?
o
受许多因素影响,大家协商。从Win Server 2003开始,Kerberos优先。
o
SQL Server 2000/2005
ü
在Win Server 2003/2008上,无论使用什么协议,做本地连接时,都会使用NTLM。
ü
用Named Pipes时,总是用NTLM
ü
如果服务器的SPN(Server
Principal Name)被正确注册,使用TCP/IP来做远程连接,会使用Kerberos。
ü
如找不到SPN,即使是TCP/IP连接,也还是使用NTLM。
ü
当局域中存在错误的SPN时,认证失败,NTLM也用不了。
o
SQL Server 2008+
ü
如果服务器的SPN被正确注册,本地连接用NTLM,而远程连接会用Kerberos,不管什么协议。
ü
如找不到SPN,就使用NTLM。
ü
当局域中存在错误的SPN时,认证失败。
o
如何让SQL Server使用Kerberos认证?
ü
客户端和SQL Server必须在一个Domain或可信域中。
ü
如果SQL Server的版本是2000/2005, 客户端必须用TCP协议。
ü
Domain Controller上,
有且只有一个由SQL Server当前的账号注册的SPN。
ü
客户端要能够正确得到SQL Server的IP地址和FQDN/Netbios(长名和短名),网络上的DNS功能要有效才行。
7.1.3.
常见认证问题
286
·
“Login
Failed for user ‘NT Authority\ANONYMOUS’ LOGON”- 在SQL Server的服务账户下手工注册SPN,使得Kerberos可以正常工作
·
“Login
Failed for user ‘’,the
user is not associated with a trusted SQL Server connection”-如客户端是一个本机用户,在服务器上创建一个同名同密码的本机账户,如客户端是一个域用户,要么建立一个正确的SPN,使Kerberos能成功,要么引导客户端用NTLM来连接SQL
Server.
·
‘Could
not open a connection to SQL Server [1326]” – same as above, but occurred on
Named Pipe, instead of TCP.
·
‘Login
failed for user ‘<domain>\<machinename>$’- 在SQL Server的Login中添加一个‘<domain>\<machinename>$账号。
·
Cannot
generate SSPI Context – 说明Kerberos认证失败了,原因的可能性很多。See KB811889.
·
Login
failed for user <username> - 权限问题,Error: 18456,可以根据State来寻求方法。
ERROR STATE |
ERROR DESCRIPTION |
State 2 and State 5 |
Invalid userid |
State 6 |
Attempt to use a Windows login name with SQL Authentication |
State 7 |
Login disabled and password mismatch |
State 8 |
Password mismatch |
State 9 |
Invalid password |
State 11 and State 12 |
Valid login but server access failure |
State 13 |
SQL Server service paused |
State 18 |
Change password required |
7.1.4.
delegation的配置要求 288
·
在双跃点或多跃点认证中,涉及多台机器,需要中间机器做代理(Delegation)的时候,使用Kerberos认证只是其中的要求之一。管理员还要在Domain Controller上做一些其它配置。
·
具体例子和步骤见pp.289-295
7.2. 包含数据库认证 295
·
2要素: Contained Database and Contained Database
User
·
依旧使用Windows
Authentication或SQL Server
Authentication, 只是在验证后,
该账号直接转为Database User,而不需要建立相应的Login。
7.2.2.
创建包含数据库
296
·
开启实例的Contained
Database功能
·
创建Contained
Database
·
创建Contained
Database User:
o
SQL User
with Password
o
Windows User
·
Migrate an
existing database to a contained database
要将一个数据库更改为Contained database,首先你需要在数据库的属性页中将Containment Type改为Partial。其次你要将数据库用户转换为Contained database user,并且需要将数据库用户对应的登录名都禁用掉。你可以使用以下脚本禁用这些登录名。
DECLARE @username sysname;
DECLARE user_cursor CURSOR
FOR
SELECT dp.name
FROM sys.database_principals
AS dp
JOIN
sys.server_principals AS
sp ON dp.sid = sp.sid
WHERE dp.authentication_type
= 1
AND
sp.is_disabled =
0;
OPEN user_cursor
FETCH NEXT FROM
user_cursor INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE sp_migrate_user_to_contained @username =
@username,
@rename = N'keep_name', @disablelogin = N'disable_login';
FETCH
NEXT FROM
user_cursor INTO @username
END
CLOSE user_cursor;
DEALLOCATE user_cursor;
7.2.3.
使用包含数据库认证
299
·
使用包含数据库认证的User来登录,登录数据库必须是Contained
Database
·
登录后只能看到那个Contained
Database.
·
Connection
string 中,用initial
catalog=ContainedDBA
·
SQLCMD时, 用-d
·
其它优点:
o
Contained Database除了能够使得认证过程“跳过”登录名这个对象之外,还带来了一些其它的好处。比如说,使用了Contained Database,你就不用担心数据库的collation和系统数据库的collation不一致的问题了。
o
独立的临时表顺序 - 当你对于Contained database进行的SQL操作时,如果产生了临时表的话,临时表的collation全部是和Contained database的collation一致,而不是和tempdb一致。
o
独立的Catalog Collation – SQL
Server2012还引入了一个新的概念叫做 Catalog collation,并且所有的Contained database都使用同一种Catalog Collation - Latin1_General_100_CI_AS_WS_KS_SC。这种Catalog collation被用于Contained database中各种对象的元数据。
7.2.4.
包含数据库认证的安全须知 303
·
任何拥有ALTER
ANY USER的用户都能创建Contained
Database User, Sysadmin要随时监控Contained Database Users
·
在Contained
Database下创建的临时表,还是在tempdb中。即使你将当前数据库切换到其它数据库,该临时表还可用。
·
Contained
Database User可以使用Guest身份来访问其它数据库。
·
重复的登录名(SQL
Server Login和Contained Database
User同名)
o
Contained
SQL User – 登录数据库必须设置为Contained
Database,SQL Server会先找Contained Database,后找Instance
o
Contained
Windows User – 登录数据库依然必须设置为Contained
Database,SQL Server会先找Instance,后找Contained Database。
·
尽可能使用Windows
User – 可以使用Kerberos,利用Windows功能如密码策略等。
·
确保数据库的AUTO_CLOSE不是打开的,这样在大量恶意连接请求的情况下,SQL Server就不会不断地打开和关闭,从而减少DoS攻击的机会。
7.3. 连接加密和证书 305
7.3.1.
SQL
Server的连接加密 306
·
2个阶段:连接时对User Name和密码加密;连接建立后对传输数据的加密。
·
建立连接阶段的加密
o
始于三次握手,终于连接建立。
o
2005+, always
o
Use
self-generated certificate
·
数据传输阶段的加密
o
By
default, no encryption, but can be changed in SQL Server Configuration Manager
or the SQL Server Client Connection Utility in MDAC. You can also set
Encrypt=Yes in connection string.
o
By
default, also uses the self-generated certificate.
o
服务器端加密如Yes,而客户端无法进行TLS/SSL加密,该客户端就无法连接到SQL Server. 服务器端加密如No,数据传输是否被加密则取决于客户端的加密设置。
o
尽管服务器端和客户端都可以加密,但不建议同时开启。
o
如果客户端要求加密数据传输,客户端必须信任服务器证书。你可以:
ü
将服务器证书的根证书安装在客户端(KB316898),或者
ü
如果服务器证书是自签名(颁布者和授予者一致),可以直接将服务器证书安装到Trusted Root Certificate Authority文件夹中。
ü
但SQL Server自我生成的证书既无根证书也无法在操作系统的Certificate Store中找到,因此,如果你打开了客户端的加密选项,客户端就无法信任服务器的证书而导致失败。那怎么办?
Ø
方法一:手动为SQL Server配置证书(见下)
Ø
方法二:当客户端驱动是Native
Client时。可在SQL Server Configuration Manager中将Trust Server
Certificate设置为Yes,这样客户端就会始终信任服务器证书,而不会去实际验证。
Ø
方法三:在Connection
String中设置TrustServerCertificate=Yes (应用程序使用的要求是Native Client 驱动)
7.3.2.
使用证书来加密SQL
Server连接 313
·
安装证书
- 首先在SQL Server服务器的Certificate Store中安装证书 – import 证书。
·
配置证书
- 配置SQL Server让它使用你要用的证书 – 建议手动修改Certificate注册表键值。
·
故障排查 – 证书问题导致SQL Server无法启动:一般是由于手动配置过证书造成,因为自签名一般不会造成启动问题。查看ErrorLog。原因一般为:(1)证书不符合SQL
Server的要求,(2)SQL
Server无法访问到指定的证书。
7.4. 小结 319