摘要:基于当今盘算机网络中资源共享中信息平安性存在的隐患,数据库系统中重要的网络数据库系统MySQL的基于受权表的平安机制,以及如何在运用中就文件系统掩护、口令掩护、权限表设置和运行选项的采取来进步平安性能的问题。
症结词:网络平安性 内部平安性内部平安性MySQL权限系统
MySQL作为一种疾速、多用户、多线程的SQL数据库效劳器,可以通过Intemet不便地获取和晋级,属免费软件,这使它成为B/S系统开发的首选数据库。作为一个网络数据库,其平安性尤其重要。作为MySQL治理员有义务保障数据库系统、内容的平安性,使得这些数据记载只能被准确受权的用户走访,这触及到数据库系统的内部平安性和内部平安性,内部平安性关切的是文件系统的问题,内部平安性关切的是内部通过网络衔接效劳器的客户问题。MySQL有一套先进但非规范的平安,权限机制。
1.内部安全性
在MySQL中,一个数据库(包含寄放用户权限信息的mysql库)对应着文件系统的一个目录,数据库中的表则对应着此目录中3个后缀分手为frm、MYD、MYI的与表同名的文件,而这些文件可间接转移到其它MySQL效劳器的数据目录下,所以关于数据文件系统的掩护也就是数据平安的重要一环。
2.MySQL、系统的作用
MySQL权限系统的重要功用是验证衔接到一台MySQL效劳器主机的一个用户能否非法,并且赋予该用户在一个数据库表上读取、拔出、更新、删除记载的权限。另外,还有能否许可匿名走访数据库,以及能否许可从内部文件批量向数据表中追加记载等操作的才能。
MySQL供给以下权限:
1) select、insert、update和delete权限许可用户在一个数据库现有的表上实施读取、拔出、更新、删除记载的操作。
2) index权限许可用户在数据表上树立或删除索引。
3) alter权限许可用户运用ALTER TABLE命令来修正现有数据表的构造。
4) create和drop权限许可创立新的数据库和表,或删除现存的数据库和表。
注重:假如将mysql数据库的drop权限授予一个用户,该用户能删除存储了51xp系统的数据库!
5) grant权限许可用户把本人领有的权限授予其它的用户。
6) file权限许可被授予该权限的用户都能读或写MySQL效劳器能读或写的任何文件。
7) shutdown权限许可用户运用shutdown命令关掉效劳器。
8) process权限许可用户运用。
9) reload权限许可用户运用reload命令告诉MySQL效劳器再次读入受权表;运用refresh命令刷新一切表、关上和封闭日志记载文件。
processlist命令显示在效劳器内履行的过程的信息;运用kill命令杀逝世效劳器过程。用户总是能显示或杀逝世本人的过程,然而,显示或杀逝世其它用户启动的过程须要process权限。
3.MySQL权限更改后的失效
mysqld启动时将一切的受权表内容读入内存,所以任何权限都会在这时失效。
效劳器启动后,修正的权限何时失效:
1)用GRANT、REVOKE或SET PASSWORD语句对受权表实施的修正会马上失效。
2)假如运用INSERT、UPDATE等语句手工修正受权表,权限不会马上失效,而是在下一次启动效劳器时失效。假如想使修正的权限马上失效,应当履行FLUSH PRIVILECES语句或运行mysqladmin flush - privileges或mysqladmin reload告诉效劳重视新装载受权表。
3)当效劳器注重到受权表更改时,对已经存在的用户衔接有以下影响:
表和列权限的修正,在用户的下一次请求时失效;
数据库权限的修正,在下一个履行USE db -name命令时失效。
4)全局权限的修正和口令的修正,在下一次用户衔接时失效。转贴于 中
4.内部平安性
4.1 明码的掩护
当客户想要登陆一个MySQL效劳器时,MySQL客户次序个别请求客户指定衔接参数:想要联接的主机、用户名和口令。假如衔接参数以多种方法被指定,在命令行上被指定的值优先于在配置文件和环境变量中指定的值,而在配置文件指定的值优先于在环境变量中指定的值。无论哪种方法的衔接,其参数指定,重点在于明码的掩护。
1)避免在命令行中输出明文显示的口令。
2)避免配置文件是全部或组可读的。当采取非交互式方法登陆效劳器时,须要事前在配置文件中存储口令,已备系统登陆时调用。
3)避免在环境变量MYSQL PWD中存储口令。
4)避免口令明文在命令行中涌现、在衔接上传输。
总之,最平安的方法是让客户次序提醒口令或在一个受掩护的文件中指定口令。
4.2权限系统的设置掩护
MySQL的平安/权限掌握信息重要寄放在mysql库User、Db、Host表中,这3个表中字段分为规模字段和权限字段。
MySQL存取权限掌握蕴含2个阶段。
1)效劳器验证客户的身份,肯定能否许可衔接。客户的身份是依据客户衔接的主机、指定的用户名和明码来唯一肯定的。当客户试图衔接一个MySQL效劳器时,效劳器会用mysql库中User表的3个字段(Host、User、Password)检讨客户的身份,假如与User表中的某一条记载完整匹配,MySQL接收这次衔接;假如匹配多条记载,将以MySQL对User表读入时排序的次序阅读条目,第一个匹配的条目被运用;否则终止这个衔接请求。
2)假设能衔接,效劳器检讨客户收回的每个请求,看能否有足够的权限实施它。阶段2中请求确认是由被存储在mysql数据库中user、db、host、ta2bles priv和columns priv受权表中的权限内容来验证的。MySQL的平安,权限系统是很灵巧的,它许可以多种不同的方法设置用户权限:既可以运用规范的SQL语句CRANT和REVOKE来修正受权表,也可以用Update、In-sert等语句间接修正受权表。在MySQL启动时和在权限修正失效时,效劳器读一文些数据表内容。
5.网络平安性
5.1物理划分
为进步数据库平安,可以通过物理介质和对应的软件将Intemet走访MySQL划分为若干区域,包含内网机制、中介机制和外网机制。走访的整体途径如图1所示。
在树立数据库时,将数据库树立在一个小型内网规模内,为避免空间糟蹋,可以同时搁置多个数据库。
在内网与外网之间树立中介机制,作为内网和外网的衔接区和隔离带。无论从外网走访数据库或从内网走访数据库,均须先走访这个中介机制,待中介机制进行信息解决后才能实施走访。中介机制为一个独立的设置,既与内网和外网互相联络,又有绝对的独立性。
5.2 内网机制
在内网中搁置数据库,须要增添相干平安插件才能保障数据库在内网中的平安,以准确地对数据库履行查问、显示、修正、编纂、删除等操作。
5.2.1数据库用户
在衔接数据库历程中,增添限制用户机制,给内网配置一个普通用户ID,给予走访数据库的权限,每次中介机制转接出去的请求都通过这个ID登陆数据库进行相干操作。 增添明码治理工具,参加数据库明码修正(在mysql/bin):mysqladmin -u用户名-p旧明码password新明码),在相应距离时光内履行,如图2所示。
5.2.2效劳器设置
为保障数据的平安性,可以通过启动效劳器和停滞效劳器来阻拦内部数据入侵,避免数据泄漏。在内网得到请求时,须要向数据库中查问数据信息时履行插件启动数据库效劳器( mysql server start),在内网停滞对数据库的走访时,主动履行插件停滞效劳器(mysql server stop)。
5.2.3主动备份
通过启动数据库效劳器之后的时光距离,树立主动备份系统,以及时备份录入和更改的数据。
5.3中介机制
通过在内网中设置中介机制,避免外网用户间接得到数据库运用权限,隔断外网用户运用触发器来制作数据库后门,而留下数据平安隐患。在中介机制中设置主动判定数据机制和内外网的衔接机制,如图3所示。
5.4外网机制
MySQL被普遍地运用在Internet上的中小型网站中,因而涌现了通过近程网络走访数据库中的共享资源,然而基于对数据库中信息的平安掩护,外网则被中介机制和内网机制与数据库隔离,不可以间接衔接数据库,以确保数据库的平安,是以外网机制最为简朴,只担任吸收和发送。
在网络走访MySQL历程中三个阶段尽管会延伸走访数据库的时光,然而在现今数据的高效性下,照旧可以填补这一缺点,同时可以到达极大水平的进步网络中走访数据库时对数据的平安掩护。
通过提交一个精心制作的身份验证数据分组,对于攻击者而言,就有可能绕过在4.1.0到4.1.2以及5.0早期构建版的MySQL中的密码身份验证机制。下面的代码取自sql_parse.cpp文件的check_connection代码:
/*
旧版本的客户端发送以null结束的字符串作为密码;新客户端使用尺寸(1字节)+字符串(并非以null作为终止符)作为密码。 因此如果是空密码的话,两者都会发送‘\0’。
*/
uint passwd_len= thd-》client_capabilities & CLIENT_SECURE_CONNECTION ?
*passwd++ : strlen(passwd);
0x8000是在客户端的能力标志中规定的,用户可以指定所选的passwd_len字段。对于该攻击,我们选择0x14 (20),这是我们预期的SHA1杂凑长度。
现在要执行多道检测以保证用户是从授权连接的主机上进行身份验证。通过这些检测后,我们到达:
/* 检查密码:它应该为空或者是正确的 */
if (passwd_len == acl_user_tmp-》salt_len)
{
if (acl_user_tmp-》salt_len == 0 ||
acl_user_tmp-》salt_len == SCRAMBLE_LENGTH &&
check_scramble(passwd, thd-》scramble, acl_user_tmp-》salt) == 0 ||
check_scramble_323(passwd, thd-》scramble,
(ulong *) acl_user_tmp-》salt) == 0)
{
acl_user= acl_user_tmp;
res= 0;
}
}
Check_scramble函数失败,但是在check_scramble_323函数之内我们看到:
my_bool
check_scramble_323(const char *scrambled, const char *message,
ulong *hash_pass)
{
struct rand_struct rand_st;
ulong hash_message[2];
char buff[16],*to,extra;
const char *pos;
hash_password(hash_message, message, SCRAMBLE_LENGTH_323);
randominit(&rand_st,hash_pass[0] ^ hash_message[0],
hash_pass[1] ^ hash_message[1]);
to=buff;
for (pos=scrambled ; *pos ; pos++)
*to++=(char) (floor(my_rnd(&rand_st)*31)+64);
extra=(char) (floor(my_rnd(&rand_st)*31));
to=buff;
while (*scrambled)
{
if (*scrambled++ != (char) (*to++ ^ extra))
return 1; /* 密码错误 */
}
return 0;
}
现在win7旗舰版用户已经规定了一个他想要的杂凑字符串,本例为一个零长度的字符串。最后的循环对杂凑字符串与MySQL已知正确响应字符串进行逐字符比较,直到杂凑字符串中的所有字符都比较完为止。由于在杂凑字符串中根本没有要比对的字符,所以函数会立即返回0,即允许用户使用零长度字符串通过身份验证。
6.小结
MySQL作为被普遍采取的网络数据库,它具备先进但非规范的平安/权限机制,这就请求系统治理员在他的平安性计划方面不能完整遵照惯例,但假如做好文件系统掩护、口令掩护和权限表的设置,一样可以使数据系统、数据处于平安的地步。另外,作为MySQL治理员,要订阅MySQL邮件列表,能及时地晓得bug和补丁的下载晋级。
参考文献:
【1】陈小辉,文佳,邓杰英.MySQL数据库的权限及其平安缺点【J】.盘算机平安,2008,(2).
【2】刘兆风,汤茂斌.MySQL平安机制及应对办法讨论【N】。广州大学学报(天然科学版),2003.