1. 环境准备与安装包校验
咱们今天来聊聊瀚高数据库安全版v4.5.8的国密算法配置和优化。如果你正在寻找一个既安全又符合特定密码算法标准的数据库,瀚高安全版加上国密算法支持,绝对是个值得深入研究的选项。我自己在几个对数据安全有严苛要求的项目里用过它,实测下来,从安装到调优,一路踩过不少坑,也总结了不少能让你少走弯路的经验。这篇文章,我就把这些实战经验掰开揉碎了讲给你听,目标是让你看完就能上手,把国密算法稳稳当当地用起来。
首先,咱们得把基础打牢。安装前的环境准备,就像盖房子前打地基,这一步马虎不得。官方文档推荐的是CentOS 7.9,x86_64架构,这个环境兼容性和稳定性都经过了大量验证。我建议你也尽量保持一致,能避免很多稀奇古怪的兼容性问题。当然,如果你用的是其他兼容的Linux发行版,理论上也可以,但最好先在测试环境里跑一遍。
安装包到手后,别急着双击(哦不,是敲命令)。第一步必须是校验!这可不是多此一举,尤其是从网络下载的包,万一传输过程中出了点差错,导致文件损坏,你后续的所有操作都可能建立在沙滩上,排查起来能让人崩溃。校验方法很简单,用md5sum命令就行。通常你拿到的安装包会附带一个.md5的校验文件。把它和安装包放在同一个目录下,执行下面这个命令:
md5sum -c hgdb-see-4.5.8-db43858.x86_64.rpm.md5如果终端显示“OK”或者“成功”,恭喜你,安装包是完整的。如果校验失败,那就得重新下载了。这个习惯一定要养成,我见过不止一个兄弟,安装到一半报错,折腾半天才发现是安装包本身的问题,白白浪费几个小时。
校验通过,就可以正式安装了。使用rpm命令进行安装:
rpm -ivh hgdb-see-4.5.8-db43858.x86_64.rpm这里的-i是安装,-v显示详细信息,-h用“#”显示安装进度条,看着更直观。安装过程通常很快,它会自动把软件文件部署到/opt/highgo/hgdb-see-4.5.8/这个默认目录下。安装完成后,这个目录就是你的瀚高数据库之家了,后面的很多配置都围绕着它展开。
2. 目录规划与数据库初始化
软件装好了,但数据放哪儿呢?默认的数据目录就在安装目录下的data里。但在生产环境,我强烈不建议你把数据放在安装目录下。为啥?一是便于管理,二是性能和安全考虑。通常我们会把数据目录放在一个独立的、空间更大的磁盘分区上,比如/data。
所以,我们需要创建独立的目录,并做个软链接。这样做的好处是,数据库引擎依然认为数据在$HGDB_HOME/data,但实际上物理文件在我们指定的大容量位置。命令如下:
mkdir -p /data/highgo/data mkdir -p /data/highgo/hgdbbak/archive ln -sf /data/highgo/data /opt/highgo/hgdb-see-4.5.8/data这里我多创建了一个archive目录,这是为后续配置WAL日志归档准备的,对于数据安全备份很重要,咱们后面会讲到。
接下来是关键一步:初始化数据库。这是决定你的数据库是否启用国密算法的关键时刻。瀚高安全版v4.5.8支持SM3(杂凑算法,类似SHA-256,用于密码校验和完整性验证)和SM4(分组密码算法,用于数据加密)。初始化命令的选项决定了数据库的“基因”。
为了方便无交互初始化,我们先创建一个临时密码文件。这个文件只在初始化时用,用完可以删掉,或者留着以后重建库时用也行。
echo “Hello@123456” > /opt/highgo/hgdb-see-4.5.8/etc/5866 echo “Hello@123456” >> /opt/highgo/hgdb-see-4.5.8/etc/5866 echo “Hello@123456” >> /opt/highgo/hgdb-see-4.5.8/etc/5866这个文件里写了三行相同的密码,分别对应初始化后生成的三个默认管理用户:sysdba(数据库管理员)、syssao(安全审计员)、syssso(安全策略员)。注意,这只是初始密码,后面我们必须改掉它。
现在,激动人心的初始化来了。如果你想启用国密算法,请执行:
initdb -A sm3 -e sm4 -c “echo 12345678” -D $PGDATA --pwfile=/opt/highgo/hgdb-see-4.5.8/etc/5866 -E ‘UTF8’我来拆解一下这几个参数:
-A sm3:指定密码认证方式为SM3。这意味着用户连接数据库时的密码校验,将使用国密SM3算法,而不是常见的md5或scram-sha-256。-e sm4:指定数据加密算法为SM4。这会影响数据库内部某些环节的加密方式,为使用全库加密或列加密特性打下基础。-c “echo 12345678”:这个参数挺有意思,它指定了一个命令来生成数据库的加密密钥。这里用的是简单的echo,实际生产环境,你应该用一个更安全、更随机的方式生成一个复杂的密钥,并妥善保管。这个密钥至关重要!-D $PGDATA:指定数据目录位置,就是我们刚才软链接过去的/data/highgo/data。--pwfile:指定包含三个管理员初始密码的文件。-E ‘UTF8’:设置默认数据库编码为UTF-8,兼容中文。
如果你暂时不需要国密算法,或者某些外围工具还不兼容SM3认证,可以用传统的md5方式初始化:
initdb -A md5 -D $PGDATA --pwfile=/opt/highgo/hgdb-see-4.5.8/etc/5866 -E ‘UTF8’这里有个超级重要的坑我踩过:一旦初始化完成,认证方式(-A参数)就很难再改了。所以务必在初始化前就想清楚,你的应用客户端驱动是否支持SM3认证。如果不确定,可以在测试环境先用SM3试试,确保整个链路畅通。
初始化成功后会输出一堆信息,最后通常会提示你运行一个生成SSL证书的脚本。SSL用于加密客户端和数据库之间的网络连接,是另一个层面的安全加固。直接运行它:
hg_sslkeygen.sh /opt/highgo/hgdb-see-4.5.8/data3. 核心配置:启用国密与网络连接
数据库初始化好了,但它现在还只是个“裸奔”的实例,我们需要进行一系列配置,让它既能被安全地连接,又能发挥国密算法的特性。
首先,配置环境变量,这样我们就不用每次敲命令都输入一长串路径了。编辑root用户的.bash_profile文件,把下面这段加进去:
cat >> /root/.bash_profile <<EOF ################################ add by Highgo at `date +%Y-%m-%d_%H:%M:%S` for hgdb start ################################ export HG_BASE=/opt/highgo export HGDB_HOME=/opt/highgo/hgdb-see-4.5.8 export PGPORT=5866 export PGDATABASE=highgo export PATH=\$HGDB_HOME/bin:\$PATH export PGDATA=\$HGDB_HOME/data ################################ add by Highgo at `date +%Y-%m-%d_%H:%M:%S` for hgdb end ################################## EOF source /root/.bash_profile配置完记得用source命令让配置立刻生效。现在,你可以在任何位置直接使用psql、pg_ctl这些命令了。
接下来是配置客户端连接认证,文件是pg_hba.conf。这个文件控制了“谁、从哪里、用什么方式”可以连接数据库。为了测试方便,我们可以先配置允许所有IP通过SM3密码连接(生产环境请务必根据实际情况收紧策略!):
cat >> /opt/highgo/hgdb-see-4.5.8/data/pg_hba.conf <<EOF ################################ add by Highgo at `date +%Y-%m-%d_%H:%M:%S` for hgdb start ################################ # IPv4 local connections: host all all 0.0.0.0/0 sm3 ################################ add by Highgo at `date +%Y-%m-%d_%H:%M:%S` for hgdb end ################################## EOF这里又是一个关键点:pg_hba.conf文件里指定的认证方法(最后那个sm3)必须和初始化数据库时用的-A参数一致!如果你初始化用了md5,这里也必须写md5,否则客户端永远连不上。配置完成后,需要重启数据库服务才能生效。
为了方便本地管理,我们可以创建一个.pgpass密码文件,这样psql等工具就不用每次都弹窗要密码了。
cat > /root/.pgpass <<EOF # host:port:database:user:password localhost:5866:*:sysdba:Hello@123456 localhost:5866:*:syssao:Hello@123456 localhost:5866:*:syssso:Hello@123456 EOF chmod 0600 /root/.pgpass # 这个权限设置必须做,否则文件不生效现在,可以启动数据库了:
pg_ctl start用psql -h localhost -p 5866 -U sysdba highgo试试能不能连上。如果连接成功,恭喜你,数据库服务已经跑起来了,并且核心的国密SM3认证已经启用。
4. 基础性能参数调优
数据库能跑起来只是第一步,要让它跑得又快又稳,还得进行一番调优。瀚高数据库基于PostgreSQL,很多优化思路是相通的,但安全版也有一些自己的特色参数。
我们先通过sysdba用户连接,设置一些最影响性能的基础参数。下面这条命令一次性修改多个参数,你可以根据自己服务器的硬件配置(尤其是内存大小)进行调整:
psql highgo sysdba <<EOF alter system set listen_addresses = ‘*’; -- 监听所有IP,生产环境建议指定 alter system set max_connections = 2000; -- 最大连接数,按需调整 alter system set work_mem=‘16MB’; -- 每个查询操作可用的内存,复杂排序、哈希操作多用 alter system set shared_buffers = ‘1GB’; -- 共享缓冲区,缓存数据,建议设为物理内存的1/4 alter system set checkpoint_completion_target = 0.8; -- 检查点完成目标,平滑I/O alter system set log_destination = ‘csvlog’; -- 日志格式 alter system set logging_collector = on; -- 开启日志收集 alter system set log_directory = ‘hgdb_log’; -- 日志目录 alter system set log_filename = ‘highgodb_%d.log’; -- 日志文件名,按天分割 alter system set log_rotation_age = ‘1d’; -- 日志每天轮转 alter system set log_rotation_size = 0; -- 不按大小轮转,只用时间 alter system set log_truncate_on_rotation = on; -- 轮转时截断 alter system set log_statement = ‘ddl’; -- 只记录DDL语句,避免日志暴涨 alter system set log_connections=on; -- 记录连接 alter system set log_disconnections=on; -- 记录断开连接 alter system set checkpoint_timeout=‘30min’; -- 检查点超时时间 alter system set maintenance_work_mem=‘1GB’; -- 维护操作(如VACUUM)可用内存 alter system set archive_mode = on; -- 开启归档模式,**重要!** alter system set archive_timeout = ‘30min’; -- 归档超时,即使WAL没满也切换 alter system set archive_command = ‘cp %p /data/highgo/hgdbbak/archive/%f’; -- 归档命令,指向我们之前创建的目录 alter system set log_line_prefix = ‘%m [%p] %a %u %d %r %h’; -- 日志行前缀,包含时间、进程、应用名、用户、数据库、远程主机等信息,方便排查 alter system set nls_length_semantics = ‘char’; -- 字符长度语义,对中文应用友好 EOF这里我重点说几个:
shared_buffers:这是数据库最重要的缓存。设得太小,数据老要从磁盘读,慢;设得太大,挤占操作系统缓存,也可能慢。物理内存的1/4是个不错的起点。work_mem:如果业务里有大量复杂的排序、聚合、哈希连接操作,适当调大这个值能显著提升速度。但注意这是每个操作可用的,连接数多的时候,总和可能超过物理内存。archive_mode和archive_command:这是实现PITR(时间点恢复)的基础。开启了归档,数据库会把写满的WAL日志文件复制到你指定的目录(这里是我们建的/data/highgo/hgdbbak/archive)。有了全量备份+这些归档日志,你可以将数据库恢复到历史上的任意一个时间点,是数据安全的最后一道坚固防线。这个功能,再强调其重要性都不为过。
执行完这些alter system命令后,修改的配置会写入到postgresql.auto.conf文件,但需要重启数据库或者让配置重载才能生效。我们可以先重载:
pg_ctl reload部分参数如shared_buffers必须重启才能生效,我们可以在后续步骤完成后统一重启。
5. 安全加固与密码策略调整
作为安全版数据库,瀚高默认开启了很多安全特性,但有些特性在追求极致性能的场景下,可能会带来一些开销。我们需要在安全和性能之间找到一个平衡点。同时,一些默认的安全设置也需要我们根据实际情况调整。
首先,改掉那烦人的默认密码有效期。安装后,所有用户(包括三个管理用户)的密码默认只有7天有效期,到期就锁,这在实际运维中太不友好了。我们需要用syssso(安全策略员)登录,修改策略:
psql highgo syssso <<EOF select set_secure_param(‘hg_idcheck.pwdvaliduntil’,‘0’); -- 将密码有效期设为0,代表永久有效 alter user current_user password ‘YourNewStrongPassword!’ valid until ‘infinity’; -- 修改syssso自身密码为永久 \c - sysdba alter user current_user password ‘YourNewStrongPassword!’; -- 修改sysdba密码 \c - syssao alter user current_user password ‘YourNewStrongPassword!’; -- 修改syssao密码 EOF切记:一定要把.pgpass文件里的旧密码也同步改掉,否则免密登录会失败。
sed -i ‘s/Hello@123456/YourNewStrongPassword!/g’ /root/.pgpass接下来,我们可以根据业务压力,适当调整一些安全参数,以提升性能。这些参数由syssso用户控制:
psql highgo syssso <<EOF select set_secure_param(‘hg_macontrol’,‘min’); -- 最小化强制访问控制,减少检查开销 select set_secure_param(‘hg_rowsecure’,‘off’); -- 关闭行级安全策略(如果不需要) select set_secure_param(‘hg_showlogininfo’,‘off’); -- 关闭登录信息显示(安全考虑,也可关闭) select set_secure_param(‘hg_clientnoinput’,‘0’); -- 设置客户端无输入超时为0(不断开) select set_secure_param(‘hg_idcheck.pwdpolicy’,‘high’); -- 密码策略保持为高强度 EOF重要提醒:hg_rowsecure(行级安全)和hg_macontrol(强制访问控制)是高级安全特性,如果你业务里用不到它们,关掉确实能减少性能损耗。但如果你在做等保测评,这些功能很可能需要开启,请务必与你的安全团队确认!
同样,审计功能(hg_audit)会记录所有数据库操作,对性能影响较大,在非审计要求的开发测试环境可以关闭,由syssao用户操作:
psql highgo syssao <<EOF select set_audit_param(‘hg_audit’,‘off’); EOF做完以上所有配置修改后,来一次彻底的重启,让所有参数生效:
pg_ctl restart或者,如果你更喜欢用systemd服务管理(安装时已自动注册),也可以这样操作:
pg_ctl stop systemctl start hgdb-see-4.5.8.service systemctl enable hgdb-see-4.5.8.service # 设置开机自启6. 国密算法深度配置与使用验证
前面的步骤已经让数据库在“系统层面”支持了国密(SM3认证,SM4加密选项)。但国密算法到底有没有真正用起来?我们还需要在数据库对象层面进行一些配置和验证。
首先,验证一下认证方式。连接到数据库后,可以查看pg_hba_file_rules系统视图,确认认证方法确实是sm3。
psql highgo sysdba -c “SELECT type, database, user_name, address, auth_method FROM pg_hba_file_rules;”你应该能看到我们之前添加的那条host all all 0.0.0.0/0 sm3记录。
其次,关于SM4加密的使用。初始化时指定-e sm4,为数据库使用存储加密等功能奠定了基础。例如,瀚高数据库支持对特定的列进行加密存储。你可以创建一个使用SM4算法加密的列:
-- 创建一个扩展,可能需要先加载(具体扩展名请查阅瀚高文档) -- CREATE EXTENSION IF NOT EXISTS hg_crypt; -- 创建测试表,并对敏感列加密 CREATE TABLE user_secrets ( id SERIAL PRIMARY KEY, plain_text VARCHAR(100), secret_data VARCHAR(100) ENCRYPTED WITH (ALGORITHM = ‘SM4’, KEY = ‘你的加密密钥’) );注意:这里的‘你的加密密钥’需要妥善管理,最好使用瀚高提供的密钥管理函数或外部密钥管理服务,而不是硬编码在SQL里。列加密功能的使用涉及更多细节,建议参考瀚高的官方安全手册。
另一个重要的验证是SSL连接。我们之前生成了SSL证书,现在可以强制要求客户端使用SSL连接,让网络传输也得到加密。修改postgresql.conf(或通过alter system set)中的ssl参数为on,并在pg_hba.conf中为某些主机或用户指定hostssl代替host。例如:
# 在pg_hba.conf中 hostssl all all 192.168.1.0/24 sm3然后重启数据库服务。客户端连接时,需要指定sslmode=require等参数。
最后,别忘了授权文件。安装后默认有30天试用期。你需要联系瀚高商务获取正式的授权文件(hgdb.lic)。上传到服务器后,执行以下命令:
chmod 0600 hgdb.lic # 修改权限 hg_lic -c -F hgdb.lic # 检查授权文件信息 hg_lic -l -F hgdb.lic # 加载授权文件加载成功后,数据库才能长期稳定运行。你可以通过hg_lic -i命令查看当前加载的授权信息。
7. 监控、维护与故障排查入门
数据库配置优化不是一劳永逸的事,上线后的监控和维护同样重要。这里给你分享几个我常用的命令和技巧,帮你盯住这个“国密数据库”的健康状况。
首先,搞清楚数据库在干嘛。pg_stat_activity视图是你的第一扇窗。
SELECT datname, usename, application_name, client_addr, state, query FROM pg_stat_activity WHERE state != ‘idle’;这个命令能列出所有非空闲的活动会话,看到谁在连、从哪里连、在跑什么SQL。如果发现某条SQL长时间运行(state=‘active’且持续时间长),可能就需要优化了。
性能瓶颈往往在I/O和锁上。查看锁等待情况:
SELECT blocked_locks.pid AS blocked_pid, blocked_activity.query AS blocked_query, blocking_locks.pid AS blocking_pid, blocking_activity.query AS blocking_query FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid WHERE NOT blocked_locks.GRANTED;如果查询结果有记录,说明发生了锁等待,blocking_query就是“罪魁祸首”,需要分析它为什么长时间不释放锁。
关于国密算法相关的状态,可以查看一些特定的系统视图或函数(具体名称可能因版本略有不同,需查手册)。例如,查看当前支持的加密算法:
SELECT * FROM pg_available_encryption_algorithms WHERE name LIKE ‘%sm%’;或者,验证SM3密码哈希是否正常工作,可以尝试修改一个用户的密码,然后尝试用错误密码连接,看认证是否失败。
日常维护离不开备份。即使有了WAL归档,定期的全量物理备份也是必须的。瀚高数据库使用标准的PostgreSQL工具pg_basebackup。这里给出一个简单的备份脚本示例:
#!/bin/bash BACKUP_PATH=“/data/highgo/backup/full_$(date +%Y%m%d_%H%M%S)” pg_basebackup -D ${BACKUP_PATH} -Fp -Xs -P -v -U sysdba -h localhost -p 5866这个命令会做一个全量备份(-Fp普通格式),并在备份过程中流式传输WAL日志(-Xs),确保备份的一致性。备份完成后,记得定期清理旧的备份和归档日志,防止磁盘撑爆。
最后,日志是你最好的朋友。配置中我们把日志按天切分到了hgdb_log目录。多关注日志里的ERROR和FATAL信息。特别是启用国密后,如果客户端驱动不支持SM3,连接失败的错误信息就会清晰地记录在这里。