oracle部分
账户权限加固
1.1.1删除或锁定无效账号
必须以DBA身份登录才有修改权限
l 删除用户:
SQL>DROPUSER USERNAME CASCADE;
l 锁定用户:
SQL>ALTER USER USERNAME ACCOUNT LOCK;
锁定除SYS、SYSTEM、DBSNMP,SYSMAN,MGMT_VIEW和业务以及维护用的帐号以外所有其他的帐号。 如果不需要使用EM(Enterprise Manager)则还可以锁定DBSNMP,SYSMAN,MGMT_VIEW三个帐号。
1.1.2权限最小化
限制应用用户在数据库中的权限,尽量保证最小化,避免授予DBA权限。
查看权限:
SQL>select *from user_sys_privs;
SQL>select *from user_role_privs;
SQL>select *from user_table_privs;
赋予用户权限
SQL>grant 权限 to username;
收回用户权限
SQL> revoke 权限 from username;
1.1.3撤销public角色的程序包执行权限
A.查看public角色的程序包执行权限
SQL> SELECT TABLE_NAME FROM DBA_TAB_PRIVS WHEREGRANTEE=’PUBLIC’ AND PRIVILEGE=’EXECUTE’;
B.撤销public角色的程序包执行权限
例如:
SQL>REVOKE EXECUTE ON UTL_FILE FROMPUBLIC;
Oracle官方建议撤销public角色对utl_file,utl_http,utl_tcp,utl_smtp,dbms_random程序包的执行权限。
用户组PUBLIC,表示数据库中的每一位用户,因此,对PUBLIC用户组授予权限其实也就是对数据库中的每一位用户都授予了相应的权限。这是在授予或撤销权限时非常有用的一条捷径。但也可能带来巨大的安全隐患,尤其是在试图确保以最少权限的方式运行数据库
时,更是如此。
撤销Public 组的一些不必要权限,严格限制以下程序包的权限:
UTL_FILE:该程序包允许oralce 用户读取服务器上的文件,如果设置错误的话,可能可以得到任何文件。
UTL_HTTP:该程序包允许oracle 用户通过HTTP 访问外部资源包括恶意的web 代码和文件。
UTL_TCP: 该程序包允许oracle 通过TCP 建立连接,从而从网络上得到可执行文件。
UTL_SMTP: 该程序包允许oracle 通过SMTP 方式进行通信,从而转发关键文件。
撤销以上包的执行权限:
Sql:
revoke EXECUTE on UTL_FILE from public;
revoke EXECUTE on UTL_TCP from public;
revoke EXECUTE on UTL_SMTP from public;
revoke EXECUTE on UTL_HTTP from public;
1.1.4修改系统账户的默认口令
SQL>ALTER USER SYS IDENTIFIED BY<NEWPASSWORD>;
SQL>ALTER USER SYSTEM IDENTIFIED BY<NEWPASSWORD>;
1.1.5密码策略设置
Oracle中与密码策略有关的配置项如下:
FAILED_LOGIN_ATTEMPTS: 最大错误登录次数
PASSWORD_GRACE_TIME: 口令失效后锁定时间
PASSWORD_LIFE_TIME: 口令有效时间
PASSWORD_LOCK_TIME: 登录超过有效次数锁定时间
PASSWORD_REUSE_MAX: 口令历史记录保留次数
PASSWORD_REUSE_TIME: 口令历史记录保留时间
PASSWORD_VERIFY_FUNCTION: 口令复杂度审计函数
PASSWORD_LIFE_TIME:口令有效时间
口令使用期限(按照国网要求,三个月修改一次密码,即90天)。
PASSWORD_GRACE_TIME:
指的是在你的密码已经过期以后,第一次登录时间开始往后统计,使系统可以使用的日期限度。
PASSWORD_REUSE_TIME:
是重用密码的最小时间间隔,单位是天。可以给出整数或分数,如1/1440表示1分钟(出于效率的考虑,oracle不会每分钟都去进行检查,一般来说,有5分钟左右的误差,因此如果这个数小于1/144则没有多大的意义)。
PASSWORD_REUSE_MAX 是重用密码前更换密码的最小次数。
安全设置:
根据公司密码策略修改$ORACLE_HOME /rdbms/admin/utlpwdmg.sql文件的192-197行:如下:
生效方法:
$cd $ORACLE_HOME /rdbms/admin/
$sqlplus /nolog
>conn /assysdba;
>@utlpwdmg.sql
>quit
设置后,密码复杂度必须包含字母,数字,标点(不区分大小写),最小长度为8;
1.2 数据库访问控制加固
1.2.1限制数据库文件的访问权限
A.用操作系统命令查看库文件访问权限
#ls –l $ORACLE_BASE/oradata
B.用操作系统命令删除库文件组和其他用户的写权限
#chmod 640 $ORACLE_BASE/oradata/*
1.2.2设置ORALCE可执行程序文件的最小访问权限
A.用操作系统命令查看$ORALCE_HOME/bin下可执行程序的访问权限
#ls –l $ORACLE_HOME/bin
B.用操作系统命令删除库文件组和其他用户的写权限
#chmod 640 $ORACLE_HOME/bin/*
1.3 服务加固
1.3.1清理数据库中无用的表,视图
A.查看数据库中表或视图等对象
SQL>SELECT * FROMDBA_TABLES;
SQL>SELECT * FROMDBA_VIEWS;
B.删除数据库中存在的无用的,测试的表或视图
SQL>DROP TABLE <TABLENAME>;
SQL>DROP VIEW <VIEWNAME>;
1.4 网络访问控制加固
1.4.1设置TNS登录IP限制
A.在目录$ORACLE_HOME/network/admin下修改sqlnet.ora文件实现TNS登录IP限制,设置信息如下:
tcp.validnode_checking=yes
#允许访问的IP
tcp.invited_nodes=(ip1,ip2,…)
#不允许访问的IP
tcp.execluded_node=(ip1,ip2,…)
B.修改sqlnet.ora后,重新启动listener服务。
需要注意的问题:
1、需要设置参数为YES,这样才能激活。
2、建议设置允许访问的IP,因为IP地址有可能被随意修改,就不能起到自己的目的。
3、TCP当参数TCP.INVITED_NODES和TCP.EXCLUDED_NODES设置的地址相同的时候将覆盖TCP.EXCLUDED_NODES设置。
4、需要重启监听器才能生效。
5、这个方式只是适合TCP协议。
6、这个配置适用于9i以上版本。在9i之前的版本使用文件protocol.ora。
7、在服务器上直接连接数据库不受影响。
8、这种限制方式事通过监听器来限制的。
9、这个限制只是针对IP检测,对于用户名检测事不支持的。
1.4.2修改数据库默认端口
A.停止监听
su – oracle
$lsntctl stop
B.修改监听文件的端口号,在目录$ORACLE_HOME/network/admin下修改listener.ora文件
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST=LOCALHOST)(PORT=11251))
)
)
C.修改初始化参数local_listener
SQL> ALTER SYSTEM SETlocal_listener=’’(address=(protocol=tcp)(host=localhost)(port=11521))”;
SQL> quit
D.重启监听
$lsnrctl start
E.修改完毕,使用新端口登录测试
netstat –tunap|grep grep 11521
lsnrctl status
客户端连接测试。
1.4.3关闭操作系统远程认证
操作系统认证方式登录数据库的含义是:只要是以oracle用户登录的用户都可以使用"sqlplus/ as sysdba"方式连接到数据库中。
出于安全的考虑,我们可能需要禁用这个特性。当然,如果以操作系统认证方式无法顺利登录,也可以通过在这个方法来排查故障问题。
1.以操作系统认证方式登录数据库的方法
1)最基本的方法就是使用"sqlplus/ as sysdba"登录数据库
[oracle@secdb admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:00:10 2010
Copyright(c)1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options
SQL>
斜杠"/"左面是用户名,右面是密码,这里表示不给出用户名和密码一样可以登录到数据库系统中。
2)使用正确的用户名和密码登陆数据库
[oracle@secdb admin]$ sqlplus sys/oracle assysdba
SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:00:52 2010
Copyright(c)1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options
SQL>
显然,登录完全没有问题。
3)使用错误的用户名和密码登陆数据库
[oracle@secdb admin]$ sqlplussys_1/oracle_1 as sysdba
SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:01:07 2010
Copyright(c)1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options
SQL>
这种操作系统认证方式登录数据库,即使使用的是错误的用户名和密码依然可以顺利的登录到数据库中。
2.禁用操作系统认证方式登录数据库
禁用的方法很简单,仅需在sqlnet.ora配置文件中添加一条"SQLNET.AUTHENTICATION_SERVICES=(NONE)"即可。
调整sqlnet.ora文件内容。
[oracle@secdb ~]$ vi$ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES=(NONE)
3.验证是否生效
1)必须使用正确的用户名和密码才能登陆到系统中
[oracle@secdb admin]$ sqlplus sys/oracle assysdba
SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:58:29 2010
Copyright(c)1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options
SQL>
2)使用正确的用户名和错误的密码进行登录测试
[oracle@secdb admin]$ sqlplus sys/oracle_1as sysdba
SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:59:14 2010
Copyright(c)1982, 2006, Oracle. AllRights Reserved.
ERROR:
ORA-01017: invalid username/password; logondenied
Enter user-name:
提示无效的用户名和密码,无法完成登录!
3)使用"sqlplus /as sysdba"登录方式进行验证
[oracle@secdb admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:58:05 2010
Copyright(c)1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
此处显示权限不足,不允许登录!
4.进一步提高系统的安全性
因为sqlnet.ora文件默认条件下oracle用户可以对其进行任意修改,我们可以通过调整sqlnet.ora文件的owner和权限的方式进一步提高系统的安全性。
1)默认条件下sqlnet.ora文件的权限和owner信息
[oracle@secdb admin]$ ls -l sqlnet.ora
-rw-r--r-- 1 oracle oinstall 266 Dec 2621:00 sqlnet.ora
2)调整sqlnet.ora文件的owner和权限信息
[root@secdb admin]# chown root:rootsqlnet.ora
[root@secdb admin]# chmod 744 sqlnet.ora
[root@secdb admin]# ls -l sqlnet.ora
-rwxr--r-- 1 root root 266 Dec 26 21:00sqlnet.ora
调整之后,oracle用户将再无权限对sqlnet.ora文件进行调整。
操作系统认证方式连接数据库是默认行为,这种方法给我们管理数据库带来了极大的便利。在得到便捷操作的同时带来的是安全上的问题,权衡利弊,做出最后的选择。
1.6 审计策略加固
启用相应的审计功能,配置审核策略使系统能够审核数据库管理和安全相关操作的信息,建议对SYSDBA审计操作
A.启用审计功能
SQL>ALTER SYSTEM SET audit_trail=osscope=spfile;
B.启用对SYSDBA的活动审计
SQL>ALTER SYSTEM SETaudit_sys_operations=true;
C.重启数据库生效
对于Oracle数据库的审计,我们一般都会认为一般不能开审计啊,一旦开启了会对oracle数据库的性能产生巨大影响。所以针对oracle自身的数据库审计的策略几乎很少有人提起。今天我就测试一下细致化的审计策略是否对数据库的操作审计有效。
首先我们先看一下Oracle默认安装后审计策略设置是怎样的。
图1
1.7由图可知默认情况下,审计策略是关闭的,而且审计记录存储的模式也未选择。所以默认情况下,某用户对某表做了某操作都是不做任何记录的。
这里先补充说明一下audit_sys_operations值只有TRUE和FALSE两个之分。
但是audit_trail值有如下情况:
(1)audit_trail=’DB’表示把审计日志记录到数据库sys.audit$表中。
(2)audit_trail=’DB,extended’在DB选项基础上,在audit$表中还增加了SQLBIND和SQLTEXT两个clob栏位,用来存储SQLBIND和SQLTEXT信息。
(3)audit_trail=‘OS’审计结果存放在操作系统的审计信息中,若是windows平台,audit trail会记录在windows的事件管理器中,若是linux/unix平台则会记录在audit_file_dest参数指定文件中。
(4)audit_trail=‘xml’审计结果存放在XML中,并包含XML文件可以由数据库以外的工具方便地处理,过滤出有用的事件,与其它系统中的审计日志组合,并格式化HTML显示,操作系统文件提供比SYS.AUD$表更强大的安全性,特别是在希望阻止数据库管理员查看或修改审计跟踪的情况下,即使关闭数据库实例,仍然可以继续使用保存在数据库外的审计日志。用以下代码确定写入审计文件的目录:audit_file_dest='directorypath'。注意,directorypath这不是一个目录对象,而是操作系统目录的实际路径名。
(5)audit_trail=‘xml,extended’,存储为xml,并包含SQLBIND和SQLTEXT信息。
audit_trail是static参数,每次修改后需要重新启动数据库才能生效。
此实验我们设置audit_trail值为DB,把审计日志记录到数据库sys.audit$表中。
SQL > alter systemset audit_sys_operations=TRUE scope=spfile ;
SQL > alter systemset audit_trail=DB scope=spfile ;
然后重启数据库:startup force
Mysql部分
操作系统级别的加固
2.1.1将数据库文件放在系统分区以外的分区
root登录
show variableswhere variable_name = 'datadir';
修改my.cnf,增加或修改如下信息:
[mysqld]
#mysql数据文件实际存放路径
datadir=/wwwroot/mysql
设置完后,重启mysql。
2.1.2使用最小权限允许Mysql数据库进程
#useradd mysql
#passwd mysql
#chown –R mysql:mysqlmysql文件目录
建议:该项在mysql安装时实现。
2.1.4禁用mysql命令历史记录
#find / -name“.mysql_history”
删除.mysql_history文件
设置环境变量MYSQL_HISTFILE为/dev/null,并添加到初始化脚本中,创建mysql_history到/dev/null的软连接
#ln –s /dev/null.mysql_history //将mysql记录文件置空
#ln -s /dev/null.bash_history //将shell记录文件置空
2.1.5确保MYSQL_PWD环境变量未设置敏感信息
#grep MYSQL_PWD /proc/*/environ
如果查询到,需进行脱敏处理。
2.2安装时加固
l 使用专用的服务器作为MYSQL数据库服务器。
l 根据不同业务分配专用的登录账号。
l 禁止在系统命令行使用明文登录MYSQL数据库。
l 执行mysql_secure_installation程序
数据库初次安装完成后,找到mysql_secure_installation程序,并执行他,按提示完成安全设置。
find / -name'mysql_secure_installation'
2.3文件权限加固
2.3.1控制数据目录的访问权限
root登录
show variableswhere variable_name = 'datadir';
在终端命令行执行如下命令:
#ls -l <datadir>/.. | egrep"^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"
其中<datadir>是第一条命令的执行结果;
如果存在问题,linux环境下在终端执行如下命令进行加固:
chmod 700<datadir>
chownmysql:mysql <datadir>
2.3.2控制二进制日志的使用权限
Mysql命令行下执行如下命令:
>show variables like 'log_bin_basename';
在终端命令行执行如下命令:
#ls <log_bin_basename>.*
对于发现的每一个文件,执行如下命令:
#ls -l <log_bin_basename.nnnnn> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 <log file>
chown mysql:mysql <log file>
2.3.3控制错误日志文件的权限
Mysql命令行下执行如下命令:
>show variables like 'log_error';
在终端命令行执行如下命令:
#ls <log_error>.*
对于发现的每一个文件,执行如下命令:
#ls -l <log_error> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
#chmod 660 <log file>
#chown mysql:mysql <log file>
2.3.4控制慢查询日志文件的权限
Mysql命令行下执行如下命令:
>show variables like 'log_error';
在终端命令行执行如下命令:
#ls <log_error>.*
对于发现的每一个文件,执行如下命令:
#ls -l <log_error> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 <log file>
chown mysql:mysql <log file>
2.3.5控制通用日志文件的权限
Mysql命令行下执行如下命令:
>show variables like 'general_log_file';
在终端命令行执行如下命令:
#ls <general_log_file>.*
对于发现的每一个文件,执行如下命令:
#ls -l <general_log_file> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
#chmod 660 <log file>
#chown mysql:mysql <log file>
2.3.6控制审计日志文件的权限
Mysql命令行下执行如下命令:
>show global variables where variable_name= 'audit_log_file';
在终端执行如下命令:
#ls -l <audit_log_file> | egrep"^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[
\t]*mysql.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
#chmod 660 <audit_log_file>
#chown mysql:mysql <audit_log_file>
2.4通用安全加固
2.4.1删除test数据库
Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:
Drop database “test”;
2.4.2确保读取本地文件的参数设置失效
Mysql命令行下,使用如下命令:
>SHOW VARIABLES WHERE Variable_name ='local_infile';
查看结果是否为OFF。
如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE或者SELECT local_file读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:
Local-infile=0;
然后重启数据库服务。
2.5数据库权限加固
2.5.1控制可以访问所有数据库的账号权限
Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。可以访问mysql数据库的用户或许可以查看密码哈希值、修改用户权限等等。
使用如下sql语句:
SELECT user, host FROM mysql.user
WHERE (Select_priv = 'Y') OR(Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');
SELECT user, host FROM mysql.db WHERE db ='mysql'
AND ((Select_priv = 'Y') OR(Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR(Create_priv = 'Y') OR (Drop_priv = 'Y'));
确保返回结果只能是数据库管理员账号。
2.5.2限制非管理员用户的权限
Mysql.user表中的权限列有:
file_priv:表示是否允许用户读取数据库所在主机的本地文件;
Process:表示是否允许用户查询所有用户的命令执行信息;
Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;
Shutdown_priv:表示用户是否可以关闭数据库;
Create_user_priv:表示用户是否可以创建或删除其他用户;
Grant_priv:表示用户是否可以修改其他用户的权限;
应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:
select user, host from mysql.user whereFile_priv = 'Y';
select user, host from mysql.user whereProcess_priv = 'Y';
select user, host from mysql.user whereProcess_priv = 'Y';
SELECT user, host FROM mysql.user WHEREShutdown_priv = 'Y';
SELECT user, host FROM mysql.user WHERECreate_user_priv = 'Y';
SELECT user, host FROM mysql.user WHEREGrant_priv = 'Y';
SELECT user, host FROM mysql.db WHEREGrant_priv = 'Y';
确保查询结果中不存在非管理员用户。
如果存在非管理员用户,使用如下命令进行权限回收:
REVOKE FILE ON *.* FROM '<user>';
REVOKE PROCESS ON *.* FROM '<user>';
REVOKE SUPER ON *.* FROM '<user>';
REVOKE SHUTDOWN ON *.* FROM '<user>';
REVOKE CREATE USER ON *.* FROM '<user>';
REVOKE GRANT OPTION ON *.* FROM <user>;
其中user为上述查询到的非管理员用户。
2.5.3合理控制DML/DDL操作授权
DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:
SELECT User,Host,Db FROM mysql.db WHERESelect_priv='Y'
OR Insert_priv='Y' ORUpdate_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'
OR Drop_priv='Y' OR Alter_priv='Y';
上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:
REVOKE SELECT ON <host>.<database>FROM <user>;
REVOKE INSERT ON <host>.<database>FROM <user>;
REVOKE UPDATE ON <host>.<database>FROM <user>;
REVOKE DELETE ON <host>.<database>FROM <user>;
REVOKE CREATE ON <host>.<database>FROM <user>;
REVOKE DROP ON <host>.<database>FROM <user>;
REVOKE ALTER ON <host>.<database>FROM <user>;
其中<user>为查询到的未授权的用户,host为相关主机,database为相关数据库。
2.6加固审计和日志
2.6.1开启错误日志审计功能
错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:
>SHOW variables LIKE 'log_error';
确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。
2.6.2确保日志存放在非系统区域
日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:
>SELECT @@global.log_bin_basename;
确保返回结果不是如下路径:/、/var、/usr.
2.6.3关闭原始日志功能
原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:
Log-raw = OFF
2.7认证加固
2.7.1 Old_password环境变量设置
Old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY、CREATE USER、GRANT等语句是时的hash算法:
0 - authenticate with the mysql_native_passwordplugin
1 - authenticate with the mysql_old_passwordplugin
2 - authenticate with the sha256_passwordplugin
设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:
>SHOW VARIABLES WHERE Variable_name ='old_passwords';
确保返回值不为1。
参考文档:https://dev.mysql.com/doc/refman/5.6/en/account-upgrades.html
2.7.2密码保存
严禁将密码保存在全局配置文件中。
2.7.3禁止所有用户使用非空密码登录
执行如下语句查询是否有用户不需要密码即可登录:
SELECT User,host
FROM mysql.user
WHERE (plugin IN('mysql_native_password','mysql_old_password')
AND (LENGTH(Password) = 0
OR Password IS NULL))
OR (plugin='sha256_password' ANDLENGTH(authentication_string) = 0);
版本不一样用如下命令:
mysql> selecthost,user,authentication_string from mysql.user;
+-----------+-----------+-------------------------------------------+
| host | user | authentication_string |
+-----------+-----------+-------------------------------------------+
| localhost |root |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| localhost |mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| % | root |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-----------+-------------------------------------------+
3 rows in set (0.00sec)
mysql>
2.7.4删除空账号
DELETE FROM mysql.user WHERE user = '';