Ubuntu上SQL Server安全设置指南
安装SQL Server
首先导入Microsoft GPG密钥并注册Ubuntu存储库,然后安装SQL Server:
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
sudo add-apt-repository "deb [arch=amd64,arm64] https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/mssql-server-2022 main"
sudo apt-get update
sudo apt-get install -y mssql-server
初始化配置
运行mssql-conf setup设置SA账户密码(需符合复杂度要求,如包含大小写字母、数字和特殊字符)及版本(Developer/Enterprise/Standard),并启用SQL Server代理:
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
sudo systemctl restart mssql-server
更改数据/日志目录
将默认数据、日志目录迁移至非系统分区(如/home/d/mssql/data),提升数据隔离性与安全性:
sudo mkdir -p /home/d/mssql/data
sudo chown -R mssql:mssql /home/d/mssql/data
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /home/d/mssql/data
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /home/d/mssql/data
配置防火墙
使用UFW开放SQL Server默认端口(1433),限制仅允许可信IP访问:
sudo apt-get install ufw
sudo ufw allow from <trusted_ip> to any port 1433/tcp
sudo ufw enable
sudo ufw status # 验证规则是否生效
修改默认端口
通过mssql-conf修改TCP端口(如27777),降低端口扫描攻击风险:
sudo /opt/mssql/bin/mssql-conf set network.tcpport 27777
sudo systemctl restart mssql-server
限制远程连接
在SQL Server配置管理器中(需通过SSH隧道访问),禁用不必要的网络协议(如Named Pipes、VIA),仅保留TCP/IP;在“TCP/IP属性”→“IP地址”选项卡中,将非必需IP的“活动”设为“No”。
禁用SA默认登录(可选)
若无需SQL Server身份验证,可通过以下命令禁用SA账户:
ALTER LOGIN sa DISABLE;
创建专用数据库用户
使用sqlcmd工具创建登录名、数据库用户,并分配最小必要权限(如db_datareader、db_datawriter):
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "
CREATE LOGIN AppUser WITH PASSWORD = 'ComplexPassword123!';
USE YourDatabase;
CREATE USER AppUser FOR LOGIN AppUser;
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;"
实施最小权限原则
避免为用户分配sysadmin等高权限角色;若需特定操作(如备份),仅授予对应权限:
GRANT BACKUP DATABASE TO BackupOperator;
REVOKE EXECUTE ON sp_configure FROM PUBLIC; -- 禁止普通用户修改服务器配置
启用密码策略
强制SA及其他登录名使用复杂密码,并设置密码过期时间:
EXEC sp_configure 'password policy', 1; -- 启用密码策略
EXEC sp_configure 'password expiration', 1; -- 启用密码过期
RECONFIGURE;
透明数据加密(TDE)
TDE加密整个数据库文件(包括数据、日志、备份),防止磁盘窃取导致的数据泄露:
-- 创建主密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MasterKeyPassword123!';
-- 创建证书
CREATE CERTIFICATE TDECert WITH SUBJECT = 'TDE Certificate';
-- 创建数据库加密密钥
USE YourDatabase;
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE TDECert;
-- 启用TDE
ALTER DATABASE YourDatabase SET ENCRYPTION ON;
列级加密
对敏感字段(如身份证号、银行卡号)进行列级加密,确保数据在存储和传输中的机密性:
-- 创建对称密钥
CREATE SYMMETRIC KEY CreditCardKey WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE TDECert;
-- 加密数据
OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE TDECert;
UPDATE Customers SET CreditCardNumber = EncryptByKey(Key_GUID('CreditCardKey'), CreditCardNumber);
-- 解密数据(查询时使用)
SELECT CreditCardNumber, CONVERT(varchar, DecryptByKey(CreditCardNumber)) AS DecryptedCard
FROM Customers;
启用登录审核
记录所有登录尝试(成功/失败),便于追踪异常行为:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'login auditing', 3; -- 0=无审核,1=失败,2=成功,3=全部
RECONFIGURE;
定期审查权限
定期检查数据库用户权限,删除未使用的账户:
-- 查看所有数据库用户及其角色
SELECT dp.name AS UserName, rp.name AS RoleName
FROM sys.database_role_members drm
JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id
JOIN sys.database_principals rp ON drm.role_principal_id = rp.principal_id
WHERE dp.type = 'S'; -- 仅显示SQL用户
-- 删除未使用的用户
DROP USER UnusedUser;
定期更新
及时更新SQL Server及Ubuntu系统,修复已知安全漏洞:
sudo apt-get update
sudo apt-get upgrade -y
sudo /opt/mssql/bin/mssql-conf update # 更新SQL Server
备份策略
使用sqlcmd或自动化工具(如cron)定期备份数据库,并测试恢复流程:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "
BACKUP DATABASE YourDatabase TO DISK = '/home/d/mssql/backups/YourDatabase_$(date +%F).bak' WITH INIT;"
通过以上步骤,可全面提升Ubuntu上SQL Server的安全性,覆盖从基础环境到数据保护的全流程。需根据实际业务需求调整配置,如调整TDE加密算法、细化列级加密范围等。