• selinux


    selinux
    selinux - NSA Security-Enhanced Linux
    (SELinux)
    selinux不是防火墙,他可以和iptables,pam,系统权限等共存
    把selinux做个比方:
    就象一个公司加了非常多的规章制度(相比于selinux来说,规章制度可能有成千上w,甚至几十W条),细小到类似规定上班时间上厕所的次数,每次最多几分钟等)
    类似于一套安防系统(对本人和小偷都有效)
    访问者subject(user或role):也就是程序
    目标object:要访问的目标文件或目录或进程
    安全上下文context:类似系统的rwx权限
    政策规则policy:(包括bool值,使用getsebool -a查看)
    # ll -Z /etc/yp.conf
    -rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/yp.conf
    # ll -Z /etc/fstab
    -rw-r--r-- root root ? /etc/fstab
    比较上面的两文件区别
    1,一个权限九位后面有一个点,另一个没有点.(有点号表示有selinux相关的策略和安全上下文;没点则相反)
    为什么有的有点号,有的没点号?
    这说明这个操作系统以前是打开selinux的(rhel6安装系统默认就打开了),但后来又关闭了selinux,并且在关闭后修改过的文件就会没有这个点号了.或者在关闭selinux的状态下新创建的文件也没有点号.
    查看selinux是否开启
    #getenforce --查看selinux是在哪种级别
    #sestatus --可以查看selinux现在的状态
    # ls /selinux --打开selinux后,此目录就有数据了,否则为空的
    #setenforce 1 --临时马上生效,切换成enforcing
    #setenforce 0 --切换成permissive
    --disabled和这两种模式不能切换,需要改配置文件重启系统
    # vim /etc/selinux/config
    # 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
    SELINUX=disabled
    # SELINUXTYPE= type of policy in use. Possible values are:
    # targeted - Only targeted network daemons are protected.
    # strict - Full SELinux protection.
    SELINUXTYPE=targeted
    --selinux类型,也就是策略policy现在分为2大类。
    1,targeted 红帽开发的,主要是对网络服务进行保护
    2,strict NSA开发,对整个系统进行多级别保护
    把SELINUX=disabled改成SELINUX=enforcing,然后reboot系统
    如果你原来一直是disabled的情况用了比较久的时间,现在第一次开启selinux,系统重新启动时,会有一个把/下的文件relable
    --这个relable会要等待一段时间(10分钟到10几分钟,由文件大小和硬盘速度决定)
    # ll -Z /etc/fstab
    -rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/fstab
    system_u:object_r:etc_t:s0
    --这就是身份(user),角色(role),类型(type) s0(保护等级,也就是MLS用的,我们这里是targeted,不用这种)
    身份:(主要为下面二种,但还有其它)
    system_u 表示系统程序
    unconfined_u 代表普通用户下的文件
    # yum install setools-console -y
    # seinfo -u --查看有哪些身份
    Users: 8
    sysadm_u
    system_u
    xguest_u
    root
    guest_u
    staff_u
    user_u
    unconfined_u
    角色:(主要有下面两种,但还有其它不常用的)
    object_r: 代表文件或目录
    system_r: 代表程序
    # seinfo -r
    Roles: 14
    auditadm_r
    dbadm_r
    guest_r
    staff_r
    user_r
    logadm_r
    object_r
    secadm_r
    sysadm_r
    system_r
    webadm_r
    xguest_r
    nx_server_r
    unconfined_r
    类型:
    type:用ll -Z 文件查出的就为type
    domain:ps -efZ |grep http 查出程序的就为domain
    # seinfo -t
    seinfo - SELinux policy query tool
    -a 列出所有相关的属性
    -u 列出selinux的所有user
    -t 列出selinux的所有type
    -r 列出selinux的所有role
    -b 列出所有布尔值
    =====================================================================================
    --(建议在一个新的虚拟机下开启selinux来做下面的例子)
    下面以rpm的http为例
    例1:
    # yum install httpd httpd-devel -y
    # echo "main page" > /var/www/html/index.html
    # systemctl start httpd --启动服务后,用客户端浏览器是可以访问的
    # ll -Z /etc/passwd
    -rw-r--r--. root root system_u:object_r:passwd_file_t:s0 /etc/passwd
    # cp /etc/passwd /var/www/html/ --注意这里是cp
    # touch /root/123
    # ll -Z /root/123
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/123
    # mv /root/123 /var/www/html/ --注意这里是mv
    # ll /var/www/html/ -Zd
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    # ll /var/www/html/ -Z
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 123
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 passwd
    --现在可以发现在apache默认家目录下创建的文件和cp过来的文件都会和目录的安全上下文一样;但mv的就保留原来的安全上下文(或者使用cp -a命令也可以保留)
    --用另一台客户端使用firefox来访问,主页和passwd文件可以被访问,但123文件不能被访问;其实就是http程序的http_t对123文件的admin_home_t没有访问权限
    chcon (change context)
    -t 修改类型域
    -R 递归
    -r 角色
    -u 身份
    --reference=示例文件 把安全上下文改成和示例文件一样
    所以如果让客户端能够访问123文件,就用下面的命令来修改
    # chcon -t httpd_sys_content_t /var/www/html/123 --改一个文件
    # chcon -t httpd_sys_content_t -R /var/www/html/ --递归改整个目录下的所有文件和子目录
    例2:
    # mkdir /www
    119 DocumentRoot "/www"
    131 <Directory "/www">
    # systemctl restart httpd
    --对比一下原家目录和现家目录
    # ll /var/www/html/ -dZ
    drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html/
    # ll /www/ -dZ
    drwxr-xr-x root root root:object_r:default_t /www/
    # echo "www main page" > /www/index.html --在现家目录里建立一个主页
    # ll -Z /www/index.html --查看主页信息,是继承了上级目录的属性
    -rw-r--r-- root root root:object_r:default_t /www/index.html
    客户端访问,却访问不到里面的网页文件,因为网页文件权限属性没改
    解决方法:加-R参数把整个目录都修改
    # chcon -R -u system_u -t httpd_sys_content_t /www/
    或者使用--reference指定按照谁来修改context
    # chcon -R --reference=/var/www/html/ /www/
    例3:
    apache默认只监听80和443这两个端口,如果你改为监听12000,则启动为报错
    # rpm -qf `which semanage`
    policycoreutils-python-2.5-8.el7.x86_64
    # yum install policycoreutils-python
    # semanage port -l |grep http --查看http相关支持端口
    http_cache_port_t tcp 3128, 8080, 8118, 8123, 10001-10010
    http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
    pegasus_http_port_t tcp 5988
    pegasus_https_port_t tcp 5989
    解决方法:
    # semanage port -a -t http_port_t -p tcp 12000
    http_port_t tcp 12000, 80, 81, 443, 488, 8008, 8009, 8443, 9000
    pegasus_http_port_t tcp 5988
    除了这些控制外,还有一个布尔值也控制着访问权限
    # getsebool -a --查找所有的布尔值
    # getsebool -a |grep allow_ypbind --查看上个例子改后的值
    ====================================================
    用selinux  
    目的:加强安全,按照需求对外提供服务,当需求与selinux规则冲突时,就需要修改selinux规则迎合需求
    使用rhel6上的selinux排错工具和日志来进行selinux的辅助排错
    # yum install selinux* setroubleshoot* policy* -y
    # systemctl status auditd.service --确认审计日志服务开启
    # cat /var/log/audit/audit.log --此日志里有selinux相关的信息,但是不容易看懂
    # sealert -a /var/log/audit/audit.log --以比较容易懂的方式查看selinux的日志,并给出解决的提示
    # sealert --打开图形排错工具
    selinux排错的总结:
    1,如果服务访问不了,或者是服务里的文件访问不了等问题;可以先尝试
    # setenforce 0改成permissive;如果改了还不能访问,那么肯定就不是selinux的问题了;如果改了就可以访问,那么可以确认是selinux的问题
    2,如果是selinux的问题,那么就访问一下让他报错,然后通过查日志,或者图形工具来查看解决方法
    # sealert -a /var/log/audit/audit.log
    # sealert
    3,根本日志里提供的信息来进行排错
    4, 如果仍然不能解决,请自行百度,谷歌
    5, 解决后,做好工作笔记,以后就直接把selinux问题解决
    排错实例1
    # yum install vsftpd -y
    # /etc/init.d/vsftpd restart
    1,在服务器上建一个用户,给它一个密码
    # useradd abc
    # echo 123 | passwd --stdin abc
    # touch /home/abc/123
    2,客户端登录,使用abc用户,密码123登录不上去
    # ftp 172.16.2.10
    Connected to 172.16.2.10 (172.16.2.10).
    220 (vsFTPd 2.2.2)
    Name (172.16.2.10:root): abc
    331 Please specify the password.
    Password:
    500 OOPS: cannot change directory:/home/abc
    Login failed.
    3,通过开关setenforce 0发现是selinux禁止了
    排错实例2(实现让普通用户登录samba,可以在自己的家目录上传下载)
    1,在服务器端安装samba,并启动
    # yum install samba-* -y
    # /etc/init.d/smb restart
    # smbpasswd -a abc
    New SMB password:
    Retype new SMB password:
    Added user abc.
    2,
    用普通用户abc登录samba服务器自己的家目录后,ls查看不到里面的内容,也下载不了
    # smbclient //172.16.2.10/abc -U abc
    Enter abc's password:
    Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
    smb: > ls
    NT_STATUS_ACCESS_DENIED listing *
    smb: > get 123 --这里最好get 123下载一下,否则samba服务器那边使用sealert出不来提示信息
    NT_STATUS_ACCESS_DENIED opening remote file 123
    smb: > put /etc/fstab fstab --客户端的/etc/fstab上传到samba服务器取名仍然叫fstab,但也被selinux禁止
    NT_STATUS_ACCESS_DENIED opening remote file fstab
    排错实例3
    smb服务器自定义一个共享后,使用普通用户abc登录,也是ls查看不到内容,也下载和上传不了
    # vim /etc/samba/smb.conf
    [test]
    comment = test
    path = /test
    public = no
    writable = yes
    # /etc/init.d/smb restart
    # mkdir /test
    # chmod 757 /test
    # touch /test/123 --touch一个文件做下载测试
    客户端
    # smbclient //172.16.2.10/test -U abc --可以登录成功,但是ls看不到内容
    Enter abc's password:
    Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
    smb: > ls
    NT_STATUS_ACCESS_DENIED listing *
    smb: > get 123
    NT_STATUS_ACCESS_DENIED opening remote file 123
    smb: > put /etc/inittab inittab
    NT_STATUS_ACCESS_DENIED opening remote file inittab
    通过sealert图形提示知道解决方法为:
    setsebool -P samba_export_all_rw 1
    --总结:如果一个服务不能访问;那么一般的检查步骤为:服务器端口-->网络->iptables->服务配置->系统权限->pam->selinux
    --在生产环境中,在配置服务时,可以打开selinux,并使用上面的方法让你的服务可以被正常访问,这样就加强了安全(因为别人就算找到你服务的漏洞并破解,他仍然会受系统的selinux的限制)
    =============================================================================
    题目:
    方法一:
    1,chmod 757 /ftp
    3, setsebool -P allow_ftpd_full_access 1
    方法二:
    1,chmod 757 /ftp
    3, chcon -t ftpd_tmp_t -R /ftp
  • 相关阅读:
    nodejs安装
    mongodb安装指南
    JQuery控制input的readonly和disabled属性
    C# 汉子增加UTF-8头
    Microsoft Visual C++ 2005 SP1 Redistributable 安装错误
    sql server 查找指定字符串的位置
    sql server 数据库附加时程序集错误
    前端路由
    CSS学习笔记——选择器优先级
    CSS学习笔记——盒子模型
  • 原文地址:https://www.cnblogs.com/skyzy/p/9201418.html
Copyright © 2020-2023  润新知