【转】过滤SQL用户登录(SQL2005)

来源:互联网 发布:国际网络电话软件 编辑:程序博客网 时间:2024/05/21 05:57

 

注:高危!

有时候,开发人员在应用服务器上,能拿到数据库的帐号和密码
如果想让DBA死掉,太简单了(哈哈哈~~,有人在奸笑~~!)
所以DBA啊,得处处小心。。

(有人说话了:你傻X吧,应用程序服务器怎么能让开发人员随便上?!)

嘿,就是上了,你DBA能咋样?

如果技术上使数据库帐号只能从某个机器(或某个IP地址)用某个应用程序登录,岂不是很爽?
哎,可惜在MS官方没有找到解决方法......

今天在 小怪物(就是传说中的小怪物) 的大力帮助下,从SQL2005中找到一个方法(非官方),能实现类似功能。


免责声明:该脚本没有得到牛X人士的认可,玩大了,跟俺无关~~!


use msdb --我是在msdb里测试的,不建议在系统库里乱搞,后果自负

--1.创建表
CREATE TABLE [dbo].[UserFiltration](
[ID] [int] IDENTITY(1,1) NOT NULL primary key,
[username] [varchar](100) NOT NULL DEFAULT ('*'),
[programname] [varchar](100) NOT NULL DEFAULT ('*'),
[IP] [varchar](100) NOT NULL DEFAULT ('*'),
[hostname] [varchar](100) NOT NULL DEFAULT ('*'),
[Comment] [varchar](1000) NOT NULL DEFAULT (''),
[Ctime] [datetime] NOT NULL DEFAULT (getdate()),
[Utime] [datetime] NULL

)


go
--2.添加规则

insert into UserFiltration(username,programname,ip,hostname)
select '*','*','*',host_name() --本机登录不受限制

go

--3.添加用户读取权限

grant select on UserFiltration to public

go

--4.添加触发器

create TRIGGER [tr_LoginCheck]
ON ALL SERVER
FOR LOGON
AS
set nocount on
if not exists(select 1 from msdb.dbo.UserFiltration
    where suser_name() = case when username = '*' then suser_name() else username end
      and app_name() like case when programname = '*' then app_name() else programname end
      and EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(128)') = case when IP = '*' then EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(128)') else IP end
      and host_name() = case when hostname = '*' then host_name() else hostname end
    )

rollback tran

 

--5.新建一个登录

sp_addlogin 'test01','123'

--6.在本机测试,应该能登录成功,成功不了,估计是rpwt
--7.在其他机器用test01登录,应该不成功,如果能成功,估计不仅仅是rpwt了


--8.添加机器访问策略

insert into UserFiltration(username,programname,ip,hostname)
select 'test01','%Microsoft SQL Server%','192.168.2.205','info2003' --info2003另外的测试机器


--9.在info2003 上用test01登录一下试试看


--10.实验做完,老师说要把垃圾搞干净。。。。。
--清除测试对象
--断开test01的链接

sp_droplogin 'test01'
go
drop TRIGGER [tr_LoginCheck] on all server
go
drop table msdb..[UserFiltration]

 

--课外作业(请勿随便执行,仅供"业内"人士搞恶、消遣!)
--如果看谁不顺眼,半夜爬到他的数据库服务器(SQL2005)上,执行一下这个
--然后有多快跑多快~~祝你好运!@

/*
create TRIGGER [tr_LoginCheck]
ON ALL SERVER
FOR LOGON
AS
rollback tran
*/