MSSQL数据库安全实验

管理SQL Server认证模式

    (1)确认 SQL Server 验证

   1. 在桌面上单击“开始”,选择“程序”→“Microsoft SQL Server 2005” →“SQL Server Management Studio”,出现“连接到服务器”对话框。

   2. 在“连接到服务器”对话框中,按表中的指定值进行设置,然后单击“连接”按钮,如下图。

     

    

    3.如果“对象资源管理器”不可见,则选择“视图”菜单上的“对象资源管理器”。

    4.在“对象资源管理器”中,右击服务器->单击“属性”->安全性->“服务器身份验证”选项区->选择身份验证模式(“SQL Server 和Windows 身份验证模式”)->确定

    5.在“对象资源管理器”中,右击服务器->单击“重新启动”

    6.在“摘要”面板中,右击“SQL Server 代理”->单击“启动”。

    

管理数据库登录

    SQL Server有两个默认的用户登录账号:即sa和administrators\builtin。sa是系统管理员,它是SQL Server的一个超级登录账号,这个账号具有操作SQL Server服务器的一切权限。BUILTIN\Administrators组成员的 Windows NT 4.0 或 Windows 2000 用户自动成为 sysadmin 固有服务器角色成员。

    (1)使用企业管理器管理Windows身份验证的登录帐号。

    ① 回到桌面,右击我的电脑->点击管理->展开系统工具->本地用户和组->用户,此时在右边可以看到当前系统中所有的用户。

    在右侧空白处右击,点击新用户。添加一个用户aaa,设置密码为admin,把用户下次登录时须更改密码前面的勾选去掉,把密码永不过期的选项选上,然后点击创建

    此时在用户列表中可以看到该用户已经添加成功。

    

    然后右击该用户->选择属性-> 点击隶属于选项卡->点击左下角的添加按钮,弹出选择组对话框->点击左下角的高级,弹出如下对话框->点击立即查找,在搜索结果中选择 administrators->点击确定按钮

    在winuser属性的隶属于选项卡下可以看到,多了一个administrators。

    

    ②在SQL Server Management Studio中,右击数据库->选择新建数据库->在数据库名称内输入student->点击确定 

    展开实例下的“安全性”->右击“登录名”按钮->在弹出的快捷菜单中选择“新建登录”->在“常规”选项卡中,单击“名称”输入框右侧的按钮->点击高级,弹出新的对话框->点击右侧的立即查找,在搜索结果中,找到aaa并选择该用户->点击确定->自动返回上一个对话框->点击确定->验证方式选择 “Windows 身份验证”->默认数据库选择student,完成登陆账号winuser的创建

    ③选择“服务器角色”选项卡。可以在服务器角色列表框中选择相应的服务器角色成员。在这里,设置登录用户winuser的服务器角色为系统管理员。

    

    ④选择“用户映射”选项卡,在列表框中列出了该账号可以访问的数据库,如果单击数据库左边的复选框,表示该用户可以访问相应的数据库。在这里,选中数据库master和student左边的复选框,表示登陆用户winuser可以访问的数据库为master和student。在下方的数据库角色成员身份都选择public。然后点击确定。

    

    在对象资源管理器中,展开安全性-登录名,可以看到aaa已存在。

    

    同时,展开数据库->系统数据库->student-安全性-用户,在用户列表中可以看到数据库student中已经建立一个数据库用户aaa。

    

    验证用WinUser账号登录SQL Server:首先在操作系统中注销当前用户的登陆,将用户切换到WinUser,再用此账号连接SQL Server查询分析器,用Windows身份验证登录,可以进入查询分析器,使用数据库master和student。

    由于远程桌面注销会又会自动连接,所以我们需要先修改当前用户(administrator)的登录密码。

    来到桌面,右击我的电脑,点击管理,在计算机管理窗口,依次展开 系统工具-本地用户和组-用户(不会的可参考之前新建aaa时的步骤),在右侧右击administrator,选择设置密码->点击继续->设置一个密码(我设置的密码是admin),需记住密码-> 点击确定,会提示密码已设置->点击左下角的开始,选择注销-> 弹出确认窗口,点击注销->自动到登陆页面,输入之前新建的aaa和密码,点击确定登录->登录后,点击左下角的开始-所有程序-Microsoft SQL Server 2005-SQL Server Management Studio 进入SQL Server Management Studio->身份验证选择 Windows 身份验证->点击连接后,登陆成功,此时可以新建查询,使用数据库master和student。

    (2)使用SQL Server Management Studio管理SQL Server身份验证的登录帐号。

    注销winuser,切换到administrator用户(不会的可参考之前从administrator切换到winuser的步骤)。

    ①在 SQL Server Management Studio中,展开实例下的“安全性”,右击“登录名”按钮,在弹出的快捷菜单中选择“新建登录”(参考前面新建登录步骤),

    ②在登录名输入框内输入需要新建的用户名,这里新建的用户名是SQLUser。验证方式选择SQL Server身份验证,然后在密码框输入SQLUser的密码。这里设置成test。把强制实施密码策略的复选框去勾选去掉,默认数据库选择master,然后点击确认。

    

    注意:采用该方法创建的SQL Server登录账号只能用于登录SQL Server服务,与登录的计算机的Windows账号无关,不能用此账号登录Windows。

    ③单击“用户映射”,在“映射到此用登录名的用户”中,将所有数据库都选中,下方的数据库角色成员身份全部选择public,然后单击确定完成账号的创建。

    

    ④关闭SQL Server Management Studio重新打开,在登录页面处身份验证选择SQL Server身份验证。然后输入刚才新建的账号和密码,然后点击连接。

    

 

    登录成功,此时可以新建查询来查询数据。

