暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【问题诊断】安全等保加固重命名SYS用户触发ORA-600[kokasgi1]错误案例分享

138
欢迎关注“数据库运维之道”公众号,一起学习数据库技术!本期将为大家分享“安全等保加固重命名SYS用户触发ORA-600[kokasgi1]错误”的处置案例。
关键词:ORA-600[kokasgi1]、10046 trace、gdb

根据数据库等保要求:应重命名或删除默认账户,修改默认账户的默认口令。部分安全公司给出了建议:修改sys,system默认账户名称,避免使用常见用户名称。Oracle 11.2.0.2引入了隐含参数_enable_rename_user来开启用户rename功能,此功能可以在restrict模式下重命名普通用户,但无法用于SYS,SYSTEM用户。用户直接强行更新Oracle系统数据字典表USER$来重命名SYS,例如:update user$ set name='SYSIDC' where name='SYS';  更新成功后,重启数据库会触发ORA-600 [kokasgi1]错误,数据库无法正常启动。
客户反馈数据库无法启动,提供的错误信息如下图所示:

    SQL> alter database open;
    alter database open
    *
    ERROR at line 1:
    ORA-01092: ORACLE instance terminated. Disconnection forced
    ORA-00600: internal error code, arguments: [kokasgi1], [], [], [], [], [], [], [], [], [], [], []
    Process ID: 4739
    Session ID: 1369 Serial number: 3

    首先,遇到ORA-600错误,第一步先查看alert告警日志,以进一步分析报错信息。
      SMON: enabling tx recovery
      Database Characterset is ZHS16GBK
      Errors in file u01/app/oracle/diag/rdbms/ywzd/ywzd/trace/ywzd_ora_4739.trc (incident=48167):
      ORA-00600: internal error code, arguments: [kokasgi1], [], [], [], [], [], [], [], [], [], [], []
      Incident details in: u01/app/oracle/diag/rdbms/ywzd/ywzd/incident/incdir_48167/ywzd_ora_4739_i48167.trc
      ARC3: Archival started
      ARC0: STARTING ARCH PROCESSES COMPLETE
      Use ADRCI or Support Workbench to package the incident.
      See Note 411.1 at My Oracle Support for error and packaging details.
      Errors in file u01/app/oracle/diag/rdbms/ywzd/ywzd/trace/ywzd_ora_4739.trc:
      ORA-00600: internal error code, arguments: [kokasgi1], [], [], [], [], [], [], [], [], [], [], []
      Errors in file u01/app/oracle/diag/rdbms/ywzd/ywzd/trace/ywzd_ora_4739.trc:
      ORA-00600: internal error code, arguments: [kokasgi1], [], [], [], [], [], [], [], [], [], [], []
      Error 600 happened during db open, shutting down database
      USER (ospid: 4739): terminating the instance due to error 600
      Instance terminated by USER, pid = 4739

      其次,查阅MOS相关文档。该错误在mos上没有查询出来明确的解决方案。于是,重启数据库并设置10046跟踪事件,让报错信息重现。

        SQL> shutdown immediate;
        SQL> startup mount;
        SQL> alter session set events='10046 trace name context forever , level 12';
        SQL> alter database open;
        alter database open
        *
        ERROR at line 1:
        ORA-01092: ORACLE instance terminated. Disconnection forced
        ORA-00600: internal error code, arguments: [kokasgi1], [], [], [], [], [], [], [], [], [], [], []
        Process ID: 4739
        Session ID: 1369 Serial number: 3
        接着,在10046 跟踪文件中可以看到启动过程中基础数据字典内容校验时出现了错误,导致数据库无法正常打开。SYS用户在Oracle程序中会被硬编码在逻辑中,强行更改会导致系统异常。
          ===================== 
          select user#,password,datats#,tempts#,type#,defrole,resource$, ptime,decode(defschclass,NULL,'DEFAULT_CONSUMER_GROUP',defschclass),
          spare1,spare4,ext_username,spare2
          from user$ where name=:1
          END OF STMT
          Bind#0
          value="SYS" <---绑定变量值

          最后,跟客户进行沟通确认,近期做过安全整改,确实有人修改了SYS用户名。于是排除是被人恶意攻击的情况。

          1、由于SYS用户名被强行更改,接下来需要通过gdb工具挂起启动过程,并强行修改数据字典进行修复,不影响数据库的健康运行。

          2、打开窗口1,将数据库启动至mount状态,关闭监听程序。

          3、打开窗口2 ,查看sqlplus的进程号,并用gdb工具进行调试

            [oracle@YWZD-DBS ~]$ ps -ef|grep LOCAL
            oracle 6961 6150 0 21:42 ? 00:00:00 oracleywzd (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
            [oracle@YWZD-DBS ~]$ gdb u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle 6961
            Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.212.el6_10.3.x86_64 libaio-0.3.107-10.el6.x86_64 numactl-2.0.9-2.el6.x86_64
            (gdb) b kokiasg 《---- 设置断点
            Breakpoint 1 at 0x15037cc
            (gdb) c 《----
            Continuing.

            4、此时回到窗口1

              SQL> alter database open;

              此时系统挂住,通过alert日志可以看到数据库实际已经open了。

              5、新开一个窗口3,可以查到SYS用户名被改为SYSIDC。

                [oracle@YWZD-DBS ~]$ sqlplus / as sysdba
                SQL*Plus: Release 11.2.0.4.0 Production on Tue Jul 26 21:45:16 2022
                Copyright (c) 19822013, Oracle.  All rights reserved.
                Connected to:
                Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
                With the Partitioning, OLAP, Data Mining and Real Application Testing options
                SQL> select status from v$instance;
                STATUS
                ------------
                OPEN
                SQL> select rowid ,name from user$ where name like 'SYS%';
                ROWID NAME
                ------------------ ------------------------------
                AAAAAKAABAAAADRAAB SYSIDC
                AAAAAKAABAAAADRAAG SYSTEM

                6、接着将用户名修改为SYS。

                  SQL> update user$ set name='SYS' where name='SYSIDC';
                  1 row updated.
                  SQL> commit;
                  Commit complete.

                  7、回到窗口2,退出断点设置。

                    Breakpoint 1, 0x00000000015037cc in kokiasg ()
                    (gdb) quit
                    A debugging session is active.
                        Inferior 1 [process 6961] will be detached.
                    Quit anyway? (y or n) y
                    Detaching from program: /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle, process 6961

                    8、回到窗口1,重启数据库与监听,并验证业务是否正常。

                    9、至此恢复完成。再次明确SYS用户是oracle内部默认的超级用户,系统很多调用在程序中写死的sys,对其用户不能进行重命名操作。

                    gdb(GNU Debugger)是Linux系统中一个强大的调试工具,它用于分析程序的运行过程,帮助开发者识别和修复程序中的错误。当数据库已经非常慢或者数据库hang到sqlplus -prelim "/as sysdba"也无法连接时,就可以使用gdb来收集系统的dump信息。尽量不要去使用gdb去dump oracle数据库后台进程,有可能导致进程被kill(遇到过几次),如果系统没有hang死,也尽量不要在生产系统使用gdb做dump和调优。

                    可以在测试环境使用gdb进行dump实验,步骤如下:

                      1、找到Oracle用户进程ID
                      ps -ef | grep orcl (LOCAL=NO)


                      2、对上述的SPID进程号进行调试跟踪


                      Example: process id 3846


                      $ gdb $ORACLE_HOME/bin/oracle 3846
                      3、打印trace信息


                      (gdb) print ksudss(258) --》##258为dump的level


                      4、找到trace文件
                      cd $ORACLE_BASE/diag/rdbms/ywzd/ywzd/trace ##参数的trace文件路径 也就是alertlog的路径
                      ll|grep 3846
                      -rw-r----- 1 oracle oinstall 6723482 Feb 4 15:51 ywzd_ora_3846.trc ##文件名为 oraclesid_ora_pid.trc
                      5、退出调试窗口
                      (gdb) detach ##脱离进程
                      (gdb) quit

                      • https://sqlora.blog.csdn.net/article/details/106721292
                      • https://blog.csdn.net/xiaofan23z/article/details/136040441
                      • https://docs.oracle.com/cd/E27071_01/html/E26441/blazn.html

                      以上就是本期关于“安全等保加固重命名SYS用户触发ORA-600[kokasgi1]错误”的处置案例。希望能给大家带来帮助。

                      欢迎关注“数据库运维之道”公众号,一起学习数据库技术!

                      欢迎扫码进“数据库运维之道”,此群用于数据库技术交流,禁止发广告!

                      可以加我的微信,交个朋友或讨论数据库解决方案,请备注”姓名单位“,谢谢!


                      文章转载自数据库运维之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论