SQL Server 2012实施与管理实战指南摘要 - 第 7 章

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.
Kerberos builds on symmetric key cryptography and requires a trusted third party
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 Server2个机器上:可以用Pass Through(在SQL Server上创建与客户端一样的账号包括密码),但不安全。
·                Domain: 让客户端和SQL Server处于同一个domain中,另外还要有Domain ControllerDomain accounts 2种认证方式:NTLMKerberos
·                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 ServerIP地址和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 ServerLogin中添加一个‘<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 AuthenticationSQL 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 databasecollation一致,而不是和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 LoginContained Database User同名)
o        Contained SQL User – 登录数据库必须设置为Contained DatabaseSQL Server会先找Contained Database,后找Instance
o        Contained Windows User – 登录数据库依然必须设置为Contained DatabaseSQL 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的要求,(2SQL Server无法访问到指定的证书。
7.4.  小结 319