1.3 保护其他可执行文件
背景 看看 $ORACLE_HOME/bin 目录中的其他可执行文件;有些看起来很熟悉,例如 sqlplus 或 lsnrctl(启动监听程序的实用工具);有些您可能并不熟悉。
其中一些文件(例如监听程序进程运行的实用工具 tnslsnr 或在 Oracle Intelligent Agent 中使用的 dbsnmp)最终用户不会直接接触到。 要正确保护这些文件,您必须了解它们的作用,从而采取相应的措施。
请记住,如果为文件设置了 SUID 位,则无论哪个用户运行该文件,该文件都在所有者的权限下运行,而不是在执行者的权限下运行。 您还应清楚,设置 SUID 是一种危险行为,不应给予鼓励。
还有一些文件将 SUID 设置为 on。 让我们将它们找出来。 $ cd $ORACLE_HOME
$ find . -type f \( -perm -2000 -o -perm -4000 \) -exec ls -l {} \;
在 Oracle 数据库 10g 第 1 版和更高版本中,上述命令应仅返回以下可执行文件: -rwsr-s--x 1 orasoft dba 93300507 Jul 22 11:20 ./bin/oracleO
-r-sr-s--- 1 root dba 0 Jul 1 23:15 ./bin/oradism
-rwsr-s--x 1 orasoft dba 94492 Jul 22 11:22 ./bin/emtgtctl2
-rwsr-s--- 1 root dba 18944 Jul 22 11:22 ./bin/nmb
-rwsr-s--- 1 root dba 20110 Jul 22 11:22 ./bin/nmo
-r-sr-sr-x 1 nobody nobody 58302 Jul 22 11:23 ./bin/extjob
我们来看看这些文件是哪些:
程序 |
说明 |
./bin/oracleO |
该文件是可执行文件“oracle”的副本。 当您使用重新链接命令重新编译 oracle 可执行文件时,旧版本将另存为 oracle0。 这是一个潜在的安全隐患;大多数 DBA 的忽略使其可能成为黑客的入侵途径。 因此,您应该采取措施删除这些权限。 最好的方法是让其没有任何权限:
$ chmod 0000 oracleO
现在,如果您查看权限:
$ ls -l oracleO ---------- 1 orasoft oinstall 248823320 Sep 15 13:27 oracleO |
./bin/oradism |
用于动态隐私共享内存。 可以在您的平台上使用。 并不是在所有情况下都出现。 如果出现,保持原样。 |
./bin/emtgtctl2 |
用于 Enterprise Manager Agent。 无需使用 SUID 设置它。 原因和“oracle”可执行文件一样。 删除权限。
$ chmod 0700 emtgtctl2 |
./bin/nmb |
Oracle 10g 网格控制代理用其来收集目标服务器上的统计信息。 保持原样。 |
./bin/nmo |
Oracle 10g 网格控制代理用其来收集目标服务器上的统计信息。 保持原样。 |
./bin/extjob |
这是 EXTJOB(外部作业,可用来从企业管理器内部执行基于 OS 的程序)的可执行文件。 您应当给予注意。 您是否经常使用外部作业? 如果不是,那么您甚至不应该保留该可执行文件。 在这种情况下,您可以将其保留在目录中,但要更改权限和所有权关系。 所有者可以是 Oracle 软件所有者(本例为 orasoft),权限应该为 rwx------。
$ chown orasoft:oinstall extjob $ chmod 0700 extjob
可能还会存在另一个程序 extjobO,它是同一程序的先前编译。 该程序的权限也要改。
$ chown orasoft:oinstall extjobO $ chmod 0000 extjobO |
在 Oracle9i 数据库第 2 版中,您将发现另一个文件 ./bin/dbsnmp,它是 Oracle Intelligent Agent 可执行文件。 权限的设置如下: -rwsr-s--- 1 root dba 2986836 Jan 26 2005 dbsnmp
该文件的问题是它需要 root 权限才能正常工作,因此必须将 SUID 位设置为 on。 但是,由于该文件的所有者是 root,因此黑客通常利用它以 root 身份获得访问。 最好的方法是消除它,或者将其所有者改为 Oracle 软件所有者,将权限设置为 700。您将失去一些功能,但是为了消除风险,这是值得的。
另一个要考虑的可执行文件是 tnslsnr,它是 Oracle 网络监听程序。 有两个可执行文件:
tnslsnr - 实际的监听程序可执行文件 lsnrctl - 用于管理监听程序(例如启动、停止等)的实用工具。
如果您查看权限: $ ls -l *lsnr*
-rwxr-x--x 1 orasoft oinstall 214720 Oct 25 01:23 lsnrctl
-rwxr-xr-x 1 orasoft oinstall 214720 Oct 1 18:50 lsnrctl0
-rwxr-x--x 1 orasoft oinstall 1118816 Oct 25 01:23 tnslsnr
-rwxr-xr-x 1 orasoft oinstall 1118816 Oct 1 18:50 tnslsnr0
这些文件全都具有执行权限。 与可执行文件 oracleO 一样,通过重新链接 Oracle 软件创建新文件 tnslsnr 时,已有的文件被重命名为 tnslsnr0。 这样做是因为,如果需要回退该进程,可以将旧的可执行文件复制到新的可执行文件上。 因为是旧的可执行文件的副本,因此文件 tnslsnr0 可能包含原来的 tnslsnr 的功能。 lsnrctl0 也是一样。
策略 既然您了解了每个可执行文件的作用,让我们来看看您如何能够保护数据库基础架构。 大部分策略已经在前面部分的背景信息中进行了讨论。 因此,实际上,您的策略措施是:
- 删除不需要的文件(例如 lsnrctl0)的所有权限。
- 限制仅 Oracle 软件具有可执行文件的权限。
- 如果 Oracle 软件所有者启动进程,删除 SUID 位。
因此,您希望更改与监听程序相关的文件的权限,如下所示: $ chmod 700 lsnrctl tnslsnr
$ chmod 000 lsnrctl0
验证结果。 $ ls -l *lsnr*
-rwx------ 1 orasoft oinstall 214720 Oct 25 01:23 lsnrctl
---------- 1 orasoft oinstall 214720 Oct 1 18:50 lsnrctl0
-rwx------ 1 orasoft oinstall 1118816 Oct 25 01:23 tnslsnr
---------- 1 orasoft oinstall 1118816 Oct 1 18:50 tnslsnr0
结论 从本例可得出以下几个结论:
- 更改 oracleO 可执行文件对数据库的操作没有影响。 如果曾经遇到导致“oracle”可执行文件损坏的问题,最好的做法是将“oracleO”文件重命名为“oracle”。 若如此,请确保将权限重设为 700。对 lsnrctl0 和 tnslsnrctl0 文件也是如此。
- 如果使用 Oracle 软件所有者用户 ID 作为企业管理器操作系统凭证,更改 emtgtctl2 权限将没有任何影响。 如果使用其他用户 ID(例如,不是 orasoft),则必须将 SUID 重设为原来的值,权限必须设为与原来一样。
- 可执行文件 dbnsmp 由 Oracle Enterprise Manager Intelligent Agent 使用,但是仅延续到 Oracle9i 数据库第 2 版。此外,如果您使用 Oracle 软件所有者作为操作系统凭证,更改权限没有任何影响。 如果您使用其他用户 ID,则必须将权限重设为原来的值。
操作计划
- 将 oracleO、tnslsnr0 和 lsnrctl0 的权限更改为 0000。
- 将 tnslsnr 和 lsnrctl 的权限更改为 0700。
- 您在企业管理器中是否使用外部作业?
IF 没有 THEN 将 extjob 的权限更改为 0000 ELSE |
|
将 extjob 的权限更改为 0700 并将所有者和组更改为 orasoft 和 oinstall(或任何 Oracle 软件所有者的用户和组)。 |
END IF |
-
IF 您运行在 Oracle9i 数据库上 THEN |
|
您是否使用 Oracle Intelligent Agent? |
IF 没有 THEN |
|
将 dbsnmp 的所有权更改为 orasoft 将权限更改为 0700 |
ELSE |
|
无需任何更改 |
END IF |
1.4 使用 umask
背景 正如所知,您可以使用 chmod 命令更改 *nix 中的权限。 但是,由于 chmod 仅在现有文件上工作,您如何确保以后创建的文件具有相同的权限?
为了说明这一点,假设您希望目录中的所有文件都具有权限 r--r--r--(或 444)。 通过发出以下命令很容易做到这一点: $ chmod 444 *
现在在目录上创建一个没有内容的简单文件,查看它的权限。 $ touch a_file.txt
$ ls -l a_file.txt
-rw-r--r-- 1 orasoft dba 0 Oct 21 13:44 a_file.txt
对于所有者,权限设置为读写,对于组设置为读,对于其他用户设置为读(或者 644),而不是您预期的 444。为什么?
在新创建的文件上设置的确切权限由一个名为 umask 的特殊参数指定。 umask 是一个值集,从所有权限中减去该值集可以得到新文件的权限值。 例如,如果将 umask 设置为 777,从整体权限值 777 中减去该值,得到 000,即新文件没有任何权限。让我们来看一个示例: $ umask 777
$ touch b_file.txt
$ ls -l ?_file.txt
-rw-r--r-- 1 oracrmp dba 0 Oct 21 13:44 a_file.txt
---------- 1 oracrmp dba 0 Oct 21 13:53 b_file.txt
请注意,文件 b_file.txt 的权限为 000 或 ---------。 此外,请注意,先前创建的文件 a_file.txt 仍然被设置为原来的权限。 将 umask 设置为 777 得到新文件的权限。
umask 是为 Oracle 将创建的不同文件设置权限的强大有效的方法。
策略 Oracle 软件所有者的整体 umask 为 022,因此文件所有者的权限为读写,所有其他用户的权限为读。 您可以将该内容放到用户的登录配置文件中,以便它随时生效。
Oracle 使用的文件有很多不同类型,数据文件、重做日志文件、跟踪文件等等。 数据文件可以预先知道,您可以轻松更改它们的权限,但是跟踪文件是在运行时生成的。 因此,您应该使用 umask 来确保这些跟踪文件没有暴露给任何外部用户,因为这些文件包含可能被黑客利用的各种机密信息。 例如,理论上,某人可以通过复制跟踪文件来窃取数据文件,并将其安装在单独的服务器上,调出数据库以窃取其内容。
为目录设置 umask,如下所示:
目录 |
说明 |
umask |
初始化参数 background_dump_dest 指定的目录 |
某些跟踪文件和数据库警报文件都在此处生成。 权限应为 rw-------(仅 Oracle 软件所有者具有读写权限)。 |
0177 |
初始化参数 user_dump_dest 指定的目录 |
跟踪文件在此处生成。 权限应与上面相同。 |
0177 |
$ORACLE_HOME/rdbms/log |
某些数据库日志文件在此处生成。 权限应与上面相同。 |
0177 |
$ORACLE_HOME/rdbms/audit |
默认情况下,数据库审计的审计跟踪存储在此处,除非您已经设置了 audit_file_dest 初始化参数。 权限应与上面相同。 即使您有 DB 审计跟踪,某些通用事件(例如 SYSDBA 连接和数据库启动/关闭)始终在此处审计和放置。 |
0177 |
初始化参数 audit_file_dest 指定的目录 |
默认情况下,数据库审计的审计跟踪存储在此处,除非您已经设置了 audit_file_dest 初始化参数。 权限应与上面相同。 |
0177 |
结论 以这种方式设置 umask 可以防止某些开发人员访问会话跟踪文件,这些文件在 user_dump_dest 目录中生成并被传递到 tkprof 进行格式化。 因此,您可能希望仅在该目录上放松规则。 操作计划
- 将 background_dump_dest 上的 umask 更改为 0177。
- 将 $ORACLE_HOME/rdbms/log 上的 umask 更改为 0177。
- 将 $ORACLE_HOME/rdbms/audit 上的 umask 更改为 0177。
- 将 audit_file_dest 上的 umask 更改为 0177。
- (可选)将 user_dump_dest 上的 umask 更改为 0177。
(编辑:aniston)
|