Skip to content

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.2

2. 网络加密算法

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_password

2. 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.2

listener.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 save

Windows 防火墙设置

  1. 打开 "Windows Defender 防火墙" 控制面板
  2. 点击 "高级设置"
  3. 点击 "入站规则",然后点击 "新建规则"
  4. 选择 "端口",点击 "下一步"
  5. 选择 "TCP",然后在 "特定本地端口" 中输入 "1521,2484"
  6. 选择 "允许连接",点击 "下一步"
  7. 选择适用的网络类型,点击 "下一步"
  8. 输入规则名称,点击 "完成"

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 配置

  1. 登录 Oracle Cloud Console
  2. 导航到 "网络" > "虚拟云网络"
  3. 选择相应的 VCN
  4. 导航到 "安全列表"
  5. 选择相应的安全列表
  6. 添加入站规则:
    • 源 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 DUAL

2. 连接限制

连接限制是指限制客户端与数据库服务器之间的连接数量,防止过多的连接导致服务器资源耗尽。

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 和云环境中的连接安全配置存在差异,需要根据实际情况选择合适的配置方式。通过合理的规划和实施连接安全策略,可以保护数据库免受未授权访问、数据泄露和篡改,提高数据库的安全性和可靠性。