配置Selinux增强服务器安全

配置Selinux增强服务器安全

安全性增强的linux

Selinux特点

  • MAC 对访问的控制彻底化,对所有文件、目录、端口的访问,都是基于策略设定的。这些策略是由管理员设定的,一般用户是无权修改的
  • RBAC 对用户只赋予最小权限。对用户来说,被划分成一些role,即使是root用户,只要不在sysadm_r里,也是不能实行sysadm_t管理操作的
  • TE 对进程只赋予最小运行权限,TE概念在Selinux中非常重要。其特点是对文件赋予一种叫type的文件类型标签,对于进程赋予一个叫domain的标签,可以规定某个进程只能执行某类文件

Selinux的执行模式

  • enforcing 强制模式,只要Selinux不允许,就无法执行
  • permissive 警告模式,将该事件记录,依然允许执行
  • disabled 关闭Selinux
  • Selinux状态切换

    • getenforce 查看Selinux状态
    • setenforce 修改Selinux状态

      # 由enforcing切换为permissive
      setenforce 0
      # 由permissive切换为enforcing
      setenforce 1
      # 由enforcing或permissive切换为Disabled只能修改配置文件重启后才能生效
      # 由Disabled切换其他两个状态也是需要修改配置文件重启后生效
      

Selinux的运行模式

  • SELINUXTYPE=targeted: 保护常见的网络服务,是Selinux的默认值
  • SELINUXTYPE=MLS: 多级安全保护

Selinux的概念

  • security context: 安全上下文由
    • 当启动Selinux的时候,所有文件与对象都有安全上下文。进程的安全上下文是域domain,安全上下文由:用户:角色:类型(user:role:type)构成
      • user: 类似linux系统中的UID,提供身份识别。三种常见的user
        • user_u: 普通用户登录系统后预设。表示普通用户无特权用户
        • system_u: 开机过程中系统进程的预设。表示系统管理员用户,通过用户可以确认身份类型,一般搭配角色使用
        • unconfined_u: 非限制,没有做定义
      • role:
        • 文件与目录的role,通常是object_r
        • 程序的role,通常是system_r
        • 用户的role,类似于系统中的GID,不同的角色具备不同的权限。用户可以具备多个role。但是同一时间只能使用一个role
      • type:
        • 用来将主体与客体划分为不同的组,组每个主体和系统中的客体定义来一个类型。为进程运行提供最低的权限环境
    • 系统根据pam子系统中的/lib64/security/pam_selinux.so模块设定登录者运行程序的安全上下文
    • rpm包安装会根据rpm包的内记录来生成安全上下文
    • 如果是手动创建的,会根据policy中规定来设置安全上下文
    • 如果是cp,会重新生成安全上下文
    • 如果是mv,安全上下文不变
  • policy: 策略(控制规则,哪些进程可以访问哪些资源)

Selinux规则文件路径

  • /etc/selinux/targeted/contexts/files/file_contexts

Selinux策略

Selinux的设置一般通过两部分完成,一个是安全上下文,另一个是策略,策略值是对安全上下文的补充

Selinux规范了许多boolean数值清单档案,提供开启或关闭功能存取项目,这些值都存放在/selinux/booleans/目录内的相关文件中,文件的值只有两种:1(启用),0(关闭)

  • getsebool 命令查看Selinux策略,指定进程可以访问哪些文件

    getsebool -a
    

