如何理解oracle审计策略

分类:编程技术 时间:2024-02-20 16:00 浏览:0 评论:0
0
如何理解Oracle审计策略。针对这个问题,本文详细进行了相应的分析和解答。希望能够帮助更多想要解决这个问题的朋友找到更简单、更容易的方法。

Oracle审计功能

1. 审核分类:

可分为“标准审计”和“细粒度审计”。后者也被称为“基于策略的审计”,其功能在Oracle10G之后得到了极大增强。标准审计可以分为用户级审计和系统级审计。用户级审核是任何 Oracle 用户都可以设置的审核。主要审计数据库表或视图的创建由用户创建并记录用户对这些表或视图所做的一切操作。成功和不成功的访问请求以及各种类型的 SQL 操作。系统级审核只能由DBA设置,以监控成功或失败的登录请求、监控GRANT以及REVOKE操作以及数据库级别权限下的其他操作。

2. 标准审核:

< span lang="EN-US">2.1 类别:

atORACLE 支持以下三种标准审计类型:

u    报表审核,针对特定类型SQL 语句审计,未指定结构或对象。

u权限审核,审核使用系统权限执行相应操作的情况。

u                                                                                                                                                                                                                                                                              对象审计,对特殊模式对象上的指定语句进行审计。

这三种标准审核类型分别审核以下3个方面:

u 执行成功、执行不成功审计报表中的一项或两项。

u对每个用户会话执行一次审计语句或每次执行语句审计一次。

u 对所有用户或指定用户的活动进行审计。

数据库审计功能开启时,会生成审计记录在语句执行阶段。 。审计记录包含审计的操作、用户执行的操作以及操作的日期和时间等信息。审计记录可以存储在数据字典表(称为审计记录)或操作系统审计记录中。数据库审核记录位于 SYS 架构中的 AUD$ 表中。

2.2设置ORACLE标准审核:

可通过以下步骤设置提高ORACLE的标准审计功能:

1. 初始修改初始化参数文件(init.ora )

如果使用服务器参数文件,请使用更改系统设置 <参数>=<值>scope=spfile|两者,具体请参考1.1节参数文件介绍),设置AUDIT_TRAIL 参数,并重新启动数据库。 AUDIT_TRAIL的值如下:

< p class="MsoNormal" >l DB/TRUE< /span>:启动审计功能,并将审计结果存储到数据库的SYS.AUD$表中

l OS:启动审计功能,并将审计结果存储在操作系统的审计信息中 

l DB_EXTENDED:它具有DB/TRUE的函数,同时填写AUD$SQLBINDSQLTEXT 字段

l NONE/FALSE:关闭审核功能

2.设置AUDIT_TRAIL参数:

如果设置AUDIT_TRAIL = OS,还需要修改参数AUDIT_FILE_DEST

如果操作系统支持该设置 AUDIT_TRAIL=OS,文件将自动存储在AUDIT_FILE >

_DEST指定目录,文件名包含进程的PID

例如:

AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit

$ ls -l $ORACLE_HOME/rdbms/audit

-rw-rw---- 1 ora92 dba 881 三月17 09:57 ora_13264.aud

  $ ps -ef|grep 13264

ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)

SQL> 选择 spid,程序,来自 v$process 的用户名;

Spid 程序用户名

------ -------------------------- -- ------------------------ -------------

< p class= "MsoNormal" > ...

13264 oracle@frhp11 (TNS V1-V3) ora92

3. 确认审计相关表是否已安装

SQLPLUS> 连接 / AS SYSDBA

SQLPLUS> select * from sys.aud$; -- 未返回任何记录

<强> SQLPLUS> 从 dba_audit_trail 选择*; -- 没有返回记录

如果表有执行上述查询时不存在,说明审计相关表尚未安装,需要安装。

SQLPLUS> 连接/作为 sysdba < /span>

SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql < span lang="EN-US">

审核表安装在 SYSTEM 表空间。因此,请确保SYSTEM表空间有足够的空间来存储审计信息。

4. 关闭并重新启动数据库

<强>5. 设置所需审核信息

以下是示例

SQL> 连接系统/管理器

