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加密算法、细化列级加密范围等。