沉默非金 發表於 2024-7-13 09:51:17

常见数据库安全加固及测评(MySQL|MongoDB|Oracle)

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">MySQL</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">一 身份鉴别</a></li><ul class="third_class_ul"><li><a href="#_label3_0_0_0">1.提示输入口令鉴别用户身份</a></li><li><a href="#_label3_0_0_1">2.查是否存在同名用户</a></li><li><a href="#_label3_0_0_2">-查询是否在空口令用户:</a></li><li><a href="#_label3_0_0_3">4)执行如下语句查看用户口今复杂度相关配置:</a></li></ul><li><a href="#_lab2_0_1">二、访问控制</a></li><ul class="third_class_ul"><li><a href="#_label3_0_1_4">1.执行语句select user,host FROM mysql.user</a></li><li><a href="#_label3_0_1_5">2.是否存在多余的、过期的账户,避免共享账户</a></li><li><a href="#_label3_0_1_6">3.应授予管理用户所需的最小权限,实现管理用户的权限分离</a></li><li><a href="#_label3_0_1_7">4.访问控制策略规定主体对客体的访问规则</a></li></ul><li><a href="#_lab2_0_2">三 安全审计</a></li><ul class="third_class_ul"><li><a href="#_label3_0_2_8">1.开启安全审计功能</a></li><li><a href="#_label3_0_2_9">2访谈是否存在第三方插件。</a></li><li><a href="#_label3_0_2_10">3.应对审计记录进行保护,定期备份</a></li></ul><li><a href="#_lab2_0_3">四 入侵防范</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label1">MongoDB</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_4">一 身份鉴别</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_5">二 访问控制</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_6">三安全审计</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_7">四检查mongod.log的日志文件记录是否正常:</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_8">五 入侵防范</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label2">Oracle</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_9">一、身份鉴别</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_10">二、访问控制</a></li><ul class="third_class_ul"><li><a href="#_label3_2_10_11">a) 应对登录的用户分配账户和权限;</a></li><li><a href="#_label3_2_10_12">d) 应授予管理用户所需的最小权限,实现管理用户的权限分离</a></li></ul></ul><li><a href="#_label3">总结</a></li><ul class="second_class_ul"></ul></ul></div><p></p>
<p class="maodian"><a name="_label0"></a></p><h2>MySQL</h2>
<p>Windows主机测评Mysql基础命令</p>
<div class="jb51code"><pre class="brush:sql;">createUSER 'new_user'@'localhost' IDENTIFIED BY 'password';                                //创建用户
alter user 'root'@'%' identified with mysql_native_password by '********';                 //修改密码
rename user 'root'@'%' to 'root'@'192.168.1.1';                                                                        //重命名
flush privileges;                                                                                                                                //刷新权限
grant all privileges on *.* to 'root'@'192.168.1.%';                                                         //赋予权限
revoke all privileges on *.* to 'root'@'%';                                                                                //收回权限
select current_user();                                                                                                //查看当前登录的用户
select current_role();                                                                                                 //查看当前登录的角
mysqldump -uroot -p mysql&gt;mysql.sql                                                                         //导出mysql数据库
create database xiaozhou_db;                                                                        //创建xiaozhou数据库
show databases;                                                                                                                        //展示所有数据库
drop database xiaohzou_db;                                                                                                        //删除数据库
alter user 'root'@'localhost' identified with mysql_native_password by 'xlpszqdbb';        //修改密码
show variables like 'port';                                                                                                                //查看端口
ALTER USER 'existing_user'@'localhost' IDENTIFIED BY 'new_password';
show variables like 'validate%';
show variables like '%connection_control%';
show variables like '%timeout%'</pre></div>
<p></p>
<p class="maodian"><a name="_lab2_0_0"></a></p><p class="maodian"><a name="_lab2_1_4"></a></p><h3>一 身份鉴别</h3>
<p></p>
<p>MySQL数据库对于用户的标识和其它数据库有些不一样,不仅仅是用户名,而是username + host。MySQL从5.7以上开始,密码字段不是password,而是authentication_string。</p>
<p>要满足密码复杂度必须在my.ini配置文件中安装plugin-load-add=validate_password.dll(Windows/Linux为plugin-load-add=validate_password.so)插件。</p>
<div class="jb51code"><pre class="brush:sql;">select * from mysql.`plugin`;//查看插件</pre></div>
<p style="text-align:center"><img alt="全网最全数据库安全加固及测评" src="https://img.jbzj.com/file_images/article/202407/202471392736429.png" /></p>
<div class="jb51code"><pre class="brush:xhtml;">install plugin validate_password soname 'validate_password.so';</pre></div>
<p>a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;</p>
<p class="maodian"><a name="_label3_0_0_0"></a></p><h4>1.提示输入口令鉴别用户身份</h4>
<p>1)尝试登录数据库,**执行mysql -u root -p(linux下)查看是否提示输入口令鉴别用户身份。**此处直接使用navicat 进行管理。</p>
<div class="jb51code"><pre class="brush:bash;">mysql -h localhost -u root -p123</pre></div>
<p class="maodian"><a name="_label3_0_0_1"></a></p><h4>2.查是否存在同名用户</h4>
<div class="jb51code"><pre class="brush:sql;">select user, host FROM mysql.user</pre></div>
<p>结果输出用户列表,查者是否存在相同用户名。结果默认不存在同名用户。</p>
<p class="maodian"><a name="_label3_0_0_2"></a></p><h4>-查询是否在空口令用户:</h4>
<div class="jb51code"><pre class="brush:sql;">select * from mysql.user where length(password)= 0 or password is null</pre></div>
<p>或者</p>
<div class="jb51code"><pre class="brush:sql;">select user,authentication_string from user;</pre></div>
<p>mysql 5.7以上识别第二条命令)通过查看不存在空口令用户。</p>
<p class="maodian"><a name="_label3_0_0_3"></a></p><h4>4)执行如下语句查看用户口今复杂度相关配置:</h4>
<div class="jb51code"><pre class="brush:sql;">show variables like 'validate%';</pre></div>
<p>默认情况下未配置,为空。</p>
<p>要满足密码复杂度必须在my.ini配置文件中安装plugin-load-add=validate_password.dll(Windows/Linux为plugin-load-add=validate_password.so)插件。</p>
<p>b) 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;</p>
<p>登录失败功能也需要mysql安装connection_control.dll或者connection_control.so插件才能实现</p>
<p>1)询问管理员是否采取其他手段配置数据库登录失败处理功能。</p>
<p>2)执行show variables like &#39;%connection_control%&#39;;或核查my.cnf或者my.ini文件,应设置如下参数:</p>
<p>max_connect_errors=100</p>
<div class="jb51code"><pre class="brush:sql;">validate_password_policy:密码安全策略,默认MEDIUM策略
validate_password_dictionary_file:密码策略文件,策略为STRONG才需要
validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,至少1个
validate_password_number_count :数字至少1个validate_password_special_char_count:特殊字符至少1个</pre></div>
<blockquote><p>show variables like &rdquo;%timeout%&ldquo;,查看返回值。默认Wait_ timeout: 一个连接connection空闲超过8个小时(默认值28800秒),MySQL 就会自动断开这个连接。默认不符合,时间太长。</p></blockquote>
<p>当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;</p>
<p>1)是否采用加密等安全方式对系统进行远程管理</p>
<p>是否用户都是localhost,全为localhost则为本地管理。不适用。</p>
<p>2)若存在远程管理,执行</p>
<div class="jb51code"><pre class="brush:sql;">show variables like "%have_ssl%"</pre></div>
<p>或者者show variables like &quot;%have_openssl%&quot;</p>
<p>查看是否支持ssl的连接特性,若为disabled说明此功能没有激活,或执行\s查看是否启用SSL。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><p class="maodian"><a name="_lab2_2_10"></a></p><h3>二、访问控制</h3>
<p>应对登录的用户分配账户</p>
<p class="maodian"><a name="_label3_0_1_4"></a></p><h4>1.执行语句select user,host FROM mysql.user</h4>
<p>输出结果结合访谈管理员是否存在网络管理员,安全管理员,系统管理员等多个账户,且分配了相应权限。</p>
<div class="jb51code"><pre class="brush:sql;">show grants for 'XXXX'@' localhost':</pre></div>
<p>查看其他管理员用户账号的权限,是否只存在特定用户如root 用户存在权限分配的权限。其他普通用户如test用户应无Grant option 权限。</p>
<p class="maodian"><a name="_label3_0_1_5"></a></p><h4>2.是否存在多余的、过期的账户,避免共享账户</h4>
<div class="jb51code"><pre class="brush:sql;">select user,accounted _lock from user;</pre></div>
<p class="maodian"><a name="_label3_0_1_6"></a></p><h4>3.应授予管理用户所需的最小权限,实现管理用户的权限分离</h4>
<div class="jb51code"><pre class="brush:sql;">select * from mysql.user</pre></div>
<p>如除root外,任何用户不应该有mysql库user表的存取权限,禁止将fil、process、 super权限授予管理员以外的账户</p>
<p>查看用户权限表,并验证用户是否具有自身角色外的其他用户的权限。输入<strong>select \* from mysql.user where user=&quot;用户名&quot;。</strong></p>
<p class="maodian"><a name="_label3_0_1_7"></a></p><h4>4.访问控制策略规定主体对客体的访问规则</h4>
<p>select * from mysql.user -检查用户权限列</p>
<p>select * from mysql.db --检查数据库权限</p>
<p>select * from mysql.tables_priv 一检查用户表权限列</p>
<p>select * from mysql.columns_priv-检查列权限列管理员</p>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>三 安全审计</h3>
<p class="maodian"><a name="_label3_0_2_8"></a></p><h4>1.开启安全审计功能</h4>
<div class="jb51code"><pre class="brush:sql;">show global variables like '%general%'。默认为OFF,不符合。应设置为ON为开启审计。</pre></div>
<p>是否已开启审计general_log为ON。输入:select * from general_log;得知具体内容</p>
<p class="maodian"><a name="_label3_0_2_9"></a></p><h4>2访谈是否存在第三方插件。</h4>
<p>对于生产环境中任务繁重的MySOL数据库,启用审计会引起服务器的高昂成本,因此建议采用第三方数据库审计产品收集审计记录。</p>
<p class="maodian"><a name="_label3_0_2_10"></a></p><h4>3.应对审计记录进行保护,定期备份</h4>
<div class="jb51code"><pre class="brush:bash;">cp /var/log/audit/audit.log /path/to/backup/audit.log//手动备份
gzip -c /var/log/audit/audit.log &gt; /path/to/backup/audit.log.gz//压缩备份
crontab 定时定期自动备份</pre></div>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>四 入侵防范</h3>
<p>1.管理终端进行限制</p>
<p>user表中的Host值不为本地主机时,应指定特定IP地址,不应为%;</p>
<p>host表中指定用户帐户允许登陆访问的主机;在非信任的客户端以数据库账户登录应被提示拒绝,从其他子网登录,应被拒绝</p>
<div class="jb51code"><pre class="brush:bash;">GRANT ALL ON *.* TO 'root'@'myip.athome' //指定IP范问</pre></div>
<p>2.版本补丁情况</p>
<div class="jb51code"><pre class="brush:sql;">show variables where variable_name like "version"</pre></div>
<p>3.数据库定期漏扫</p>
<p></p>
<p class="maodian"><a name="_label1"></a></p><h2>MongoDB</h2>
<h3>一 身份鉴别</h3>
<p>MongoDB服务在安装后默认未开启权限验证,默认是空账户、空口令</p>
<p>mongod.cfg配置文件中修改auth=true,启用身份认证,执行命令mongo显示权限不足</p>
<p>自身不具备设置登录账户的口令复杂度和定期更换口令的策略,</p>
<p>仅通过管理员自行设置口令复杂度,use admin。</p>
<p>是否采用加密安全方式对系统进行远程管理</p>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>二 访问控制</h3>
<p>show users&rdquo;查看mongoDB中的账户的管理权限,</p>
<p>授予管理用户所需的最小权限,</p>
<p>实现管理用户的权限分离</p>
<p>mongoDB不存在默认账户, 应及时删除或停用多余的、过期的账户,避免共享账户的存在</p>
<p>访谈和查看管理员是否制定了访问控制策略;</p>
<p>use admin 启用身份鉴别,且具备权限分离</p>
<p>访问控制的粒度应达到主体为用户级或进程级</p>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>三安全审计</h3>
<p>检查mongod.cfg配置文件中是否添加quiet: false,启用日志安全审计功能</p>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>四检查mongod.log的日志文件记录是否正常:</h3>
<p>访谈人员是否通过第三方工具(数据库审计系统)收集审计数据进行分析,查看是否包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息。</p>
<p>应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等</p>
<p>MongoDB数据库备份:</p>
<div class="jb51code"><pre class="brush:bash;">mongodump -h dbhost -d dbname -o dbdirectory</pre></div>
<p>MongoDB数据库恢复:</p>
<div class="jb51code"><pre class="brush:bash;">mongorestore -h dbhost -d dbname --dir dbdirectory</pre></div>
<p>集群部署、双机热备均可判定为符合。</p>
<p>检查数据库中是否存储个人信息,若有,检查个人信息保护机制和个人信息保护管理制度</p>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>五 入侵防范</h3>
<p>最小安装原则</p>
<p>管理的管理终端进行限制</p>
<p>打开mongdb.cfg 看它的bindip。需要修改为指定连接</p>
<p>访谈管理员是否定期或不定期进行扫描或测试,若存在,是否及时进行修补。</p>
<p><strong>a)应采用密码技术保证重要数据在传输过程中的完整性</strong></p>
<p>TLS、SSH等协议</p>
<p>询问管理人员是否使用了第三方软件对数据库重要数据进行了完整性校验。</p>
<p></p>
<p class="maodian"><a name="_label2"></a></p><h2>Oracle</h2>
<p class="maodian"><a name="_lab2_2_9"></a></p><h3>一、身份鉴别</h3>
<p>a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;</p>
<p>sysdba是Oracle数据库的最高权限管理员。通常使用sqlplus或PL/SQL 管理软件进行管理,PL/SQL 为第三方管理软件,但SQL查询语句一样。</p>
<p>注:sysdba如果是本地管理,乱输密码也能登录成功,需要改sqlnet.ora文件。</p>
<ul><li>管理员登录数据库时是是否需要输入用户名/口令,不存在空口令;</li><li>使用&nbsp;<strong>Select username,account_status from dba_users</strong>; 显示所有能登录数据库的用户信息:(),那些是open那些是locked,UID是否唯一</li></ul>
<p>\3. 通过命令 *select \&nbsp;from dba_profiles where resource_type=&#39;password&#39;;<strong>或</strong>SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE=&#39;DEFAULT&#39; AND RESOURCE_NAME=&#39;PASSWORD_VERIFY_FUNCTION&#39;;**如果为NULL则为未设置密码复杂度要求。</p>
<p>若有设置应为 (1)PASSWORD_LOGIN_ATTEMPTS = 登录尝试次数; (2)PASSWORD_LIFE_TIME = unlimited 未设置口令有效期; (3)PASSWORD_ROUSE_MAX = unlimited 未设置重新启用一个先前用过的口令前必须对该口令进行重新设置的次数(重复用的次数); (4)PASSWORD_VERIFY_FUNCITON = NULL,未设置口令复杂度校验函数; (5)PASSWORD_GRACE_TIME=,口令修改的宽限期天数:7;</p>
<p>b) 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;</p>
<p>1. 通过输入&nbsp;<strong>SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE=&#39;DEFAULT&#39; AND RESOURCE_NAME=&#39;FAILED_LOGIN_ATTEMOTS&#39;;</strong>,查询结果若为&rsquo;UNLIMITED&rsquo;则无登录重试次数限制,超过此值用户被锁定。可以通过ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 10(重试次数10次)</p>
<h3>二、访问控制</h3>
<p class="maodian"><a name="_label3_2_10_11"></a></p><h4>a) 应对登录的用户分配账户和权限;</h4>
<p>通过输入<strong>Select username,account_status from dba_users;</strong>语句,主要查看数据库存在那些可用用户,至少得有两个,该测评项就需要Oracle中存在至少两个账户,且这两个账户的权限不一样。</p>
<p>1.为用户分配了账户和权限及相关设置情况,主要看可用账户(例如采用&ldquo;用户权限列表&rdquo;);<br />2.是否已禁用或限制匿名、默认账户的访问权限。如只有MGMT_UIEW,SYSTEM,SYS,DBSNMP为启用状态,其他均为启用状态,则为符合。</p>
<p>b) 应重命名或删除默认账户,修改默认账户的默认口令</p>
<p>在Oracle中默认用户最常用的就是SYS和SYSTEM这两个账户。<br />1.是否已经重命名SYS、SYSTEM、DBSNMP等默认帐户名或已修改默认口令,sys默认口令为CHANGE_ON_INSTALL;SYSTEM:MANAGER;DBSNMP的默认口令为:DBSNMP。可以登录测试。</p>
<p>c) 应及时删除或停用多余的、过期的账户,避免共享账户的存在</p>
<p>访谈管理员是否存在多余或过期账户,管理员用户与账户之间是否一一对应通过输入<strong>Select username,account_status from dba_users;</strong>查看是否存在默认帐户SCOTT/OUTLN/ORDSY等用户,不存在acount_status为expired的账户。访谈管理员是否存在共享账户等。示例不符合。</p>
<p class="maodian"><a name="_label3_2_10_12"></a></p><h4>d) 应授予管理用户所需的最小权限,实现管理用户的权限分离</h4>
<p>1. 通过输入<strong>Select username,account_status from dba_users;</strong>查看状态为open的用户的用途。是否进行角色划分,是否有多个用户进行管理数据库;<br />2. 通过输入&nbsp;<strong>select * from dba_tab_privs where grantee=&#39;SYS&#39; &nbsp;ORDER BY GRANTEE;</strong>查看SYS最高权限授予给那些用户,得知管理用户的权限是否已进行分离;</p>
<p class="maodian"><a name="_label3"></a></p><h2>总结</h2>
<p>数据库安全加固是组织信息安全战略的关键组成部分,不仅有助于防范安全威胁,还能支持业务发展和符合法律法规的要求。</p>
<p>到此这篇关于常见数据库安全加固及测评(MySQL|MongoDB|Oracle)的文章就介绍到这了,更多相关常见数据库安全加固及测评内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: 常见数据库安全加固及测评(MySQL|MongoDB|Oracle)