1. 首页 > Oracle教程 > 正文

Oracle教程FG188-客户端信息

Part01-基础概念与理论知识

1.1 客户端信息概念

风哥教程参考Oracle官方文档Security部分。Oracle客户端信息是指与数据库客户端相关的信息,包括客户端主机名、IP地址、操作系统用户、应用程序名称等。这些信息对于数据库审计、安全监控和故障排查非常重要。更多视频教程www.fgedu.net.cn

1.2 客户端信息的获取方式

1. 内置函数:使用USERENV、SYS_CONTEXT等内置函数获取客户端信息;2. V$SESSION视图:从V$SESSION视图中查询客户端信息;3. 应用程序设置:通过DBMS_APPLICATION_INFO包设置和获取客户端应用程序信息。

1.3 客户端信息的应用场景

1. 审计和合规:记录用户的登录信息和操作来源;2. 性能监控:分析不同客户端的性能表现;3. 故障排查:定位问题客户端;4. 安全控制:基于客户端信息实施访问控制。

Part02-生产环境规划与建议

2.1 客户端信息收集规划

生产环境建议收集以下客户端信息:客户端主机名、IP地址、操作系统用户、应用程序名称、应用程序模块、客户端版本、连接时间等。根据安全和监控需求确定需要收集的信息。

2.2 审计策略规划

制定客户端信息的审计策略,包括:审计哪些客户端信息、审计频率、审计数据的存储位置和保留期限等。

生产环境建议:定期备份审计数据,确保数据的完整性和可用性。

2.3 性能影响评估

评估收集客户端信息对系统性能的影响。收集过多的客户端信息可能会增加系统开销,需要在安全性和性能之间取得平衡。

Part03-生产环境项目实施方案

3.1 使用USERENV获取客户端信息

使用Oracle内置的USERENV函数获取客户端信息。

# 登录到数据库
$ sqlplus / as sysdba

# 使用USERENV函数获取客户端信息
SQL> SELECT
SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’) AS session_user,
SYS_CONTEXT(‘USERENV’, ‘HOST’) AS client_host,
SYS_CONTEXT(‘USERENV’, ‘IP_ADDRESS’) AS client_ip,
SYS_CONTEXT(‘USERENV’, ‘OS_USER’) AS os_user,
SYS_CONTEXT(‘USERENV’, ‘MODULE’) AS module,
SYS_CONTEXT(‘USERENV’, ‘ACTION’) AS action,
SYS_CONTEXT(‘USERENV’, ‘CLIENT_INFO’) AS client_info
FROM dual;SESSION_USER CLIENT_HOST CLIENT_IP OS_USER MODULE ACTION CLIENT_INFO
—————————— —————————— ———— ———— ———– ———– ——————–
SYS db.fgedu.net.cn 192.168.1.100 oracle SQL*Plus SELECT

3.2 从V$SESSION视图查询客户端信息

从V$SESSION视图中查询客户端信息。