管理数据库用户

    数据库用户对数据的访问权限以及对数据库对象的所有关系都是通过用户账号来控制的。在数据库中,用户账号与登录账号是两个不同的概念。一个合法的登录账号只表明该账号通过了Windows认证或SQL Server 认证,但不能表明其可以对数据库数据和数据对象进行某种或某些操作,只有其同时拥有了用户账号后,才能够访问数据库。所以一个登录账号总是与一个或多个数据库用户账号(这些账号必须分别存在相异的数据库中)相对应,这样才可以访问数据库。

    (1)创建数据库用户

    打开SQL Server Management Studio,展开服务器-数据库,选择要创建用户的数据库,如student,展开student,用鼠标右键单击“安全性”节点,从弹出的菜单中选择“新建-用户”命令->弹出“新建用户”对话框->在用户名输入框输入要新建的数据库用户名称,如dbuser  ->在“登录名”处点击后面的按钮-> 弹出选择登录名对话框,在该对话框选择浏览-> 弹出查找对象对话框,在里面选择一个用户,选择administrators->点击确定,自动返回到选择登录名对话框

    

 

    点击确定,在此用户拥有的架构勾选db_owner,数据库角色成员身份同样选择db_owner,单击“确定”按钮,即可完成数据库用户的创建。

    (2)修改用户信息

    用鼠标右键单击要修改的用户,在系统弹出菜单上单击“属性”

    可打开“数据库用户”对话框查看该用户的信息,同时需要时能直接修改相应用户的设置信息。

    (3)删除数据库用户。

    在企业管理器中,用鼠标右键单击要删除的数据库用户,如数据库student中的数据库用户dbuser,从快捷菜单中选择“删除”命令即可。(要删除架构中的db_user)

管理数据库角色

    SQL Server有自己的固有角色。固有角色是指 SQL Server预先定义好的系统角色。用户不能修改这些角色的任何属性,也不能创建新的服务器固有角色和数据库固有角色。

    数据库角色是在数据库的安全级别上创建,一个数据库角色只在其所在的数据库中有效,对其他数据库无效。在数据库中,除了有固有的数据库角色外,还可以自定义数据库角色,同时根据需要,可以为数据库角色添加成员或删除自定义角色。

    1.创建数据库角色

    打开SQL Server Management Studio,展开服务器-数据库,选择要创建用户的数据库,如student,展开student,用鼠标右键单击“安全性”节点,从弹出的菜单中选择“新建-数据库角色”命令->弹出“新建角色”对话框,在角色名称输入框中输入数据库新角色的名称,如NewRole,点击所有者后面的按钮->在里面选择一个用户,例如选择aaa(如果不会,参考前面的步骤)->在此角色拥有的架构中选择db_owner,然后点击确定,完成角色创建。

    在安全性-角色-数据库角色中看到,刚才添加的角色已经成功。

    

 

    (2)删除自定义的数据库角色

    在SQL Server Management Studio中,用鼠标右键单击要删除的自定义角色,如NewRole,从弹出的菜单中选择“删除”命令即可删除自定义角色。

    注意:不能删除一个有成员的角色,在删除角色之前,应先删除其成员。

