10

我有一个当前的数据库驱动应用程序,它有几种访问数据的方法。

  1. Web应用程序
  2. 直接 SQL 访问用户(我正在尝试删除这些)
  3. 客户端服务器应用程序
  4. 批量输入和输出

我需要实施基于上下文的审计,因为当前的数据审计不足以追溯识别导致数据更改的过程。

我目前正在考虑将数据模型隐藏在 XAPI(事务性 API)后面,并且数据模型上的每个操作都必须提供某种形式来识别相关操作或数据更改的原因,这些操作将与审计数据本身一起存储。

谁能给我一个更好的方法来实现基于上下文的审计,这将涵盖对数据库的所有访问?或者甚至指出我目前的方法中遗漏的任何明显缺陷?

提前致谢。

4

3 回答 3

2

这是一篇较旧的帖子,但我仍然想提供一个解决方案,可能对某人有用。

Oracle 为每个会话提供“上下文”变量。在使用连接池连接数据库的应用程序中,Oracle 提供了一个名为“CLIENTCONTEXT”的默认命名空间。在该命名空间中,您可以创建诸如 USER ID 之类的变量,并确保在将连接移交给服务器 Web 请求时设置此变量。这样,在数据库内部,您可以识别数据库内部正在处理哪个“网络用户”(或应用程序用户)请求。例如 dbms_session.set_context('CLIENTCONTEXT',user_id, ); 希望能帮助到你。

于 2013-02-08T15:55:20.753 回答
1

编辑将答案的上下文特定部分添加到底部

  • 每个用户都有一个登录。
  • 将这些登录信息与 SQL Server 用户联系起来。
  • 使用 SYSTEM_USER(例如:选择 SYSTEM_USER)进行审核。

上述变得棘手的唯一地方是网络应用程序。

  • 我不知道您的 Web 应用程序是否是内部的(如果它是内部的,使用带有模拟/委托的 Windows 身份验证会很好用)
  • 如果它是外部的,您将拥有一个系统定义的帐户,该帐户将验证登录到 Web 应用程序(并可能执行其他特权操作),那么您可以在会话期间使用用户自己的凭据进行数据库访问。
    • 如果您不想拥有一堆 SQL Server 用户,您可以进行自己的会话管理并即时创建/删除用户(例如当他们登录/注销时)

这里有一些 T-SQL 来说明

-- AFTER SUCCESSFUL LOGIN
BEGIN
-- You would already have the user name and password
DECLARE @user varchar(32)
SET @user = 'tester'
DECLARE @pw varchar(32)
SET @pw = 'SuperTest123'
-- if the user logs in from 2 different sessions
-- keep the name more unique
SELECT @user = @user + REPLACE(NEWID(), '-', '')
-- build the dynamic sql to create a user
DECLARE @sql varchar(8000)
SELECT @sql = 'CREATE LOGIN [' + @user + '] WITH PASSWORD = ''' + @pw + '''; '
SELECT @sql = @sql + 'USE MyDatabase; CREATE USER [' + @user + '] FOR LOGIN [' + @user + '] WITH DEFAULT_SCHEMA = db_datareader; '
EXEC(@sql)
-- use these credentials for web apps sql connections
SELECT @user [UserName], @pw [Password]
END

-- AFTER LOGOUT / SESSION EXPIRATION
BEGIN
-- You would already have the user+guid used by the sql server
DECLARE @login varchar(32)
SET @login = 'tester3C8DA60B996C4E5881774D1FE4'
-- build the dynamic sql to drop user
DECLARE @sql varchar(8000)
SELECT @sql = 'DROP LOGIN [' + @login + ']; '
SELECT @sql = @sql + 'USE MyDatabase; DROP USER [' + @login + ']; '
EXEC(@sql)
-- user gone until next session
END

上下文约束可以直接在审计触发器中实现。

  • 表:TEMP_AUDITREASON
    • [用户] VARCHAR(128) 默认系统用户
    • [原因] VARCHAR(512)
  • 扳机

这可能有点油嘴滑舌,但是...

IF EXIST(SELECT [Reason] FROM [TEMP_AUDITREASON] WHERE [User] = SYSTEM_USER AND [Reason] IS NOT NULL)
BEGIN
 SELECT @REASON = [Reason] FROM [TEMP_AUDITREASON] WHERE [User] = SYSTEM_USER
 -- clear it for the next transaction
 DELETE FROM [TEMP_AUDITREASON] WHERE [User] = SYSTEM_USER
END
ELSE
BEGIN
 -- SOUND THE ALARM!!! no reason was given
END
于 2011-10-04T18:32:35.597 回答
0

我们有一个项目,要求我们提供有关更改内容、更改时间和更改人的详细审计信息。

在我们的案例中,我们所做的是改进了我们的 MVC 解决方案,以便在事情发生变化时保持审计跟踪。在那种情况下,我们能够存储辅助信息,例如网络用户、IP 等。

此外,我们启用了 mysql 二进制日志记录,因此我们可以在必要时回滚完整的历史记录,并提供存储的有关访问的附加日志以区分更改的来源。

在您的情况下,如果您在数据库和实际数据库访问之间没有任何层,那会有些棘手。所以,我建议为数据操作创建 api,它可以作为中间层,并为您提供您正在寻找的所有控制权。

这应该为您提供入门指南。

于 2011-10-04T12:44:12.713 回答