# 查询当前会话的客户端信息
SQL> SELECT sid, serial#, username, machine, terminal, program, module, action, client_info, logon_time
FROM v$session
WHERE sid = (SELECT sid FROM v$mystat WHERE rownum = 1);SID SERIAL# USERNAME MACHINE TERMINAL PROGRAM MODULE ACTION CLIENT_INFO LOGON_TIME
———- ———- —————————— —————————— —————————— —————————— ———– ———– ——————– ——————-
54 123 SYS db.fgedu.net.cn pts/0 sqlplus@db.fgedu.net.cn (TNS V SQL*Plus SELECT 31-MAR-26 14:00:00

3.3 使用DBMS_APPLICATION_INFO设置客户端信息

使用DBMS_APPLICATION_INFO包设置客户端应用程序信息。

# 设置模块和操作信息
SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE(module_name => ‘FGEDU_APPLICATION’, action_name => ‘QUERY_EMPLOYEES’);PL/SQL procedure successfully completed.

# 设置客户端信息
SQL> EXEC DBMS_APPLICATION_INFO.SET_CLIENT_INFO(client_info => ‘USER_ID=100,DEPARTMENT=SALES’);PL/SQL procedure successfully completed.

# 验证设置的信息
SQL> SELECT
SYS_CONTEXT(‘USERENV’, ‘MODULE’) AS module,
SYS_CONTEXT(‘USERENV’, ‘ACTION’) AS action,
SYS_CONTEXT(‘USERENV’, ‘CLIENT_INFO’) AS client_info
FROM dual;MODULE ACTION CLIENT_INFO
—————— —————— ——————————
FGEDU_APPLICATION QUERY_EMPLOYEES USER_ID=100,DEPARTMENT=SALES

3.4 创建测试用户和表

创建测试用户和表,用于演示客户端信息的应用。

# 创建测试用户
SQL> CREATE USER fgedu_client IDENTIFIED BY client123;User created.

# 授予权限
SQL> GRANT CONNECT, RESOURCE TO fgedu_client;Grant succeeded.

# 授予执行DBMS_APPLICATION_INFO的权限
SQL> GRANT EXECUTE ON DBMS_APPLICATION_INFO TO fgedu_client;Grant succeeded.

# 创建测试表
SQL> CREATE TABLE fgedu_client.orders (
order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
order_date DATE,
total_amount NUMBER
);Table created.

# 插入测试数据
SQL> INSERT INTO fgedu_client.orders VALUES (1, 100, SYSDATE, 5000);SQL> INSERT INTO fgedu_client.orders VALUES (2, 200, SYSDATE, 8000);SQL> INSERT INTO fgedu_client.orders VALUES (3, 300, SYSDATE, 12000);1 row created.

1 row created.

1 row created.

SQL> COMMIT;Commit complete.

Part04-生产案例与实战讲解

4.1 监控客户端连接

监控数据库的客户端连接情况。

# 查询所有客户端连接
SQL> SELECT username, machine, program, module, action, client_info, COUNT(*) AS connection_count
FROM v$session
WHERE username IS NOT NULL
GROUP BY username, machine, program, module, action, client_info
ORDER BY connection_count DESC;USERNAME MACHINE PROGRAM MODULE ACTION CLIENT_INFO CONNECTION_COUNT
—————————— —————————— —————————— —————— —————— —————————— —————-
SYS db.fgedu.net.cn sqlplus@db.fgedu.net.cn (TNS V SQL*Plus SELECT 1
FGEDU_CLIENT db.fgedu.net.cn sqlplus@db.fgedu.net.cn (TNS V 1

4.2 基于客户端信息的审计

创建审计策略,基于客户端信息记录用户的操作。

# 启用审计
SQL> ALTER SYSTEM SET audit_trail = ‘DB’ SCOPE = SPFILE;System altered.

# 重启数据库
SQL> SHUTDOWN IMMEDIATE;SQL> STARTUP;# 审计表的访问,包括客户端信息
SQL> AUDIT SELECT, INSERT, UPDATE, DELETE ON fgedu_client.orders BY ACCESS;Audit succeeded.

# 切换到测试用户
SQL> CONNECT fgedu_client/client123@fgedudb

Connected.

# 设置客户端信息
SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE(module_name => ‘ORDER_APPLICATION’, action_name => ‘VIEW_ORDERS’);SQL> EXEC DBMS_APPLICATION_INFO.SET_CLIENT_INFO(client_info => ‘USER=FGEDU_CLIENT,IP=192.168.1.100’);PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

# 执行查询操作
SQL> SELECT * FROM orders;ORDER_ID CUSTOMER_ID ORDER_DAT TOTAL_AMOUNT
———- ———– ——— ————
1 100 31-MAR-26 5000
2 200 31-MAR-26 8000
3 300 31-MAR-26 12000

# 执行插入操作
SQL> INSERT INTO orders VALUES (4, 400, SYSDATE, 7500);1 row created.

SQL> COMMIT;Commit complete.

# 切换回sys用户,查询审计记录
SQL> CONNECT / as sysdba

Connected.

SQL> SELECT username, os_username, userhost, terminal, action_name, sql_text, to_char(timestamp, ‘YYYY-MM-DD HH24:MI:SS’) audit_time
FROM dba_audit_trail
WHERE owner = ‘FGEDU_CLIENT’ AND obj_name = ‘ORDERS’
ORDER BY timestamp DESC;USERNAME OS_USERNAME USERHOST TERMINAL ACTION_NAME SQL_TEXT AUDIT_TIME
—————————— —————————— —————————— —————————— —————————— ————————————————————————————– ——————-
FGEDU_CLIENT oracle db.fgedu.net.cn pts/0 INSERT INSERT INTO orders VALUES (4, 400, SYSDATE, 7500) 2026-03-31 14:20:00
FGEDU_CLIENT oracle db.fgedu.net.cn pts/0 SELECT SELECT * FROM orders 2026-03-31 14:15:00

4.3 创建登录触发器收集客户端信息

创建登录触发器,自动收集客户端信息并存储到审计表中。学习交流加群风哥QQ113257174

# 创建审计表
SQL> CREATE TABLE fgedu.client_login_audit (
audit_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
username VARCHAR2(30),
os_username VARCHAR2(100),
client_host VARCHAR2(100),
client_ip VARCHAR2(20),
program VARCHAR2(100),
module VARCHAR2(100),
logon_time TIMESTAMP,
logoff_time TIMESTAMP
);Table created.

# 创建登录触发器
SQL> CREATE OR REPLACE TRIGGER fgedu.client_login_trigger
AFTER LOGON ON DATABASE
DECLARE
v_sid NUMBER;v_serial NUMBER;BEGIN
— 获取当前会话的SID和SERIAL#
SELECT sid, serial# INTO v_sid, v_serial
FROM v$session
WHERE audsid = SYS_CONTEXT(‘USERENV’, ‘SESSIONID’);– 插入登录审计记录
INSERT INTO fgedu.client_login_audit(
username, os_username, client_host, client_ip, program, module, logon_time
) VALUES (
SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’),
SYS_CONTEXT(‘USERENV’, ‘OS_USER’),
SYS_CONTEXT(‘USERENV’, ‘HOST’),
SYS_CONTEXT(‘USERENV’, ‘IP_ADDRESS’),
sys_context(‘USERENV’, ‘MODULE’),
sys_context(‘USERENV’, ‘ACTION’),
SYSTIMESTAMP
);COMMIT;END;/Trigger created.

# 创建登出触发器
SQL> CREATE OR REPLACE TRIGGER fgedu.client_logout_trigger
BEFORE LOGOFF ON DATABASE
DECLARE
v_audit_id NUMBER;BEGIN
— 更新登出时间
UPDATE fgedu.client_login_audit
SET logoff_time = SYSTIMESTAMP
WHERE username = SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’)
AND logon_time = (SELECT MAX(logon_time)
FROM fgedu.client_login_audit
WHERE username = SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’));COMMIT;END;/Trigger created.

