数据加密传输是保障数据安全与业务可信的核心技术手段。在应用与数据库间的网络链路中,存在被窃听、篡改和身份冒充的风险,若采用明文传输,数据库账号密码、用户隐私信息(如身份证、手机号、银行卡号)、核心业务数据及 SQL 执行语句等敏感内容将直接暴露,极易引发数据泄露与安全事件;因此对账户加密和数据加密是必要的措施。
在 DMDRS 数据同步软件中,可通过修改配置文件,增加相关的安全参数实现账户密文登录和数据加密传输,满足加密需求。
本文将模拟 dmdrs 同步软件在使用过程中配置《账户加密》以及《数据传输加密》。
本次实验 通过DMDRS 做DM8 到 KAFKA 单向同步,环境信息如下:
| 源端/目标端 | 类型 | IP | 端口 | 同步的用户 |
|---|---|---|---|---|
| 源端 | dm8 | 192.168.175.78 | 5238 | kafka |
| 目标端 | kafka+dm8 | 192.168.175.80 | 5236 | kafka |
同步账户仅在源端配置文件使用,首次启动软件时,需要先使用明文配置,在启动DMDRS 服务后,通过控制台 drcsl 对明文密码进行转换,然后在配置文件中使用密文。步骤如下:
[dmdba@dm78 bin]$ ./drcsl cpt.xml
ENCRYPT "<pwd>"
3. 复制生成的密文,在配置文件中使用。使用密文需要在
<pwd_encipher>1</pwd_encipher> ## 1 为启用数据库登录密码的加密功能
<pwd>7EB5D3EB83686BA1BF17C2176CE34C53</pwd> ## 上一步得到的密文
4. 重新登录控制台,即配置完成。
注意:未配置密文参数<pwd_encipher>1</pwd_encipher>会报错,如下:
在 DM8 数据库中,配置COMM_ENCRYPT_NAME参数设置消息加密算法名,以启用加密通信。
在 DMDRS 中,配置数据加密传输使用的是 enable_tls 参数,在 DMDRS 同步链路中,所有的 DMDRS 服务(包括源 DMDRS、目标 DMDRS)都需要配置该参数。配置该参数后,DMDRS服务之间将会启用基于 TLS1.2 协议的证书认证及通信功能。
select CYT_NAME from V$CIPHERS order by 1;
方式一:CALL SP_SET_PARA_STRING_VALUE(2,'COMM_ENCRYPT_NAME','AES256_CBC')
方式二:直接编辑 dm.ini 文件,修改 COMM_ENCRYPT_NAME 参数。
确认已修改 COMM_ENCRYPT_NAME 参数,重启数据库服务。
cd /data2/dmdrs/bin
<base>
<mgr_port>5347</mgr_port>
<siteid>100</siteid>
<pwd_encipher>1</pwd_encipher> ##启动账户使用密文
<enable_tls>1</enable_tls> ##启动数据通信加密
</base>
<send>
<ip>192.168.175.80</ip>
<port>5347</port>
<target_name>exec_kafka</target_name> ##下一级 DMDRS 服务的接收
模块的名称,目标端配置 kafka 时注意该名称的使用。
<enable_compress>1</enable_compress>
<cipher>AES256_CBC</cipher> ##3.1.1 配置的加密算法名
<map>
<item>KAFKA.*==KAFKA.*</item>
</map>
</send>
根据 DMDRS 手册说明,在使用 enable_tls 参数时需要加载 OpenSSL 的认证证书:作为客户端,需要证书 drs_ca.crt;作为服务端,需要证书 drs_server.crt 和秘钥 drs_server.key。
cd /data2/dmdrs/bin mkdir server_tls --服务端证书存放位置 mkdir client_tls --客户端证书存放位置
cd /data2/dmdrs/bin/server_tls
## 执行以下三条命令:
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout drs_ca.key -out drs_ca.crt -days 3650
注:该命令所有步骤按回车默认即可
openssl req -newkey rsa:2048 -nodes -keyout drs_server.key -out drs_server.csr
注:common name 填源端主机 ip:192.168.175.78 ,其他步骤回车默认即可
openssl x509 -req -in drs_server.csr -CA drs_ca.crt -CAkey drs_ca.key -CAcreateserial -out drs_server.crt -days 365
注:CN 显示源端 IP 即可
cd /data2/dmdrs/bin/client_tls
mkdir 127.0.0.1 --本地客户端验证目录
mkdir 192.168.175.80 --目标端验证目录,需要从目标端传输文件过来
cd /data2/dmdrs/bin/server_tls
cp drs_ca.crt /data2/dmdrs/bin/client_tls/127.0.0.1/
cd /data2/dmdrs/bin/client_tls/192.168.175.80
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout drs_ca.key -out drs_ca.crt -days 3650
注:全部步骤按回车默认即可
openssl req -newkey rsa:2048 -nodes -keyout drs_server.key -out drs_server.csr
注:common name 填源端主机 ip:192.168.175.78 ,其他步骤回车默认即可
openssl x509 -req -in drs_server.csr -CA drs_ca.crt -CAkey drs_ca.key -CAcreateserial -out drs_server.crt -days 365
rm -rf drs_ca.crt
参考 4.1.1 源端的配置方式
cd /data2/dmdrs/bin
[dmdba@dm78 bin]$ vi producer.properties
bootstrap.servers=192.168.175.80:9092
[dmdba@dm78 bin]$ vi json_format.ini
#DMDRS kafka json format Configuration file
#this is comments
#common format control parameters
OP_TIME_FORMAT = (yyyy-mm-dd hh:mi:ss)
CUR_TIME_FORMAT = (yyyy-mm-dd hh:mi:ss)
NULL_FORMAT = "null"
SET_QUOTA = 0
SET_ROWID_COL = 0
NEED_CRLF = 1
CHAR_REPLACE =(",\"),(\,\\)
OLD_VALUES = ALL
NEW_VALUES = ALL
OLD_LOB_FLAG = "empty_lob()"
JSON_FORMAT_INS={
"table":"#SCHEMA.#TABLE",
"op_type":"#OP_TYPE",
"op_ts":"#OP_TIME",
"current_ts":"#TIME",
"pos":"#POS",
"primary_keys":[#PRIMARY_KEY],
"after":{#NEW_VALUES}
}
JSON_FORMAT_UPD={
"table":"#SCHEMA.#TABLE",
"op_type":"#OP_TYPE",
"op_ts":"#OP_TIME",
"current_ts":"#TIME",
"pos":"#POS",
"primary_keys":[#PRIMARY_KEY],
"before":{#OLD_VALUE},
"after":{#NEW_VALUE}
}
JSON_FORMAT_DEL={
"table":"#SCHEMA.#TABLE",
"op_type":"#OP_TYPE",
"op_ts":"#OP_TIME",
"current_ts":"#TIME",
"pos":"#POS",
"primary_keys":[#PRIMARY_KEY],
"before":{#OLD_VALUE}
}
JSON_FORMAT_DDL={
"table":"#SCHEMA.#TABLE",
"op_type":"#OP_TYPE",
"op_ts":"#OP_TIME",
"current_ts":"#TIME",
"pos":"#POS",
"after":
("DB_TYPE":"ORA",
"OBJECT_TYPE":"#OP_TYPE",
"OBJECT_NAME":"#SCHEMA.#TABLE",
"DDL_TEXT":"#DDL_SQL")
}
目标端只需要配置 client_tls 即可
cd /data2/dmdrs/bin
mkdir client_tls
mkdir server_tls
mkdir -p client_tls/192.168.175.80 ## 本机 IP
cd /data2/dmdrs/bin/server_tls
## 执行以下三条命令
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout drs_ca.key -out drs_ca.crt -days 3650
注:全部步骤按回车默认即可
openssl req -newkey rsa:2048 -nodes -keyout drs_server.key -out drs_server.csr
注:common name 填本机 ip:192.168.175.80 ,其他步骤回车默认即可
openssl x509 -req -in drs_server.csr -CA drs_ca.crt -CAkey drs_ca.key -CAcreateserial -out drs_server.crt -days 365
cd /data2/dmdrs/bin/client_tls/192.168.175.80
cp /data2/dmdrs/bin/server_tls/drs_ca.crt ./
scp drs_ca.crt
dmdba@192.168.175.78:/data2/dmdrs/bin/client_tls/192.168.175.80
注意:目标端也是需要在 server_tls 下生成 ca 文件,否则会有报错
nohup /opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties > /tmp/zookeeper.log 2>&1 &
nohup /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties > /tmp/kafka.log 2>&1 &
/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.175.80:9092 --create --replication-factor 1 --partitions 1 --topic test_dm8
2. 启动生产者
/opt/kafka/bin/kafka-console-producer.sh --topic test_dm8 --bootstrap-server localhost:9092
3. 在另外一个新窗口后台启动消费者,观察消费是否正常。
scp drs_ca.crt
dmdba@192.168.175.78:/data2/dmdrs/bin/client_tls/192.168.175.80
说明:可以看到 Kafka 能正常接收数据,那么就可以通过同步软件将消息推送到 kafka 了
需要提前开启归档及逻辑日志
1、cd /data2/dmdrs/bin
2、cp service_template/TemplateService ./DrsServiceCPT
3、vi DrsServiceCPT
修改如下内容:
INSTALL_HOME=/data2/dmdrs
PROG_DIR=/data2/dmdrs/bin
CONF_PATH=/data2/dmdrs/bin/cpt.xml
NEED_LIB_PATH=/data2/dmdrs/bin:/data/dm8/dmdbms/bin
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME=drs server
4、./DrsServiceCPT start
CREATE TABLESPACE KAFKA DATAFILE 'KAFKA.DBF' SIZE 1024 AUTOEXTEND ON NEXT
2048;
CREATE USER KAFKA IDENTIFIED BY DMwzy6870 DEFAULT TABLESPACE KAFKA
DEFAULT INDEX TABLESPACE KAFKA;
GRANT DBA TO KAFKA;
CREATE TABLE KAFKA.TEST(ID INT ,NAME VARCHAR(50));
INSERT INTO KAFKA.TEST VALUES(1,'WANG');
INSERT INTO KAFKA.TEST VALUES(2,'ZHANG');
INSERT INTO KAFKA.TEST VALUES(3,'LI');
INSERT INTO KAFKA.TEST VALUES(4,'LIU');
CREATE TABLE KAFKA.TEST_BF(ID INT ,NAME VARCHAR(50));
insert into KAFKA.TEST_BF VALUES (00011,'20260202AABBCCDDEE');
insert into KAFKA.TEST_BF VALUES (00022,'20260202dfdfdfdfdfdf');
1、cd /data2/dmdrs/bin
2、cp service_template/TemplateService ./DrsServiceEXEC
3、vi DrsServiceEXEC
INSTALL_HOME=/data2/dmdrs
PROG_DIR=/data2/dmdrs/bin
CONF_PATH=/data2/dmdrs/bin/exec.xml
NEED_LIB_PATH=/data2/dmdrs/bin:/data/dm8/dmdbms/bin
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME=drs server
4、./DrsServiceEXEC start
1、cd /data2/dmdrs/bin
2、./drcsl cpt.xml
3、connect
4、start
5、alter dmdrs_dm8 add table "sch.name='KAFKA'"
前台执行命令观察消费是否正常,正常情况下,控制台(源端)执行的同步操作会将表
数据推送到该前台:
/opt/kafka/bin/kafka-console-consumer.sh --topic test_dm8 --bootstrap-server localhost:9092 --from-beginning
用 tcpdump 工具抓包,可以看到在配置加密传输前后的差距:《左边为未开启加密传输》的结果,可看到详细的数据值;《右边为开启加密传输后》的结果,对数据进行了加密,无明显的数据显示。
在 DMDRS 同步软件中,可通过配置实现账户密文登录和数据加密传输,更多 DMDRS 的功能使用可在达梦官网查询:
https://eco.dameng.com/document/dm/zh-cn/start/DMDRS_Product_Introduction.html
文章
阅读量
获赞
