欢迎光临重庆市中国转运网
详情描述
SQL Server 身份验证模式详解

1. 身份验证模式概述

SQL Server 支持两种身份验证模式:

1.1 Windows 身份验证模式

  • 使用 Windows 账户凭据
  • 无需单独管理 SQL Server 登录名
  • 更安全,支持 Kerberos 身份验证

1.2 混合模式 (SQL Server 和 Windows 身份验证)

  • 同时支持 Windows 身份验证和 SQL Server 身份验证
  • SQL Server 身份验证使用用户名/密码
  • 适合需要跨平台访问的场景

2. 设置身份验证模式的步骤

2.1 安装时设置

在 SQL Server 安装过程中选择身份验证模式:

  • 选择 "Windows 身份验证模式" 或 "混合模式"
  • 如果选择混合模式,需要为 sa 账户设置密码

2.2 安装后修改身份验证模式

方法1:使用 SQL Server Management Studio (SSMS)

连接到 SQL Server 实例 右键点击服务器 → 属性 选择 "安全性" 页 更改 "服务器身份验证" 重启 SQL Server 服务

方法2:使用 T-SQL

USE [master]
GO
EXEC xp_instance_regwrite 
    N'HKEY_LOCAL_MACHINE', 
    N'Software\Microsoft\MSSQLServer\MSSQLServer', 
    N'LoginMode', 
    REG_DWORD, 
    2  -- 2 表示混合模式,1 表示 Windows 身份验证
GO
-- 重启 SQL Server 服务使更改生效

3. 创建和管理 SQL Server 登录名

3.1 创建 SQL Server 登录名

-- 创建 SQL Server 登录名
CREATE LOGIN [TestUser] WITH PASSWORD = 'StrongPassword123!',
    DEFAULT_DATABASE = [master],
    CHECK_EXPIRATION = ON,
    CHECK_POLICY = ON

-- 创建带选项的登录名
CREATE LOGIN [AppUser] WITH PASSWORD = 'App@Pass123',
    DEFAULT_DATABASE = [YourDatabase],
    DEFAULT_LANGUAGE = [us_english],
    CHECK_EXPIRATION = OFF,
    CHECK_POLICY = OFF

3.2 修改登录名属性

-- 更改密码
ALTER LOGIN [TestUser] WITH PASSWORD = 'NewStrongPassword456!'

-- 启用/禁用登录名
ALTER LOGIN [TestUser] DISABLE
ALTER LOGIN [TestUser] ENABLE

-- 解锁被锁定的账户
ALTER LOGIN [TestUser] WITH CHECK_POLICY = OFF
ALTER LOGIN [TestUser] WITH CHECK_POLICY = ON

3.3 删除登录名

DROP LOGIN [TestUser]

4. 创建数据库用户并分配权限

USE [YourDatabase]
GO

-- 创建数据库用户
CREATE USER [TestUser] FOR LOGIN [TestUser]
GO

-- 分配角色
EXEC sp_addrolemember 'db_datareader', 'TestUser'
EXEC sp_addrolemember 'db_datawriter', 'TestUser'
GO

-- 授予特定权限
GRANT EXECUTE ON [dbo].[YourStoredProcedure] TO [TestUser]
GRANT SELECT ON [dbo].[YourTable] TO [TestUser]
GRANT INSERT, UPDATE ON [dbo].[AnotherTable] TO [TestUser]
GO

-- 拒绝权限
DENY DELETE ON [dbo].[SensitiveTable] TO [TestUser]
GO

5. 完整示例:设置混合模式并创建用户

5.1 启用混合模式(需要管理员权限)

-- 检查当前身份验证模式
SELECT 
    CASE SERVERPROPERTY('IsIntegratedSecurityOnly')
        WHEN 1 THEN 'Windows Authentication'
        WHEN 0 THEN 'Mixed Mode'
    END AS [Authentication Mode]

-- 启用混合模式(需要重启服务)
EXEC xp_instance_regwrite 
    N'HKEY_LOCAL_MACHINE', 
    N'Software\Microsoft\MSSQLServer\MSSQLServer', 
    N'LoginMode', 
    REG_DWORD, 
    2

5.2 完整的用户创建示例

-- 1. 创建登录名
CREATE LOGIN [WebAppUser] 
WITH PASSWORD = 'WebApp@Secure#2024',
    DEFAULT_DATABASE = [AppDatabase],
    DEFAULT_LANGUAGE = [us_english],
    CHECK_EXPIRATION = ON,
    CHECK_POLICY = ON

-- 2. 在特定数据库中创建用户
USE [AppDatabase]
GO

CREATE USER [WebAppUser] FOR LOGIN [WebAppUser]
GO

