外观
Oracle 连接安全
连接安全概述
连接安全是指保护客户端与数据库服务器之间的连接,防止未授权访问、数据泄露和篡改。Oracle 提供了多种连接安全功能,包括网络加密、SSL/TLS 配置、防火墙设置、连接管理等。
连接安全的重要性
- 防止未授权访问:保护数据库免受未授权的连接尝试
- 防止数据泄露:保护传输过程中的数据不被截获和窃取
- 防止数据篡改:确保传输过程中的数据不被篡改
- 满足合规要求:如 GDPR、SOX 等合规要求
- 保护数据库服务器:防止恶意攻击和 DDoS 攻击
连接安全的挑战
- 复杂的网络环境:包括本地网络、云网络和混合网络
- 不断演变的威胁:如黑客攻击、中间人攻击、DDoS 攻击等
- 性能影响:连接安全措施可能会影响数据库性能
- 配置复杂性:连接安全配置较为复杂,需要专业知识
- 兼容性问题:不同版本的 Oracle 和客户端可能存在兼容性问题
网络加密
网络加密是指对客户端与数据库服务器之间传输的数据进行加密,防止数据在传输过程中被截获和窃取。Oracle 提供了透明数据加密(TDE)和网络加密两种加密机制。
1. 网络加密配置
Oracle 网络加密可以通过 SQL*Net 配置文件进行配置,包括 sqlnet.ora 和 listener.ora 文件。
服务器端配置(sqlnet.ora):
sql
-- 启用网络加密
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
-- 启用网络校验和
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA512, SHA384, SHA256)客户端配置(sqlnet.ora):
sql
-- 启用网络加密
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)
-- 启用网络校验和
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA512, SHA384, SHA256)listener.ora 配置:
sql
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
-- 配置加密和校验和
SSL_VERSION = 1.22. 网络加密算法
Oracle 支持多种网络加密算法,包括对称加密算法和非对称加密算法。
常用加密算法:
- 对称加密算法:AES128、AES192、AES256、3DES
- 非对称加密算法:RSA、DSA
- 哈希算法:SHA256、SHA384、SHA512
3. 网络加密验证
可以使用 Oracle 提供的工具验证网络加密是否配置成功。
验证网络加密:
sql
-- 查看网络加密状态
SELECT network_service_banner FROM v$session_connect_info WHERE sid = SYS_CONTEXT('USERENV', 'SID');
-- 查看加密算法
SELECT s.network_service_banner FROM v$session s, v$session_connect_info sci WHERE s.sid = sci.sid AND s.username = 'SCOTT';SSL/TLS 配置
SSL/TLS 是一种用于保护网络通信的协议,它可以验证服务器身份,加密客户端与服务器之间的数据传输。
1. SSL/TLS 证书管理
SSL/TLS 证书是 SSL/TLS 配置的核心,它包含服务器的公钥和身份信息。
创建 SSL/TLS 证书:
bash
# 创建自签名证书
openssl req -x509 -newkey rsa:4096 -keyout oracle.key -out oracle.crt -days 365 -nodes
# 将证书转换为 Oracle 格式
openssl pkcs12 -export -in oracle.crt -inkey oracle.key -out oracle.p12 -name oracle -passout pass:password
# 导入证书到 Oracle 钱包
orapki wallet create -wallet /u01/app/oracle/admin/orcl/wallet -pwd wallet_password -auto_login_local
orapki wallet add -wallet /u01/app/oracle/admin/orcl/wallet -pkcs12 oracle.p12 -pwd wallet_password2. SSL/TLS 配置
SSL/TLS 配置包括服务器端配置和客户端配置。
服务器端配置(sqlnet.ora):
sql
-- SSL/TLS 配置
WALLET_LOCATION = (SOURCE = (METHOD = FILE)(METHOD_DATA = (DIRECTORY = /u01/app/oracle/admin/orcl/wallet)))
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2listener.ora 配置:
sql
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = dbserver)(PORT = 2484))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
-- SSL/TLS 配置
WALLET_LOCATION = (SOURCE = (METHOD = FILE)(METHOD_DATA = (DIRECTORY = /u01/app/oracle/admin/orcl/wallet)))
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2客户端配置(tnsnames.ora):
sql
ORCL_SSL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = dbserver)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
(SECURITY =
(SSL_SERVER_CERT_DN = "CN=dbserver, OU=IT, O=Company, L=City, ST=State, C=Country")
)
)3. SSL/TLS 验证
可以使用 Oracle 提供的工具验证 SSL/TLS 是否配置成功。
验证 SSL/TLS 配置:
bash
# 使用 SQL*Plus 连接(SSL/TLS)
sqlplus scott/tiger@orcl_ssl
# 查看 SSL/TLS 连接状态
SELECT sys_context('USERENV', 'NETWORK_PROTOCOL') AS protocol,
sys_context('USERENV', 'SESSION_ID') AS session_id,
sys_context('USERENV', 'SSL_VERSION') AS ssl_version,
sys_context('USERENV', 'SSL_CIPHER') AS ssl_cipher
FROM dual;防火墙设置
防火墙是保护数据库服务器的重要手段,它可以限制对数据库服务器的访问,防止未授权的连接尝试。
1. 服务器端防火墙设置
服务器端防火墙设置包括操作系统防火墙和网络防火墙。
Linux 防火墙设置(iptables):
bash
# 允许 Oracle 监听端口 1521
iptables -A INPUT -p tcp --dport 1521 -j ACCEPT
# 允许 SSL/TLS 端口 2484
iptables -A INPUT -p tcp --dport 2484 -j ACCEPT
# 允许特定 IP 访问
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 1521 -j ACCEPT
# 保存防火墙规则
service iptables saveWindows 防火墙设置:
- 打开 "Windows Defender 防火墙" 控制面板
- 点击 "高级设置"
- 点击 "入站规则",然后点击 "新建规则"
- 选择 "端口",点击 "下一步"
- 选择 "TCP",然后在 "特定本地端口" 中输入 "1521,2484"
- 选择 "允许连接",点击 "下一步"
- 选择适用的网络类型,点击 "下一步"
- 输入规则名称,点击 "完成"
2. 客户端防火墙设置
客户端防火墙设置包括操作系统防火墙和网络防火墙,需要允许客户端连接到数据库服务器的监听端口。
客户端防火墙设置:
- 允许客户端连接到数据库服务器的 1521 端口(TCP)
- 允许客户端连接到数据库服务器的 2484 端口(TCP,用于 SSL/TLS)
- 允许客户端使用 Oracle 客户端工具(如 SQL*Plus、SQL Developer)
3. 云环境防火墙设置
在云环境中,需要使用云服务提供商的防火墙服务,如 Oracle Cloud Security Lists、AWS Security Groups、Azure Network Security Groups 等。
Oracle Cloud Security Lists 配置:
- 登录 Oracle Cloud Console
- 导航到 "网络" > "虚拟云网络"
- 选择相应的 VCN
- 导航到 "安全列表"
- 选择相应的安全列表
- 添加入站规则:
- 源 CIDR:客户端 IP 地址或 CIDR 范围
- 协议:TCP
- 目标端口范围:1521,2484
- 操作:允许
连接管理
连接管理是指管理客户端与数据库服务器之间的连接,包括连接池配置、连接限制、连接超时等。
1. 连接池配置
连接池是管理数据库连接的重要手段,它可以提高连接复用率,减少连接建立和关闭的开销。
Oracle 连接池配置:
- Oracle Connection Pool:Oracle 提供的连接池实现
- WebLogic Connection Pool:WebLogic 服务器的连接池实现
- Tomcat Connection Pool:Tomcat 服务器的连接池实现
- HikariCP:高性能的第三方连接池实现
HikariCP 配置示例:
properties
# HikariCP 配置
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL2. 连接限制
连接限制是指限制客户端与数据库服务器之间的连接数量,防止过多的连接导致服务器资源耗尽。
Oracle 连接限制配置:
sql
-- 查看当前连接数
SELECT COUNT(*) FROM v$session;
-- 查看最大连接数
SELECT value FROM v$parameter WHERE name = 'processes';
-- 修改最大连接数
ALTER SYSTEM SET processes=300 SCOPE=SPFILE;
ALTER SYSTEM SET sessions=335 SCOPE=SPFILE;
-- 重启数据库使配置生效
SHUTDOWN IMMEDIATE;
STARTUP;3. 连接超时
连接超时是指设置连接的超时时间,防止连接长时间占用资源。
Oracle 连接超时配置:
sql
-- 设置空闲连接超时
ALTER SYSTEM SET resource_limit=TRUE;
-- 创建资源配置文件
CREATE PROFILE app_user_profile LIMIT
IDLE_TIME 30
CONNECT_TIME 180
SESSIONS_PER_USER 5
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
COMPOSITE_LIMIT UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 5
PASSWORD_VERIFY_FUNCTION NULL
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7;
-- 分配资源配置文件给用户
ALTER USER scott PROFILE app_user_profile;密码策略
密码策略是指设置用户密码的复杂性、过期时间、锁定时间等,防止弱密码和密码泄露。
1. 密码复杂性验证
密码复杂性验证是指要求用户密码满足一定的复杂性要求,如长度、大小写字母、数字、特殊字符等。
密码复杂性验证配置:
sql
-- 启用密码复杂性验证
ALTER SYSTEM SET resource_limit=TRUE;
-- 创建密码验证函数
CREATE OR REPLACE FUNCTION verify_password(
username VARCHAR2,
password VARCHAR2,
old_password VARCHAR2
) RETURN BOOLEAN IS
min_length NUMBER := 8;
has_uppercase BOOLEAN := FALSE;
has_lowercase BOOLEAN := FALSE;
has_digit BOOLEAN := FALSE;
has_special BOOLEAN := FALSE;
BEGIN
-- 检查密码长度
IF LENGTH(password) < min_length THEN
RETURN FALSE;
END IF;
-- 检查密码复杂性
FOR i IN 1..LENGTH(password) LOOP
IF REGEXP_LIKE(SUBSTR(password, i, 1), '[A-Z]') THEN
has_uppercase := TRUE;
ELSIF REGEXP_LIKE(SUBSTR(password, i, 1), '[a-z]') THEN
has_lowercase := TRUE;
ELSIF REGEXP_LIKE(SUBSTR(password, i, 1), '[0-9]') THEN
has_digit := TRUE;
ELSIF REGEXP_LIKE(SUBSTR(password, i, 1), '[^a-zA-Z0-9]') THEN
has_special := TRUE;
END IF;
END LOOP;
-- 要求至少包含 uppercase, lowercase, digit, special 中的三种
IF (has_uppercase + has_lowercase + has_digit + has_special) >= 3 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
/
-- 创建资源配置文件,使用密码验证函数
CREATE PROFILE strong_password_profile LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 5
PASSWORD_VERIFY_FUNCTION verify_password
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7;
-- 分配资源配置文件给用户
ALTER USER scott PROFILE strong_password_profile;2. 密码过期和锁定
密码过期和锁定是指设置密码的过期时间和锁定时间,防止密码长期不变和暴力破解。
密码过期和锁定配置:
sql
-- 设置密码过期时间为 90 天
ALTER PROFILE default LIMIT PASSWORD_LIFE_TIME 90;
-- 设置密码锁定时间为 1 天
ALTER PROFILE default LIMIT PASSWORD_LOCK_TIME 1;
-- 设置密码宽限期为 7 天
ALTER PROFILE default LIMIT PASSWORD_GRACE_TIME 7;
-- 设置失败登录尝试次数为 5 次
ALTER PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 5;3. 密码重用限制
密码重用限制是指限制用户重用之前使用过的密码,防止密码循环使用。
密码重用限制配置:
sql
-- 设置密码重用时间为 365 天
ALTER PROFILE default LIMIT PASSWORD_REUSE_TIME 365;
-- 设置密码重用次数为 5 次
ALTER PROFILE default LIMIT PASSWORD_REUSE_MAX 5;连接安全最佳实践
1. 设计阶段
- 设计安全的网络架构:采用分层网络架构,如 DMZ、内部网络等
- 选择合适的加密算法:如 AES256、SHA512 等
- 设计合理的连接池配置:根据业务需求配置连接池大小、超时时间等
- 设计合理的密码策略:根据合规要求设置密码复杂性、过期时间等
2. 开发阶段
- 使用 SSL/TLS 连接:在应用程序中使用 SSL/TLS 连接数据库
- 使用连接池:在应用程序中使用连接池管理数据库连接
- 实现连接重试机制:在应用程序中实现连接重试机制,提高可用性
- 记录连接事件:在应用程序中记录连接事件,便于审计和追溯
3. 运维阶段
- 定期更新 SSL/TLS 证书:定期更新 SSL/TLS 证书,防止证书过期
- 定期审查连接配置:定期审查连接配置,确保符合安全要求
- 监控连接状态:监控数据库连接状态,及时发现异常连接
- 定期更新密码:定期更新数据库用户密码,防止密码泄露
- 限制连接来源:限制只有授权的 IP 地址才能连接到数据库
4. 版本差异处理
Oracle 11g 及以下版本:
- 网络加密配置较为基础,支持 AES128、3DES 等加密算法
- SSL/TLS 支持较为基础,支持 SSL 3.0、TLS 1.0
- 连接管理功能较为基础,需要手动配置
Oracle 12c 及以上版本:
- 增强了网络加密功能,支持 AES256、SHA256 等加密算法
- 增强了 SSL/TLS 支持,支持 TLS 1.2、TLS 1.3
- 增强了连接管理功能,支持自动连接池、连接超时等
Oracle 19c 及以上版本:
- 增强了安全功能,如透明数据加密的自动密钥轮换
- 支持云环境的连接安全,如 Oracle Autonomous Database 的安全模型
- 支持机器学习驱动的连接安全
5. 云环境连接安全
- 使用云服务提供商的安全服务:如 Oracle Cloud Security、AWS KMS、Azure Key Vault 等
- 使用云服务提供商的 VPN 服务:如 Oracle Cloud VPN、AWS VPN、Azure VPN 等
- 使用云服务提供商的防火墙服务:如 Oracle Cloud Security Lists、AWS Security Groups、Azure Network Security Groups 等
- 加密云环境中的数据传输:使用 SSL/TLS 加密云环境中的数据传输
常见问题(FAQ)
1. 如何选择合适的网络加密算法?
根据业务需求和合规要求选择合适的网络加密算法:
- AES128:适用于一般安全需求
- AES256:适用于高安全需求,如金融、医疗等行业
- SHA256/SHA512:适用于数据完整性验证
2. 如何配置 SSL/TLS 连接?
配置 SSL/TLS 连接需要以下步骤:
- 创建 SSL/TLS 证书
- 配置服务器端 SSL/TLS
- 配置客户端 SSL/TLS
- 验证 SSL/TLS 连接
3. 如何限制数据库连接数?
可以通过以下方法限制数据库连接数:
- 修改 processes 参数
- 修改 sessions 参数
- 使用资源配置文件限制用户的并发会话数
4. 如何防止弱密码?
可以通过以下方法防止弱密码:
- 启用密码复杂性验证
- 设置密码长度要求
- 要求密码包含大小写字母、数字、特殊字符
- 定期更新密码
5. 如何监控数据库连接?
可以使用以下方法监控数据库连接:
- 查询 v$session 视图
- 使用 Oracle Enterprise Manager(OEM)
- 使用第三方监控工具,如 Prometheus、Grafana 等
6. 如何处理连接泄露?
连接泄露是指应用程序没有正确关闭数据库连接,导致连接池耗尽。处理连接泄露的方法:
- 检查应用程序代码,确保正确关闭连接
- 配置连接池的超时时间
- 使用连接池监控工具,如 HikariCP 监控
7. 如何防止 DDoS 攻击?
可以通过以下方法防止 DDoS 攻击:
- 配置防火墙,限制连接来源
- 配置连接限制,限制并发连接数
- 使用 DDoS 防护服务,如 Oracle Cloud DDoS Protection、AWS Shield 等
8. 如何配置连接池?
配置连接池需要考虑以下因素:
- 连接池大小:根据业务需求和服务器资源配置
- 连接超时时间:根据业务需求配置
- 空闲连接超时时间:根据业务需求配置
- 连接验证机制:如 SELECT 1 FROM DUAL
9. 如何在云环境中配置连接安全?
在云环境中配置连接安全需要:
- 使用云服务提供商的安全服务
- 配置云环境防火墙
- 使用 SSL/TLS 连接
- 配置云环境的连接限制
10. 如何平衡连接安全和性能?
可以通过以下方法平衡连接安全和性能:
- 选择高性能的加密算法
- 优化连接池配置
- 合理配置网络加密参数
- 定期测试性能,进行必要的优化
总结
Oracle 连接安全是数据库安全的重要组成部分,它包括网络加密、SSL/TLS 配置、防火墙设置、连接管理、密码策略等多个方面。Oracle 提供了多种连接安全功能,可以满足不同场景的安全需求。
在实施连接安全时,应该遵循最佳实践,包括设计阶段的安全网络架构设计、加密算法选择、连接池配置设计等;开发阶段的 SSL/TLS 连接使用、连接池使用、连接重试机制实现等;运维阶段的 SSL/TLS 证书更新、连接配置审查、连接状态监控等。
不同版本的 Oracle 和云环境中的连接安全配置存在差异,需要根据实际情况选择合适的配置方式。通过合理的规划和实施连接安全策略,可以保护数据库免受未授权访问、数据泄露和篡改,提高数据库的安全性和可靠性。