管理数据库权限

    权限用来指定授权用户可以使用的数据库对象和这些授权用户可以对这些数据库对象执行的操作。用户在登录到SQL Server之后,其用户账号所归属的NT组或角色所被赋予的权限决定了该用户能够对哪些数据库对象执行哪种操作以及能够访问、修改哪些数据。在SQL Server中包括语句级权限和对象级权限。

    (1)进行语句级权限管理:

    启动SQL Server Management Studio,展开实例数据库,右击student数据库,在弹出的快捷菜单中选择“属性”,然后选择“权限”选项卡。在用户WinUser一栏中,将“创建表”和“创建视图”选中.

    在SQLUser一栏中,则选择除“创建表”和“创建视图”以外的选项

    

 

    图中权限设置的方法是:

    许可权限中复选框单击为勾号时:表示授予该权限。

    许可权限中复选框单击为叉号时:表示角色或用户不具有该操作权限。

    许可权限中复选框既没勾号,也没叉号时:表示角色或用户是否具有该操作权限要根据隐含规则来决定。

    这样的结果是,授予用户WinUser可以在数据库student中创建视图和表。授予用户SQLUser可以在数据库student中进行除创建视图和表以外的所有操作。

分析与思考

1、 SQL Server的Windows认证模式和混合认证模式的区别?

两个验证方式的不同主要集中在信任连接和非信任连接。
windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不推断sapassword。而仅依据用户的windows权限来进行身份验证,我们称为“信任连接”。可是在远程连接的时候会因NTML验证(NT系统一种验证方法)的缘故,无法登陆。
混合模式验证就比較既当本地用户訪问sql时候採用windows身份验证建立信任连接。当远程用户訪问时因为未通过windows认证,而进行sql server认证(使用sa的用户也能够登录sql),建立“非信任连接”。从而使得远程用户也能够登录。

2、 分析数据库各种角色权限的异同,自定义数据库,并进行权限管理,深入理解实验原理。

角色权限

 

 

自定义数据库:

 

CREATE FUNCTION 函数名称(
  变量名称 类型,
  变量名称 类型
)
RETURN 类型
BEGIN
  -- 声明, 语句要完成的操作,
RETURN 变量;
END;

 

 权限管理

SQL server中的访问权限分别从服务器、数据库及对象三个级别进行设置。

1、服务器级别权限设置
在SOL Server 2016中内置了一组服务器角色(也称为固定服务器角色),这些角色用来执行服务器级别的管理,如创建数据库,管理和审核登录账户、 中止SQL Server实例中长时间运行的进程等,它们作用于整台服务器,而非单独某个数据库。

一个用户可以拥有多个固定服务器角色权限,但是固定服务器角色不能被修改、添加和删除。服务器角色如下所示:

2、数据库级别权限设置:
创建任何一个数据库中默认包含两个特殊用户 dbo(database owner)和guest,前者为数据库的所有者,对该数据库具有所有权限;后者是来宾账户,不能被删除,默认处于禁用状态且不具备任何权限。一般要慎重启用guest账号并授予权限。

服务器角色主要控制服务器登录名在服务器范围内的访问,但是在设置具体数据库的管理和操作权限方面就显得比较大了,因此需要依靠数据库角色对数据库级别的对象进行更加细化的权限划分。SQL server默认提供的数据库角色如下所示:

固定数据库角色还包含一个名为public的角色,该角色用来捕获数据库中用户的所有默认权限,所有用户和角色默认属于public角色,该角色不能被删除。

