三级等保 修改需求及解决方案
本文记录系统进行三级等保过程中涉及的部分服务器配置和系统修改需求及解决方案。
以下将以“等保测评项问题”以及解决方案的形式记录。
三级等保根据服务商要求,必须解决全部的高风险项目。其中,中、低风险项目可根据实际情况,将能完成的项目尽量完成。涉及的无法解决的风险项目,可以咨询等保服务商相关人员等。
相关人员
修改/记录:zitian
相关配置
Linux:centos 7
MySQL:5.7.33
等保评测项问题
1、功能权限以及数据权限
测评对象:数据安全
安全层面:安全计算环境
安全控制点:个人信息保护
测评项目:应禁止未授权访问和非法使用用户个人信息。
符合情况:不符合
风险情况:高
结果记录:该应用系统未采取措施控制未授权访问和非法使用用户个人信息
问题描述:该应用系统未采取措施控制未授权访问和非法使用用户个人信息
整改建议:建议系统采取了措施控制了系统账户对个人信息的访问,如权限控制等。建议未授权无法访问和使用用户的个人信息。
整改方案:
通过功能权限、数据权限,限制了后台用户访问功能以及数据。
2、数据库开启审计、日志功能
测评对象:数据库
安全层面:安全计算环境
安全控制点:安全审计
测评项目:应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计。
符合情况:不符合
风险情况:高
结果记录:该数据库未启用安全审计功能,log_bin为off,审计内容未包括用户执行的操作、用户登录信息以及系统安全事件等
问题描述:该数据库未启用安全审计功能,log_bin为off,审计内容未包括用户执行的操作、用户登录信息以及系统安全事件等
整改建议:建议数据库开启日志功能,开启审计进程,或使用第三方审计系统对系统的数据库操作进行审计,审计范围应覆盖到每个用户,如:配置MySql数据库服务器的审计功能级别。找my.cnf这个文件修改日志功能级别:错误日志 LOG-ERR;查询日志 LOG;慢查询日志 LOG-SLOW-QUERIES;更新日志 LOG-UPDATE;二进制日志 LOG-BIN;修改数据库全局配置,log_*的配置都启用为on
整改方案:
1、配置数据库的审计功能
(1)安装审计插件
插件下载地址: dl.bintray.com/mcafee/mysq…
下载插件压缩包,通过unzip(下载时的插件是zip格式)解压到存放的位置。
在插件解压后的文件内执行授权,之后将mysql,登录mysql,查看默认存放插件的位置,将解压好的插件通过cp命令复制到规定位置
/**
* 相关命令
* 涉及文件目录的根据真实情况修改,执行最后一条命令之后,将会出现在
*/
// 进入存放插件的文件夹授权,执行命令后将出现配置需要的数据,妥善保存
cd /opt/audit-plugin-mysql-5.7-1.1.4-725/utils
chmod +x offset-extract.sh
./offset-extract.sh /usr/bin/mysql
// 编辑my.cnf,配置参数
plugin-load=AUDIT=libaudit_plugin.so
audit_offsets = 7824, 7872, 3632, 4792, 456, 360, 0, 32, 64, 160, 536, 7988, 4360, 3648, 3656, 3660, 6072, 2072, 8
audit_json_file = on
audit_record_cmds = 'insert,delete,update,create,drop,alter,grant,truncate'
// 查看mysql插件存放的位置
mysql > show global variables like 'plugin_dir';
// 给插件权限
chmod +x libaudit_plugin.so
chown mysql:mysql libaudit_plugin.so
// 执行安装命令
mysql > install plugin audit soname 'libaudit_plugin.so';
// 检查插件安装情况
show plugins;
(2)开启mysql日志。 查看日志的启用情况,关闭则需要修改config文件重启。
以下已log_bin为例。 查看log_bin启用状态,值为OFF则表示未开启日志,ON则表示正常启用。
show global variables like \'log_bin\';
编辑config文件。
vim /etc/my.cnf
3、日志文件、审计记录异地备份
凡是评测项目为“应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等。”而系统不符合的,可以通过异地备份日志文件、审计记录解决,以下仅为举例。其中操作系统审计记录通过rsyslog记录并保存在其他服务器,可查看与本文档同时提交的相关附件。
测评对象:数据库服务器
安全层面:安全计算环境
安全控制点:安全审计
测评项目:应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等。
符合情况:不符合
风险情况:高
结果记录:该数据库日志保存时间未超过6个月,未使用日志服务器对审计记录进行定期存档备份,避免受到未预期的删除、修改或覆盖
问题描述:该数据库日志保存时间未超过6个月,未使用日志服务器对审计记录进行定期存档备份,避免受到未预期的删除、修改或覆盖
整改建议:建议数据库部署日志服务器对审计记录进行定期存档备份,避免审计记录受到未预期的删除、修改或覆盖,日志保存时间超过6个月
解决方案:
编写sh脚本将相关日志文件、审计记录,通过scp传输到另一台专门用于存储的服务器。通过crontab(定时任务)定时执行shell脚本。
系统修改过程中同时需要异地备份数据库文件,按理应部署爱数备份,但部署测试好几次失败之后,同样采用scp来进行异地备份。
1、设置ssh,允许免密登录。(免密登录操作有疑虑的可在本文档中双因子登录相关修改中查看) 2、编写ssh脚本 将mysql产生的各种日志文件、审计记录,打包成压缩包发送到另一服务器。 3、通过crontab定期执行。 crontab -e 即可编写命令
4、加密传输
该测评项等保服务商提供的建议是对数据进行加密存储以及加密传输。其中加密存储系统无法完成,所以对重要页面在传输数据的过程中增加可逆加密算法。
测评对象:数据安全
安全层面:安全计算环境
安全控制点:数据保密性
测评项目:应采用密码技术保证重要数据在存储过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等。
符合情况:不符合
风险情况:高
结果记录:应用系统未采用技术措施对存储在数据库中的鉴别数据、重要业务数据和重要个人信息进行保密性处理
问题描述:应用系统未采用技术措施对存储在数据库中的鉴别数据、重要业务数据和重要个人信息进行保密性处理
整改建议:建议对主要的操作系统、网络设备、数据库管理系统、应用系统采用密码技术对存储过程中的鉴别数据、重要业务数据和重要个人信息进行保密性处理
解决方案:
前端页面在提交重要数据之前,通过js加密。
(1)js加密 js加密使用crypto.js,引入js后,编写js文件进行加密。 原本加密的js有进行js混淆,不过在ie内核的浏览器中,js混淆后的代码无法执行,就取消了混淆。
const key = CryptoJS.enc.Latin1.parse('16位字符');
const iv = CryptoJS.enc.Latin1.parse('16位字符');
function encrypt(text){
var encrypted = CryptoJS.AES.encrypt(text, key, {iv:
iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding}).toString();
return encrypted;
}
(2)接收后解密 php:
/**
* 提交数据加密运输
* @author zitian
*/
class Encrypt{
/**
* 解密(约定好了类型为:aes-128-cbc)
* @param array|string $data 需要解密的字符串、数组等
* @return array|bool|string
*/
public static function deciphering($data) {
$is_array_type = false; // 检验输入值类型
if(!is_string($data))
{
if(is_array($data))
{
// 数组转化为json字符串
$data = json_encode($data);
$is_array_type = true;
}else{
return false;
}
}
// 秘钥
$encrypt_key = "与js一致的16位字符";
$encrypt_iv = "与js一致的16位字符";
// 通过openssl_decrypt进行解密
$decrypted = openssl_decrypt($data, 'aes-128-cbc', $encrypt_key,OPENSSL_ZERO_PADDING ,$encrypt_iv);
if($is_array_type)
{
$decrypted = json_encode($decrypted);
}
if(is_string($decrypted)){
$decrypted = trim($decrypted);
}
return $decrypted;
}
}
5、修改数据库账号
测评对象:数据库
安全层面:安全计算环境
安全控制点:入侵防范
测评项目:应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制。
符合情况:不符合
风险情况:高
结果记录:数据库系统未限制网络地址范围对通过网络进行管理的管理终端进行限制
问题描述:数据库系统未限制网络地址范围对通过网络进行管理的管理终端进行限制
整改建议:建议数据库系统限制网络地址范围对通过网络进行管理的管理终端进行限制
解决方案:
合理的划分数据库权限,暂时不允许数据库账户的host项为“%”,将所有host改为确定的ip地址。 修改前备份数据表。修改可通过直接更改mysql库中的user表。(至少要给自己保留操作权限。)修改后刷新权限生效。 修改后可能出现部分视图因创建者账户被修改而无法编辑的状态。执行一下命令之后将会获得sql语句,执行生成的sql语句即可。
select concat("alter DEFINER=`new user`@`new host` SQL SECURITY DEFINER VIEW `",TABLE_SCHEMA,"`.",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER = 'old user@old host';
6、数据库登录管理插件
测评对象:数据库
安全层面:安全计算环境
安全控制点:身份鉴别
测评项目:应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施。
符合情况:不符合
风险情况:高
结果记录:该数据库未设置登录失败处理功能和操作超时退出功能等策略
问题描述:该数据库未设置登录失败处理功能和操作超时退出功能等策略
整改建议:建议数据库设置登录失败处理功能参数,至少满足登录失败次数超过5次采取非法登录锁定措施,操作超时时间不大于10分钟,如Mysql配置登录失败处理功能,输入my.cnf添加指令:connection-control-failed-connections-threshold=5和connection-control-min-connection-delay=600000,设置wait_timeout为900
解决方案:
安装服务:connection_mysql
进入数据库执行sql安装:
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME'connection_control.so';
查看启用情况:
show plugins;
配置文件修改
connection-control-failed-connections-threshold=5
connection-control-min-connection-delay=600000
wait_timeout=900
plugin-load-add = connection_control.so
interactive_timeout = 800012
执行后重启mysql。
7、Linux双因子登录
测评对象:数据库服务器
安全层面:安全计算环境
安全控制点:身份鉴别
测评项目:应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
符合情况:不符合
风险情况:高
结果记录:该操作系统仅采用用户名/口令对用户进行身份鉴别,未采用两种或两种以上组合的鉴别技术对用户进行身份鉴别
问题描述:该操作系统仅采用用户名/口令对用户进行身份鉴别,未采用两种或两种以上组合的鉴别技术对用户进行身份鉴别
整改建议:建议操作系统采用两种或两种以上组合的鉴别技术实现用户身份鉴别,双因子鉴别方法,如:第一种鉴别采用用户名/密码,第二种鉴别USBkey、动态密码、令牌、数字证书、虹膜等
解决方案:
数字证书+用户名/密码 ssh支持对登录设置多个身份验证方法。
vim /etc/ssh/sshd_config
AuthenticationMethods "publickey,password"
PasswordAuthentication yes
配置之后,生成publickey
在 /root 目录下执行
ssh-keygen -t rsa
其中两次输入密码的时候根据业务需求输入。直接回车,登录时就不需要多输入秘钥的密码。
执行之后,在root目录下的.ssh目录中,就生成了秘钥id_rsa文件和公钥id_ras.pub文件
将公钥文件id_rsa.pub配置到需要秘钥登录的服务器。
进入到.ssh目录
cat id_rsa.pub >> authorized_keys
将秘钥文件妥善保管。 完成以上操作之后重启mysql服务器。