Selinux的使用

  • 查看文件的Selinux安全上下文

    [[email protected] ~]# touch a.txt
    [[email protected] ~]# ls -Z a.txt
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
    # ||
    [[email protected] ~]# ls --context a.txt
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
    
  • 使用chcon修改文件的安全上下文

    • –reference=参考文件 使用指定参考文件的安全环境,而非指定值
    • -R, –recursive 递归处理所有的文件及子目录
    • -u, –user=用户 设置指定用户的目标安全环境
    • -r, –role=角色 设置指定角色的目标安全环境
    • -t, –type=类型 设置指定类型的目标安全环境

      [[email protected] ~]# ls -Z a.txt
      -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
      [[email protected] ~]# ls -Z /etc/hosts
      -rw-r--r--. root root system_u:object_r:net_conf_t:s0  /etc/hosts
      [[email protected] ~]# chcon -t net_conf_t a.txt
      [[email protected] ~]# ls -Z a.txt
      -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 a.txt
      
  • 查看apache文件目录下的文件类型

    # 文件类型为httpd_sys_content_t,也就是说apache的特有文件类型就是httpd_sys_content_t,所有文件都必须是此类型才能被访问,否则会出现Forbidden
    [[email protected] ~]# ll -Z /var/www/html/index.html
    -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
    [[email protected] ~]# mv a.html /var/www/html/
    # 当访问a.html的时候就会出现Forbidden
    [[email protected] ~]# ll -Z /var/www/html/a.html
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/a.html
    
    # 查看apache文件目录的类型
    [[email protected] ~]# ll -Zd /var/www/html/
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    # 使用--reference参考apche文件目录的类型修改文件类型
    [[email protected] ~]# chcon --reference=/var/www/html /var/www/html/a.html
    # 现在可以正常访问了
    [[email protected] ~]# ll -Z !$
    ll -Z /var/www/html/a.html
    -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/a.html
    
  • 使用restorecon恢复文件规则

    [[email protected] ~]# touch a.txt
    [[email protected] ~]# ll -Z a.txt
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
    [[email protected] ~]# ll -Z /etc/hosts
    -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /etc/hosts
    [[email protected] ~]# chcon --reference=/root/a.txt /etc/hosts
    [[email protected]2lan150 ~]# ll -Z /etc/hosts
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /etc/hosts
    [[email protected] ~]# restorecon -v /etc/hosts
    restorecon reset /etc/hosts context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:net_conf_t:s0
    [[email protected] ~]# ll -Z /etc/hosts
    -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /etc/hosts
    
    # 也可以批量更改
    [[email protected] ~]# echo "bbbb" > b.html
    [[email protected] ~]# mv b.html /var/www/html/
    [[email protected] ~]# ll -Z /var/www/html/b.html
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/b.html
    [[email protected] ~]# restorecon -rv /var/www/html/
    restorecon reset /var/www/html/b.html context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
    [[email protected] ~]# ll -Z /var/www/html/b.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/b.html
    
  • Selinux策略使用

    设定Selinux bool数值清单列表与内容

    使用:setsebool [ -PV ] boolean value | bool1=val1 bool2=val2...

    -P是永久性设置,否则重启后无效

    • 使用系统用户登录ftp后,会自动切换自己的家目录。
    # 安装ftp
    [[email protected] ~]# yum install -y vsftpd
    [[email protected] ~]# service vsftpd restart
    # 安装ftp客户端
    [[email protected] ~]# rpm -ivh /mnt/Packages/lftp-4.0.9-1.el6.x86_64.rpm
    [[email protected] ~]# useradd aftp
    [[email protected] ~]# echo 123456 | passwd --stdin aftp
    # 开启selinux后默认是不允许的
    [[email protected] ~]# lftp [email protected]
    口令:
    lftp [email protected]:~> ls
    ls: 登录失败: 500 OOPS: cannot change directory:/home/aftp
    lftp [email protected]:~>
    
    # 默认是关闭的
    [[email protected] ~]# getsebool -a | grep ftp_home
    ftp_home_dir --> off
    
    # 开启
    [[email protected] ~]# setsebool -P ftp_home_dir=on
    [[email protected] ~]# getsebool -a | grep ftp_home_dir
    ftp_home_dir --> on
    [[email protected] ~]# lftp [email protected]
    口令:
    lftp [email protected]:~> ls
    lftp [email protected]:~> !ls
    anaconda-ks.cfg  document.txt     fail2ban-0.8.14.tar.gz  ks.cfg
    a.txt         date.txt
    lftp [email protected]:~> put a.txt
    lftp [email protected]:~> ls
    -rw-r--r--    1 507      507             0 Nov 09 09:55 a.txt
    
    • 设置允许ftp服务器匿名用户登录后,可以创建文件

      # 默认只允许查看和下载
      [[email protected] ~]# lftp 192.168.1.150
      lftp 192.168.1.150:~> ls
      drwxr-xr-x    3 14       0            4096 May 29  2017 datas
      -rw-r--r--    1 0        0            1282 Oct 30 16:13 ks.cfg
      drwxr-xr-x    2 0        0            4096 Feb 12  2013 pub
      lftp 192.168.1.150:/> !ls
      anaconda-ks.cfg  document.txt     fail2ban-0.8.14.tar.gz  ks.cfg
      a.txt         date.txt
      lftp 192.168.1.150:/> put date.txt
      put: Access failed: 550 Permission denied. (date.txt)
      
      # 修改ftp配置文件
      [[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
      anonymous_enable=YES
      anon_upload_enable=YES
      anon_mkdir_write_enable=YES
      [[email protected] ~]# service vsftpd restart
      
      # 修改目录权限
      [[email protected] ~]# chmod -R 777 /var/ftp/pub
      
      [[email protected] ~]# getsebool -a | grep allow_ftpd_anon_write
      allow_ftpd_anon_write --> off
      
      # 测试
      [[email protected] ~]# lftp 192.168.1.150
      lftp 192.168.1.150:~> cd pub/
      lftp 192.168.1.150:/pub> put a.txt
      put: Access failed: 553 Could not create file. (a.txt)
      
      [[email protected] ~]# setsebool -P allow_ftpd_anon_write=on
      
      [[email protected] ~]# ll -Zd /var/ftp/pub/
      drwxrwxrwx. root root system_u:object_r:public_content_t:s0 /var/ftp/pub/
      [[email protected] ~]# chcon -t public_content_rw_t /var/ftp/pub/
      
      # 测试
      [[email protected] ~]# lftp 192.168.1.150
      lftp 192.168.1.150:~> cd pub/
      lftp 192.168.1.150:/pub> ls
      -rw-------    1 14       50              5 Nov 11 08:12 date.txt
      -rw-------    1 14       50             40 Nov 11 08:14 document.txt
      -rwxrwxrwx    1 0        0            1801 May 29  2017 passwd
      lftp 192.168.1.150:/pub> put a.txt
      lftp 192.168.1.150:/pub> ls
      -rw-------    1 14       50              0 Nov 11 08:16 a.txt
      -rw-------    1 14       50              5 Nov 11 08:12 date.txt
      -rw-------    1 14       50             40 Nov 11 08:14 document.txt
      -rwxrwxrwx    1 0        0            1801 May 29  2017 passwd
      lftp 192.168.1.150:/pub> exit