原文链接: http://www.dbaleet.org/how_to_enable_selinux_on_exadata_cell/
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)为Linux设计的,对于强制访问控制的一个安全子系统。大多数Linux的发行版都在各自的内核级别启用 SELinux 的,同时提供一个可定制的安全策略。SELinux实际上是强制访问控制的一种实现,主要目的是为了控制进程可以访问的资源,能够减少或者防止0-day漏洞的探测和攻击。
在Exadata上,DB节点默认其SELInux的策略是禁止的,主要是考虑到ASM可能造成的问题:参见我之前的文章 iptables和SELinux是不是必须禁用? http://www.dbaleet.org/is_disable_iptables_and_selinux_to_be_mandatory/ 。
SELinux有三种状态:
- Enforcing: 这个缺省模式会在系统上启用并实施 SELinux 的安全性政策,拒绝访问及记录行动
- Permissive: 在 Permissive 模式下,SELinux 会被启用但不会实施安全性政策,而只会发出警告及记录行动。Permissive 模式在排除 SELinux 的问题时很有用。
- Disabled: SELinux 已被禁用。
在Cell端,SELInux默认以Permissive的方式开启,也就意味着系统只默认将违背访问控制的的内容写入到日志文件,并不真正的实行安全性策略。
[root@dm01cel01 audit]# imageinfo Kernel version: 2.6.32-400.6.2.el5uek #1 SMP Sun Nov 18 17:02:09 PST 2012 x86_64 Cell version: OSS_11.2.3.2.1_LINUX.X64_121203 Cell rpm version: cell-11.2.3.2.1_LINUX.X64_121203-1 Active image version: 11.2.3.2.1.121203 Active image activated: 2012-12-05 18:22:16 -0700 Active image status: success Active system partition on device: /dev/md5 Active software partition on device: /dev/md7 In partition rollback: Impossible Cell boot usb partition: /dev/sda1 Cell boot usb version: 11.2.3.2.1.121203 Inactive image version: undefined Rollback to the inactive partitions: Impossible [root@dm01db01 audit]# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: permissive Mode from config file: permissive Policy version: 24 Policy from config file: targeted
在Linux下,SELinux是通过auditd守护进程将其违反的AVC策略写入到/var/log/audit/audit.log中的,这个文件默认日志会在25MB大小的时候进行rotation ,生成后缀为.1或者.2之类的归档文件。
Exadata较新的版本中,在/opt/oracle.SupportTools目录下会有一个名为SELinuxPermit.log的文件,这个文件实际上是取自/var/log/audit/audit.log文件中的avc denial message,;例如:
type=AVC msg=audit(1330990260.465:60): avc: denied { execute } for pid=8232 comm="ntpdate" path="/lib64/libcap.so.1.10" dev=md5 ino=688359 scontext=system_u:system_r:ntpd_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=file
这些就是违背SELinux的规则,如果将 SELinuxPermit.log添加为例外的规则,那么就是将SELinux设置为enforcing的模式了。
1. 根据SELinuxPermit.log的违反规则,生成对应的te(type enforcement)文件:
[root@dm01cel01 audit]# sed -e '/^#/d' /opt/oracle.SupportTools/SELinuxPermit.log |audit2allow -m Exadata > Exadata.te
2. 编译成对应的模块:
[root@dm01cel01 audit]# checkmodule -M -m Exadata.te -o Exadata.mod
3. 将模块生成对应的package:
[root@dm01cel01 audit]# semodule_package -m Exadata.mod -o Exadata.pp
4. 在内核中移除以前的Exadata模块:
[root@dm01cel01 audit]# semodule -r Exadata
5. 将新生成的package载入内核:
[root@dm01cel01 audit]# semodule -i Exadata.pp
6. 将/etc/selinux/config文件中的 “selinux=修改为enforcing”。
7. 重启主机生效。
注意,当前SELinux enforcing模式没有经过严格的测试,并不被官方支持。如果对Linux的SELinux不是太熟悉,请不要进行设置。
参见MOS文档:How to enable ‘enforcing’ mode for SELinux on Exadata (Doc ID 1481829.1)
Please note that SELinux enforcing mode is not tested by Exadata Development and
that creating/changing an SELinux policy is beyond the scope of Oracle Support.
Setting SELinux policy must be done carefully, to avoid ‘breaking’ applications,
so be sure to check /var/log/audit/audit.log if something should ‘go wrong’.
附我当前测试环境下Exadata其对应的TE文件的内容:
module Exadata 1.0; require { type audisp_t; type mount_t; type file_t; type restorecon_t; type load_policy_t; type procmail_t; type mdadm_t; type wtmp_t; type snmpd_t; type tmp_t; type root_t; type auditctl_t; type fsdaemon_t; type auditd_t; type faillog_t; type fsadm_t; type iptables_t; type hwclock_t; type mqueue_spool_t; type pam_console_t; type system_mail_t; type semanage_t; type usr_t; type ping_t; type syslogd_t; type sysfs_t; type var_spool_t; type irqbalance_t; type var_log_t; type sendmail_log_t; type setfiles_t; type lastlog_t; type etc_mail_t; type shadow_t; type ifconfig_t; type ntpd_t; type locale_t; type etc_runtime_t; type klogd_t; type device_t; type initrc_var_run_t; type var_t; type netutils_t; class process { setsched getsched }; class capability sys_resource; class file { rename execute setattr read getattr write ioctl unlink append }; class netlink_route_socket { write bind create read nlmsg_read }; class lnk_file read; class dir { rename search read write getattr rmdir remove_name }; } #============= audisp_t ============== allow audisp_t file_t:file { execute getattr }; allow audisp_t self:capability sys_resource; #============= auditctl_t ============== allow auditctl_t etc_runtime_t:file getattr; allow auditctl_t faillog_t:file getattr; allow auditctl_t file_t:file read; allow auditctl_t initrc_var_run_t:file getattr; allow auditctl_t lastlog_t:file getattr; allow auditctl_t locale_t:file getattr; allow auditctl_t shadow_t:file getattr; allow auditctl_t tmp_t:file read; allow auditctl_t wtmp_t:file getattr; #============= auditd_t ============== allow auditd_t file_t:file { rename getattr setattr read unlink append }; #============= fsadm_t ============== allow fsadm_t root_t:file unlink; allow fsadm_t var_log_t:file append; #============= fsdaemon_t ============== allow fsdaemon_t file_t:file { read getattr }; allow fsdaemon_t self:capability sys_resource; allow fsdaemon_t usr_t:file { read getattr }; #============= hwclock_t ============== allow hwclock_t self:capability sys_resource; #============= ifconfig_t ============== allow ifconfig_t file_t:dir { search getattr }; allow ifconfig_t file_t:file append; allow ifconfig_t file_t:lnk_file read; allow ifconfig_t usr_t:lnk_file read; allow ifconfig_t var_log_t:file write; #============= iptables_t ============== allow iptables_t file_t:dir { search getattr }; allow iptables_t file_t:file append; allow iptables_t file_t:lnk_file read; #============= irqbalance_t ============== allow irqbalance_t file_t:file { read getattr execute }; #============= klogd_t ============== allow klogd_t file_t:file { read getattr execute }; #============= load_policy_t ============== allow load_policy_t file_t:file { read getattr execute }; #============= mdadm_t ============== allow mdadm_t var_log_t:file append; #============= mount_t ============== allow mount_t var_log_t:file append; #============= netutils_t ============== allow netutils_t sysfs_t:dir search; allow netutils_t sysfs_t:file read; #============= ntpd_t ============== allow ntpd_t file_t:file { read getattr unlink execute }; #============= pam_console_t ============== allow pam_console_t file_t:file { read ioctl getattr }; #============= ping_t ============== allow ping_t file_t:file { read getattr execute }; #============= procmail_t ============== allow procmail_t file_t:file { read getattr }; allow procmail_t self:capability sys_resource; #============= restorecon_t ============== allow restorecon_t file_t:file execute; #============= semanage_t ============== allow semanage_t file_t:dir { rename write getattr rmdir read remove_name }; allow semanage_t file_t:file { execute unlink }; allow semanage_t file_t:lnk_file read; #============= setfiles_t ============== allow setfiles_t device_t:file append; allow setfiles_t file_t:file execute; #============= snmpd_t ============== allow snmpd_t etc_mail_t:dir search; allow snmpd_t etc_mail_t:file { read getattr }; allow snmpd_t file_t:file { read rename getattr unlink execute }; allow snmpd_t mqueue_spool_t:dir search; allow snmpd_t self:capability sys_resource; allow snmpd_t self:netlink_route_socket { write bind create read nlmsg_read }; allow snmpd_t self:process { setsched getsched }; allow snmpd_t sendmail_log_t:dir search; allow snmpd_t sendmail_log_t:file read; allow snmpd_t tmp_t:dir { read getattr }; allow snmpd_t usr_t:file append; allow snmpd_t var_spool_t:dir search; allow snmpd_t var_t:lnk_file read; #============= syslogd_t ============== allow syslogd_t file_t:file { read getattr execute }; #============= system_mail_t ============== allow system_mail_t file_t:file { read getattr execute };
Comment