Oracle 数据库网络安全之加密配置

1.1、Oracle Net 加密配置

Oracle Net 加密配置,就是用 Oracle 原生网络加密(NNE,Native Network Encryption),对数据库客户端 ↔ 服务器之间的 Oracle Net 流量做传输加密 + 完整性校验,防止抓包窃听、篡改,属于 Oracle Advanced Security(ASO)的基础能力,不用证书、不用 TLS 端口,直接在 sqlnet.ora 配置。

默认 Oracle Net 是明文传输,可被 Wireshark 直接看到 SQL 内容;开启 NNE 后会对整个会话加密。

1.1.1、核心配置文件:sqlnet.ora

位置(服务器 + 客户端都要有):

  • Linux:$ORACLE_HOME/network/admin/sqlnet.ora
  • Windows:%ORACLE_HOME%\network\admin\sqlnet.oraOracle

加密策略(必配)

sql 复制代码
-- 服务器端
SQLNET.ENCRYPTION_SERVER = REQUIRED

-- 客户端
SQLNET.ENCRYPTION_CLIENT = REQUIRED

四种策略:

  • REQUIRED:必须加密,不加密就拒绝连接
  • REQUESTED:能加密就加密,不行就明文
  • ACCEPTED:对方要求加密就加密
  • REJECTED:禁止加密,强制明文

加密算法(必配)

sql 复制代码
-- 服务器端
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256,AES192,AES128)

-- 客户端
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256,AES192,AES128)

常用算法(优先 AES):

  • AES256:最高安全,性能损耗小
  • AES192 / AES128
  • 3DES、RC4(老旧兼容)

完整性校验(防篡改,必配)

sql 复制代码
-- 服务器端
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256,SHA1)

-- 客户端
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256,SHA1)

算法:SHA256(推荐)、SHA1、SHA384、SHA512

基本加密配置

服务器 sqlnet.ora

sql 复制代码
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256)

客户端 sqlnet.ora

sql 复制代码
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256)
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256)

生效:

  • 不用重启数据库 / 监听,新连接自动生效
  • 老连接保持原状态
  • 试图查询是否生效:SELECT NETWORK_SERVICE, ENCRYPTION_ALGORITHM, INTEGRITY_ALGORITHM FROM V$SESSION_CONNECT_INFO WHERE SID = USERENV('SID');

1.2、SSL/TLS 配置

Oracle SSL/TLS 是基于数字证书的数据库网络安全连接方案,替代明文 1521 端口,实现:

  1. 客户端 <-> 数据库全程加密传输
  2. 双向身份认证(防钓鱼、仿冒数据库)
  3. 金融、政务、等保三级强制要求
  4. 独立端口:默认 2484(TCPS 协议)

核心组件

  1. Oracle Wallet 钱包 存放:服务器证书、客户端证书、CA 根证书,Oracle 专属密钥库
  2. TCPS 协议 监听不用 TCP,改用TCPS
  3. 三个配置文件:listener.ora 监听开启 SSL、tnsnames.ora 客户端走 TCPS、sqlnet.ora 指定钱包路径、SSL 规则

两种认证模式

  • 单向 SSL(最常用) 客户端验证数据库服务器证书,数据库不校验客户端 适合业务系统、APP 连接

  • 双向 SSL(互信认证) 服务端验客户端证书 + 客户端验服务端证书 最高安全,仅限内网核心系统

关键配置

1. 服务端配置

  • 创建 Oracle 钱包,导入服务器证书
  • listener.ora 新增 TCPS 监听 2484
  • sqlnet.ora 指定钱包路径、SSL 版本

2. 客户端配置

  • 客户端钱包放入根证书 / 客户端证书
  • tns 别名改用 (PROTOCOL=TCPS)
  • JDBC 连接改用 jdbc:oracle:thin:@(DESCRIPTION=...TCPS...)

基本SSL/TLS 配置

环境:Linux + Oracle 通用

端口:明文 1521 + SSL 端口2484

模式:单向 SSL(生产最常用)

1、前期准备:创建 Oracle 钱包 & 自签证书

创建钱包目录

bash 复制代码
mkdir -p /u01/oracle/wallet
chmod 700 /u01/oracle/wallet
chown oracle:oinstall /u01/oracle/wallet

生成钱包 + 自签证书(orapki 命令)

bash 复制代码
# 1. 创建空钱包
orapki wallet create -wallet /u01/oracle/wallet -auto_login_local

