Linux -- SELinux相关问题解决办法

时间:2022-06-01 20:18:30

一、如何解决SELinux问题?

说起SELinux,多数Linux发行版缺省都激活了它,可见它对系统安全的重要性,可惜由于它本身有一定的复杂性,如果不熟悉的话往往会产生一些看似莫名其妙的问题,导致人们常常放弃使用它,为了不因噎废食,学学如何解决SELinux问题是很有必要的。

我们以CentOS环境为例重现一个非常常见的SELinux问题:

首先需要确认SELinux处于激活状态,可以使用getenforce或sestatus命令:

shell> getenforce  Enforcing   shell> sestatus  SELinux status:                 enabled  SELinuxfs mount:                /selinux  Current mode:                   enforcing  Mode from config file:          enforcing  Policy version:                 24  Policy from config file:        targeted

注:关于SELinux的基础知识介绍请参考鸟哥的Linux私房菜中相关的介绍。

我们还需要确认系统已经安装并启动了Apache,没有的话就YUM装一个,这很简单,就不多说了,接着在root目录创建一个测试文件test.html,如下:

shell> cat /root/test.html  hello, world.

然后把这个测试文件拷贝到Apache的DocumentRoot目录,我的Apache是通过YUM安装的话,缺省是/var/www/html目录,如下:

shell> cp /root/test.html /var/www/html

接着浏览一下,如果没出什么幺蛾子,应该一切都在意料之中,如下:

shell> curl http://localhost/test.html  hello, world.

看到这,你可能觉得我废话连篇,别着急,下面就是见证奇迹的时候了:

同样还是那个测试文件test.html,不过这次不再是拷贝,而是移动,如下:

shell> mv /root/test.html /var/www/html

接着浏览一下,怎么样,结果很出人意料吧,竟然提示权限错误,如下:

shell> curl http://localhost/test.html  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /test.html  on this server.</p> </body></html>

当然,我们现在知道这个问题是由于SELinux引起的,但还不知其所以然,实际上问题的原因此时已经被audit进程记录到了相应的日志里,可以这样查看:

shell> audit2why < /var/log/audit/audit.log

如果看不懂的话,推荐安装setroubleshoot套件:

shell> yum install setroubleshoot

它本身是一个GUI套件,不过其中包含的一个sealert命令对我们命令行用户很有用:

shell> sealert -a /var/log/audit/audit.log  Summary:   SELinux is preventing /usr/sbin/httpd "getattr" access to  /var/www/html/test.html.   Detailed Description:   SELinux denied access requested by httpd. /var/www/html/test.html may be a  mislabeled. /var/www/html/test.html default SELinux type is httpd_sys_content_t,  but its current type is admin_home_t. Changing this file back to the default  type, may fix your problem.   File contexts can be assigned to a file in the following ways.     * Files created in a directory receive the file context of the parent      directory by default.    * The SELinux policy might override the default label inherited from the      parent directory by specifying a process running in context A which creates      a file in a directory labeled B will instead create the file with label C.      An example of this would be the dhcp client running with the dhclient_t type      and creating a file in the directory /etc. This file would normally receive      the etc_t type due to parental inheritance but instead the file is labeled      with the net_conf_t type because the SELinux policy specifies this.    * Users can change the file context on a file using tools such as chcon, or      restorecon.   This file could have been mislabeled either by user error, or if an normally  confined application was run under the wrong domain.   However, this might also indicate a bug in SELinux because the file should not  have been labeled with this type.   If you believe this is a bug, please file a bug report against this package.   Allowing Access:   You can restore the default system context to this file by executing the  restorecon command. restorecon '/var/www/html/test.html', if this file is a  directory, you can recursively restore using restorecon -R  '/var/www/html/test.html'.   Fix Command:   /sbin/restorecon '/var/www/html/test.html'

这次应该看懂了吧!原因是说Apache下文件上下文类型应该是httpd_sys_content_t,但是现在是admin_home_t,所以权限错误,并且在结尾处给出了修复命令。

可httpd_sys_content_t,admin_home_t都怎么看啊?很简单,借助ls命令的-Z参数即可:

shell> ls -Z /path

回到问题的开始,拷贝之所以没出现问题,是因为cp自动修改上下文属性,而移动之所以出现问题是因为mv保留原文件的上下文属性。

注:关于SELinux和Apache的详细介绍,可以参考『man httpd_selinux』。

知道了如何解决SELinux问题,以后如果遇到类似的情况不要急着武断的关闭SELinux。

二、启用SELinux时遇到的问题


一台CentOS5.7的机器,原来只是在公司内部访问,SELinux是禁用的状态,现需要搭建成FTP服务器并发布到外网上去,为了安全,启用SELinux。编辑/etc/selinux/config文件,将SELINUX=disabled改为SELINUX=permissive,保存后重启系统。(SELinux从禁用状态转变为启用时,需要重启系统以重新标记文件的上下文,红帽建议先将SELinux的值设置为permissive,重新标记完成后再设置为enforcing。)

按道理说,重新对整个文件系统进行标记应该是比较费时间的,至少需要几分钟,但在这台机器上敲入reboot命令后,发现它很快就启动起来的。登录后使用命令getenforce,返回permissive,说明SELinux的状态正常,于是把SELinux的状态设置为Enforcing,设置完成后重启了一下vsftpd和httpd服务,这下问题大了,服务无法正常启动,提示“errorwhile loading shared libraries: libssl.so.6: failed to map segment from sharedobject: Permission denied”,直觉告诉我是因为重启时没有对整个文件系统进行正确的relabeling引起的,于是执行命令touch   /.autorelabel   ,在/下创建一个.autorelabel文件,有这个文件存在,系统在重启时就会对整个文件系统进行relabeling,但奇怪的是重启又很快完成,看来还是没有完成relabeling。

最后google了一下,发现一个解决方案,执行下面三条命令:

fixfiles    -f   relabel

touch   /.autorelabel

reboot

但在执行第一条命令时就报错,提示“/etc/selinux/targeted/contexts/files/file_contexts.homedirs: line 18 hasinvalid context user_u:object_r:user_mozilla_home_t:s0”,报错信息有多条类似的,不止这一条。

再次google,最后在红帽的网站上找到了原因,之所以会出现这个问题因为在SELinux是disabled的状态下升级了操作系统,参见https://bugzilla.redhat.com/show_bug.cgi?id=449420

解决方法:

在启用SELinux并重启后,执行下列命令:

genhomedircon

touch /.autorelabel

reboot

这次在重启的时候就停在relabeling的地方,大概花了5分钟左右,完成后进入系统,将SELinux设置为Enforcing模式,执行命令ps  -eZ  查看进程的SELinux上下文,一切正常。

附:

系统启动时,运行/etc/rc.d/rc.sysinit脚本,在这个脚本中判断了/.autorelabel文件是否存在,如果存在,则会调用fixfiles命令对整个文件系统进行relabeling,相关代码如下:

If   [ -f /.autorelabel ] || strstr"$cmdline" autorelabel ; then

relabel_selinux

fi

