
- 類(lèi)型:數(shù)據(jù)庫(kù)類(lèi)大小:40.7M語(yǔ)言:中文 評(píng)分:6.6
- 標(biāo)簽:
一、背景
在某天晚上凌晨1點(diǎn),我收到領(lǐng)導(dǎo)的通知:需要把我們所有的數(shù)據(jù)庫(kù)的密碼都需要進(jìn)行一次修改,原因是我們放到Web服務(wù)器的配置文件config中明文了我們的數(shù)據(jù)庫(kù)帳號(hào)和密碼,而且這份配置文件可能泄露了,更糟糕的是我們的數(shù)據(jù)庫(kù)是可以通過(guò)外網(wǎng)進(jìn)行訪問(wèn)的。雖然有端口進(jìn)行映射,但是我們的數(shù)據(jù)依然處在危險(xiǎn)的狀態(tài),所以這個(gè)時(shí)候DBA需要爭(zhēng)分奪秒修改數(shù)據(jù)庫(kù)的帳號(hào)密碼。
我們的數(shù)據(jù)庫(kù)服務(wù)器大概有30臺(tái),而且每臺(tái)機(jī)器上跑了很多個(gè)數(shù)據(jù)庫(kù)。有創(chuàng)建數(shù)據(jù)庫(kù)帳號(hào)經(jīng)驗(yàn)的同學(xué)你會(huì)發(fā)現(xiàn):使用SSMS進(jìn)行創(chuàng)建帳號(hào)密碼是件多么痛苦的事情,需要點(diǎn)擊很多checkbox,特別是在創(chuàng)建一個(gè)可以訪問(wèn)整個(gè)數(shù)據(jù)庫(kù)實(shí)例里的所有數(shù)據(jù)庫(kù)的時(shí)候(雖然我們提倡每個(gè)數(shù)據(jù)庫(kù)的帳號(hào)和密碼都不一樣,更嚴(yán)格的要求可能需要設(shè)置同一個(gè)數(shù)據(jù)庫(kù)下需要有不同權(quán)限的帳號(hào)進(jìn)行管理)
如果我們對(duì)數(shù)據(jù)庫(kù)的帳號(hào)進(jìn)行有效管理的話(huà),我們可以很輕松的完成這個(gè)任務(wù),只需要一條SQL就能管理了。在這里我提倡一種安全、易維護(hù)的方案給大家:SQL Server數(shù)據(jù)庫(kù)帳號(hào)密碼安全設(shè)計(jì)
二、設(shè)計(jì)概要
我們首先要明白我們出現(xiàn)的問(wèn)題是什么:
1. 我們厭煩了一個(gè)個(gè)去點(diǎn)擊checkbox;
2. 點(diǎn)擊那么多次checkbox,我們不能確保所有的點(diǎn)擊都是正確的;
所以我們第一步要想的就是有沒(méi)什么辦法可以解決上面這些問(wèn)題?上面的這些操作SSMS是能讓用戶(hù)把操作保存為腳本的,我們可以自己編寫(xiě)SQL腳本來(lái)完成類(lèi)似的工作。為了模擬SSMS上的操作,我們需要獲取到數(shù)據(jù)庫(kù)實(shí)例中所包含的所有數(shù)據(jù)庫(kù),再對(duì)每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建帳號(hào)和密碼。我們可以通過(guò)游標(biāo)的形式循環(huán)數(shù)據(jù)庫(kù),并創(chuàng)建帳號(hào)和密碼。最后我們需要禁用掉sa這個(gè)帳號(hào)。
修改下面【通用SQL模板】的@user和@password的值,拷貝到下面的代碼到SSMS中執(zhí)行,這樣就可以生成出適合本數(shù)據(jù)庫(kù)實(shí)例的SQL腳本【生成的腳本代碼】了,我們?cè)倏截惿傻腟QL代碼到SSMS中執(zhí)行就可以了。
執(zhí)行下面的兩個(gè)腳本不過(guò)秒級(jí),所以20臺(tái)服務(wù)器對(duì)你來(lái)說(shuō),簡(jiǎn)單啦。
三、通用SQL模板
--創(chuàng)建數(shù)據(jù)庫(kù)帳號(hào)
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帳號(hào)
SET @sql = '
USE [master]
GO
ALTER LOGIN [sa] DISABLE
GO'
PRINT(@sql)
四、生成的腳本代碼
--創(chuàng)建數(shù)據(jù)庫(kù)帳號(hào)密碼
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
五、特別說(shuō)明
1. 這里生成的SQL腳本中包含了系統(tǒng)數(shù)據(jù)庫(kù):master、model、msdb、tempdb,為了方便我就沒(méi)對(duì)這些數(shù)據(jù)庫(kù)進(jìn)行限制的,希望以后可以修正下這個(gè)腳本。
2. 這里再次推薦大家使用同一的數(shù)據(jù)庫(kù)帳號(hào)密碼的管理,無(wú)論是安全還是方便維護(hù)都是大有好處的。SQL Server數(shù)據(jù)庫(kù)帳號(hào)密碼安全設(shè)計(jì),大家可以提些其它的想法。