# 2. 创建服务器自签证书
orapki wallet add -wallet /u01/oracle/wallet -dn "CN=oracledb,OU=db,O=company,L=city,S=province,C=CN" -keysize 2048 -self_signed -validity 3650

导出根证书(客户端要用)

bash 复制代码
orapki wallet export -wallet /u01/oracle/wallet -dn "CN=oracledb,OU=db,O=company,L=city,S=province,C=CN" -cert /u01/oracle/wallet/server.crt
2、服务端配置文件

listener.ora (监听配置): 路径:$ORACLE_HOME/network/admin/listener.ora

bash 复制代码
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    )
    # SSL/TLS 监听 2484
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCPS)(HOST = 0.0.0.0)(PORT = 2484))
    )
  )

# SSL 钱包路径
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
      (DIRECTORY = /u01/oracle/wallet)
    )
  )

sqlnet.ora (全局网络安全配置): 路径:$ORACLE_HOME/network/admin/sqlnet.ora

bash 复制代码
# 钱包路径
WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
      (DIRECTORY = /u01/oracle/wallet)
    )
  )

# 单向SSL关闭客户端证书校验
SSL_CLIENT_AUTHENTICATION = FALSE

# 允许登录方式
SQLNET.AUTHENTICATION_SERVICES= (BEQ,TCPS,NTS)

# 禁用弱SSL协议
SSL_VERSION = 1.2
SSL_CIPHER_SUITES = (TLS_RSA_WITH_AES_256_CBC_SHA256)

# 关闭原生加密冲突(可选)
SQLNET.ENCRYPTION_SERVER=REJECTED

tnsnames.ora 服务端本地 TNS

bash 复制代码
ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

# SSL连接别名
ORCL_SSL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCPS)(HOST = 数据库IP)(PORT = 2484))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
3、重启监听生效
bash 复制代码
lsnrctl stop
lsnrctl start
lsnrctl status

看到 TCPS 2484 即成功

4、客户端全套配置

客户端准备: 把服务端导出的 server.crt 放到客户端钱包目录,客户端创建钱包导入证书

bash 复制代码
# 客户端创建钱包
orapki wallet create -wallet D:\oracle\wallet -auto_login
# 导入服务端证书
orapki wallet add -wallet D:\oracle\wallet -trusted_cert -cert D:\oracle\wallet\server.crt

客户端 sqlnet.ora

bash 复制代码
WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
      (DIRECTORY = D:\oracle\wallet)
    )
  )
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2

客户端 tnsnames.ora (SSL 连接串)

bash 复制代码
ORCL_SSL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST=数据库IP)(PORT=2484))
    (CONNECT_DATA = (SERVICE_NAME=orcl))
  )

客户端测试连接

bash 复制代码
sqlplus 用户名/密码@ORCL_SSL

总结:NNE 与 SSL/TLS 对比

对比项 NNE (原生加密) SSL/TLS(TCPS)
证书 / 钱包 ❌ 不需要 ✅ 必须
端口 / 协议 1521/TCP 不变 2484/TCPS
身份认证 ❌ 仅用户名密码 ✅ 证书认证 (单向 / 双向)
防中间人攻击 ❌ 不能 ✅ 可以
配置复杂度 极低 (仅 sqlnet.ora) 中等 (需证书 + 3 个文件)
性能损耗 低 (5-10%) 中 (10-20%)
等保三级 ❌ 不满足 ✅ 满足
适用场景 内网、开发测试 外网、生产、合规要求
相关推荐
2401_867623981 小时前
如何设置用户默认表空间_ALTER USER DEFAULT TABLESPACE
jvm·数据库·python
callJJ1 小时前
SQL 调优完全指南 —— 从入门到实战
数据库·sql·调优·慢查询
努力成为DBA的小王1 小时前
MySQL数据类型
数据库·mysql
日取其半万世不竭1 小时前
Supabase 自建:开源的 Firebase 替代品,带数据库的后端服务
数据库·开源
2301_803934611 小时前
html标签怎样划分页面区域_section与div的区别【介绍】
jvm·数据库·python
埃伊蟹黄面1 小时前
MySQL 库的操作
数据库·mysql
姬成韶1 小时前
[BUUCTF 2018]Online Tool题目解析
web安全·网络安全·代码审计
埃伊蟹黄面1 小时前
数据库基础认识
数据库
看我干嘛!1 小时前
Redis安装
数据库·redis·缓存