如何实现基于上下文的数据库审计?

时间:2011-07-15 14:24:57

标签: oracle plsql oracle10g auditing audit-trail

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

  1. 网络应用程序
  2. 直接SQL Access用户(我正在尝试删除这些用户)
  3. 客户端服务器应用程序
  4. 批量输入和输出
  5. 我需要实现基于上下文的审核,因为当前的数据审核不足以回溯识别导致数据更改的流程。

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

    有人能为我提供更好的方法来实现基于上下文的审核,这将涵盖对数据库的所有访问吗? 或者甚至指出我错过了当前方法中的任何明显缺陷?

    提前致谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

编辑在底部添加了上下文特定的答案部分

  • 每个用户都有登录。
  • 将这些登录绑定到SQL Server用户。
  • 使用SYSTEM_USER(例如:选择SYSTEM_USER)进行审核。

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

  • 我不知道您的网络应用程序是否是内部的(如果它是内部的,使用带有模拟/委派的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
    • [User] VARCHAR(128)DEFAULT SYSTEM_USER
    • [Reason] 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

答案 2 :(得分:0)

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

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

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

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

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