SQL> 将审核系统授予 scott;

SQL> 连接 scott/tiger

SQL> 审核会话;

停止审核:

SQL> noaudit 会话;

一般设置标准审核后即可通过strong>审计语句以启用审计,use noaudit 声明撤回审核。如下图:

更改SC要审计表结构或数据操作,可以使用以下语句:

奥迪更改SC 更新;

SC表的所有审核,请使用以下语句:

NOAUDIT ALL ON SC;

2.3 设置审核实例(审核使用密码的访问尝试):

以下是一个审计示例,记录了破解ORACLE帐户密码的尝试通过暴力破解尝试:

1 。 修改审核相关参数(参考上面介绍的方法)

2. 重新启动数据库

3. 设置审核信息

SQL>在不成功时按访问方式进行全部审计

4. 查询澳元$

< span lang="EN-US" times="" new=""> SQL> 选择 returncode、action#、userid、userhost、terminal,时间戳

来自 aud$

< span lang="EN-US" times="" new="">

返回代码操作# 用户 ID USERHOST 终端

--- ------- ---------- -------- -- ---------------------- ------------

1017 100 斯科特 WPRATA-BR

1017   100 斯科特 WPRATA-BR

1017 100 斯科特 WPRATA-BR

ORA-1017 表示用户名和密码不正确。通过查看澳元表格WPRATA-BR<可以清楚地看到这一点/span >尝试破译SCOTT的密码。您可以使用以下存储过程来分析 AUD$ 表并查找可疑信息:< /span>

创建或替换过程 AuditLogin(Since Varchar2,Times PLS_Integer)

USER_ID VARCHAR2(20);

光标 c1 是 select userid,count(*) from sys.aud$ where returncode='1017' and timestamp# >=to_date(Since,'yyyy-mm-dd')

按用户 ID 分组;

光标 C2 IS 选择用户主机、终端、TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS' )

来自 sys. aud$ WHERE returncode='1017' 和时间戳#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;

ct PLS_INTEGER;

V_USERHOST VARCHAR2(40);

V_TERMINAL VARCHAR(40);

V_DATE VARCHAR2 (40);

开始

打开C1;

dbms_output.enable(1024000);< /span>

循环

FETCH C1 INTO USER_ID,CT;

当 C1%NOTFOUND 时退出;< /p>

IF(CT>=TIMES) THEN

DBMS_OUTPUT.PUT_LINE('用户中断警报:'||USER_ID);

        打开 C2 ;

                                                                                                                                                                                                                           打开 C2;strong> 将 C2 提取到 V_USERhOST,V_TERMINAL,V _DATE;

DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'|| V_USERHOST||',TERM: '||V_TERMINAL||',TIME:'||V_DATE);

                                                                                                                                                                                                                                                                                          通过

关闭c2;

END IF;< /strong>

结束循环;

关闭c1;

END;

END;

/

执行结果如下:< span lang="EN-US" >

SQL>设置服务器输出;

SQL> 执行auditlogin('2004-01-01',2);

用户损坏警报:SYS

主机:,学期:XUJI ,时间:2004-09-22:11:08:00

主持人:,学期:许继,时间:2004-09-22:11:08:01

主持人:,任期:许继,时间:2004 -09-22:11:09:29

主持人:,学期:许继,时间:2004-09 -22:11:09:29

PL/SQL 流程已完成已成功。

2.4移动审核相关表到其他表时间:

由于AUD$ 表存储在 SYSTEM 中> 表空间,所以为了不影响提高系统性能和保护SYSTEM表空间,最好使用 AUD$移动到其他表空间。可以使用以下语句进行移动:

sql> connect / as sysdba;

sql>alter table aud$ move tablespace <新表空间> ;

sql>更改索引 I_aud1重建在线表空间 <新表空间>;

SQL> alter tableaudit$ move tablespace < new tablespace>;

SQL> alter index i_audit 重建在线表空间 ;

SQL> alter tableaudit_actions move tablespace ;< /strong>

SQL> alter index i_audit_actions 重建在线表空间<新表空间>;< /p>

3. 细粒度审核:

细粒度审核 (FGA)(通过 Oracle9i )可以理解为" 基于策略的审计.与标准审核功能相反,FGA 可用于指定生成审核记录所需的条件:

FGA 策略通过使用 "dbms_fga" 包以编程方式绑定到对象(表、视图)。与通过 VPD ("dbms_rls") 进行访问控制的包类似,它允许您创建任何您想要的条件,例如:仅当以下条件为 true 时审核事件:

上午 9 点至下午 6 点或周六和周日访问餐桌。

IP 地址在公司网络外部使用。

已选择或更新特定列。

此列使用特定值。

这将创建一个更有意义的完整的审计跟踪,因为不需要记录每个人对表的每次访问。从 Oracle 数据库 10g 开始,FGA 为支持使用"选择""在策略 span>插入""更新"< /span> 和 " 的任意组合删除 " 语句。事实上,绑定到表的 FGA 策略简化了审计策略的管理,因为它们只需在数据库中更改一次,而不是在每个应用程序中再次更改,再次。还。无论用户如何连接到数据库(通过应用程序、Web 界面,或通过 SQL*Plus) ,其操作将被记录。

3.1 使用细粒度审计:

1创建测试表

创建 表格 帐户< /p>

(AACT_NO 数量 不是 null

CUST_ID 号码 不是 null,

余额数量( 15, 2)

);

2 、添加审核策略:

< p class="MsoNormal" > 开始

DBMS_FGA.DROP_POLICY(object_schema => 'TEST',

< p class="MsoNormal" >sp; object_name => 'ACCOUNT',

policy_name => 'ACCOUNT_ACCESS' );

end;

此代码必须由包dbms_fga权限执行执行。建议创建专门的用户负责添加审计策略。这个过程有很多参数,具体含义如下:

< tbody>< tr class="firstRow">

OBJECT_SCHEMA

定义了 FGA 策略的表或视图的所有者

OBJECT_NAME

< p class="MsoNormal" >表的名称e 或视图

POLICY_NAME

策略名称,由用户自定义 例如,ACCOUNTS_ACCESS

POLICY_TEXT

添加策略时指定的审核条件 例如,余额 >= 11000

POLICY_COLUMN

审核列对于例如,余额

启用

YES 如果启用,

PF_SCHEMA

拥有策略处理器模块的模式(如果存在)

PF_PACKAGE

处理器模块的包名称(如果存在)

PF_FUNCTION

过程名称处理器模块(如果存在)

< strong>3,定义策略后,当用户按照通常的方式查询表时,如下:

从bank.accounts中选择*;

< p class="MsoNormal" >审计线索会记录本次操作,您可以使用以下语句查看线索:

选择时间戳,

db_user,< /p>

os_user,

object_schema ,

object_name,

sql_text

来自 dba_fga_audit_trail;

TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT< /p>

--------- ------- ------- ------ - -------- ------------ ----------

26-MAR-10 TEST ananda TEST ACCOUNT select * from account

注意名为 DBA_FGA_AUDIT_TRAIL ,记录细粒度的访问信息,显示审计事件的时间戳,查询 作者的数据库用户 ID、操作系统用户 ID、查询中使用的表的名称和所有者查询,最后就是准确的查询语句。

3.2 审核列和审核条件:

默认情况下,将对所有列启用审核审核对象。当任何列被访问时,都会记录审核信息。这在现实生活中并不是很常见,因为这会导致审计信息表增长过快,造成存储空间压力。因此,通常会设置审核条件,当条件触发时启动审核。例如,我们可以在Account表的Balance列设置审计条件,只有当满足以下条件时才会进行审计该列被访问并触发审核条件。作为如下所示:

开始

< p class="MsoNormal" >dbms_fga.add_policy (

object_schema=> ' TEST',

object_name=>'ACCOUNT',

policy_name=>'ACCOUNT_ACCESS',

audit_column => ' 余额',

audit_condition => 'BALANCE >= 11000'

);

end;

仅当列值大于或等于 11000 时,此策略才会访问 BALANCE 列span> 启动审核。因此,根据这个条件,账户有以下不同的审核状态:

