Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;
登陆:mysql: mysql -h 192.168.1.1 -uroot -p
一、账号管理、认证授权安全基线测试
1.以普通帐户安全运行mysqld,禁止mysql以管理员帐号权限运行
ps -ef | grep mysql
grep -i user /etc/my.cnf
# mysql服务的运行账号非高权限账号
配置:
# 配置/etc/my.cnf
[mysql.server]
user=mysql
2.应按照用户分配账号,避免不同用户间共享账号
3.应删除或锁定与数据库运行、维护等工作无关的账号
use mysql;
select host,user,authentication_string from user;
# 不同用户可以连接数据库
预期结果:
不同权限的账号均可连接数据,且与数据库运行、维护等工作无关的账号已被删除或锁定
drop user ''@'mysql',''@'localhost','root'@'::1','root'@'mysql';
4.检查帐户默认密码和弱密码
select Host,User,Password,Select_priv,Grant_priv from user;
密码长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类
update user set password=password('vv@122') where user='root';
5.在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限
检查命令:
select host,user,Select_priv,Insert_priv,Update_priv,Delete_priv,Drop_priv,Reload_priv,Shutdown_priv,Shutdown_priv,Process_priv from user;
select host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv from db;
Select_priv确定用户是否可以通过SELECT命令选择数据。
Insert_priv确定用户是否可以通过INSERT命令插入数据。
Update_priv确定用户是否可以通过UPDATE命令修改现有数据。
Delete_priv确定用户是否可以通过DELETE命令删除现有数据。
Drop_priv确定用户是否可以删除现有数据库和表。
Reload_priv确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表。
Shutdown_priv确定用户是否可以关闭MySQL服务器。在将此权限提供给root账户之外的任何用户时,都应当非常谨慎。
Process_priv确定用户是否可以通过SHOW PROCESSLIST命令查看其他用户的进程。
二、日志安全基线测试
6.数据库应配置日志功能。
show variables like 'log_%'; #查看所有的log命令
show variables like 'log_bin'; #查看具体的log命令
cat /etc/my.cnf
# 配置如下,启用审核记录对数据库的操作,便于日后检查
[mysqld]
log = filename
**三、其他安全基线测试
7.系统安装了最新的安全补丁(在保证业务及网络安全的前提下)**
SELECT VERSION();
8.禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击
远程无法连接数据库:telnet 192.168.1.1 3306
配置:
#方法是在my.cnf的[mysqld]部分增加:
bind-address=127.0.0.1
9.通过数据库所在操作系统或防火墙限制,只有信任的IP地址才能通过监听器访问数据库
mysql> GRANT ALL PRIVILEGES ON db.*一> 一> TO 用户名@’IP子网/掩码’;
#只有通过指定IP 地址段的用户才可以登录。在非信任的客户端以数据库账户登陆被提示拒绝。
10.根据机器性能和业务需求,设置最大最小连接数
SHOW [FULL] PROCESSLIST # 显示哪些线程正在运行
#root 用户登陆时可看到链接数配置信息。在[mysqld]配置段添加:max_connections=1000,即可配置
su -oracle # 切换到数据库用户
sqlplus /nolog # 运行sqlplus命令,进入sqlplus环境,nolog参数表示不登录;
conn /as sysdba # 以系统管理员(sysdba)的身份连接数据库
一、账号管理、认证授权安全基线测试
1.应按照用户分配账号,避免不同用户间共享账号。
select username from dba_users where ACCOUNT_STATUS='OPEN';
# 查看数据库已启用的帐号,不同权限的账号均以连接数据库;
配置:
create user abc1 identified by password1;
create user abc2 identified by password2;
#建立role,并给role授权,把role赋给不同的用户。abc1 和 abc2 是两个不同的账号名称
2.应删除或锁定与数据库运行、维护等工作无关的账号。
select username,account_status from dba_users;
首先锁定不需要的用户,确认该用户对业务确无影响的情况下,删除用户
alter user username account lock; #锁定
drop user username cascade; #删除
3.对用户的属性进行控制,包括密码策略、资源限制等
SELECT * from dba_profiles;
SELECT * from dba_users;
通过设置profile限制数据库账户口令的复杂程度,口令生存周期和账户的锁定方式等。
4.启用数据字典保护,只有SYSDBA用户才能访问数据字典基础表
show parameter 07_dictionary_accessibility;
show parameter O7_DICTIONARY_ACCESSIBILITY;
# 将O7_DICTIONARY_ACCESSIBILITY设置为FALSE
5.对于采用静态口令认证技术的数据库,账户口令的生存期不长于90天
select resource_name,limit from dba_profiles,dba_users where dba_profiles.profile = dba_users.profile and dba_users.account_status='OPEN' and resource_name='PASSWORD_GRACE_TIME';
# 预期结果PASSWORD_GRACE_TIME小于等于90。
6.对于采用静态口令认证技术的数据库,应配置数据库,使用户不能重复使用最近5次内已使用的口令
select resource_name,limit from dba_profiles,dba_users where dba_profiles.profile = dba_users.profile and dba_users.account_status='OPEN' and resource_name='PASSWORD_REUSE_MAX';
# 预期结果PASSWORD_REUSE_MAX大于等于5
7.对于采用静态口令认证技术的数据库,应配置当用户连续认证失败次数超过6次,锁定该用户使用的账号
select resource_name,limit from dba_profiles,dba_users where dba_profiles.profile = dba_users.profile and dba_users.account_status='OPEN' and resource_name='FAILED_LOGIN_ATTEMPTS';
# 预期结果FAILED_LOGIN_ATTEMPTS等于6
8.更改数据库默认帐号的密码。
常用默认用户账号登陆数据库;
#system/system 、 system/manager 、 sys/sys 、sys/cHAnge_on_install 、 scott/scott、scott/tiger、
# dbsnmp/dbsnmp 、rman/rman、xdb/xdb
9.对于采用静态口令进行认证的数据库,口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类
select limit from dba_profiles where resource_name='PASSWORD_VERIFY_FUNCTION' and profile in (select profile from dba_users where account_status='OPEN');
为用户建profile,调整PASSWORD_VERIFY_FUNCTION,指定密码复杂度
10.在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限
select * from user_sys_privs;
select * from user_role_privs;
select * from user_tab_privs;
# 预期结果:数据库权限配置合理
grant 权限 to username; #给用户赋相应的最小权限
revoke 权限 from username; #收回用户多余的权限
11.限制具备数据库超级管理员(SYSDBA)权限的用户远程登录
Show parameter REMOTE_LOGIN_PASSWORDFILE;
REMOTE_LOGIN_PASSWORDFILE设置为NONE,该参数在init.ora文件中设置:
remote_login_passwordfile=none;不使用密码文件登录;不允许远程用户用 sys 登录系统;可以在线修改 sys 的密码;
remote_login_passwordfile=exclusive ;只允许一个数据库使用该密码文件;允许远程登录;允许非 sys 用户以 sysdba 身份管理数据库;可以在线修改 sys 的密码;
-remote_login_passwordfile=shared
可以多个数据库使用密码文件。实际上是这样的: Oracle 数据库在启动时,首先查找的是orapw的口令文件,如果该文件不存在,则开始查找,orapw 的口令文件;如果口令文件命名为 orapw,多个数据库就可以共享.;允许远程登录;只能用 sys 进行 sysdba 管理;可以在线修改 sys 的密码。
12.使用数据库角色(ROLE)来管理对象的权限
select * from dba_role_privs;
select * from dba_sys_privs;
select * from dba_tab_privs;
# 对应用用户不要赋予DBA Role或不必要的权限
13.根据业务要求制定数据库审计策略
select * from dba_audit_trail; #检查初始化参数 audit_trail 是否设置
对审计的对象进行一次数据库操作,检查操作是否$ORACLE_BASE/admin/adump 目录下是否有数据被记录。
通过设置参数audit_trail = db或os来打开数据库审计。然后可使用Audit命令对相应 的对象进行审计设置。
14.对用户登录进行记录,记录内容包括用户登录使用的账号、登录是否成功、登录时间以及远程登录时用户使用的IP地址
15.数据库应配置日志功能,记录用户对数据库的操作,包括但不限于以下内容:账号创建、删除和权限修改、口令修改、读取和修改数据库配置、读取和修改业务用户的话费数据、身份数据、涉及通信隐私数据。记录需要包含用户账号,操作时间,操作内容以及操作结果。
16.数据库应配置日志功能,记录对与数据库相关的安全事件
检查命令:
select trigger_name from all_triggers where table_name='TRI_LOGON';
select text from all_source where type='TRIGGER' AND name='TRI_LOGON ';
select * from LOGON_TABLE;
登录测试,检查相关信息是否被记录。
配置:
创建 ORACLE 登录触发器,记录相关信息。
#建表 LOGON_TABLE
#建触发器
CREATE TRIGGER TRI_LOGON
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO LOGON_TABLE VALUES
(SYS_CONTEXT('USERENV', 'SESSION_USER'),
SYSDATE);
END;
备注:触发器对短连接业务的资源开销比较大,使用时要慎重考虑,
17.为数据库监听器(LISTENER)的关闭和启动设置密码
$ORACLE_HOME/network/admin/listener.ora 文 件 中 是 否正确 设 置 参 数 PASSWORDS_LISTENER。
18.使用Oracle提供的高级安全选件来加密客户端与数据库之间或中间件与数据库之间的网络传输数据
$ORACLE_HOME/network/admin/sqlnet.ora 文件是否设置sqlnet.encryption 正确设置参数sqlnet.encryption
19.在某些应用环境下可设置数据库连接超时,比如数据库将自动断开超过15分钟的空闲远程连接
$ORACLE_HOME/network/admin/sqlnet.ora 文件中是否正确设置参数 SQLNET.EXPIRE_TIME
配置:在sqlnet.ora中设置下面参数:SQLNET.EXPIRE_TIME=15。
注:如果服务器业务系统所访问,该项为可选
20.通过数据库所在操作系统或防火墙限制,只有信任的iP地址才能通过监听器访问数据库
$ORACLE_HOME/network/admin/sqlnet.ora 文件中是否正确设置参数tcp.validnode_checking 和 tcp.invited_nodes
在非信任的客户端以数据库账户登陆被提示拒绝
21.应设置PUBLIC角色执行权限
select count(*) table_name from dba_tab_privs where grantee='PUBLIC' and privilege='EXECUTE' and table_name in ('UTL_FILE', 'UTL_TCP', 'UTL_HTTP', 'UTL_SMTP', 'DBMS_LOB', 'DBMS_SYS_SQL', 'DBMS_JOB');
得到的数值越小越好,一般在10以下即可
22.应根据机器性能和业务需求,设置最大最小连接数
show parameter processes;
select count(*) from v$session;
执行 show parameter processes;可以看到 processes 和 sessions 参数以按照设定修改执行