3、对象级别权限设置:
一个数据库中通常包含多个数据表、视图、存储过程等对象,如果赋予了某个用户对该数据库的读取权限,用户就可以读取该数据库下所有表或试图等。但是,如果只想让用户拥有查询某个对象的权限,就需要进行对象级别的权限设置了,下图是为表授权的一些常用权限及其说明:

(原文链接:https://blog.csdn.net/weixin_44907813/article/details/90512636)

3、 查阅近期数据库安全事件,分析攻击原理,掌握数据库安全的重要性

 

案例1:一条sql语句把数据库弄宕 链接 http://blog.itpub.net/23718752/viewspace-1141131/ 这个案例听起来好像还真玄妙,是真实的案例。 就是在生产库中执行了alter system set sga_target=xxxG; 这样一个语句导致数据库直接宕机。当然问题的发生还是有一些前提条件的。最终发现和一个Oracle bug有关。 Bug 10173135 - Resize SGA_TARGET crashes instance with ORA-600 [kmgsb_resize_sga_target_1] (Doc ID 10173135.8) 看似简单的一个操作就能导致严重的问题。生产中的操作真是慎之又慎,很多特性的使用也是需要斟酌和考究的。不要抱有侥幸心理,没准就让你碰上了。所以在生产中执行的语句,几乎都会在其它环境中反复测试才会部署。

案例2:kernel配置把数据库弄hang http://blog.itpub.net/23718752/viewspace-1417471/ 这个 这个问题其实也是客户带着侥幸心理,结果没想到真出了问题,倒不是把数据库弄宕。但是系统反应极为缓慢,swap的交换非常频繁,最后发现是由于调整了sga等参数,但是hugepage的调整给漏掉了。 在启动数据库的时候其实也报出了hugepage的问题,但是没有引起重视。

所以问题放大之后,就产生了严重的影响。linux内核参数在很多时候会起到决定性的作用,所以影响不容小视。

案例3:使用图形工具操作失误 图形工具在生产系统中会极大的提高工作效率,但是有时候会产生一些误导,比如测试环境中的一些配置信息和生产中是完全不同的。但是通过图形界面可能很简单的点一下按钮就会产生极为严重的数据事故,这个问题发生在很多补丁的部署在测试环境中都没有问题,但是在生产环境中有一个配置略有不同,结果没有引起重视,一个按钮点下去,在后台做了很多的验证和连接操作,然后就开始了一些意料之外的大动作,比如re-create,比如drop操作。这个问题最后发现是由于配置的问题导致的,最后采用了基于时间点的恢复,很快得以解决。但是虽然之后知道配置问题解决了,但是使用起来还是会有很多顾虑,最后一致决定,采用控制脚本来完成,在生产环境中完全弃用了这个工具。 所以生产中的操作是重之又重。不确定不明白的地方一定要确认好。存在的隐患一定要提前规避。 案例4:数据库升级中的exp错误,险些导致回退 http://blog.itpub.net/23718752/viewspace-773852/ 这个问题印象实在是太深了,和原厂的人折腾了很久,问题在类似生产环境中反复演练了很多次,都没有发现,但是在生产中还是碰到了。问题看似是一个小问题,在使用exp 使用consistent=y的时候出现问题,结果导致系统中某一个服务处理不了。

 

虽然最后得以解决,但是解决方案确实是有些牵强,就是purge recyclebin,即清空回收站。 mealink中的各种帖子都被翻遍了。各种bug和补丁都斟酌了,当时在场的那种压力可想而知,在紧绷神经近10多个小时之后,终于解决。也算是化险为夷了。

案例4:pl/sql性能问题导致升级差点失败 http://blog.itpub.net/23718752/viewspace-1172818/ 这个问题发生的也是意料之外,但是影响也很大,其实就是在升级前,从开发那边传过来一个补丁,在测试环境中测试通过,但是在类生产系统中没有测试,结果在部署的时候,pl/sql执行了好几个小时,给业务升级带来很大的影响,差点导致回退。 其实把pl/sql改为sql语句不到一分钟就能够搞定,但是因为这个临时的问题导致大家都有些手忙脚乱。

原文链接(https://cloud.tencent.com/developer/article/1062844)

 

 

posted @ 2021-09-17 09:00  乐忧hh  阅读(158)  评论(0)    收藏  举报