SQL < /span> 声明

审核状态< /span>

从帐户中选择余额;

审核。用户选择了添加策略时指定的审核列BALANCE

< /tr>

从帐户中选择 *;

审核。即使用户没有显式指定列 BALANCE* 也会隐式选择它。

从余额 < 10000 的帐户中选择 cust_id; span>

审核。埃夫如果用户没有显式指定列 BALANCEwhere 子句也会隐式选择它。

从帐户中选择 cust_id;

无审核。用户未选择列BALANCE

从帐户中选择 count(*);

无审核。用户未显式或隐式选择列BALANCE

3.3优化器模式:

FGA 需要基于成本的优化(CBO),以便正常工作。在基于规则的优化过程中,每当用户从表中进行选择时,无论是否选择了相关列,都会生成审核跟踪,从而增加了误导项目的可能性。为了使 FGA 正常工作,除了在实例级别启用 CBO 之外,还需要 hint),并且查询中的所有表必须至少使用评估选项进行分析。

3.4管理 FGA 策略

要删除策略,可以使用以下语句:

开始

dbms_fga.drop_policy (

object_schema => '测试',

object_name => '帐户',

policy_name => 'ACCOUNT_ACCESS'

);

end;

没有快速修复方法改变策略解决方案。要更改策略中的任何参数,您必须删除该策略并添加具有更改参数的策略。不过,您可以暂时禁用现有策略,如下所示:

begin

dbms_fga.enable_policy (

object_schema => 'TEST',

object_name => 'ACCOUNT',

policy_name => 'ACCOUNT_ACCESS',

启用 => FALSE

);

end;

要重新启用它,使用相同的功能,只需将参数启用设置为 TRUE

3.5 FGA 数据字典视图:

< span lang="EN-US">FGA 策略的定义位于数据字典视图DBA_AUDIT_POLICIES 中。各列含义如下:

< td>

SQL_TEXT

"MsoNormal" >SQL_BIND

SESSION_ID

审核会话标识符;与 V$SESSION 视图中的会话标识符不同

时间戳

生成审核记录的时间戳

DB_USER

发出查询的数据库用户< /span>

OS_USER

操作系统用户

USERHOST

用户连接的计算机主机名< span lang="EN-US">

CLIENT_ID

