10/13/13

SELinux的配置以及排错问题

SELinux(Security-EnhancedLinux)是美国国家安全局(NAS)对于强制访问控制的实现,字面上的意思就是安全强化的linux之意。

1、apache 测试selinux 及排错
a、设置默认主目录为/phpdba

[root@localhost ~]# mkdir /phpdba

[root@localhost ~]# vim index.html

[root@localhost ~]# cd /xxx/httpd/conf/

[root@localhost conf]# vim httpd.conf

DocumentRoot “/phpdba”

开启selinux以后,再次启动httpd的时候发现已经不能启动了。

[root@localhost ~]# tail -f /var/log/messages

最后一行提示

run sealert -l 6d4b54ef-9617-48f0-9613-b7cc1e18f21b

[root@localhost ~]# setenforce 0 /1 #0代表警告 但是可以运行,1代表强制

[root@localhost ~]# getenforce #得到selinux的状态。

Enforcing

这样就不用重启系统,比较方便。把参数值改为0的时候是可起来的。1就不能起来

只要把目标和源的上下文修改为一致就可以了

命令如下:

[root@localhost ~]# chcon -R -t httpd_sys_content_t /phpdba

设置完就可以正常启动和访问了。

b、修改一下监听端口,发现又启动不了了

[root@localhost ~]# cd /xxx/httpd/conf

[root@localhost conf]# vim httpd.conf

Listen 800

查看selinux支持的http端口

[root@localhost ~]# semanage port -l |grep http

http_cache_port_t tcp 3128, 8080, 8118, 11211, 10001-10010

http_cache_port_t udp 3130, 11211

http_port_t tcp 80, 443, 488, 8008, 8009, 8443

pegasus_http_port_t tcp 5988

pegasus_https_port_t tcp 59

修改方法,把800加入到selinux支持http的端口

[root@localhost ~]# semanage port -a -t http_port_t -p tcp 800

重启一下,就可以基于端口访问,例如:http://192.168.0.100:800/。

2、ftp的selinux配置

[root@localhost ~]# yum install vsftpd -y

添加用户如下

[root@localhost Server]# useradd phpdba

[root@localhost Server]# passwd 123456

[root@localhost ~]# cd /home/phpdba

[root@localhost phpdba]# vim u1.txt #创建文件用于测试

phpdba登录

[root@localhost Server]# ftp 127.0.0.1

ftp> dir

227 Entering Passive Mode (127,0,0,1,49,10)

150 Here comes the directory listing.

226 Directory send OK.

ftp> pwd

257 “/home/phpdba”

并没有发现u1.txt这个文件

查看日志:

Dec 22 21:52:18 localhost setroubleshoot: SELinux is preventing the ftp daemon from reading users home directories (/home/phpdba/u1.txt). For complete SELinux messages. run sealert -l f4d80bc3-3352-46c7-8aed-882c00493214 #selinux拒绝访问自己的家目录文件

a、图形化解决

[root@localhost ~]# system-config-selinux

把标准的选项(allow ftp to write/read files in user home directories)勾选上就ok了

b、命令设置

[root@localhost ~]# getsebool -a

ftp_home_dir –> off

ftpd_connect_db –> off

ftpd_disable_trans –> off

ftpd_is_daemon –> on

将有关选项设置为ON

[root@localhost ~]# setsebool -P ftp_home_dir=ON

设置完以后就可以进行访问了

查看如下:

[root@localhost ~]# getsebool -a |grep ftp

allow_ftpd_anon_write –> off

allow_ftpd_full_access –> off

allow_ftpd_use_cifs –> off

allow_ftpd_use_nfs –> off

allow_tftp_anon_write –> off

ftp_home_dir –> on

3、semanage

semanage {login|user|port|interface|fcontext|translation} -l [-n]

semanage login -{a|d|m} [-sr] login_name

semanage user -{a|d|m} [-LrRP] selinux_name

semanage port -{a|d|m} [-tr] [-p protocol] port | port_range

semanage interface -{a|d|m} [-tr] interface_spec

semanage fcontext -{a|d|m} [-frst] file_spec

semanage translation -{a|d|m} [-T] level

10/13/13

SELinux引起的SSH公钥认证失败问题

1、现象:使用Putty登陆时,出现如下出错提示:

Public-key authentication with the server for user sw failed. Please verify username and public/private key pair.

