设为首页 收藏本站
查看: 815|回复: 0

[经验分享] SQL Server 数据库帐号密码生成

[复制链接]

尚未签到

发表于 2015-6-27 12:06:19 | 显示全部楼层 |阅读模式
  一、背景
  在某天晚上凌晨1点,我收到领导的通知:需要把我们所有的数据库的密码都需要进行一次修改,原因是我们放到Web服务器的配置文件config中明文了我们的数据库帐号和密码,而且这份配置文件可能泄露了,更糟糕的是我们的数据库是可以通过外网进行访问的。虽然有端口进行映射,但是我们的数据依然处在危险的状态,所以这个时候DBA需要争分夺秒修改数据库的帐号密码。
  我们的数据库服务器大概有30台,而且每台机器上跑了很多个数据库。有创建数据库帐号经验的同学你会发现:使用SSMS进行创建帐号密码是件多么痛苦的事情,需要点击很多checkbox,特别是在创建一个可以访问整个数据库实例里的所有数据库的时候(虽然我们提倡每个数据库的帐号和密码都不一样,更严格的要求可能需要设置同一个数据库下需要有不同权限的帐号进行管理)
  如果我们对数据库的帐号进行有效管理的话,我们可以很轻松的完成这个任务,只需要一条SQL就能管理了。在这里我提倡一种安全、易维护的方案给大家:SQL Server数据库帐号密码安全设计
  在看这篇文章之前,建议你先看看:SQL Server 2005控制用户权限访问表
  
  二、设计概要
  我们首先要明白我们出现的问题是什么:
  1.      我们厌烦了一个个去点击checkbox;
  2.      点击那么多次checkbox,我们不能确保所有的点击都是正确的;
  所以我们第一步要想的就是有没什么办法可以解决上面这些问题?上面的这些操作SSMS是能让用户把操作保存为脚本的,我们可以自己编写SQL脚本来完成类似的工作。为了模拟SSMS上的操作,我们需要获取到数据库实例中所包含的所有数据库,再对每个数据库创建帐号和密码。我们可以通过游标的形式循环数据库,并创建帐号和密码。最后我们需要禁用掉sa这个帐号。
  修改下面【通用SQL模板】的@user和@password的值,拷贝到下面的代码到SSMS中执行,这样就可以生成出适合本数据库实例的SQL脚本【生成的脚本代码】了,我们再拷贝生成的SQL代码到SSMS中执行就可以了。
  执行下面的两个脚本不过秒级,所以20台服务器对你来说,简单啦。
  
  三、通用SQL模板



--创建数据库帐号
DECLARE @dbname varchar(100)
DECLARE @user varchar(100)
DECLARE @password varchar(100)
DECLARE @sql varchar(max)
SET @user = 'UfranimdA_gz'
SET @password = 'o23#25R@8a8A!@23#@%'
SET @sql = '
USE [master]
GO
CREATE LOGIN ['+ @user + '] WITH PASSWORD=N'''+ @password +''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
EXEC master..sp_addsrvrolemember @loginame = N'''+@user+''', @rolename = N''sysadmin''
GO'
PRINT(@sql)
DECLARE @itemCur CURSOR
SET @itemCur = CURSOR FOR
SELECT name from sys.databases where state =0
OPEN @itemCur
FETCH NEXT FROM @itemCur INTO @dbname
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql = '
USE ['+ @dbname + ']
GO
CREATE USER ['+@user+'] FOR LOGIN ['+@user+']
GO
USE ['+ @dbname + ']
GO
ALTER USER ['+@user+'] WITH DEFAULT_SCHEMA=[dbo]
GO
USE ['+ @dbname + ']
GO
EXEC sp_addrolemember N''db_owner'', N'''+@user+'''
GO'
PRINT(@sql)
FETCH NEXT FROM @itemCur INTO @dbname
END
CLOSE @itemCur
DEALLOCATE @itemCur
--禁用sa帐号
SET @sql = '
USE [master]
GO
ALTER LOGIN [sa] DISABLE
GO'
PRINT(@sql)
  
  四、生成的脚本代码



--创建数据库帐号密码
USE [master]
GO
CREATE LOGIN [UfranimdA_gz] WITH PASSWORD=N'o23#25R@8a8A!@23#@%', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
EXEC master..sp_addsrvrolemember @loginame = N'UfranimdA_gz', @rolename = N'sysadmin'
GO
USE [master]
GO
CREATE USER [UfranimdA_gz] FOR LOGIN [UfranimdA_gz]
GO
USE [master]
GO
ALTER USER [UfranimdA_gz] WITH DEFAULT_SCHEMA=[dbo]
GO
USE [master]
GO
EXEC sp_addrolemember N'db_owner', N'UfranimdA_gz'
GO
USE [tempdb]
GO
CREATE USER [UfranimdA_gz] FOR LOGIN [UfranimdA_gz]
GO
USE [tempdb]
GO
ALTER USER [UfranimdA_gz] WITH DEFAULT_SCHEMA=[dbo]
GO
USE [tempdb]
GO
EXEC sp_addrolemember N'db_owner', N'UfranimdA_gz'
GO
USE [model]
GO
CREATE USER [UfranimdA_gz] FOR LOGIN [UfranimdA_gz]
GO
USE [model]
GO
ALTER USER [UfranimdA_gz] WITH DEFAULT_SCHEMA=[dbo]
GO
USE [model]
GO
EXEC sp_addrolemember N'db_owner', N'UfranimdA_gz'
GO
USE [msdb]
GO
CREATE USER [UfranimdA_gz] FOR LOGIN [UfranimdA_gz]
GO
USE [msdb]
GO
ALTER USER [UfranimdA_gz] WITH DEFAULT_SCHEMA=[dbo]
GO
USE [msdb]
GO
EXEC sp_addrolemember N'db_owner', N'UfranimdA_gz'
GO
USE [DBA_DB]
GO
CREATE USER [UfranimdA_gz] FOR LOGIN [UfranimdA_gz]
GO
USE [DBA_DB]
GO
ALTER USER [UfranimdA_gz] WITH DEFAULT_SCHEMA=[dbo]
GO
USE [DBA_DB]
GO
EXEC sp_addrolemember N'db_owner', N'UfranimdA_gz'
GO
USE [TestDB]
GO
CREATE USER [UfranimdA_gz] FOR LOGIN [UfranimdA_gz]
GO
USE [TestDB]
GO
ALTER USER [UfranimdA_gz] WITH DEFAULT_SCHEMA=[dbo]
GO
USE [TestDB]
GO
EXEC sp_addrolemember N'db_owner', N'UfranimdA_gz'
GO
USE [master]
GO
ALTER LOGIN [sa] DISABLE
GO

  五、特别说明
  1.      这里生成的SQL脚本中包含了系统数据库:master、model、msdb、tempdb,为了方便我就没对这些数据库进行限制的,希望以后可以修正下这个脚本。
  2.      这里再次推荐大家使用同一的数据库帐号密码的管理,无论是安全还是方便维护都是大有好处的。SQL Server数据库帐号密码安全设计,大家可以提些其它的想法。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-80917-1-1.html 上篇帖子: 人人都是 DBA(III)SQL Server 调度器 下篇帖子: SQL Server 事件通知(Event notifications)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表