# 测试登录触发器
SQL> CONNECT fgedu_client/client123@fgedudb

Connected.

SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE(module_name => ‘TEST_APPLICATION’, action_name => ‘TEST_ACTION’);PL/SQL procedure successfully completed.

SQL> CONNECT / as sysdba

Connected.

# 查询审计记录
SQL> SELECT audit_id, username, os_username, client_host, client_ip, program, module, logon_time, logoff_time
FROM fgedu.client_login_audit
ORDER BY logon_time DESC;AUDIT_ID USERNAME OS_USERNAME CLIENT_HOST CLIENT_IP PROGRAM MODULE LOGON_TIME LOGOFF_TIME
———- —————————— —————————— —————————— ———— —————————— —————— ————————————————————————— —————————————————————————
2 FGEDU_CLIENT oracle db.fgedu.net.cn 192.168.1.100 sqlplus@db.fgedu.net.cn (TNS V TEST_APPLICATION 31-MAR-26 02.25.00.000000 PM 31-MAR-26 02.26.00.000000 PM
1 SYS oracle db.fgedu.net.cn 192.168.1.100 sqlplus@db.fgedu.net.cn (TNS V SQL*Plus 31-MAR-26 02.10.00.000000 PM 31-MAR-26 02.15.00.000000 PM

4.4 使用客户端信息进行性能分析

使用客户端信息分析不同应用程序的性能表现。

# 启用SQL跟踪
SQL> ALTER SYSTEM SET sql_trace = true;System altered.

# 切换到测试用户,执行一些操作
SQL> CONNECT fgedu_client/client123@fgedudb

Connected.

SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE(module_name => ‘REPORT_APPLICATION’, action_name => ‘GENERATE_REPORT’);PL/SQL procedure successfully completed.

SQL> SELECT * FROM orders WHERE order_date = SYSDATE;ORDER_ID CUSTOMER_ID ORDER_DAT TOTAL_AMOUNT
———- ———– ——— ————
1 100 31-MAR-26 5000
2 200 31-MAR-26 8000
3 300 31-MAR-26 12000
4 400 31-MAR-26 7500

SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE(module_name => ‘BATCH_APPLICATION’, action_name => ‘PROCESS_ORDERS’);PL/SQL procedure successfully completed.

SQL> UPDATE orders SET total_amount = total_amount * 1.1 WHERE customer_id > 200;2 rows updated.

SQL> COMMIT;Commit complete.

# 切换回sys用户,使用TKPROF分析跟踪文件
SQL> CONNECT / as sysdba

Connected.

SQL> ALTER SYSTEM SET sql_trace = false;System altered.

# 查找跟踪文件
SQL> SELECT value FROM v$diag_info WHERE name = ‘Default Trace File’;VALUE
——————————————————————————–
/oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/fgedudb_ora_1234.trc

# 使用TKPROF分析跟踪文件
$ tkprof /oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/fgedudb_ora_1234.trc output=trace_analysis.txt

TKPROF: Release 19.0.0.0.0 – Development on Thu Mar 31 14:30:00 2026
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

Trace file: /oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/fgedudb_ora_1234.trc
Sort options: default

********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************

# 分析结果将包含客户端信息和SQL执行统计

4.5 基于客户端信息的访问控制

创建基于客户端信息的访问控制策略。

# 创建VPD策略函数,基于客户端IP地址限制访问
SQL> CREATE OR REPLACE FUNCTION fgedu_ip_restriction_policy(
schema_name IN VARCHAR2,
table_name IN VARCHAR2
) RETURN VARCHAR2 IS
v_ip VARCHAR2(20);BEGIN
— 从USERENV获取客户端IP地址
v_ip := SYS_CONTEXT(‘USERENV’, ‘IP_ADDRESS’);– 只允许特定IP地址访问
IF v_ip IN (‘192.168.1.100’, ‘192.168.1.101’) THEN
RETURN NULL;ELSE
RETURN ‘1=2’; — 返回false条件,拒绝访问
END IF;END fgedu_ip_restriction_policy;/Function created.

# 启用VPD策略
SQL> EXEC DBMS_RLS.ADD_POLICY(
object_schema => ‘FGEDU_CLIENT’,
object_name => ‘ORDERS’,
policy_name => ‘IP_RESTRICTION_POLICY’,
function_schema => ‘SYS’,
policy_function => ‘fgedu_ip_restriction_policy’,
statement_types => ‘SELECT, INSERT, UPDATE, DELETE’
);PL/SQL procedure successfully completed.

# 测试访问控制(从允许的IP地址)
SQL> CONNECT fgedu_client/client123@fgedudb

Connected.

SQL> SELECT * FROM orders;ORDER_ID CUSTOMER_ID ORDER_DAT TOTAL_AMOUNT
———- ———– ——— ————
1 100 31-MAR-26 5000
2 200 31-MAR-26 8000
3 300 31-MAR-26 13200
4 400 31-MAR-26 8250

# 从其他IP地址访问将被拒绝

Part05-风哥经验总结与分享

1. 客户端信息是Oracle数据库安全和监控的重要组成部分,可以帮助管理员了解用户的访问模式和行为。风哥提示:生产环境建议开启客户端信息审计,便于安全监控和故障排查。

2. 使用DBMS_APPLICATION_INFO包可以设置应用程序特定的客户端信息,提高审计的准确性和可用性。

3. 登录触发器是收集客户端信息的有效方式,可以自动记录用户的登录和登出信息。

4. 基于客户端信息的访问控制可以增强系统安全性,限制特定客户端的访问权限。更多学习教程公众号风哥教程itpux_com

5. 客户端信息可以用于性能分析,帮助管理员识别性能瓶颈和优化机会。

6. 定期审查客户端信息的收集策略,确保符合安全和合规要求,同时避免对系统性能造成过大影响。from oracle:www.itpux.com

学习交流加群风哥微信: itpux-com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息