relabel_selinux() {

if [ -x/usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then

chvt 1

fi

# if /sbin/init isnot labeled correctly this process is running in the

# wrong context,so a reboot will be reuired after relabel

REBOOTFLAG=`restorecon -v /sbin/init`

AUTORELABEL=

./etc/selinux/config

if ["$AUTORELABEL" = "0" ]; then

rm -f  /.autorelabel


echo

echo$"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required. "

      echo $"*** /etc/selinux/configindicates you want to manually fix labeling"

echo$"*** problems. Dropping you to a shell; the system will reboot"

echo$"*** when you leave the shell."

echo"0" > $selinuxfs/enforce

sulogin


echo$"Unmounting file systems"

umount -a

mount -n -oremount,ro /

echo$"Automatic reboot in progress."

reboot -f

else

echo

echo$"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required."

echo$"*** Relabeling could take a very long time, depending on file"

echo$"*** system size and speed of hard drives."


echo"0" > $selinuxfs/enforce

/sbin/fixfiles  restore > /dev/null 2>&1

rm -f  /.autorelabel

if [ ! -z "$REBOOTFLAG" ]; then

echo$"Automatic reboot in progress."

reboot -f

fi

echo$SELINUX_STATE > $selinuxfs/enforce

if [ -x/usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then

chvt 8

fi

fi

}

三、用SELinux保护你的Apache


你的Web服务器确实有可能遭受攻击,但是SELinux可以用来确保你的网站不用承受真正的伤害。

你可以运用SELinux类型来创建一个确切定义:一个服务可以做什么和它在哪里完成要做的事情。默认情况下,httpd_sys_content类型被设为/var/www,它规定httpd进程可以在该目录中工作。如果攻击者破坏了Apache Web服务器并尝试在别处写入,就像红帽和Fedora以及CentOS等相似Linux版本的默认/tmp,你需要知道你正在处理什么。如果你配置Apache来为/data目录中的内容服务,SELinux也会默认地防止这种情况。

由于这些默认设置可能造成复杂的情况,很多Linux管理员关闭SELinux。虽然关闭SELinux的确让你的服务器提供服务时更容易,但是它还是增加了安全风险。

为Apache管理SELinux设置

为Apache等服务管理SELinux设置并不难。问题是并没有简单的图形工具可以让你快速安装。但只要用三条命令,你就可以配置它。

为了在你想让服务访问到的目录上设置文件类型,你首先必须决定要使用的文件系统类型。要这么做,只需在服务使用的默认目录上输入ls �CldZ。

对于Apache,你会使用ls �CldZ /var/www。你会注意到在这种情况下,�CZ选项给出了额外的文件属性,而�Ct选项才是最关键的一个。这个进程规定现有的文件系统类型,这个系统类型是Apache设置的(httpd_sys_content_t)。这也是你需要按照新文件根设置的文件类型。

你可以用两条命令设置你的内容形式:用chcon你可以做一次暂时的变更,它在重启后消失;用followed by紧跟着的semanage,你可以做永久的变更。

semanage命令似乎有些复杂,但它实际上非常简单,因为你只需要改变你想要用的类型和目标目录。在下面的例子中,你只需要改变两个参数。

semanage fcontext -a -t httpd_sys_content_t /web(/.*)/?

在运用semanage设置默认文件类型之后,运用restorecon命令来确保它得到应用了。在上面的例子中,针对目录/web的文件类型被变更来允许到那个目录上服务器文件的Apache,运行以下命令来应用该变更:

restorecon -R -v /web

在这一点上,Apache将能服务于新的非默认文件根目录上的文件。

为SELinux管理布尔值

你需要管理的SELinux的另一个方面是SELinux布尔值。这些都是开启或关闭某些功能的二进制值。布尔值可以在多种服务中获得。运用getsebool �Ca命令来概观整个现有的布尔值。该命令通常会将你能应用的设置列成一个长长的列表。

要为你想配置的服务找到所有布尔值,通过grep传输所有getsebool �Ca的输出。举例来说,运用getsebool �Ca | grep http来找到所有与行http匹配的布尔值。即使你并不是对所有布尔值都有明确认识,你通常还是可以通过观察它们的名字和它们可能做的事情查明白。

使用getsebool -a来找出哪个SELinux可以用来修改服务行为:

[root@bia Desktop]# getsebool -a | grep httpallow_httpd_anon_write --> offallow_httpd_mod_auth_ntlm_winbind --> offallow_httpd_mod_auth_pam --> offallow_httpd_sys_script_anon_write --> offhttpd_builtin_scripting --> onhttpd_can_check_spam --> offhttpd_can_network_connect --> offhttpd_can_network_connect_cobbler --> offhttpd_can_network_connect_db --> offhttpd_can_network_relay --> offhttpd_can_sendmail --> offhttpd_dbus_avahi --> onhttpd_enable_cgi --> onhttpd_enable_ftp_server --> offhttpd_enable_homedirs --> offhttpd_execmem --> offhttpd_read_user_content --> offhttpd_setrlimit --> offhttpd_ssi_exec --> offhttpd_tmp_exec --> offhttpd_tty_comm --> onhttpd_unified --> onhttpd_use_cifs --> offhttpd_use_gpg --> offhttpd_use_nfs --> off

学会了你想用哪个布尔值后,运用setsebool -P来应用它们。如果你想允许Apache运用nfs,在上面运用setsebool -P http_use_nfs。想要得到所有可用布尔值的完整列表,咨询一下httpd_selinux页面,这个页面解释了Apache特有的文件标签和布尔值。 

原文:http://www.searchsv.com.cn/showcontent_53067.htm

四、如果SELinux拒绝vsftpd上传文件到用户主目录怎么办

用惯了vsftpd,觉得vsftpd非常实用而且安全,但是那些初学者经常会遇到一些问题如下:

系统是CentOS 5.1,创建用户后,不能登陆FTP,在/var/log/messages文件记录以下信息:

Mar 31 13:46:15 localhost kernel: audit(1206942375.697:5719): avc: denied { append } for pid=32111 comm="vsftpd" name="test" dev=sda3 ino=19400200 scontext=root:system_r:ftpd_t:s0 tcontext=root:object_r:root_t:s0 tclass=file

SELinux ftp daemon policy is customizable based on least access required. So by default SElinux does not allow users to login and read their home directories.

If you are setting up this machine as a ftpd server and wish to allow users to access their home directorories, you need to set the ftp_home_dir boolean.

执行命令:

setsebool -P ftp_home_dir 1

上传文件成功。

五、SELinux服务器不关闭配置 samba的方法


给大家推荐一款很不错的SELinux系统很有学习价值,这里我主要讲解SELinux系统的应用,包括介绍SELinux知识等方面。前段时间在实验室的4*4核服务器上安装Samba服务器,解决了服务器安装的硬件问题后,在服务器上配好了Samba,但在客户机访问Samba时,显示错误。查看到主机机器上右上方有红色感叹号显示。

点击一看,是SELinux报警,报警时间与每次客户机访问samba时间一致,估计是SELinux太严谨的问题,将客户机的错误信息在网上搜索,查找到果然是samba与SELinux冲突的问题。

PS:曹老师开始用挂载的方法配NSF时也没配成功,同样是SELinux的问题,关闭后可解决。 方法一:关闭SELinux,并修改配置文件,使系统启动时不启动SELinux。(我采用的是这种方法)

Disable selinux   [root@Jie ~]#  vi /etc/sysconfig/selinux  # This file controls the state of SELinux on the system.  # SELINUX= can take one of these three values:  #       enforcing - SELinux security policy is enforced.  #       permissive - SELinux prints warnings instead of enforcing.  #       disabled - SELinux is fully disabled.  SELINUX=enforcing # SELINUXTYPE= type of policy in use. Possible values are:  #       targeted - Only targeted network daemons are protected.  #       strict - Full SELinux protection.  SELINUXTYPE=targeted

把 SELINUX设定为disable, 下次启动系统后将会停止SElinux。Linux核心参数(Kernel Parameter)或者可以在核心参数后加上: selinux=0 (停止) 或 selinux=1 (开启)参数档案/boot/grub/menu.lst

title Fedora Core (2.6.18-1.2798.fc6)  root (hd0,0)  kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet  selinux=0 initrd /initrd-2.6.18-1.2798.fc6.img

检查SELinux现时况态要知到你现在是否使用 SELinux:# getenforce disabled

方法二:不关闭SELinux配置 samba的方法(未测试)

将smb.conf中如下这两行启用(去掉行首的;号就可以了) setsebool -P samba_domain_controller on setsebool -P samba_enable_home_dirs on这两行生效后,自己的home目录就可以正常读写了。

如果想将/home/samba/temp目录设置成完全的共享就应该在字符状态写输入:chcon -t samba_share_t /home/samba/temp 同时不要忘记将/home/samba/temp目录属性设置成777 就可以了。其它和以前的FC版本应该没有什么区别了。

默认的,SELinux禁止网络上对Samba服务器上的共享目录进行写操作,即使你在smb.conf中允许了这项操作。 假设你已经配置了共享目录/share并允许用户进行读写,而你又不想关闭SELinux的话,可以试试以下操作:

程序代码:

#/usr/sbin/setsebool -P allow_smbd_anon_write=1   #chcon -t public_content_rw_t /share

其中第一条语句设置SELinux放行标记了public_content_rw_t的内容,第二条语句把欲共享的/share目录标记为public_content_rw_t。 附SELinux资料:selinux简介SElinux 在linux内核级别上提供了一个灵活的强制访问控制系统(MAC),这个强制访问控制系统是建立在*访问控制系统(DAC)之上的。

DAC是指系统的安全访问控制都是由系统管理员root*管理的,不是系统强制行为MAC运行的时候,比如一个应用程序或者一个线程以某个用户UID或者SUID运行的时候同样对一些其他的对象拥有访问控制限制,比如文件,套接子(sockets)或者其他的线程通过运行SElinux MAC内核可以保护系统不受到恶意程序的侵犯.

或者系统本身的bug不会给系统带来致命影响(把影响限定在一定范围内)SElinux为每一个用户,程序,进程,还有文件定义了访问还有传输的权限。然后管理所有这些对象之间的交互关系

对于SELinux设定的对象全限是可以根据需要在安装时候规定严格程度,或者完全禁用在大多数情况下,SElinux对于用户来说是完全透明的,普通用户根本感觉不到 Selinux的存在,只有系统管理员才需要对这些用户环境,以及策略进行考虑。

这些策略可以按照需要宽松的部署或者应用严格的限制,Selinux提供 了非常具体的控制策略,范围覆盖整个linux系统比如,当一个对象如应用程序要访问一个文件对象,内核中的控制程序检查访问向量缓存 (AVC),从这里寻找目标和对象的权限.

如果在这里没有发现权限定义,则继续查询安全定义的上下关联,以及文件权限,然后作出准许访问以及拒绝访问的决 定。如果在var/log/messages出现avc: denied信息,则表明访问拒绝。

目标和对象通过安装的策略来决定自身的安全关联,同时这些安装的策略也负责给系统产生安全列表提供信息。除了运行强制模式以外,SELinux可以运行在许可模式,这时候,检查AVC之后,拒绝的情况被记录。Selinux不强制使用这种策略.

以下介绍一下SELinux相关的工具

/usr/bin/setenforce 修改SELinux的实时运行模式  setenforce 1 设置SELinux 成为enforcing模式  setenforce 0 设置SELinux 成为permissive模式

如果要彻底禁用SELinux 需要在/etc/sysconfig/selinux中设置参数selinux=0 ,或者在/etc/grub.conf中添加这个参数/usr/bin/setstatus -v


六、教会你Redhat Enterprise Linux关闭SELinux


时光流逝,世界日新月异,现在的生活随着科技的发展,发生了巨大的改变,计算机给我们的生活改变更是巨大。下面讲解Redhat Enterprise Linux中如何关闭SELinux?希望你能学会Redhat Enterprise Linux关闭SELinux。

红帽企业 Linux 4包括了一个SELinux 的实现。SELinux 代表了用户,程序以及进程间相互交流的主要变化。在这个发行版本中,SELinux 被默认安装并被开启使用。

在安装的过程中,您可以选择禁用 SELinux,或是设置它只记录警告信息,或是使用它的只在以下守护进程中有效的目标化策略:dhcpd、httpd、mysqld、named、 nscd、ntpd、portmap、postgres、snmpd、squid、syslogd

目标化策略在默认的情况下被启用。

红帽企业 Linux 4 使用在 ext2/ext3 文件系统上的扩展属性来支持 SELinux。这就意味着,当一个文件被写到默认挂载的 ext2/ext3 文件系统中时,一个扩展的属性也会被写入。

当系统有 红帽企业 Linux 4 和 红帽企业 Linux 2.1 双重启动的时候,这就可能会产生一些问题。红帽企业 Linux2.1 内核不支持文件的扩展属性,当它遇到文件的扩展属性时,系统可能会崩溃。

有Linux桌面用户在安装了Redhat Enterprise Linux 4.0后,可能会需要关闭SELinux,正确的方法是:
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。
By wangzhijun, # 24. January 2006, 04:09:06

SELinux中的Apache和MySQL设定

Fedora Core 3 在安装时默认把SELinux的选项激活了。SELinux比普通的Linux内核提供了更高的安全性,理论上说,在系统因为未知漏洞溢出的时候,普通用户是不可能得到超级用户的权限了。但是,就是因为SELinux安全性的提高,导致我们在使用时,会发生一些我们以前从没遇到的问题。

前两天我在使用Fedora Core 3搭建PHP+MySQL的WebServer时就遇到了一些问题。现在整理一下,如果您也遇到同样的问题,那么,看过这篇文章,就应该可以轻而易举的解决了。

1. Apache - Document root must be a directory 问题。有可能和这个问题并发的问题还有 403 Forbidden 禁止访问的问题。

现象描述:
不使用系统默认的 /var/www/html作为系统的Document Root,自己新建一个目录后修改 /etc/httpd/conf/httpd.conf 中的配置,然后重起Apache的Daemon,发现Apache无法起动,系统报错:
Document root must be a directory
但是,我们设置的DocumentRoot 的确是一个目录,而且apache用户具有可读权限。

另一种情况:新建一个虚拟目录或文件后,无法访问,显示 Forbidden, 403 Error,但文件或目录有可读权限。
问题产生的原因:一开始我想来想去想不出为什么,但是给我感觉是权限的问题,用传统的Linux的思维方式来看,权限绝对没有问题。但是仔细一想,SELinux是不是会有其他安全的设定?

检查 avc message,查看 /var/log/messages文件,发现有类似以下内容的这样一段:

Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc: \  denied { getattr } for pid=19029 exe=/usr/sbin/httpd \  path=/var/www/html/about.html dev=dm-0 ino=373900 \  scontext=root:system_r:httpd_t tcontext=user_ubject_r:user_home_t \  tclass=file

嘿嘿,问题找到了,果然是SELinux的新特性搞的鬼。我把目录或文件设成了user_home_t类型,因此apache的进程没有权限,无法访问。针对Apache的进程所使用的SELinux target policy规定了apache的进程只能访问httpd_sys_content_t类型的目录或文件。

解决办法:
很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了
使用root用户
# chcon -t httpd_sys_content_t 目录名或文件名
然后可以用 ls -laZ 命令查看文件目录的策略类型

这样你就成功的完成Redhat Enterprise Linux关闭SELinux了。

七、分析SELinux日志,排查SELinux故障

你终有一天会被 SELinux 阻止你访问所需的东西,而且要解决这个问题。SELinux 拒绝某个文件、进程或资源被访问的基要原因有数个:

1 一个被错误标签的文件

2 一个进程在错误的 SELinux 安全性脉络下运行

3 政策出错。某个进程要访问一个在编写政策时意料不到的文件,并产生错误信息

4 一个入侵的企图。

头三个情况我们可以处理,而第四个正正是预期的表现。

推荐专题:SELinux:linux内核的安全保镖

先安装setroubleshoot 组件。有的资料说他是默认安装的,但在我的CentOS5.5上没有。

yum install setroubleshoot

日志档是排除任何疑难的关键,而 SELinux 亦不例外。SELinux 缺省会通过 Linux 审计系统(auditd)将日志写在 /var/log/audit/audit.log 内,而这项务服缺省为启用的。假若 auditd 并未运行,信息将会被写进 /var/log/messages。SELinux 的日志都被标签有 AVC 这个关键字,方便它们从其它信息中过滤出来。

由 CentOS 5 起,你可以用 SELinux 排除疑难工具协助你分析日志档,将它们转换为供人阅读的格式。这个工具包含一个以可读格式显示信息及解决方案的图像界面、一个桌面通报图示、与及一个长驻进程(setroubleshootd),它负责查阅新的 SELinux AVC 警告并传送至通报图示(不运行 X 服务器的话可设置以电邮通报)。SELinux 排除疑难工具是由 setroubleshoot 组件所提供,并缺省会被安装。这个工具可以从「系统」选单或命令行引导:

sealert -b

不运行 X 服务器的人可以通过命令行产生供人阅读的报告:

sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt


参考:http://os.51cto.com/art/201209/355309.htm 

本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1554842