查看服务器日志,找不到有用的相关记录。
2、在另一台机器上使用ssh连接,打开verbose模式(ssh -vvv),部分如下:

debug1: Next authentication method: password

root@xxx.xxx.xxx.xxx’s password:

ssh先尝试了使用publickey进行认证失败了,日志没有显示相关原因,然后降级到使用密码认证。

3、将服务器sshd的日志级别设置为DEBUG3(修改/etc/ssh/sshd_config中的LogLevel),期望得到有用的信息。修改以后重启sshd,然后再尝试连接,查看/var/log/secure,得到如下日志信息:

Mar 6 16:42:14 local sshd[1517]: debug3: mm_answer_keyallowed: key 0xXXXXXXXX is not allowed

日志信息只提到Failed publickey,并没有明确说明出错原因。

4、检查各种配置文件,各种文件访问权限,这台机器软硬件环境都和其它机器一样,而且SSH的publickey认证也是配置过无数次的了。最后求助万能的Google,发现serverfault上有一个案例的现象和出错信息与我遇到几乎一样,提问者怀疑是SELinux导致的。

案例见 http://www.linuxidc.com/Linux/2013-07/87267p2.htm

下面的回复证实了确实是SELinux的问题,并且给出了解决方案:

Yes, SELinux is likely the cause. The .ssh dir is probably mislabeled. Look at /var/log/audit/audit.log. It should be labeled ssh_home_t. Check with ls -laZ. Run restorecon -r -vv /root/.ssh if need be.

Yep, SELinux was the cause: type=AVC msg=audit(1318597097.413:5447): avc:denied { read } for pid=19849 comm=”sshd” name=”authorized_keys” dev=dm-0 ino=262398 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file

It works after running “restorecon -r -vv /root/.ssh”. Thanks a lot.

5、用ls -laZ检查了一下我的.ssh目录,果然不是ssh_home_t,使用restorecon对.ssh目录的context进行了恢复。 再次尝试进行连接,结果还是不行,现象和出错信息与之前一样。

6、查看了其它机器上的.ssh目录的context,都没有标为ssh_home_t,但是那些机器上的SSH服务都是正常的。

7、又仔细看了一下网上那个案例的描述和错误信息,于是把SELinux暂时关了试试,使用setenforce 0把SELinux关闭,重新尝试连接,publickey认证正常了。 确认了是SELinux引发的问题,接下来查看了/var/log/audit/audit.log,发现有如下日志:
type=AVC msg=audit(1362560807.992:320): avc: denied { search } for pid=1595 comm=”sshd” name=”/” dev=sda3 ino=2 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir
这条日志与网上案例唯一不同的地方在于案例中是sshd对分区dm-0中的authorized_keys文件没有read权限,而机器上是sshd对分区sda3的根没有search权限。
8、确认问题所在,仔细回忆了系统的安装过程与其它机器有什么不同之处。日志中提到的sda3是系统的/home分区,当时装系统的时候由于操作失误/home分区只有200M,装完系统以后发现了这个问题,于是我把sda3分区删除重建,然后挂载到/home。这么一折腾,/home目录上的context就不对了。
9、对/home目录的context进行恢复:
[root@local ~]# restorecon -r -vv /home/
restorecon reset /home context system_u:object_r:file_t:s0->system_u:object_r:home_root_t:s0
restorecon reset /home/lost+found context system_u:object_r:file_t:s0->system_u:object_r:lost_found_t:s0
restorecon reset /home/sw/.pki context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:home_cert_t:s0
restorecon reset /home/sw/.pki/nssdb context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:home_cert_t:s0

10、setenforce 1打开SELinux,重新连接SSH,认证成功,问题解决。

09/28/13

排除SELinux疑难

SELinux 阻止你需要访问的东西,要怎么解决这个问题呢?

SELinux 拒绝某个文件、进程或资源被访问的基本原因有数个:

1 、一个被错误标签的文件
2、 一个进程在错误的 SELinux 安全性脉络下运行
3、 政策出错,某个进程要访问一个在编写政策时意料不到的文件,并产生错误信息
4、 一个入侵的企图

排查工具:

安装setroubleshoot 组件。

yum install setroubleshoot

(https://fedorahosted.org/setroubleshoot)

1、日志是排除任何疑难的关键,而 SELinux 亦不例外。

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

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

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

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