客户端标识符(如果打包过程使用 dbms_session.set_identifier

EXT_NAME

外部认证客户名称,如 LDAP 用户

< span lang="EN -US">OBJECT_SCHEMA

访问此表触发了对表所有者的审核

OBJECT_NAME

SELECT 操作触发了审核表名

POLICY_NAME

触发审计的策略名称(如果表定义了多个策略,则每个策略将插入一条记录。在本例中,此列显示通过哪种策略插入了哪些行。)

SCN

已审核Oracle 系统变更编号

用户

语句

通过绑定SQL 语句使用的变量(如果存在)

3.6查看和FGA

假设在 VW_ACCOUNT “EN-US">帐户表如下:

create view vw_account as select * from account;

现在如果用户从视图而不是从表中选择:

从 vw_account 选择 *;

您将看到以下审核跟踪:

选择 object_name , 来自 dba_fga_audit_trail 的 sql_text;

OBJECT_NAME SQL_TEXT

---- -------------- -------------------------------------------------------- ------

ACCOUNT select * from vw_account

注意是基表名,不是视图名称出现在 OBJECT_NAME 列中,因为视图中的选择是来自基表的选择。然而,SQL_TEXT 列记录了用户实际提交的语句。

如果您只想审核针对视图而不是针对表的查询,则可以针对视图本身建立策略。通过将视图的名称而不是表的名称传递给打包过程 dbms_fga.add_policy 中的参数 object_name < /span> 可以完成这项工作。那么 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME列就会显示视图的名称,并且不会再有关于表访问的额外记录出现。 span>

3.7 其他用途:

除了记录对表的选择性访问之外,FGA 也可用于某些其他情况:

FGA 可用于数据仓库来捕获特定的表、视图或物化视图,这有助于规划索引。无需转到 V$SQL 视图来获取此信息。即使 SQL 语句也超出了 中的 V$SQL 过期日期FGA 审计跟踪将开始并最终提供。

由于 FGA 捕获了绑定变量,因此可以帮助理解绑定变量值模式,有助于设计直方图集合等。

警报可以发送给审核员或 DBA < /span>,可以帮助跟踪恶意应用程序。

由于 FGA 可以用作 SELECT 语句,您可以在需要此功能的任何时候使用它。 <跨度语言="EN-US">

3.8 FGAat10G< 增强功能 /强>

3.8.1 对于所有人DML审核:

在 中 9iFGA 只能处理 Select 语句。进行审核,但不进行其他DML语句(更新删除插入)用于审核。如果要审计其他DML语句,只能通过在数据库发起的形式进行。审核所有 DMLtatements在10G中实现,如下所示:

begin
 dbms_fga.add_policy (
 object_schema => 'TEST',
 object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS',< /pre>
audit_column => 'BALANCE',
audit_condition =>'BALANCE >= 3000',
statement_types =>'插入、更新、删除、选择'< /pre>
 );
end;

传递 statement_types => 'INSERT、UPDATE、DELETE、SELECT' 参数制定了新的策略,该策略可以应用于除 Select US">DML 操作之外的所有审核操作。因此,根据新的审核条件和审核策略,会出现以下不同情况:

1 情况

之前:余额 = 1000

用户发出:

更新账户设置余额 = 1200,其中 ACCOUNT_NO = ....

新旧余额小于3000,不满足审核条件;因此本报表不予审计。

2 种情况

之前:余额 = 1000

用户发送:

更新账户设置余额 = 3200 其中 ACCOUNT_NO = ... .

新的 余额 大于 3,000,满足审核条件;因此,本报表将接受审计。

3 种情况

之前:BALANCE = 3200

用户发出:

更新账户设置余额 = 1200,其中 ACCOUNT_NO = ....

余额小于3,000,但旧余额大于3,000。因此,符合审计条件,对本报表进行审计。

4 种情况

用户插入 余额 < 3000 的行。

插入账户值(9999,1200,'X' );

由于余额1200不满足审计条件,因此该报表不予审计。如果余额列大于或等于3,000,则会被审核。

5 种情况

用户插入一行,其中余额的值为无效的。

插入账户(account_no, status)值(9997, 'X ');

由于余额为空且该列没有任何默认值,因此不满足审核条件。 (比较 NULL >= 3000 ,结果为 FALSE),该语句不会被审计。 重要说明:假设该列的默认值大于3,000,这条语句仍然不会被审计,即使插入行的余额 列值大于 3000。请注意,DML 语句的审计是由自动事务插入的;即使回滚 DML语句的操作,审计记录也会存在并且不会回滚。

3.8.2< strong>制定

在表 ACCOUNT 上定义的策略如下:

开始

dbms_fga.add_policy (

object_schema => 'TEST',

object_name => 'ACCOUNT',

policy_name => 'ACCOUNT_SEL',

 audit_column => 'ACCOUNT_NO ,BALANCE',

audit_condition => 'BALANCE >= 3000',

statements_types => 'SELECT'

);

end;

在下面的某些情况下,列的组合可能是重要而不是特定的列。上述政策是在 ACCOUNT_NO BALANCE 上定义的。然后,如果用户发出以下语句:

从帐户中选择余额,其中account_no = 9995;

此语句将是已审核,因为选择了 余额 列,且余额为 3,200,大于 3,000并满足审核条件。

如果用户想要找出银行的总余额,他发出:

从帐户中选择总和(余额);

此查询几乎无害;它没有明确标识帐户所有者和帐户余额。因此,安全策略可能不需要审核此查询。但是,此查询

从 account_no = 9995 的帐户中选择余额

必须经过审核;因为它明确指定了一个帐户。默认情况下,所有语句都会被审核(无论列组合是什么)。这将创建大量不需要的审计跟踪项目,并可能引入e 一些空间限制问题。为了限制它们,您可以指定仅在查询中使用所需的列组合时才开始审核。当定义策略时.ALL_COLUMNS

此参数将使策略仅使用列 ACCOUNT_NO BALANCE 仅当在查询中访问两者时才会创建审计跟踪项。例如,以下查询将生成审计跟踪项。

< p class="MsoNormal" >选择 account_no,账户余额;

但是此查询不会生成审核跟踪项。

从帐户中选择 account_no;

使用此参数会将审核数量限制在更易于管理的大小。如果你想使用默认行为即任意一列s 选择时会进行审核,因此可以对同一参数使用不同的值。

audit_column_opts => DBMS_FGA.ANY_COLUMNS

3.8.3 与标准审核集成:

通过制定如下审计,实现标准审计与细粒度审计的结合策略

开始
 dbms_fga.add_policy (
 object_schema => 'TEST', 
 object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_SEL',
audit_column => 'ACCOUNT_NO,BALANCE',
audit_condition => 'BALANCE >= 3000',
statement_types => 'SELECT',
audit_column_opts => DBMS_FGA.ALL_COLUMNS,
audit_trail => DB 
 );
end;

通过指定 audit_trail => DB 参数允许在细粒度审计期间启用标准审计。 Oracle 数据库 10g 中的标准审计也得到了极大改进。标准审核是通过 AUDIT 命令执行的,该命令现在可以捕获大量其他有用信息。标准审计在内容和功能上与细粒度审计相似。然而,作为一名数据库管理员,了解所有审计项目而不仅仅是一个审计项目是很有趣的。新视图 DBA_COMMON_AUDIT_TRAIL 将标准审计跟踪与 FGA 审计跟踪相结合。使用以下查询来检查两者:

select * from dba_common_audit_trail ;使用此查询,您可以同时查看两个审核收集的信息。

4.FGA审核与标准审核的区别:

必须使用参数 AUDIT_TRAIL 在数据库级别启用标准审核。此参数不是动态的; 必须重启数据库才能生效,相比之下,FGA 不需要修改任何参数。

一旦在对象上设置,标准审核将保留在那里。要禁用它,必须使用 NOAUDIT 命令删除审核选项。这可能会很不方便,因为删除表上的审核选项也会删除元数据信息。但是,FGA 可以暂时禁用和启用,而不会丢失任何元数据信息。

FGA 只能处理四种类型的语句:选择插入更新删除跨度>。相比之下,定期审计可以处理许多其他语句和权限,甚至会话连接和断开连接。

标准审计只为每个会话(per session)创建一条记录或者为每个访问对象(per access)创建一条记录,比较消耗资源有控制审计跟踪表空间的一些重要方法。 FGA 的资源效率并不相同;它每次访问运行一次 使线程更大。

标准审核可用于通过记录线索来检测任何中断尝试,并在尝试不成功时生成错误代码。而FGA 则不能。

标准审计可以写入数据库表或操作系统

跨度> 过滤器e.当审计员(而不是数据库管理员)有权访问跟踪时,后者很有用。在 Windows 下,非数据库审计跟踪记录在事件日志中,并且可以通过不同方式进行访问。此选项可保护审计跟踪的完整性。但是,FGA 日志仅写入数据库表 FGA_LOG$ 。可以在 FGA 中创建用户定义的审核处理程序来写入 OS 文件,但不保证其完整性。

可以为默认对象设置标准审核。当表运行时 当创建一个期间时,此功能变得非常有用:默认审计选项允许在没有数据库管理员干预的情况下进行审计。这在FGA中是不可能的,其中用户必须在现有表上创建策略,上述情况只能在t之后发生。能够已被创建。

FGA 中,审核更加灵活 仅当访问某些列时、特定条件为真等时。当您需要控制潜在客户增长时,这种多功能性会派上用场。

FGA span> 中,SQL 赋值变量。在标准审计中,必须设置初始化参数 audit_trail 才能启用此功能。

权限差异:标准审计所需的审计系统或语句权限; FGA 仅需要 dbms_fga 软件包的运行权限。

如何理解Oracle审计策略的问题解答分享在这里。希望以上内容能够对大家有所帮助。如果您还有很多疑问没有解决,可以关注行业资讯频道了解更多相关知识。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何理解oracle审计策略

用户评论