-- 3. 分配数据库角色
ALTER ROLE [db_datareader] ADD MEMBER [WebAppUser]
ALTER ROLE [db_datawriter] ADD MEMBER [WebAppUser]
ALTER ROLE [db_executor] ADD MEMBER [WebAppUser]  -- 如果存在此角色

-- 4. 授予额外权限
GRANT VIEW DEFINITION TO [WebAppUser]
GRANT EXECUTE TO [WebAppUser]
GO

-- 5. 创建架构并分配权限
CREATE SCHEMA [WebApp]
GO

ALTER USER [WebAppUser] WITH DEFAULT_SCHEMA = [WebApp]
GO

GRANT CONTROL ON SCHEMA::[WebApp] TO [WebAppUser]
GO

6. 连接字符串示例

6.1 SQL Server 身份验证连接字符串

// C# / .NET
string connectionString = "Server=YourServerName;Database=YourDatabase;User Id=TestUser;Password=StrongPassword123!;";

// 包含更多选项的连接字符串
string connString = @"Server=YourServerName\InstanceName;
                     Database=YourDatabase;
                     User Id=TestUser;
                     Password=StrongPassword123!;
                     MultipleActiveResultSets=True;
                     Connection Timeout=30;
                     Encrypt=True;
                     TrustServerCertificate=False";

6.2 Python 连接示例

import pyodbc

# SQL Server 身份验证
conn_str = (
    "Driver={SQL Server};"
    "Server=YourServerName;"
    "Database=YourDatabase;"
    "UID=TestUser;"
    "PWD=StrongPassword123!;"
)

conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

7. 安全最佳实践

7.1 密码策略

-- 强制密码策略(需要 Windows 密码策略)
CREATE LOGIN [SecureUser] WITH 
    PASSWORD = 'ComplexP@ssw0rd!2024',
    CHECK_POLICY = ON,
    CHECK_EXPIRATION = ON,
    MUST_CHANGE = ON  -- 首次登录时必须更改密码

7.2 定期维护脚本

-- 检查过期的登录名
SELECT 
    name,
    create_date,
    modify_date,
    is_expired,
    is_disabled
FROM sys.sql_logins
WHERE is_expired = 1 OR is_disabled = 1

-- 查找弱密码(空密码或简单密码)
SELECT name 
FROM sys.sql_logins 
WHERE PWDCOMPARE('', password_hash) = 1
   OR PWDCOMPARE(name, password_hash) = 1

7.3 备份登录名脚本

-- 生成创建登录名的脚本
SELECT 
    'CREATE LOGIN [' + name + '] ' +
    'WITH PASSWORD = 0x' + CONVERT(VARCHAR(MAX), password_hash, 2) + ' HASHED, ' +
    'SID = 0x' + CONVERT(VARCHAR(MAX), sid, 2) + ', ' +
    'DEFAULT_DATABASE = [' + default_database_name + '], ' +
    'DEFAULT_LANGUAGE = [' + default_language_name + '], ' +
    'CHECK_EXPIRATION = ' + 
        CASE is_expiration_checked WHEN 1 THEN 'ON' ELSE 'OFF' END + ', ' +
    'CHECK_POLICY = ' + 
        CASE is_policy_checked WHEN 1 THEN 'ON' ELSE 'OFF' END
FROM sys.sql_logins
WHERE name NOT IN ('sa', '##MS_PolicyEventProcessingLogin##', '##MS_PolicyTsqlExecutionLogin##')

8. 故障排除

8.1 常见问题及解决方案

-- 1. 无法连接到 SQL Server
-- 检查 SQL Server 是否正在运行
-- 检查 TCP/IP 协议是否启用
-- 检查防火墙设置

-- 2. 登录失败
-- 检查用户名和密码是否正确
-- 检查账户是否被禁用
SELECT name, is_disabled 
FROM sys.sql_logins 
WHERE name = 'YourLoginName'

-- 3. 重置 sa 密码
ALTER LOGIN sa WITH PASSWORD = 'NewSAPassword!'
ALTER LOGIN sa ENABLE

-- 4. 检查身份验证模式
EXEC xp_loginconfig 'login mode'

-- 5. 查看当前登录信息
SELECT 
    session_id,
    login_name,
    host_name,
    program_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1

总结

选择身份验证模式:根据安全需求选择 Windows 或混合模式 创建强密码:遵循密码策略,使用复杂密码 最小权限原则:只授予必要的权限 定期审计:检查登录名状态和权限 使用安全连接:在生产环境中启用加密连接

通过以上步骤和示例代码,您可以有效地配置和管理 SQL Server 的身份验证模式,确保数据库访问的安全性和可控性。