默认计划
930人加入学习
(23人评价)
Linux安全基础
价格 ¥ 399.00
该课程属于 高校公益行 | 网络安全实践训练营 请加入后再学习

配置日志服务器

     一、设置系统环境如下:

                 日志服务去器:

                         IP地址:172.16.8.100/24

                          主机名;LServ.sevenwin.org

                日志客户端;

                       IP地址:127.16.8.101/24

                       主机名:LCli.sevenwin.org

二、构建LAMP

三、配置日志服务器数据库

四、配置服务器rsyslogd的主配置文件/etc/rsyslog.conf

五、配置防火墙,开放TCP与UDP 514端口、TCP 3306端口、TCP 80端口;配置SELinux

[展开全文]

日志分析与安全-内核及系统日志、用户日志、程序日志

日志为什么重要?

         用于记录系统、程序运行中发生的各种事件

         通过阅读日志,有助于诊断和解决系统故障

        是审计的基础

 日志文件的分类

        内核及系统日志

               由系统服务rsyslogd统一进行管理,日志格式基本相似

         用户日志

               记录系统用户登录及退出系统的相关信息

        程序日志

                由各种应用程序独立管理的日志文件,记录格式不统一

        在Linux系统中,有三个主要的日志子系统

        连接时间日志:由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmp,login等程序会更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

        进程统计:由系统内核执行,当一个进程终止时,为每个进程往进程统计文件中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。

       错误日志:由rsyslogd守护程序执行,各种系统守护进程、用户程序和内核通过rsyslogd守护程序向文件/var/log/messages报告值得注意的事件。另外有许多Linux程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

日志保存位置

     默认位于:/var/log目录下

  主要日志文件介绍:

         内核及公共消息日志:/var/log/messages

          计划任务日志:/var/log/cron

          系统引导日志:/var/log/dmesg

          邮件系统日志:/var/log/maillog

          用户登录日志:/var/log/lastlog(最近的用户登录事件)

 /var/log/secure(用户验证相关的安全性事件)

/var/log/wtmp(当前登录用户详细信息)

/var/run/utmp/(用户登录、注销及系统开关机等事件)

    其他日志

用户日志

   有关当前登录用户的信息记录在文件utmp中,utmp文件被各种命令文件使用,包括who、w、users和finger。

    登录和退出记录在文件wtmp中;数据交换、关机以及重启的信息也都记录在wtmp文件中;wtmp文件被命令last和ac使用。

         所有的记录都包括时间戳。时间戳对日志来说非常重要,因为很多攻击行为分析都是与时间有极大关系的。

         这两个文件是二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作。

      用户日志的基本命令:

内核及系统日志

            由系统服务rsyslogd统一管理

               软件包:rsyslog-7.4.7-7.el7_0.x86_64

             主要程序:/sbin/rsyslofd

              配置文件:/etc/rsyslog.conf

日志消息的级别

     0EMERG(紧急):导致主机系统不可用的情况

   1ALERT:(警告):必须马上采取措施解决的问题

    2CRIT(严重):比较严重的情况

   3ERR(错误):运行出现错误

  4WARNING(提醒):可能会影响系统功能的事件

   5NOTICE(注意):不会影响系统但值得注意

   6INFO(信息):一般信息

    7DEBUG(调试):程序或系统调试信息等

  日志记录的一般格式:

   时间戳 主机名 子系统 消息级别 消息字段内容

程序日志:

     由相应的应用程序独立进行管理,如:

   Web服务:/var/log/httpd/

            access_log、error_log

    代理服务:/var/log/squid/

              access.log、cache.log、squid.out、store.log

    FTP服务:/var/log/xferlog

分析工具;

        文本查看、grep过滤检索、Webmin管理套件中查看

        awk、sed等文本过滤、格式化编辑工具

       Webalizer、Awstats等专用日志分析工具

日志系统审计、运维注意事项

     系统管理人员应该提高警惕,随时注意各种可以情况,并且按时和随机地检查各种系统日志文件,包括一般日志信息、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。例如:

     用户在非常规时间登录;

      不正常的日志记录,比如日志的残缺不全或者诸如wtmp这样的日志文件无故地缺少了中间的记录文件;

         用户登录系统的IP地址和以往的不一样;

          用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录;

         非法使用或不正当使用超级用户权限su指令

       无故或非法重新启动各项网络服务的记录

     另外,日志并非完全可靠。高明的黑客在入侵系统后,会打扫战场。

日志管理策略

      及时作好备份和归档

      延长日志保存期限

     控制日志访问权限

            日志中可能会包含各类敏感信息,如账户、口令等

    集中管理日志

           将服务器的日志文件发到统一i的日志文件服务器

          便于日志信息的统一收集、整理和分析

         杜绝日志信息的意外丢失、恶意篡改或删除

 

         

   

 

 

     

 

[展开全文]

               弱口令检测

John the Ripper(开膛手约翰或者约翰的粗齿锯)

简称为JR

       一款密码分析工具,支持字典式的暴力破解

      通过对shadow文件的口令分析,可以检测密码强度

   网址:http://www.openwall.com/

  安装JR工具

   make clean系统类型

   主程序文件为john

查看分析结果

结合密码文件进行分析

JR的一些常用用法

   把用户密码导出到当前txt文档里     ./unshadow/etc/passwd/etc/shadow>password.txt

  简单模式破解

     ./john --single password.txt

   自定义字典模式破解

./john --wordlist=password.lst password.txt

     穷举模式破解,耗时,耗力

   ./john --incremental=Digits --fork=30 password.txt

      指定解密类型

        类型参数举例: --format=des/bsdi/md5/bf/afs/lm/trip/dummy

./john --format=md5 passsword.txt

 

   

[展开全文]

                    服务区进程安全控制-Systemd

     Systemd的优势

             并行处理所有服务,加快开机速度

                    旧init启动脚本是"依序一项项执行启动“模式(类似单序列串行模式),因此不相关的服务也要依次排队等候。

                      systemd实现了不存在依存关系的服务同时并行启动的能力,这样大大的加快了系统启动的速度。

                统一管理,on-demand(按需)启动服务

                  systemd全部仅有一个systemd服务搭配systemctl指令来处理,不需要额外的指令来支持。不像systemV需要init、chkconfig、service...等等指令。此外,systemd常驻内存,可以按需处理后续的daemon启动任务。

               服务依存关系自我检查:

                    systemd可以针对服务的依存关系进行检查,这样管理员就不需要启动了一个服务,要先去分析它依存哪些其他服务,检查那些依存的服务是否启动,省去了这些麻烦。

            根据daemon的功能进行分类:

                    systemd旗下管理的服务非常多,为了理清所有服务的功能,systemd先定义所有的服务为一个服务单位(unit),并将该unit归类到不同的服务类型(type)中。旧的init仅分为stand alone(独立与super daemon(超级守护进程)其实是不够的;systemd将服务单位(unit)区分为service(系统服务)、socket(套接字服务)、target(多目标服务)、path(目录路径服务)、snapshot(快照服务)、timer(定时服务)等多种不同的类型(type),方便管理员的分类与记忆。

                将多个daemons集合成一个群组:

               如同systemV的init里有个runlevel(运行级别)的特色,systemd也可以将多个功能集合成为一个所谓的target项目,这个项目主要用于构建一个操作环境,所以是集合了许多个daemons,既执行某个target就是执行好多个daemon,共同营建某一种操作环境。

               向下兼容旧的init服务脚本:

         基本上,systemd是可以兼容init启动脚本的。因此,旧的init启动脚本也能够透过systemd来管理。

 Systemd配置文件保存的储目录:

   /usr/lib/systemd/system/:每个服务最主要的启动脚本保存的地方,有点类似于以前的/etc/init.d底下的文件

  /run/systemd/system/:系统执行过程中产生的服务脚本,他们的优先级要比/usr/lib/systemd/system高

 /etc/systemd/system/:管理员依据主机系统的需求所创建的执行脚本,其实这个目录有点像以前的/etc/rc.d/rc5.d/Sxx之类的功能,执行优先级比/run/systemd/system/要高。

  也就是说,系统开机会不会执行某些服务其实是看/etc/systemd/system/底下的设置,所以该目录底下就是一大堆链接文件。而执行的systemd启动脚本文件,都是放置在/usr/lib/systemd/system/底下的。因此如果你想要修改某个服务启动的设置,应该要去改/usr/lib/systemd/system/底下修改。

 Systemd的unit

 

 

                   

[展开全文]

配置SSH身份认证

登录验证对象:

      服务器中本地用户账号

登录验证方式

     密码验证:核对用户名、密码是否匹配

     密钥对验证:核对客户的私钥、客户端公钥是否匹配

构建密钥对验证的SSH体系:

   第一步:创建密钥对(在客户端)

         私密文件:id_rsa

         公钥文件:id_rsa.pub

   第二步:

           上传公钥文件id-rsa.pub

 

   第三步:导入公钥信息

               公钥库文件:       ~/.ssh//authorized_keys

   第四

 

 

 

 

[展开全文]

SSH安全性和配置最佳实践

  将root账户仅限制为控制台访问:

  配置TCP Wrappers,对远程主机进行访问控制:

  在工作站或者笔记本电脑上,关闭SSH服务并卸载SSH服务器包:

    通过控制用户账号,限制其对SSH的访问:

    仅使用SSH Protocol2:

    不支持闲置会话,并配置Idle Logout Timeout间隔:

    禁用空密码,设置密码重试次数:

    禁用基于主机的身份验证:

    禁用用户的.rhosts文件:

    限制SSH,将侦听绑定到可用的网络接口与端口:

    始终保持SSH补丁版本最新:

 

   

 

[展开全文]

                     账号基本安全

注释掉系统不需要的用户和用户组

     不建议直接删除

    再用户名前加“#”,便可注释掉

将非登录用户的shell设为/sbin/nologin

锁定一段时间内不使用的账号

       账号user00口令字段前加了一个“!

"号,便无法登录

给账号、组账号、账号口令文件加上不可更改属性(加锁),从而防止非授权用户获得权限。

账号口令的安全设置

         设置密码的有效期与最短长度限制

         要求用户下次登录时修改密码  

命令历史限制

         减少记录的命令条数

         注销时自动清空历史命令记录

终端自动注销

        闲置60

 

         

[展开全文]

            CentOS7安装

步骤:

      创建虚拟机并准备好系统安装镜像文件

     进入安装初始化界面

     进入图形化安装界面

            语言选择

            本地化

                    日期与时间、键盘、语言支持

             软件

                    安装源与软件选择

            系统

                   安装位置与网络主机名、KDUMP、NETWORK与HOSTNAME

              用户设置

                          设置root

[展开全文]
温衡 · 2019-01-09 · CentOS7安装 0

注释掉系统不需要的用户和用户组

cp /etc/passwd    /var/.bak/etc/

vim /etc/passwd

可以被注释掉的

adm,lp,sync,shutdown,halt,operator,games,ftp...

vim /etc/group

adm,lp,floppy,games, ftp...

7段

用户名 密码的占位符 uid号,gid号,说明信息,用户的目录,使用的shell

#注释

 

非登录用户的shell设为/sbin/nologin

usermod -s /sbin/nologin user00

tail -2 /etc/passwd

 程序帐号 apache这种

 

锁定帐号

usermod -L user00

tail -3 /etc/shadow

shadow是用来保存帐号密码的文件

有个感叹号,表示密码暂时不能用,即加锁了

 

chattr +i /etc/passwd

shadow group gshadow

账号文件组账号文件加锁,加锁后无法增删用户,防止普通用户提权

lsattr /etc/passwd /etc/shadow xxxxx

查看文件属性

chattr -i /etc/passwd

解锁

 

密码有效期 长短限制 要求下次登录时修改密码

vim /etc/login.defs

PASS_MAX_DAYS

这里改了只适用于新建账号

chage -M 30 user00 

修改已存在帐号的密码有效期

chage -d  0  xx

强制下次登录改密码

 

减少记录的命令条数 注销时自动清空历史命令记录

vim /etc/profile 

HISTSIZE=50

vim ~/.bash_logout

history -c

clear

 

终端闲置600秒后自动注销

vim ~/.bash_profile

export TMOUT=600

 

 

 

[展开全文]

linux需要安装一些软件,黄狗更新系统yum

自动解决rpm包依赖关系

 配置一个yum源

首先得有一个ip地址

/etc/sysconfig.network-scripts/ ifcfgxxx 本地网卡的配置文件

BOOTPROTO 不用dhcp用static

IPV6xxx  no

IPADDR=10.11.11.1

NETMASK=255.255.255.0

GATEWAY=10.11.11.254

DNS1=114.114.114.114

Q:这个dns地址怎么回事,好像见过。。

/etc/hostname改成yum.xx.org

/etc/hosts 10.11.11.1 yum yum.xx.org

systemctl restart network.service

hostname 看主机名

卸载光盘 umount /dev/cdrom

mount /dev/cdrom /media/cdrom 换了个挂在的地方

rpm -Uvh vsftpd-3.0.2-xxxx.rpm

cp -rf /media/cdrom/* /var/ftp/yum

里面有个解决依赖关系的db

ftp配置被动模式 比较安全

在/etc/vsftpd/vsftpd.conf里

在connect_from_port_20=YES后面添加

pasv_enable=YES

pasv_min_porv=3001

pasv_max_port=3100

 

systemctl restart vsftpd.service

netstat -atpn | grep vsftpd

 

setsebool allow_ftpd_full_access 1

setsebool httpd_enable_ftp_server 1

[展开全文]

适用场景:大规模安装linux服务器,需要安装过程统一且标准化

过程:1. 需要一个DHCP服务器

yum install dhcp

cd /usr/share/doc/dhcp-xx/

cp dhcpd.conf.example /etc/dhcp/dhcpd.conf

vim /etc/dhcp/dhcpd.conf

---


#/etc/dhcp/dhcpd.conf

default-lease-time 600;

max-lease-time 7200;

log-facility local7;

subnet 10.11.11.0 netmask 255.255.255.0{

    range 10.11.11.26 10.11.11.30; // 要改成自己用的

    option routers 10.11.11.254;

    option broadcast-address 10.11.11.255;

    default-lease-time 600;

    max-lease-time 7200;

    next-server 10.11.11.1; // 指定PXE引导服务器 就是当前服务器ip

    filename "pxelinux.0"; // 指定引导文件

}

Q: 这个配置文件的每一行什么意思,配置什么的

---

systemctl start dhcp

systemctl status dhcpd.service

2. tftp和syslinux

tftp 用于远程linux的引导

syslinux提供引导块,引导模块的远程启动服务

yum install tftp-server syslinux

vim /etc/xinetd.d/tftp

把disable=yes改成no

顺便,server的目录是tftp共享的目录

systemctl restart xinetd

netstat -aupn |grep 69

cd /var/lib/tftpboot // tftp的根目录

cp /usr/share/syslinux/pxelinux.0 ./

// 以下是系统光盘的内容

cp /var/ftp/yum/isolinux/vmlinuz ./

                                          inittrd.img

                                          vesamenu.c32

                                          boot.msg

// 然后编辑启动菜单配置文件

mkdir /var/lib/tftpboot/pxelinux.cfg

cp /var/ftp/yum/isolinux/isolinux.cfg pxelinux.cfg/default

vim 这个default

在label linux行前添加

label centos

 menu label ^Install CentOS7.1

 menu default

 kernel vmlinuz

// 目标是ftpxxx 自动化脚本配置文件是xxxks什么的

 append initrd=initrd.img inst.stage2=ftp://10.11.11.1/yum inst.ks=ftp://10.11.11.1/ks.cfg.quiet

然后删了menu label Test this ^ media & install CentOS7前面的menu default行删了

3.安装kickstart

yum install system-config-kickstart

system-config-kickstart

kickstart不能配置软件包安装

ks.cfg加上@packages@end之后,保存到/var/ftp

 

firewall-cmd --permanent --add-port=69/udp

--add-service=dhcp

ftp

 

--reload

 

新建的主机自动就默认去用PXE了……猜测是整个网段都会自动走这个流程0 v 0

 

 

 

 

[展开全文]


重置root密码

   CentOS 7 与之前的版本不同,当忘记root密码,并采用GRUB2为启动器时,将无法通过单用户模式重置root密码
   1、启动系统,并在 GRUB2启动屏显时,按下e键进入编辑模式
   2、找到  linux16开头的行  ,按  end键到行尾,输入一个空格键之后再输入   rd.break
      Ctrl+x  进入  提示符界面
   3、 输入  mount  -o   remount,rw   /sysroot/  命令   ,重新挂载系统分区   // 此步之前系统分区是只读状态
   4、再输入   chroot   /sysroot/  命令  ,  改变根
   5、修改root密码                 此时出现类似乱码的字符,属于正常现象
   6、 如果之前系统启用了SELinux ,必须运行  touch   /.autorelabel   命令,否则将无法正常启动系统
   7、然后按  Ctrl + d  退出
   8、输入  reboot 命令重启 , OK
   
   重启后等待时间可能有点长,属于正常现象
   这样方便是方便,但是不安全啊,下面有解决方案

为GRUB2菜单加上防编辑密码
   
   第一步:
      [root@huawei_plus ~]# grub2-mkpasswd-pbkdf2
      输入口令:
      Reenter password:
      PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.8EBF7E924D4F2751C16EDA60B01CCF2132082125CFAE98C932FDC9981AAA64E38615454C214E7BA4195836EC8AF5580B7DB24316ED4F343F501DE3C36C5420D8.783DD1820A3F9FB61264293E2EBDFF83551218B57DCABD63412232E5F5252CB9D0CEC2FDCE7955E86415CFA6D69B6DB019D1D382E99A6C47E96FF3E41CE72F29
   第二步:
      复制第一步的加粗字符串
      vi  /boot/grub2/grub.cfg   添加 下面的加粗字体,注意上下文对应
      ### BEGIN /etc/grub.d/10_linux ###
      set superusers="cws"                                            # 注意是  superusers   有 s
      password_pbkdf2  cws   此处粘贴第一步复制的加粗字符串
      menuentry 'CentOS Linux (3.10.0-862.11.6.el7.x86_64) 7 (Core)'
      
      上面的superuser可以随便定
      保存退出,测试
   再安装之前那样重置root密码的步骤,按下 e键之后,需要输入用户名(对应于 superusers )和密码(对应于 输入 grub2-mkpasswd-pbkdf2命令后 输入的口令  )
   这样,就为 GRUB2菜单加上了防编辑密码

单用户模式重置root密码
   
      在grub 页面输入a,进入修改内核模式
      在内核的结尾“/”,输入空格,在输入single,回车
      启动系统,进入单用户模式
      Passwd root 修改密码
修复MBR


   
      
      
      
   
   

 

[展开全文]

cluster 群集 

多台主机 对外表现一个整体

类型  负载均衡 load balancer 一起干

         高可用 微软叫故障转移群 一主多备 轮班

         高性能运算 

 

keeplived 

为 lvs 和 ha设计的一款健康检查公具

         

[展开全文]

简介

  • 网站支撑系统,Linux世界中应用最多的服务
  • 何为LNMP
    • Linux+Nginx+Mysql/MariaDB+PHP
  • 优势和功能
    • 无需一个个输入命令,无需值守,编译安装优化编译参数,提高性能,解决不必要的软件间依赖,特别针对配置自动优化
    • 支持自定义Nginx、PHP编译参数及网站和数据库目录、支持生成LetseEcrypt证书、LNMP模式支持多PHP版本、支持单独安装Nginx/Mysql/MariaDB/Pureftpd服务器。同时提供一些使用的辅助工具如虚拟主机管理、FTP用户管理...
  • 下载地址:https://lnmp.org/download.html

LNMP安装

  • 系统需求

    • Centos/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin Server(深度)/Aliyun/Amazon..
    • 5GB以上的硬盘空间,128MB以上的内存
    • 安装MYSQL 5.6/7及MariaDB必须1GB以上内存
    • Centos5,Debian6以前版本其官网已经结束支持使用
  • 1、先配置IP地址和主机名

    • vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0 HWADDR=00:0C:29:BD:A1:6C //保持与UDEV记录一致 ONBOOT=yes BOOTPROTO=static IPADDR=172.16.8.100 NETMASK=255.255.255.0 GATEWAY=172.16.8.2 DNS1=114.114.114.114
    • vim /etc/sysconfig/networkHOSTNAME=lnmp.sevenwin.org
    • vim /etc/hosts 172.16.8.165 lnmp.sevenwin.org lnmp
    • vim /etc/selinux/config SELINUX=disabled
      • [root@localhost ~]# reboot
  • 2、远程安装

    • yum -y install screen
    • Xshell远程连接之
      • screen -S lnmp ://开启保活窗口,防止中断
      • wget -chttp://soft.vpser.net/lnmp/lnmp1.4-full.tar.gz
      • cd lnmp1.4-full/ | ./install.sh
        • 7:install MariaDB 10.1.23
        • passwd
        • 激活之
        • 4:5.5.38
        • 3:TCmalloc
        • Install Over
      • 扩展安装
        • 缓存加速类扩展安装
          • xcache:国人开发,PHP opcode缓存器
          • memcached:分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载
          • eAccerator:PHP加速器,优化和动态内存缓存,提高PHP缓存性能
          • opcache:PHP优化加速组件,和eAccerator冲突
        • imageMagick:用于查看、编辑位图文件,可用来替换GD库
        • Radis:基于内存,键值对储存数据库
      • 添加虚拟主机/网站站点
  • 3.客户机测试(win7)

    • 修改"c:/windows/system/drivers/etc/hosts"
    • 在浏览器测试
  • 4.服务器端其他设置

    • lnmp vhost list 查看虚拟机
    • lnmp vhost del 删除虚拟机
    • 默认配置文件
      • /usr/local/nginx/conf/nginx.conf
    • lnmp database list 列出数据库

Nginx对比Apache

  • Apache是同步多进程模型,Nginx是异步的,多个连接可以对应一个进程
  • Nginx的抗并发能力更强,消耗资源较少
  • Nginx支持反向代理,支持7层负载均衡
  • Apache的rewrite比Nginx强大
  • Apache的模块超多
  • 一般来说,需要性能的web服务用Nginx;需要稳定的web服务用apache

Nginx配置文件结构

  • /usr/local/nginx/conf/nginx.conf
  • 全局块,配置影响nginx全局的指令
  • events块,配置工作模式和连接数上限
  • http块,可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
  • server块,配置虚拟主机的相关参数
  • location块,配置请求的路由,以及各种页面的处理情况 
  • 注意:
    • 惊群现象:一个事件触发后唤醒多个进程,最后选择一个进程,造成资源浪费

Nginx反向代理

  • 参考:https://blog.csdn.net/u012152619/article/details/53821518
  • 反向代理网络环境搭建过程演示
    • 网络拓扑图 
    • 1.lnmp端
      • 增加一块网卡,ip是192.168.1.100(VMNET1)
      • cd /etc/sysconfig/network-scripts/
      • cp ifcfg-ens32 ifcfg-ens34
      • nmcli con 拷贝UUID号
      • vim ifcfg-ens34
        • 修改ip192.168.1.100
        • 粘贴UUID号
      • 创建Nginx虚拟主机配置文件
        • cd /usr/local/nginx/conf/
        • cd vhost/
        • vim www.sevenwin.org.conf
          • 在server上面添加
          
           

          upstream sw_net { server 192.168.1.2:80 weight=2; server 192.168.1.3:80 weight=1; }

          • 添加location块内容
      • lnmp reload
    • 2.apache1客户端1配置(net)
      • kill -9 $(cat /varrun/yum.pid)
      • yum -y install httpd
      • 将网卡设置为vnet1
      • vim /etc/sysconfig/network-script/ifcfg-ens32
        • static ip:192.168.1.2
        • ipv6init=no
        • systemctl enabled httpd
        • systemctl start httpd
        • ifdown ens32
        • ifup ens32
        • vim /var/www/html/index.html
          • this is w1
    • 3.apache2客户端2配置(net)
      • kill -9 $(cat /varrun/yum.pid)
      • yum -y install httpd
      • 将网卡设置为vnet1
      • vim /etc/sysconfig/network-script/ifcfg-ens32
        • static ipaddr=192.168.1.2
        • ipv6init=no
        • systemctl enabled httpd
        • systemctl start httpd
        • ifdown ens32
        • ifup 3ns32
        • vim /var/www/html/index.html
          • this is w2
    • 4.win7客户机做测试
[展开全文]

简介

  • Puppet是一种Linux、Unix、windows平台的集中配置管理系统
  • 使用自有的Puppet描述语言,可管理配置文件、系统用户、Cron任务、安装软件包、系统服务等。Puppet把这些系统实体称之为资源,Puppet的设计目标是简化对这些资源的管理以及妥处理资源之间的依赖关系。
  • Puppet采用C/S星型结构,所有客户端和一个或几个服务器交互。每个客户端周期性的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证配置信息同步。Puppet客户端严格按照服务器上的配置文件来配置各种应用、服务。配置完成以后,Puppet客户端会反馈给服务器端一个消息。如果出错,也会给服务器端反馈一个消息。
  • Puppet的官方网站
  • https://puppet.com/
  • 下载:https://yum.puppetlabs.com/puppetlabs-release-
    pc1-el-7.noarch.rpm

 

部署Puppet

  • 1、配置IP地址、主机名,关闭SELinux

  • [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728

    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=172.16.8.100
    NETMASK=255.255.255.0
    GATEWAY=172.16.8.2
    DNS1=114.114.114.114
    DNS2=8.8.8.8 //修改的内容,其它内容省略
    
  • [root@localhost ~]# vim /etc/sysconfig/network
    HOSTNAME=pt.sevenwin.org

  • [root@localhost ~]# vim /etc/hosts
    172.16.8.100 pt.sevenwin.org pt
    172.16.8.101 c65.sevenwin.org c65

  • [root@localhost ~]# vim /etc/selinux/config
    SELINUX=disabled

  • [root@localhost ~]# reboot

  • 2、设置NTP服务

  • [root@pt ~]# yum -y install ntp

  • [root@pt ~]# ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime

  • [root@pt ~]# vim /etc/ntp.conf

        restrict 172.16.8.0 mask 255.255.255.0 nomodify notrap
        server 210.72.145.44 //这是中国国家授时中心的IP
        server 0.centos.pool.ntp.org iburst
        server 1.centos.pool.ntp.org iburst
        server 2.centos.pool.ntp.org iburst
    
  • [root@pt ~]# systemctl start ntpd.service

  • [root@pt ~]# systemctl enable ntpd.service

  • [root@pt ~]# firewall-cmd --permanent --zone=public --add-port=123/udp

  • [root@pt ~]# firewall-cmd --zone=public --add-port=123/udp

  • [root@pt ~]# firewall-cmd --permanent --zone=public --add-port=8140/tcp

  • [root@pt ~]# firewall-cmd --zone=public --add-port=8140/tcp

  • 3、安装Puppet-Server、启动Puppet-Server

  • [root@pt ~]# yum -y install ruby

  • [root@pt ~]# wget https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm

  • [root@pt ~]# rpm -ivh puppetlabs-release-pc1-el-7.noarch.rpm

  • [root@pt ~]# yum -y clean all

  • [root@pt ~]# yum -y update

  • [root@pt ~]# yum install puppetserver –y

    • //Puppet默认使用JVM内存大小2G,如调整编辑/etc/sysconfig/puppetserver文件
  • [root@pt ~]# vim /etc/sysconfig/puppetserver

    • //确定下面的参数
      JAVA_ARGS="-Xms2g -Xmx2g -XX:MaxPermSize=256m"
  • [root@pt ~]# vim /etc/profile

    PATH=/opt/puppetlabs/bin:$PATH //第52行
    export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
    
  • [root@pt ~]# systemctl enable puppetserver

  • [root@pt ~]# reboot

  • 4、安装Puppet-Agent

    • 1、先配置IP地址和主机名

      • [root@c65 桌面]# cat /etc/udev/rules.d/70-persistent-net.rules
        SUBSYSTEM==“net”, ACTION==“add”, DRIVERS==“?*”,
        ATTR{address}==“00:0c:29:bd:a1:6c”, ATTR{type}==“1”, KERNEL==“eth*”,
        NAME=“eth0“ //复制MAC址
        
      • [root@c65 桌面]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0
        HWADDR=00:0C:29:BD:A1:6C //保持与UDEV记录一致
        ONBOOT=yes
        BOOTPROTO=static
        IPADDR=172.16.8.101
        NETMASK=255.255.255.0
        GATEWAY=172.16.8.2
        DNS1=114.114.114.114
        
      • [root@c65 桌面]# vim /etc/sysconfig/network
        HOSTNAME=c65.sevenwin.org
      • [root@c65 桌面]# vim /etc/hosts
        172.16.8.165 c65.sevenwin.org c65
        172.16.8.172 pt.sevenwin.org pt
        
    • 2、配置任务计划

      • echo "00 */1 * * * root /usr/sbin/ntpdate 172.16.8.100;/sbin/hwclock -w" >> /etc/crontab
        • 每小时第0分钟以root身份运行ntpdate命令,向172.16.8.100主机请求时间信息
      • ntpdate 172.16.8.100
        • 需要一段时间后才能获取到时间
    • 3、安装Puppet-Agent

    • 4、配置Puppet

      • [root@c65 ~]# vim /etc/profile
        PATH=/opt/puppetlabs/bin:$PATH
        export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
        
      • [root@c65 ~]# vim /etc/puppetlabs/puppet/puppet.conf
        [main]
        certname = c65.sevenwin.org
        server = pt.sevenwin.org
        environment = production
        runinterval = 30
        
      • puppet cart list --all
        • 检查证书
      • reboot
    • 5、启动并测试Puppet

      • 在客户端启动Puppet代理
        • [root@c65 ~]# service puppet start
        • [root@c65 ~]# puppet agent -t
          • 申请证书失败,到服务器端发放证书
      • 在服务端签发指定客户端证书
        • [root@pt ~]# puppet cert sign c65.sevenwin.org
        • [root@pt ~]# puppet cert list --all
      • 在客户端启动Puppet代理2
        • puppet agent -t
    • 6、配置Puppet开发环境(统一控制客户端)

      • [root@pt ~]# wget http://download.puppetlabs.com/puppet/puppet.vim -P /usr/share/vim/vim74/plugin
      • [root@pt ~]# vim .etc/puppetlabs/code/environments/production/manifests/site.pp
        • site.pp是puppetmaster的第一执行脚本
        • 其他的脚本需要通过site.pp来调用
            node default{
                file{ "/tmp/helloworld.txt":
                    content => "Hello World !\n";
                }
            }
        
        • default:指定所有客户端
      • [root@c65 ~]# puppet agent -t
      • [root@c65 ~]# cat /tmp/helloworld.txt
  • 5、puppet的工作原理

  • 6、puppet的基本语法

    • puppet的代码构成:资源:资源之属性
      • 属性包括:type|title|其它
        • 不同的标题表示不同的资源
      • 每个属性键值后都有一个都好,最后一个属性键值对后面可以使用逗号或分号
      • 资源默认值
        • 为某类资源制定一个默认的参数;使用没有标题的大写资源首字母方式
          • 格式:Type{属性 => 值,..,属性=>值}
    • 典型的资源结构
    • 变量的定义和引用
    • 数组的定义和使用
      • puppet使用[]来定义数组,其中的内容由逗号分割,且由双引号括起来
    • 类的定义和使用
      • 类是一个资源的集合,代表节点上一个单独的配置项目
      • 类的继承
    • 函数(define)
    • 资源之间的依赖关系
      • before:在某个资源之前执行
      • after:在某个资源之后执行
      • require:某个资源必须存在或者正确执行后,才执行响应的资源
    • 资源之间触发更新
      • notify:用来通知某个资源进行更新
      • subscribe:该资源有更新时,通知另一个资源执行相应的操作
    • 模块
      • 如果你配置的应用、守护进程、或函数包含很多类、文件或模板,最简单的办法就是将这些资源放到一个包里.
      • 使用puppet管理的时候,会根据业务进行划分,将其分为web、db、mencache等,为了方便统一管理,就可以使用模板,针对不同业务类型定义标准化的配置
      • 模板应用案例
        • 1、创建mariadb目录
          • [root@pt ~] mkdir -p /etc/puppetlabs/code/modules/mariadb/{manifests,files,templates}
        • 2、创建init.pp文件
          • [root@pt ~] cd /etc/puppetlabs/codee/modules/mariadb/
          • [root@pt ~] vim manifests/init.pp
            class mariadb{
                package{ 'mariadb-server' :
                  ensure => installed,
                }
                service{ 'mariadb.service' :
                  ensure => running,
                  ensure => true,
                  start => '/usr/bin/systemctl start mariadb.service',
                  restart = '/usr/bin/systemctl restart mariadb.service',
                  stop => '/usr/bin/systemctl stop mariadb.service',
                  require => Package['mariadb-server'],
                }
            }
            
        • 3、定义一个节点,并使用该模块
          • [root@pt ~] vim /etc/puppetlabs/code/environments/prodution/manifests/site.pp
            node default{
                include mariadb
            }
            
        • 4、到客户端测试
          • rpm -qa | grep mariadb 检查有无mariadb包(无)
          • puppet agent --server pt.sevenwin.org
          • puppet agent -t --noop
          • rpm -qa | grep mariadb
            • 包比较大,等待一段时间,即可安装完成
[展开全文]

简介

  • zabbix,基于WEB界面的分布式系统监视与网络监视企业级开源解决方案
  • zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
  • zabbix由2部分构成,zabbix server与可选组件zabbix agent。
  • zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,OpenBSD,OS X等平台上。
  • Zabbix的官方网站
  • http://www.zabbix.com/
  • 下载:http://www.zabbix.com/download.php

 

部署Zabbix

  • 1、配置IP地址、主机名,关闭SELinux

    • [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
      BOOTPROTO=static
      ONBOOT=yes
      IPADDR=172.16.8.172
      NETMASK=255.255.255.0
      GATEWAY=172.16.8.2
      DNS1=114.114.114.114
      DNS2=8.8.8.8 //修改的内容,其它内容省略
      
    • [root@localhost ~]# vim /etc/sysconfig/network
      HOSTNAME=zbx.sevenwin.org
    • [root@localhost ~]# vim /etc/hosts
      172.16.8.172 zbx zbx.sevenwin.org
    • [root@localhost ~]# vim /etc/selinux/config
      SELINUX=disabled
    • [root@localhost ~]# reboot
  • 2、安装“Zabbix安装包”资源存储库
    -[root@zbx ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-
    6.el7.noarch.rpm

  • 3、安装Zabbix

    • [root@zbx ~]# yum install mariadb-server -y
    • [root@zbx ~]# yum install zabbix-server-mysql zabbix-web-mysql -y
  • 4、对数据库进行初始化并创建Zabbix数据库
    -[root@zbx ~]# systemctl start mariadb.service
    -[root@zbx ~]# systemctl enable mariadb.service
    -[root@zbx ~]# mysqladmin -u root password 9865321
    -[root@zbx ~]# mysql -uroot -p
    MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin; MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'Z9865321'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> quit
    -[root@zbx ~]# zcat /usr/share/doc/zabbix-server-mysql-3.2.6/create.sql.gz | mysql -uroot zabbix -p

  • 5、编辑Zabbix数据库配置文件并启动Zabbix服务

    • [root@zbx ~]# vim /etc/zabbix/zabbix_server.conf
  • 6、修改php.ini,启动Apache,添加防火墙规则
    DBHost=localhost //第81行 DBName=zabbix //第91行 DBUser=zabbix //第107行 DBPassword=Z9865321 //第115行
    -[root@zbx ~]# systemctl start zabbix-server
    -[root@zbx ~]# systemctl enable zabbix-server
    -[root@zbx ~]# sed -i "s@;date.timezone =@date.timezone = Asia/Chongqing@g" /etc/php.ini
    -[root@zbx ~]# systemctl enable httpd.service
    -[root@zbx ~]# systemctl start httpd.service
    -[root@zbx ~]# firewall-cmd --permanent --zone=public --add-port=10051/tcp
    -[root@zbx ~]# firewall-cmd --zone=public --add-port=10051/tcp

  • 7、在WebUI中继续安装

    • 7.1 欢迎使用Zabbix
      • 127.0.0.1/zabbix/
    • 7.2 检查先决条件
    • 7.3 配置数据库连接
      默认即可
    • 7.4 配置服务器详细信息
      默认即可
    • 7.5 配置服务器详细信息
      默认即可
    • 7.6 预安装总结
    • 7.7 安装完成
  • 8、在WebUI中登录

    • 127.0.0.1/zabbix/index.php
    • 第一次登录,用户名:Admin,密码:zabbix
  • 9、修改WebUI界面语言为中文

    • 9.1、点击右上角“个人配置”
    • 9.2、选择Language为Chinese(zh_CN),再点击“Update”
  • 10、被监测端(Agent)部署

    • 10.1、Linux Agent的安装与配置(发行版本CentOS 6.5)
      • 克隆主机如何修改ip
        • 覆盖旧mac地址(用自动生成的mac地址覆盖掉第一条记录))
        • vi /etc/udev/rules.d/70-persistent-net.rules
          • 将第二条mac记录的网卡改为eth0,并复制mac地址
        • vi /etc/sysconfig/network-scripts/ifcfg-eth0
          • 将新mac地址粘贴覆盖掉旧mac地址
          • 配置IP地址:172.16.8.101
        • vi /etc/sysconfig/network
        • vi /etc/hosts
          172.16.8.101 c65 c65.test.com
          172.16.8.100 zbx zbx.test.com
          
      • [root@c65 ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2.6-1.el6.noarch.rpm
      • [root@c65 ~]# yum -y install zabbix-agent
      • [root@c65 ~]# vim /etc/zabbix/zabbix_agentd.conf
        Server=172.16.8.172 //第95行
        ServerActive=172.16.8.172 //第136行
        
      • [root@c65 ~]# chkconfig zabbix-agent on
      • [root@c65 ~]# service zabbix-agent restart
      • [root@c65 ~]# iptables -I INPUT -p tcp --dport 10050 -j ACCEPT
      • [root@c65 ~]# service iptables save
    • 10.2-windows2008r2 Agent部署
      • IP:172.16.8.102
      • http://www.zabbix.com/
        • 下载win agent
        • 复制到C盘根目录下
        • 编辑conf下的zabbix_agent.win.conf
          • ServerActive=172.16.8.100
          • 改名:去掉win
          • 复制到根路径
        • 以管理员运行cmd
          • cd c:\zabbix_agents_3.2.1.win\bin\win64\
          • zabbix_agentd.exe --install
          • zabbix_agentd.exe --start
    1. 即可在服务端添加主机
[展开全文]

简介

  • 基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具
  • Cacti通过SNMP(简单网络管理协议)协议来获取数据,使用 RRDtool来描绘图形,而且你完全不需要了解RRDtool复杂的参数。
  • 它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看的树状结构、主机以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善。
  • 官方网站:http://www.cacti.net/
  • Cacti的工作结构
    • C/S模式,采集监测数据
    • B/S模式,管理监测平台
    • B/S模式,管理监测平台

 

部署Cacti

  1. 配置IP地址、主机名,关闭SELinux
    • vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=172.16.8.172
    NETMASK=255.255.255.0
    GATEWAY=172.16.8.2
    DNS1=114.114.114.114
    DNS2=8.8.8.8 
    
    • vim /etc/sysconfig/network
      HOSTNAME=cti.sevenwin.org
    • vim /etc/hosts
      172.16.8.172 cti cti.sevenwin.org
    • vim /etc/selinux/config
      SELINUX=disabled
    • reboot
  2. 基本环境构建
    • [root@cti ~]# yum install -y gcc httpd php php-mysql php-snmp mariadbmariadb-devel mariadb-server rrdtool
    • [root@cti ~]# yum install -y net-snmp net-snmp-devel net-snmp-utils wget ntp
      • 配置并启动NTP服务,支持PHP,保证时间统一并准确
    • [root@cti ~]# systemctl enable ntpd.service
    • [root@cti ~]# sed -i "s@;date.timezone =@date.timezone =Asia/Chongqing@g" /etc/php.ini
    • [root@cti ~]# systemctl start ntpd.service
      • 配置MariaDB,并为Cacti创建数据库
    • [root@cti ~]# systemctl enable mariadb.service
    • [root@cti ~]# systemctl start mariadb.service
    • [root@cti ~]# mysqladmin -u root password 9865321
    • [root@cti ~]# mysql -u root -p
      • MariaDB [(none)]> create database cacti;
      • MariaDB [(none)]> create user cactiuser@localhost identified by 'Pa9865321';
      • MariaDB [(none)]> grant all on cacti.* to cactiuser@localhost;
      • MariaDB [(none)]> flush privileges;
      • MariaDB [(none)]> quit
  3. 安装Cacti
    • [root@cti ~]# wget http://www.cacti.net/downloads/cacti-0.8.8h.tar.gz
    • [root@cti ~]# tar zxvf cacti-0.8.8h.tar.gz
    • [root@cti ~]# mv cacti-0.8.8h /var/www/html/cacti
    • [root@cti ~]# cd /var/www/html/cacti/
    • [root@cti cacti]# mysql -h localhost -u cactiuser -p cacti<cacti.sql
      • Enter password: //上面的步骤导入数据库脚本,初始化Cacti数据库
    • [root@cti cacti]# vim ./include/config.php
      $database_type = "mysql";
      $database_default = "cacti";
      $database_hostname = "localhost";
      $database_username = "cactiuser";
      $database_password = “Pa9865321”; //这里改为建库时的脚本
      $database_port = "3306";
      $database_ssl = false;
      
    • [root@cti cacti]# crontab –e //配置任务计划,每隔1分钟就轮询1次
      */1 * * * * php /var/www/html/cacti/poller.php >/dev/null
    • [root@cti ~]# systemctl enable httpd.service
    • [root@cti ~]# systemctl start httpd.service //启动Apache
  • 4、启动SNMP服务
    • [root@cti ~]# systemctl enable snmpd.service
    • [root@cti ~]# systemctl start snmpd.service
  • 5、配置防火墙规则
    • [root@cti ~]# firewall-cmd --permanent --zone=public --add-service=http
    • [root@cti ~]# firewall-cmd --zone=public --add-service=http
    • [root@cti ~]# firewall-cmd --permanent --zone=public --add-port=161/udp
    • [root@cti ~]# firewall-cmd --zone=public --add-port=161/udp
  • 6、在浏览器中进行安装配置
    • 127.0.0.1/cacti/
    • 6.1 点击“Next”
    • 6.3 由于前面配置得当,这里直接点击“Finish”即完成
    • 6.4 第一次登录,默认的用户名与密码都是“admin”
    • 6.5 要求修改管理员登录密码
    • 6.6 over
  1. 轮询插件spine安装
    • 7.1 下载并编译安装、配置
      • [root@cti ~]# wget http://www.cacti.net/downloads/spine/cacti-spine-
        0.8.8h.tar.gz
      • [root@cti ~]# tar zxvf cacti-spine-0.8.8h.tar.gz
      • [root@cti ~]# cd cacti-spine-0.8.8h/
      • [root@cti cacti-spine-0.8.8h]# ./configure
      • [root@cti cacti-spine-0.8.8h]# make && make install
      • [root@cti cacti-spine-0.8.8h]# cp -rf /usr/local/spine/etc/spine.conf.dist /etc/spine.conf
      • [root@cti cacti-spine-0.8.8h]# ln -s /usr/local/spine/bin/spine /usr/bin/
      • [root@cti cacti-spine-0.8.8h]# vim /etc/spine.conf
        DB_Host localhost
        DB_Database cacti
        DB_User cactiuser
        DB_Pass Pa9865321
        DB_Port 3306
        
    • 7.2 在浏览器界面上的配置
      • 选择“Setting”>“Paths”>找到“Spine Poller File Path”项,设置值“/usr/bin/spine”
      • 然后点击“Save”
    • 7.3 在浏览器界面上的配置
      • 再选择“Setting”>“Poller”>找到“Poller Type”项,选择“spine”
      • 然后点击“Save”
  2. 其它常用插件的安装
    • 8.1 下载安装
    • 8.2 在WUI中设置
      • 选择“Plugin Management”中安装并激活这些插件

 

配置Cacti客户端

  • 9、Linux(centos6)
    • ip:172.16.8.101
      • 克隆机器修改mac地址:vi /etc/udev/rules.d/70-persistent-net.rules
        • 复制自动生成的mac地址,覆盖掉拷贝过来的地址
        • 再编辑ip地址即可
    • [root@c65 ~]# yum -y install net-snmp
    • [root@c65 ~]# vim /etc/snmp/snmpd.conf
      com2sec notConfigUser 172.16.8.172 public
      access notConfigGroup "" any noauth exact all none none
      view all included .1 80
      
    • [root@c65 ~]# service snmpd start
    • [root@c65 ~]# chkconfig snmpd on
    • [root@c65 ~]# iptables -I INPUT -p udp --dport 161 -j ACCEPT
    • [root@c65 ~]# iptables -I INPUT -p udp --dport 162 -j ACCEPT
    • [root@c65 ~]# service iptables save
    • 现在即可在服务端添加主机
  • 10、Windows(Server 2012)
    • 设置固定的IP地址:172.16.8.102
    • 添加角色和功能:snmp
    • 服务配置
      • snmp service
        • 安全-添加:团体权限(只读),社区名称(public)
        • 添加服务器:172.16.8.172
    • 现在即可在服务端添加主机

 

关于CactiEZ

[展开全文]

简介

  • 著名的漏洞评估系统Nessus[人头马],已经由开源走向闭源
  • OpenVAS完全开源,集成了大量插件,可免费更新
    • http://www.openvas.org/
    • 工作组件
      • Scan Targets
      • OpenVas Scanner
        • NVT's(漏洞利用模块)
      • OpenVas Manager
        • 远程管理组件
          • OpenVas CLI(命令行)
          • Greenbone Sercurity Assistant(网站)
        • Result configs
  • X-Scan,Windows下的漏洞评估系统,工作于非C/S模式下的程序,插件已经非常陈旧了

 

安装-centos7

  1. 配置IP地址、主机名,关闭SELinux
  • vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=172.16.8.172
    NETMASK=255.255.255.0
    GATEWAY=172.16.8.2
    DNS1=114.114.114.114
    DNS2=8.8.8.8 //修改的内容,其它内容省略
    
  • vim /etc/sysconfig/network
    HOSTNAME=ovs.sevenwin.org
  • vim /etc/hosts
    172.16.8.172 ovs ovs.sevenwin.org
  • vim /etc/selinux/config
    SELINUX=disabled
  • reboot
  1. 安装所必需的包
  • yum install wget bzip2 texlive net-tools alien -y
  1. 安装Atomicorp repo源
  1. 安装OpenVAS
  • yum install openvas -y
  1. 配置并启动Redis服务
  • vim /etc/redis.conf
    unixsocket /tmp/redis.sock
    unixsocketperm 700 //找到这两项,把前面的#号去掉。
    
  • systemctl enable redis && systemctl restart redis
  1. 运行openvas-setup
  • openvas-setup
    过程非常漫长,过程中需要一些设置… …
  1. 配置防火墙规则
  • firewall-cmd --permanent --zone=public --add-port=9392/tcp
  • firewall-cmd --reload
  1. 在浏览器上访问 https://127.0.0.1:9392
  2. OpenVAS安装之后的检测工作

 

安装--Kali

  • 安装过程:
    • root@kali:~# apt-get update
    • root@kali:~# apt-get dist-upgrade
    • root@kali:~# apt-get install openvas
    • root@kali:~# openvas-setup
  • 运行检查程序,检查安装过程,进行排错:
    • root@kali:~# openvas-check-setup
  • 创建管理员帐号:
    • root@kali:~# openvasmd --get-users
      admin
    • root@kali:~# openvasmd --user=admin --new-password=Pa9865321
  • 通过浏览器访问 https://127.0.0.1:9392
[展开全文]

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
  • 实验环境
    • 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
    • 配置ip地址
      • 防火墙端
        • vi /etc/udev/70-persistent-net.rules
          • 复制eth1和eth2的mac地址
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth1
          • 用于连接外网
          • 粘贴eth1的mac地址
          • static协议
          • IPADDR=172.16.8.100
          • MASKNET=255.255.255.0
          • GATEWAY=172.16.8.2 -这个应该是宿主机的IP或网关
          • DNS1=114.114.114.114
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth2
          • 用于连接内网
          • 粘贴eth2的mac地址
          • static协议
          • IPADDR=192.168.11.11
          • MASKNET=255.255.255.0
          • 无网关和DNS
        • vi /etc/sysconfig/network
        • vi /etc/hosts
        • reboot
      • 客户端(用于后面的NAT转发)
        • 仅主机模式
        • IP:192.168.11.3
        • 默认网关地址::192.168.11.11
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
        • 拒绝来自192.168.1.11的连接
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
        • 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
        • 允许该网段进行dns查询
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
        • 拒绝带以上标记的TCP包
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
        • 不带SYN标记的统统接收
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
        • 不允许来自别人的ping
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

iptables实现NAT功能

  • SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
    • 局域网各主机正确设置IP地址/子网掩码
      • 仅主机模式
      • IP:192.168.11.3
      • 默认网关地址::192.168.11.11
    • Linux网关需要支持IP路由转发
      • iptables -F
      • echo "1" > /proc/sys/net/ipv4/ip_forward
        • 或通过vi /etc/sysctl.conf编辑
      • sysctl -p 查看当前状态
      • 至此该Linux开启了路由转发功能
    • 编写SNAT转换规则
      • iptables -t nat -D POSTROUTING 1
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
        • POSTROUTING:路由选择后处理。
        • -s X.X.X.X/X:内网源地址。
        • -o eth1:外网接口。
        • --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
    • MASQUERADE —— 地址伪装
      • 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
  • DNAT,修改数据包的目标地址或端口号
    • 实现内网服务器通过防火墙发布到互联网
    • 局域网的Web服务器能够访问Internet
    • 网关的外网IP地址有正确的DNS解析记录
    • Linux网关支持IP路由转发
      • echo "1" > /proc/sys/net/ipv4/ip_forward
    • 编写DNAT转换规则
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
        • PREROUTING:DNAT使用PREROUTING链,路由选择前处理
        • -i eth1:外网接口。
        • -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
        • --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
          • 可以使用XAMPP自动部署web环境
          • 默认是80端口,其它端口的转发需要指定
          • 在浏览器输入172.16.8.100测试
    • 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22

 

iptables系统服务与脚本

  • 脚本位置:/etc/init.d/iptables
  • 规则文件位置:/etc/sysconfig/iptables
    • service iptables start|restart|stop|save…
  • 配置防火墙脚本
    1. 编写防火墙脚本→开机时自动执行该脚本
      • 脚本执行指令写入/etc/rc.d/rc.local
      • vim ipfw.sh
        #!/bin/bash
        WAN_IF="eth1"
        WAN_IP="172.16.8.100"
        LAN_IF="eth2"
        LAN_IP="192.168.11.11"
        LAN_NET="192.168.11.0/24"
        LAN_WWW_IP="192.168.11.10"
        IPT="/sbin/iptables"
        MOD="/sbin/modprobe"
        CTL="/sbin/sysctl"
        
    2. 加载必要的系统模块,在ipfw.sh中追加
      $MOD ip_tables
      $MOD ip_conntrack
      $MOD ipt_REJECT
      $MOD ipt_LOG
      $MOD ipt_iprange
      $MOD xt_tcpudp
      $MOD xt_state
      $MOD xt_multiport
      $MOD xt_mac
      $MOD ip_nat_ftp
      $MOD ip_conntrack_ftp
      
    3. 调整/proc参数, Linux内核控制及调优,在ipfw.sh中追加
      $CTL -w net.ipv4.ip_forward=1
      $CTL -w net.ipv4.ip_default_ttl=128
      $CTL -w net.ipv4.icmp_echo_ignore_all=1
      $CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1
      $CTL -w net.ipv4.tcp_syncookies=1
      $CTL -w net.ipv4.tcp_syn_retries=3
      $CTL -w net.ipv4.tcp_synack_retries=3
      $CTL -w net.ipv4.tcp_fin_timeout=60
      $CTL -w net.ipv4.tcp_max_syn_backlog=3200
      
    4. 具体的防火墙规则,在ipfw.sh中追加
      • 按表、链分别设置规则,包括默认策略
      $IPT -t filter -X
      $IPT -t nat -X
      $IPT -t filter -F
      $IPT -t nat -F
      $IPT -P INPUT DROP
      $IPT -P FORWARD DROP
      $IPT -P OUTPUT ACCEPT
      $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
      $WAN_IP
      $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
      DNAT --to-destination $LAN_WWW_IP
      
    5. 使用IP地址黑、白名单
        1. 建立IP地址列表文件
        • 黑名单、白名单分开保存
        • 每行一个IP地址,或网段地址
        vim /opt/ipfw.w
            192.168.11.0/24
            220.121.72.85
        ……
        vim /opt/ipfw.b
            218.29.30.131
            61.45.135.29
            121.113.79.81
        
        1. 在脚本中调用黑、白名单,在ipfw.sh中追加
        • 使用for循环
        • 封锁黑名单地址、放开对白名单地址的限制
        BLST="/opt/ipfw.b"
        for i in $(grep -v "^#" $BLST)
        do
        $IPT -I INPUT -s $i -j DROP
        $IPT -I OUTPUT -d $i -j DROP
        $IPT -I FORWARD -s $i -j DROP
        $IPT -I FORWARD -d $i -j DROP
        done
        WLST="/opt/ipfw.w"
        for i in $(grep -v "^#" $WLST)
        do
        $IPT -I INPUT -s $i -j ACCEPT
        $IPT -I OUTPUT -d $i -j ACCEPT
        $IPT -I FORWARD -s $i -j ACCEPT
        $IPT -I FORWARD -d $i -j ACCEPT
        done
        
    6. 开机自动运行脚本
      • cp ipfw.sh /opt/
      • vi /etc/rc.d/rc.local
        • 添加/opt/ipfw.sh
      • reboot
      • iptables -L 检查配置情况
      • iptables -t nat -L
  • 防火墙脚本的构成
    • 主机型防火墙
      • 针对本机进行保护
      • 主要针对filter表中的INPUT、OUTPUT链设置规则
      • 修改ipfw.sh
        #!/bin/bash
        # 1. 定义基本变量
        IPT= "/sbin/iptables"
        ……
        # 3.2 定义默认策略
        $IPT -P INPUT DROP
        $IPT -P FORWARD DROP
        $IPT -P OUTPUT ACCEPT
        # 3.3 设置filter表中的各种规则
        $IPT -A INPUT -p tcp --dport 80 -j ACCEPT
        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ……
        
    • 网络型防火墙
      • 针对网络互访进行保护
      • 主要针对filter表中的FORWARD链,以及nat表设置规则
      • 修改ipfw.sh
        #!/bin/bash
        ……
        # 4.3 设置nat表中的各种规则
        $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
        $WAN_IP
        $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
        DNAT --to-destination $LAN_WWW_IP
        # 4.4 设置filter表中的各种规则
        $IPT -A FORWARD -d $LAN_NET -i $WAN_IF -m state --state
        ESTABLISHED,RELATED -j ACCEPT
        ……
        

 

Firewalld防火墙

  • 特点
    • FirewallD提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
    • FirewallD支持IPv4、IPv6防火墙设置以及以太网桥接,并且拥有“运行时配置”和“永久配置”选项。
    • FirewallD支持允许服务或者应用程序直接添加到防火墙规则中。
    • FirewallD动态管理防火墙,不需要重启整个防火墙便可应用更改。
    • FirewallD通过D-BUS提供当前激活的防火墙设置信息,也通过D-BUS接受使用PolicyKit认证方式做的更改。
    • 系统托盘区图标来显示防火墙状态,方便开启和关闭防火墙。
    • 提供firewall-cmd命令行界面进行管理及配置工作。
    • 为libvirt提供接口及界面,在必须的PolicyKit相关权限允许的情况下实现。
    • 提供firewall-config图形化配置工具。
    • 实现系统全局及用户进程的防火墙规则配置管理。
  • 区域
    • 通过将网络划分成不同的区域(通常情况下称为zones),制定出不同区域之间的访问控制策略来控制不同信任程度区域之间转发的数据流。
    • 传统防火墙都有区域的概念。
      • 例:Netscreen防火墙中“Trust”与“Untrust”区域;
      • 例:ASA防火墙中“Inside”与“Outside”区域;
      • 例:IPCop防火墙中“Red”与“Green”区域。
    • 默认区域
      • 在配置规则时,不指定区域则被认定为写入到默认区域。
      • FirewallD防火墙的默认区域为“public”
    • 区域相关命令
      • firewall-cmd --get-zones
        • 当前支持的区域列表。
      • firewall-cmd --get-default-zone public
        • 显示默认区域。
    • 区域规则中的元素
      • 防火墙规则就是由这些元素构成
      • 预定义的服务
        • 服务是端口(和/或)协议组成的;当然,也可能还包括netfilter助手模块以及目标地址(由IPv4或IPv6地址构成)。
      • 端口和协议
        • 定义了tcp或udp端口,端口可以是一个端口或者一组端口范围。
      • ICMP过滤器
        • 可用于规则的ICMP报文类型;这些报文可以是信息请求,也可以是对信息请
          求或错误条件创建的响应。
      • 伪装
        • 将私网地址映射为公网IP地址(多为动态地址);即源地址转换。
      • 端口转发
        • 转发一个网络端口从一个网络节点到另一个网络节点的规则。
      • 接口与源(略)
      • 富规则(后面详细介绍)
    • FirewallD预定义区域
      • 丢弃区域(Drop Zone):任何进入的数据包都将被丢弃。这个类似与我们之前使用iptables -j DROP。
      • 阻塞区域(Block Zone):拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。
      • 公共区域(Public Zone):只接受那些被设定的连接。
      • 外部区域(External Zone):这个区域相当于路由器启用伪装(masquerading)选项。只有指定的连接会被接受。
      • 隔离区域(DMZ Zone):如果想要只允许给定的部分服务能被外部访问,可以在DMZ区域中定义。
      • 工作区域(Work Zone):在这个区域,我们只能定义内部网络。
      • 家庭区域(Home Zone):这个区域专门用于家庭环境。
      • 内部区域(Internal Zone):这个区域和工作区域(Work Zone)
        类似,只能通过被选中的连接。
      • 信任区域(Trusted Zone):该区域中的接口将被允许所有的网络通信。
    • 区域操作命令
      • firewall-cmd --set-default-zone=home
        • 设置默认区域
      • firewall-cmd --get-active-zones home
        • 查看当前活跃区域
      • firewall-cmd --list-all-zones
        • 列出全部区域及特性
        … …
        public (default, active)
        interfaces: eno16777728
        sources:
        services: dhcpv6-client ssh
        ports:
        masquerade: no
        forward-ports:
        icmp-blocks:
        rich rules:
        … …
        
      • firewall-cmd --zone=public --list-all -列出某一区域特性
      • 根据接口获取区域信息
        • firewall-cmd --get-zone-of-interface=eno16777728 public
      • 临时将接口增加到区域
        • firewall-cmd --zone=public --add-interface=eno16777728
      • 临时修改接口所属区域
        • firewall-cmd --zone=public --change-interface=eno16777728 success
      • 临时从区域中删除一个接口
        • firewall-cmd --zone=public --remove-interface=eno16777728 success
      • 查询区域中是否包含某接口,未指定区域名,实则为默认区域
        • firewall-cmd --zone= --query-interface=eno16777728 Yes
      • 查询区域中已启用的服务
        • firewall-cmd --zone= --list-services dhcpv6-client ssh
  • 防火墙基本操作
    • 启动服务
      • systemctl enable firewalld.service
    • 停止服务
      • systemctl stop firewalld.service
    • 查看防火墙状态
      • systemctl status firewalld.service
    • 服务管理
      • 显示服务列表
        • firewall-cmd --get-services
      • 显示当前服务
        • firewall-cmd --list-services
      • 允许某服务通过,其中选项--permanent,表示为永久配置项
        • firewall-cmd --permanent --zone=internal --add-service=http
      • 临时开启某服务,选项--timeout,表示临时开启秒数
        • firewall-cmd --zone=work --add-service=smtp --timeout=60
        • firewall-cmd --reload - 配置规则重新载入
      • 从区域移除服务
        • firewall-cmd --zone=public --remove-service=ftp
    • 端口管理
      • 打开或关闭端口,打开/关闭“443/tcp”端口在public区域
        • firewall-cmd --zone=public --add-port=443/tcp
        • firewall-cmd --zone=public --remove-port=443/tcp
      • 端口转发,在external区域实现SNAT伪装
        • firewall-cmd --zone=external --add-masquerade
      • 端口转发,把public区域的80端口转发到3128端口
        • firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=3128
      • 端口转发,把external区域的443端口转发到内网172.16.8.201这台主机
        • firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.16.8.201
      • 移除一个端口转发规则
        • firewall-cmd --zone=external --remove-forward-port=port=443:proto=tcp:toport=3128:toaddr=172.16.8.201
      • 列表区域中已开启端口与端口转发规则
        • firewall-cmd --zone=public --list-ports
        • firewall-cmd --zone=external --list-forward-ports
    • 其他命令
      • 启用应急模式阻断所有网络连接,以防出现紧急状况
        • firewall-cmd --panic-on
        • firewall-cmd --panic-off //禁用应急模式
        • firewall-cmd --query-panic //查询应急模式
      • 获取所有支持的ICMP类型
        • firewall-cmd --get-icmptypes
      • 阻塞默认区域中的ICMP应答报文
        • firewall-cmd --add-icmp-block=echo-reply
      • 禁止ICMP应答阻塞
        • firewall-cmd --remove-icmp-block=echo-reply/request
      • 查询ICMP应答报文的阻塞状态
        • firewall-cmd --query-icmp-block=echo-reply
      • 通过--direct参数直接将iptables命令参数传递给防火墙
        • firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -- dport 80 -j ACCEPT
    • 富规则(Rich Language-复杂防火墙规则
      • 增加、移除、查询规则:
        • firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
          • 允许源ipv4地址为172.16.8.201的http服务通过默认区域
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --timeout=90
          • 永久规则
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --permanent
        • firewall-cmd [--zone=zone] --remove-rich-rule='rule' [--permanent]
        • firewall-cmd [--zone=zone] --query-rich-rule='rule '
      • rule参数:
        • rule family="ipv4|ipv6"
        • source address="address[/mask]" [invert="True"]
        • destination address="address[/mask]" [invert="True" ]
        • service name="service name"
        • port="port value" protocol="tcp|udp"
        • icmp-block name="icmptype name"
        • masquerade
        • forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
        • log [prefix="prefix text"] [level="log level"] [limitvalue="rate/duration"] [audit]
        • accept | reject [type="reject type"] | drop
      • rule例子(结合防火墙图形配置工具来理解以下规则)
        • firewall-cmd --add-rich-rule 'rule protocol value="ah" accept'
        • firewall-cmd --add-rich-rule 'rule service name="ftp" log limit value="1/m" audit accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp"
          level="info" limit value="1/m" accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.3" reject type="icmp-admin-prohibited"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.4" drop'
    • 在防火墙配置文件中创建自己的服务
      • 我们准备添加一个新的服务叫rtmp,使用TCP协议,端口号是9527,步骤如下:
      • cd /etc/firewalld/services/
      • cp /usr/lib/firewalld/services/nfs.xml ./ //找个模板
      • mv nfs.xml rtmp.xml
      • vim rtmp.xml
        <?xml version="1.0" encoding="utf-8"?>
        <service>
        <short>RTMP</short>
        <description>The RTMP protocol Bala Bala ...</description>
        <port protocol="tcp" port="9527"/>
        </service>
        
      • firewall-cmd --reload
        • 防火墙配置重载
      • firewall-cmd --add-service=rtmp
      • cat /etc/firewalld/service/rtmp.service

 

SeLinux机制

安全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个“用户”、“进程”、“应用”和“文件”的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略将指定如何严格或宽松地进行检查。

SELinux对系统用户(system users)是透明的,只有系统管理员(root)需要考虑
在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。
只有同时满足了“标准Linux访问控制”和“SELinux访问控制”时,主体才能
访问客体。

  • Security-Enhanced Linux由以下两部分组成

      1. Kernel SELinux模块(/kernel/security/selinux)
      1. 用户态工具
  • DAC和MAC的区别(root用户)

    • 未启用SELinux的Linux系统是使用自主访问控制模型(DAC)的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它就无所不能了。
    • 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。强制访问控制模型(MAC)原本就是为军队开发的。
    • SELinux实现了一个更灵活的MAC形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全模型(Multi-Level Security)。DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路。
  • SeLinux的运行机制

    • 当一个subject(主体,如: 一个应用)试图访问一个object(客体,如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节写入/var/log/messages。
  • SeLinux伪文件系统

    • /sys/fs/selinux/”伪文件系统类似于“/proc/”伪文件系统;它存储了SELinux系统的状态。系统管理员和用户不需要操作这部分(通常借助相关命令修改其状态)
    • 可以这样修改
      • cd /sys/fs/selinux
      • more enforce
        • 0 //SELinux处于警告模式
      • echo 1 > enforce
      • more enforce
        • 1 //SELinux改为强制模式
  • SeLinux配置文件

    • 目录:/etc/selinux
      • “/etc/sysconfig/selinux”是“/etc/selinux/config” 主配置文件的符号链接。
      • /etc/sysconfig/selinux中包含如下配置选项:
        • 打开或关闭SELinux
        • 设置系统执行哪一个策略(policy)
        • 设置系统如何执行策略(policy)
        • SELINUX=enforcing,定义SELinux运行状态
          • Enforcing:SELinux安全策略置于强制模式。
          • Permissive:SELinux安全策略置于警告模式。
          • Disabled:SELinux完全被禁用。SELinux内核和伪文件系统脱钩,处于未注册状态。
        • SELINUXTYPE=targeted,定义SELinux策略模型
          • Targeted,类型强制(TE,Type Enforcement)访问控制,基于目标策略进行保护;
          • Minimum,Targeted策略模型的修改版本。仅针对选定的过程实施保护;
          • MLS,多层次安全保护模型(MLS,Multi-Level Security)。
  • SeLinux命令工具

    • /usr/sbin/setenforce,修改SELinux运行模式
      • setenforce 1 //SELinux以强制(enforcing)模式运行
      • setenforce 0 //SELinux以警告(permissive)模式运行
    • /usr/sbin/getenforce,查看SELinux模式
    • /usr/sbin/sestatus -v ,显示系统的详细状态
    • /usr/bin/chcon,修改对象(文件)的安全上下文,比如:用户:角色:类型:安全级别
    • 用法:
      • chcon [选项]... 环境 文件...
          - chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
          - chcon [选项]... --reference=参考文件 文件...
    • 参数:
      • -h, --no-dereference 影响符号链接文件,而不是引用文件
      • --reference=参考文件 使用指定参考文件的安全环境,而非指定值
      • -R, --recursive 递归处理所有的文件及子目录
        • 以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系;如果您指定了多于一个选项,那么只有最后一个会生效。
          • -H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
          • -L 遍历每一个遇到的通到目录的符号链接
          • -P 不遍历任何符号链接(默认)
      • -v, --verbose 为处理的所有文件显示诊断信息
      • -u, --user=用户 设置指定用户的目标安全环境
      • -r, --role=角色 设置指定角色的目标安全环境
      • -t, --type=类型 设置指定类型的目标安全环境
      • -l, --range=范围 设置指定范围的目标安全环境
      • --help 显示此帮助信息并退出
      • --version 显示版本信息并退出
    • 用例
      • mkdir -p /var/share/up
        • -p表示可以创建不存在的上级目录
      • 允许该目录匿名共享
        • chcon -R -t public_content_t /var/share
      • 允许向该目录上传文件
        • chcon -t public_content_rw_t /var/share/up
  • 策略与规则管理相关命令

    • getsebool命令、setsebool命令、semanage命令
    • /usr/sbin/setsebool,用于修改SElinux策略内各项规则的布尔值。
      • 语法
        • setsebool [-P] 布尔值=[0|1]
      • 选项
        • -P:直接将设置值写入配置文件,该设置数据将来会生效的。
      • 用例:
        • 允许vsftpd匿名用户写入权限:
          • setsebool -P allow_ftpd_anon_write=1
        • 允许ftp用户访问自己的家目录:
          • setsebool -P ftp_home_dir 1
        • HTTP被允许CGI设置:
          • setsebool -P httpd_enable_cgi 1
        • 允许用户以HTTP方式访问其个人主页,该设定限仅于用户的家目录主页:
          • setsebool -P httpd_enable_homedirs 1
          • chcon -R -t httpd_sys_content_t ~user/public_html
        • 允许httpd访问终端:
          • setsebool -P httpd_tty_comm 1
        • 关于named、master更新selinux设定:
          • setsebool -P named_write_master_zones 1
        • Selinux将本机的NFS共享设置成只读:
          • setsebool -P nfs_export_all_ro 1
        • SElinux将本机的NFS共享设置成可读可写:
          • setsebool -P nfs_export_all_rw 1
        • 将远程NFS的家目录共享到本机:
          • setsebool -P use_nfs_home_dirs 1
        • 将samba服务器共享目录给多个域:
          • setsebool -P allow_smbd_anon_write=1
        • 允许samba服务器共享家目录:
          • setsebool -P samba_enable_home_dirs 1
        • 在本机上使用远程samba服务器的家目录:
          • setsebool -P use_samba_home_dirs 1
        • 允许rsync其他用户写入:
          • setsebool -P allow_rsync_anon_write=1
        • 允许系统使用kerberos:
          • setsebool -P allow_kerberos 1
    • /usr/sbin/getsebool,用来查询SElinux策略内各项规则的布尔值。
      • 语法
        • getsebool [-a] [布尔值条款]
      • 选项
        • -a:列出当前系统所有布尔值条款设置值。
    • /usr/sbin/semanage,用来查询与修改SELinux默认目录的安全上下文。
      • 语法
        • semanage {login|user|port|interface|fcontext|translation} -l
        • semanage fcontext -{a|d|m} [-frst] file_spec
      • 选项
        • -l:查询。
        • fcontext:主要用在安全上下文方面。
        • -a:增加,你可以增加一些目录的默认安全上下文类型设置。
        • -m:修改。
        • -d:删除。
      • 用例
        • semanage fcontext -l |grep /var/www/html
        • 设置/var/share目录的默认安全性本文为public_content_t
          • semanage fcontext -a -t public_content_t "/var/share(/.*)?"
          • semanage fcontext -l |grep "/var/share"
        • 规则其实写在这里
          • cat /etc/slinux/targetd/contexts/files/file_contexts.local
          • 尝试给其恢复默认值
            • restorecon -Rv "/var/share"
            • 如果没有默认值,会失败
    • /usr/sbin/restorecon,用来恢复SELinux文件属性即恢复文件的安全上下文。
      • 语法
        restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f
        filename | pathname...]
      • 选项
        • -i: 忽略不存在的文件。
        • -f infilename文件: infilename中记录要处理的文件。
        • -e directory: 需要排除的目录。
        • -R/-r: 递归处理目录。
        • -n: 不改变文件标签。
        • -o outfilename: 在文件不正确的情况下保存文件列表到outfilename。
        • -v:将过程显示到屏幕上。
        • -F:强制恢复文件安全语境
      • 用法
           假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经
        常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网
        页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可
        能是因为这个文件的SELinux配置信息是继承原来那个目录的,与
        /var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一
        起移动过来了,从而导致无法打开页面,具体请看下面的实例:
            cd 
            echo "Hello" >index.html
            ll -Z       //可以查看安全上下文关系
            mv index.html /var/www/html/
            systemctl start httpd.service
            使用浏览器访问测试
            作如下操作,恢复index.html的安全上下文,再用浏览器访问
                cd /var/www/html/
                ls -Z ..
                restorecon -R /var/www/html/
        
  • 安全上下文

    • 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),“域”和“域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域;通常,我们认为域、域类型、主体类型和进程类型都是同义的,即都是安全上下文中的TYPE
    • SELinux对系统中的许多命令做了修改,通过添加一个“-Z”选项显示客体和主体的安全上下文。
      • 主体:系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;
      • 客体文件的Security Context规则如下:
        • rpm包安装的:会根据rpm包内记录来生成安全上下文;
        • 手动创建的文件:会根据policy中的规定来设置安全上下文;
        • cp:会重新生成安全上下文;
        • mv:安全上下文则不变。
      • 安全上下文相关的选项:-Z
    • 安全上下文的格式
      • 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文
        • 安全上下文中的用户和角色标识符对类型强制访问控制策略没什么影响;
        • 对于进程,用户和角色标识符显得更有意义,因为它们把控制类型和用户标识符联合,这样就会与Linux用户账号关联起来;
        • 对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用
      • 标准Linux安全(DAC)中的用户ID和SELinux安全上下文(MAC)中的用户标识符分别用于标准(DAC)的和安全增强(MAC)的访问控制机制;两者之间的任何一个相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。
      • USER
        • user identity:类似Linux系统中的UID,提供身份识别,用来记录身份,安全上下文的一部分;
        • 几种常见的 user:
          • user_u :普通用户登录系统后的预设;
          • system_u :开机过程中系统进程的预设;
          • unconfined_u:自由,非限制用户标识,系统预设;
          • root :root登录后的预设;
        • 在 targeted policy中users不是很重要;
        • 在strict policy中比较重要,所有预设的SELinux Users都是以“_u”结尾的,root除外。
      • ROLE
        • 文件、目录和设备的role:通常是object_r;
        • 程序的role:通常是system_r;
        • 用户的role:
          • 用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;
        • targeted policy为system_r;
        • strict policy为sysadm_r、staff_r、user_r;
        • 使用基于RBAC(Roles Based Access Control)的strict(新版已淘汰)和mls策略中,用来存储角色信息。
      • TYPE
        • type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
        • 当一个类型与执行中的进程相关联时,其type也称为domain;
        • type是SElinux security context中最重要的部位,是SELinux类型强制执行安全模型的核心,预设值以_t结尾;
        • LEVEL和CATEGORY:定义层次和分类,只用于MLS策略中;
          • LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高
          • CATEGORY:代表分类,目前已经定义的分类为c0-c1023
  • SELinux和标准Linux的访问控制属性的对比

    • 在SELinux中,访问控制属性总是安全上下文(用户:角色:类型)形式,所有客体和主体都有一个关联的安全上下文。需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。
    • 注意:SELinux是在标准Linux访问控制基础之上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须同时满足才能访问一个客体;
      • 例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w权限,
        那么我们也不能写该文件。
    • 标准Linux基于用户和组ID进行访问控制
    • 系统中每个文件、目录、网络端口等都被指定一个安全上下文,策略(policy)则给出各安全上下文之间的作用规则。
    • SELinux根据策略(policy)及安全上下文(security context)规则来决定存取行为是否可执行
      • 主体(Subject)主体:系统进程,比如/usr/sbin/httpd;
      • 客体(Object)客体:被存取的项目,比如文件、目录、套接字接口等
  • 类型强制(TE)访问控制

    • Type Enforcement(TE),在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用/组ID是什么;所以在SELinux中,没有默认的超级用户。
    • SELinux通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
      • 源类型(Source type(s)),通常是尝试访问的进程的域类型
      • 目标类型(Target type(s)),被进程访问的客体的类型
      • 客体类别(Object class(es)),指定允许访问的客体的类别
      • 许可(Permission(s)),允许源类型访问客体类型的具体权限
    • 举个例子:
      • allow user_t bin_t : file {read execute getattr};
        • 允许主体user_t访问客体bin_t,访问的类别为file(至于其它类别,想都别想),能够行使的权限有读、执行、获取属性。
  • 基于角色的访问控制(RBAC)

    • Role Base Access Control(RBAC)是一种权限与角色相关联的通用访问控制安全模型,用户通过成为适当角色的成员而得到这些角色的权限,从而较为方便的实现不同人员的权限分配。不同于细粒度的能力划分,RBAC更像是一种能力的集合体,由一种管理需求设计角色,然后为角色分配细粒度的能力,使得角色成为与人员较为对等的映射关系。
    • 在RBAC模型中,人员可以应需求切换角色,角色可以应调整进行修改其拥有的能力。对比MAC,管理模式更加人性化,更加适合应用于实际的人员管理。
    • SELinux中的RBAC主要通过其安全上下文的role字段实现。
  • SeLinux中的多级安全

    • MLS(Multi-Level Security)多级安全是BLP(Bell-La-Padula)模型在SELinux中的体现。
    • MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。
    • 为了支持MLS,安全上下文被扩展了,包括了安全级别。
    • 在SELinux下的Type Enforcement(TE)是一个更加灵活和更具表现力的安全策略,在许多情况下,TE比MLS更适合。在一些场景中,MLS是仍然是必须的。如:一个文件服务器上存有混合分类的数据,且客户以不同的许可连接此服务器这将导致在一个简单的系统中,需要大量的安全 级别来强制隔离所有数据。这种场景就适合应用MLS。
    • MLS安全上下文至少必须有一个安全级别(它由敏感度和范畴组成),但可以包括两个安全级别。
[展开全文]
川农_小辰 · 2018-08-17 · SELinux 1

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
  • 实验环境
    • 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
    • 配置ip地址
      • 防火墙端
        • vi /etc/udev/70-persistent-net.rules
          • 复制eth1和eth2的mac地址
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth1
          • 用于连接外网
          • 粘贴eth1的mac地址
          • static协议
          • IPADDR=172.16.8.100
          • MASKNET=255.255.255.0
          • GATEWAY=172.16.8.2 -这个应该是宿主机的IP或网关
          • DNS1=114.114.114.114
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth2
          • 用于连接内网
          • 粘贴eth2的mac地址
          • static协议
          • IPADDR=192.168.11.11
          • MASKNET=255.255.255.0
          • 无网关和DNS
        • vi /etc/sysconfig/network
        • vi /etc/hosts
        • reboot
      • 客户端(用于后面的NAT转发)
        • 仅主机模式
        • IP:192.168.11.3
        • 默认网关地址::192.168.11.11
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
        • 拒绝来自192.168.1.11的连接
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
        • 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
        • 允许该网段进行dns查询
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
        • 拒绝带以上标记的TCP包
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
        • 不带SYN标记的统统接收
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
        • 不允许来自别人的ping
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

iptables实现NAT功能

  • SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
    • 局域网各主机正确设置IP地址/子网掩码
      • 仅主机模式
      • IP:192.168.11.3
      • 默认网关地址::192.168.11.11
    • Linux网关需要支持IP路由转发
      • iptables -F
      • echo "1" > /proc/sys/net/ipv4/ip_forward
        • 或通过vi /etc/sysctl.conf编辑
      • sysctl -p 查看当前状态
      • 至此该Linux开启了路由转发功能
    • 编写SNAT转换规则
      • iptables -t nat -D POSTROUTING 1
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
        • POSTROUTING:路由选择后处理。
        • -s X.X.X.X/X:内网源地址。
        • -o eth1:外网接口。
        • --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
    • MASQUERADE —— 地址伪装
      • 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
  • DNAT,修改数据包的目标地址或端口号
    • 实现内网服务器通过防火墙发布到互联网
    • 局域网的Web服务器能够访问Internet
    • 网关的外网IP地址有正确的DNS解析记录
    • Linux网关支持IP路由转发
      • echo "1" > /proc/sys/net/ipv4/ip_forward
    • 编写DNAT转换规则
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
        • PREROUTING:DNAT使用PREROUTING链,路由选择前处理
        • -i eth1:外网接口。
        • -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
        • --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
          • 可以使用XAMPP自动部署web环境
          • 默认是80端口,其它端口的转发需要指定
          • 在浏览器输入172.16.8.100测试
    • 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22

 

iptables系统服务与脚本

  • 脚本位置:/etc/init.d/iptables
  • 规则文件位置:/etc/sysconfig/iptables
    • service iptables start|restart|stop|save…
  • 配置防火墙脚本
    1. 编写防火墙脚本→开机时自动执行该脚本
      • 脚本执行指令写入/etc/rc.d/rc.local
      • vim ipfw.sh
        #!/bin/bash
        WAN_IF="eth1"
        WAN_IP="172.16.8.100"
        LAN_IF="eth2"
        LAN_IP="192.168.11.11"
        LAN_NET="192.168.11.0/24"
        LAN_WWW_IP="192.168.11.10"
        IPT="/sbin/iptables"
        MOD="/sbin/modprobe"
        CTL="/sbin/sysctl"
        
    2. 加载必要的系统模块,在ipfw.sh中追加
      $MOD ip_tables
      $MOD ip_conntrack
      $MOD ipt_REJECT
      $MOD ipt_LOG
      $MOD ipt_iprange
      $MOD xt_tcpudp
      $MOD xt_state
      $MOD xt_multiport
      $MOD xt_mac
      $MOD ip_nat_ftp
      $MOD ip_conntrack_ftp
      
    3. 调整/proc参数, Linux内核控制及调优,在ipfw.sh中追加
      $CTL -w net.ipv4.ip_forward=1
      $CTL -w net.ipv4.ip_default_ttl=128
      $CTL -w net.ipv4.icmp_echo_ignore_all=1
      $CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1
      $CTL -w net.ipv4.tcp_syncookies=1
      $CTL -w net.ipv4.tcp_syn_retries=3
      $CTL -w net.ipv4.tcp_synack_retries=3
      $CTL -w net.ipv4.tcp_fin_timeout=60
      $CTL -w net.ipv4.tcp_max_syn_backlog=3200
      
    4. 具体的防火墙规则,在ipfw.sh中追加
      • 按表、链分别设置规则,包括默认策略
      $IPT -t filter -X
      $IPT -t nat -X
      $IPT -t filter -F
      $IPT -t nat -F
      $IPT -P INPUT DROP
      $IPT -P FORWARD DROP
      $IPT -P OUTPUT ACCEPT
      $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
      $WAN_IP
      $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
      DNAT --to-destination $LAN_WWW_IP
      
    5. 使用IP地址黑、白名单
        1. 建立IP地址列表文件
        • 黑名单、白名单分开保存
        • 每行一个IP地址,或网段地址
        vim /opt/ipfw.w
            192.168.11.0/24
            220.121.72.85
        ……
        vim /opt/ipfw.b
            218.29.30.131
            61.45.135.29
            121.113.79.81
        
        1. 在脚本中调用黑、白名单,在ipfw.sh中追加
        • 使用for循环
        • 封锁黑名单地址、放开对白名单地址的限制
        BLST="/opt/ipfw.b"
        for i in $(grep -v "^#" $BLST)
        do
        $IPT -I INPUT -s $i -j DROP
        $IPT -I OUTPUT -d $i -j DROP
        $IPT -I FORWARD -s $i -j DROP
        $IPT -I FORWARD -d $i -j DROP
        done
        WLST="/opt/ipfw.w"
        for i in $(grep -v "^#" $WLST)
        do
        $IPT -I INPUT -s $i -j ACCEPT
        $IPT -I OUTPUT -d $i -j ACCEPT
        $IPT -I FORWARD -s $i -j ACCEPT
        $IPT -I FORWARD -d $i -j ACCEPT
        done
        
    6. 开机自动运行脚本
      • cp ipfw.sh /opt/
      • vi /etc/rc.d/rc.local
        • 添加/opt/ipfw.sh
      • reboot
      • iptables -L 检查配置情况
      • iptables -t nat -L
  • 防火墙脚本的构成
    • 主机型防火墙
      • 针对本机进行保护
      • 主要针对filter表中的INPUT、OUTPUT链设置规则
      • 修改ipfw.sh
        #!/bin/bash
        # 1. 定义基本变量
        IPT= "/sbin/iptables"
        ……
        # 3.2 定义默认策略
        $IPT -P INPUT DROP
        $IPT -P FORWARD DROP
        $IPT -P OUTPUT ACCEPT
        # 3.3 设置filter表中的各种规则
        $IPT -A INPUT -p tcp --dport 80 -j ACCEPT
        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ……
        
    • 网络型防火墙
      • 针对网络互访进行保护
      • 主要针对filter表中的FORWARD链,以及nat表设置规则
      • 修改ipfw.sh
        #!/bin/bash
        ……
        # 4.3 设置nat表中的各种规则
        $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
        $WAN_IP
        $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
        DNAT --to-destination $LAN_WWW_IP
        # 4.4 设置filter表中的各种规则
        $IPT -A FORWARD -d $LAN_NET -i $WAN_IF -m state --state
        ESTABLISHED,RELATED -j ACCEPT
        ……
        

 

Firewalld防火墙

  • 特点
    • FirewallD提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
    • FirewallD支持IPv4、IPv6防火墙设置以及以太网桥接,并且拥有“运行时配置”和“永久配置”选项。
    • FirewallD支持允许服务或者应用程序直接添加到防火墙规则中。
    • FirewallD动态管理防火墙,不需要重启整个防火墙便可应用更改。
    • FirewallD通过D-BUS提供当前激活的防火墙设置信息,也通过D-BUS接受使用PolicyKit认证方式做的更改。
    • 系统托盘区图标来显示防火墙状态,方便开启和关闭防火墙。
    • 提供firewall-cmd命令行界面进行管理及配置工作。
    • 为libvirt提供接口及界面,在必须的PolicyKit相关权限允许的情况下实现。
    • 提供firewall-config图形化配置工具。
    • 实现系统全局及用户进程的防火墙规则配置管理。
  • 区域
    • 通过将网络划分成不同的区域(通常情况下称为zones),制定出不同区域之间的访问控制策略来控制不同信任程度区域之间转发的数据流。
    • 传统防火墙都有区域的概念。
      • 例:Netscreen防火墙中“Trust”与“Untrust”区域;
      • 例:ASA防火墙中“Inside”与“Outside”区域;
      • 例:IPCop防火墙中“Red”与“Green”区域。
    • 默认区域
      • 在配置规则时,不指定区域则被认定为写入到默认区域。
      • FirewallD防火墙的默认区域为“public”
    • 区域相关命令
      • firewall-cmd --get-zones
        • 当前支持的区域列表。
      • firewall-cmd --get-default-zone public
        • 显示默认区域。
    • 区域规则中的元素
      • 防火墙规则就是由这些元素构成
      • 预定义的服务
        • 服务是端口(和/或)协议组成的;当然,也可能还包括netfilter助手模块以及目标地址(由IPv4或IPv6地址构成)。
      • 端口和协议
        • 定义了tcp或udp端口,端口可以是一个端口或者一组端口范围。
      • ICMP过滤器
        • 可用于规则的ICMP报文类型;这些报文可以是信息请求,也可以是对信息请
          求或错误条件创建的响应。
      • 伪装
        • 将私网地址映射为公网IP地址(多为动态地址);即源地址转换。
      • 端口转发
        • 转发一个网络端口从一个网络节点到另一个网络节点的规则。
      • 接口与源(略)
      • 富规则(后面详细介绍)
    • FirewallD预定义区域
      • 丢弃区域(Drop Zone):任何进入的数据包都将被丢弃。这个类似与我们之前使用iptables -j DROP。
      • 阻塞区域(Block Zone):拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。
      • 公共区域(Public Zone):只接受那些被设定的连接。
      • 外部区域(External Zone):这个区域相当于路由器启用伪装(masquerading)选项。只有指定的连接会被接受。
      • 隔离区域(DMZ Zone):如果想要只允许给定的部分服务能被外部访问,可以在DMZ区域中定义。
      • 工作区域(Work Zone):在这个区域,我们只能定义内部网络。
      • 家庭区域(Home Zone):这个区域专门用于家庭环境。
      • 内部区域(Internal Zone):这个区域和工作区域(Work Zone)
        类似,只能通过被选中的连接。
      • 信任区域(Trusted Zone):该区域中的接口将被允许所有的网络通信。
    • 区域操作命令
      • firewall-cmd --set-default-zone=home
        • 设置默认区域
      • firewall-cmd --get-active-zones home
        • 查看当前活跃区域
      • firewall-cmd --list-all-zones
        • 列出全部区域及特性
        … …
        public (default, active)
        interfaces: eno16777728
        sources:
        services: dhcpv6-client ssh
        ports:
        masquerade: no
        forward-ports:
        icmp-blocks:
        rich rules:
        … …
        
      • firewall-cmd --zone=public --list-all -列出某一区域特性
      • 根据接口获取区域信息
        • firewall-cmd --get-zone-of-interface=eno16777728 public
      • 临时将接口增加到区域
        • firewall-cmd --zone=public --add-interface=eno16777728
      • 临时修改接口所属区域
        • firewall-cmd --zone=public --change-interface=eno16777728 success
      • 临时从区域中删除一个接口
        • firewall-cmd --zone=public --remove-interface=eno16777728 success
      • 查询区域中是否包含某接口,未指定区域名,实则为默认区域
        • firewall-cmd --zone= --query-interface=eno16777728 Yes
      • 查询区域中已启用的服务
        • firewall-cmd --zone= --list-services dhcpv6-client ssh
  • 防火墙基本操作
    • 启动服务
      • systemctl enable firewalld.service
    • 停止服务
      • systemctl stop firewalld.service
    • 查看防火墙状态
      • systemctl status firewalld.service
    • 服务管理
      • 显示服务列表
        • firewall-cmd --get-services
      • 显示当前服务
        • firewall-cmd --list-services
      • 允许某服务通过,其中选项--permanent,表示为永久配置项
        • firewall-cmd --permanent --zone=internal --add-service=http
      • 临时开启某服务,选项--timeout,表示临时开启秒数
        • firewall-cmd --zone=work --add-service=smtp --timeout=60
        • firewall-cmd --reload - 配置规则重新载入
      • 从区域移除服务
        • firewall-cmd --zone=public --remove-service=ftp
    • 端口管理
      • 打开或关闭端口,打开/关闭“443/tcp”端口在public区域
        • firewall-cmd --zone=public --add-port=443/tcp
        • firewall-cmd --zone=public --remove-port=443/tcp
      • 端口转发,在external区域实现SNAT伪装
        • firewall-cmd --zone=external --add-masquerade
      • 端口转发,把public区域的80端口转发到3128端口
        • firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=3128
      • 端口转发,把external区域的443端口转发到内网172.16.8.201这台主机
        • firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.16.8.201
      • 移除一个端口转发规则
        • firewall-cmd --zone=external --remove-forward-port=port=443:proto=tcp:toport=3128:toaddr=172.16.8.201
      • 列表区域中已开启端口与端口转发规则
        • firewall-cmd --zone=public --list-ports
        • firewall-cmd --zone=external --list-forward-ports
    • 其他命令
      • 启用应急模式阻断所有网络连接,以防出现紧急状况
        • firewall-cmd --panic-on
        • firewall-cmd --panic-off //禁用应急模式
        • firewall-cmd --query-panic //查询应急模式
      • 获取所有支持的ICMP类型
        • firewall-cmd --get-icmptypes
      • 阻塞默认区域中的ICMP应答报文
        • firewall-cmd --add-icmp-block=echo-reply
      • 禁止ICMP应答阻塞
        • firewall-cmd --remove-icmp-block=echo-reply/request
      • 查询ICMP应答报文的阻塞状态
        • firewall-cmd --query-icmp-block=echo-reply
      • 通过--direct参数直接将iptables命令参数传递给防火墙
        • firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -- dport 80 -j ACCEPT
    • 富规则(Rich Language-复杂防火墙规则
      • 增加、移除、查询规则:
        • firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
          • 允许源ipv4地址为172.16.8.201的http服务通过默认区域
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --timeout=90
          • 永久规则
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --permanent
        • firewall-cmd [--zone=zone] --remove-rich-rule='rule' [--permanent]
        • firewall-cmd [--zone=zone] --query-rich-rule='rule '
      • rule参数:
        • rule family="ipv4|ipv6"
        • source address="address[/mask]" [invert="True"]
        • destination address="address[/mask]" [invert="True" ]
        • service name="service name"
        • port="port value" protocol="tcp|udp"
        • icmp-block name="icmptype name"
        • masquerade
        • forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
        • log [prefix="prefix text"] [level="log level"] [limitvalue="rate/duration"] [audit]
        • accept | reject [type="reject type"] | drop
      • rule例子(结合防火墙图形配置工具来理解以下规则)
        • firewall-cmd --add-rich-rule 'rule protocol value="ah" accept'
        • firewall-cmd --add-rich-rule 'rule service name="ftp" log limit value="1/m" audit accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp"
          level="info" limit value="1/m" accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.3" reject type="icmp-admin-prohibited"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.4" drop'
    • 在防火墙配置文件中创建自己的服务
      • 我们准备添加一个新的服务叫rtmp,使用TCP协议,端口号是9527,步骤如下:
      • cd /etc/firewalld/services/
      • cp /usr/lib/firewalld/services/nfs.xml ./ //找个模板
      • mv nfs.xml rtmp.xml
      • vim rtmp.xml
        <?xml version="1.0" encoding="utf-8"?>
        <service>
        <short>RTMP</short>
        <description>The RTMP protocol Bala Bala ...</description>
        <port protocol="tcp" port="9527"/>
        </service>
        
      • firewall-cmd --reload
        • 防火墙配置重载
      • firewall-cmd --add-service=rtmp
      • cat /etc/firewalld/service/rtmp.service

 

SeLinux机制

安全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个“用户”、“进程”、“应用”和“文件”的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略将指定如何严格或宽松地进行检查。

SELinux对系统用户(system users)是透明的,只有系统管理员(root)需要考虑
在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。
只有同时满足了“标准Linux访问控制”和“SELinux访问控制”时,主体才能
访问客体。

  • Security-Enhanced Linux由以下两部分组成
      1. Kernel SELinux模块(/kernel/security/selinux)
      1. 用户态工具
  • DAC和MAC的区别(root用户)
    • 未启用SELinux的Linux系统是使用自主访问控制模型(DAC)的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它就无所不能了。
    • 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。强制访问控制模型(MAC)原本就是为军队开发的。
    • SELinux实现了一个更灵活的MAC形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全模型(Multi-Level Security)。DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路。
  • SeLinux的运行机制
    • 当一个subject(主体,如: 一个应用)试图访问一个object(客体,如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节写入/var/log/messages。
  • SeLinux伪文件系统
    • /sys/fs/selinux/”伪文件系统类似于“/proc/”伪文件系统;它存储了SELinux系统的状态。系统管理员和用户不需要操作这部分(通常借助相关命令修改其状态)
    • 可以这样修改
      • cd /sys/fs/selinux
      • more enforce
        • 0 //SELinux处于警告模式
      • echo 1 > enforce
      • more enforce
        • 1 //SELinux改为强制模式
  • SeLinux配置文件
    • 目录:/etc/selinux
      • “/etc/sysconfig/selinux”是“/etc/selinux/config” 主配置文件的符号链接。
      • /etc/sysconfig/selinux中包含如下配置选项:
        • 打开或关闭SELinux
        • 设置系统执行哪一个策略(policy)
        • 设置系统如何执行策略(policy)
        • SELINUX=enforcing,定义SELinux运行状态
          • Enforcing:SELinux安全策略置于强制模式。
          • Permissive:SELinux安全策略置于警告模式。
          • Disabled:SELinux完全被禁用。SELinux内核和伪文件系统脱钩,处于未注册状态。
        • SELINUXTYPE=targeted,定义SELinux策略模型
          • Targeted,类型强制(TE,Type Enforcement)访问控制,基于目标策略进行保护;
          • Minimum,Targeted策略模型的修改版本。仅针对选定的过程实施保护;
          • MLS,多层次安全保护模型(MLS,Multi-Level Security)。
  • SeLinux命令工具
    • /usr/sbin/setenforce,修改SELinux运行模式
      • setenforce 1 //SELinux以强制(enforcing)模式运行
      • setenforce 0 //SELinux以警告(permissive)模式运行
    • /usr/sbin/getenforce,查看SELinux模式
    • /usr/sbin/sestatus -v ,显示系统的详细状态
    • /usr/bin/chcon,修改对象(文件)的安全上下文,比如:用户:角色:类型:安全级别
    • 用法:
      • chcon [选项]... 环境 文件...
          - chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
          - chcon [选项]... --reference=参考文件 文件...
    • 参数:
      • -h, --no-dereference 影响符号链接文件,而不是引用文件
      • --reference=参考文件 使用指定参考文件的安全环境,而非指定值
      • -R, --recursive 递归处理所有的文件及子目录
        • 以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系;如果您指定了多于一个选项,那么只有最后一个会生效。
        • -H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
        • -L 遍历每一个遇到的通到目录的符号链接
        • -P 不遍历任何符号链接(默认)
      • -v, --verbose 为处理的所有文件显示诊断信息
      • -u, --user=用户 设置指定用户的目标安全环境
      • -r, --role=角色 设置指定角色的目标安全环境
      • -t, --type=类型 设置指定类型的目标安全环境
      • -l, --range=范围 设置指定范围的目标安全环境
      • --help 显示此帮助信息并退出
      • --version 显示版本信息并退出
    • 用例
      • mkdir -p /var/share/up
      • 允许该目录匿名共享
        • chcon -R -t public_content_t /var/share
      • 允许向该目录上传文件
        • chcon -t public_content_rw_t /var/share/up
  • 策略与规则管理相关命令
    • getsebool命令、setsebool命令、semanage命令
    • /usr/sbin/setsebool,用于修改SElinux策略内各项规则的布尔值。
      • 语法
        • setsebool [-P] 布尔值=[0|1]
      • 选项
        • -P:直接将设置值写入配置文件,该设置数据将来会生效的。
      • 用例:
        • 允许vsftpd匿名用户写入权限:
          • setsebool -P allow_ftpd_anon_write=1
        • 允许ftp用户访问自己的家目录:
          • setsebool -P ftp_home_dir 1
        • HTTP被允许CGI设置:
          • setsebool -P httpd_enable_cgi 1
        • 允许用户以HTTP方式访问其个人主页,该设定限仅于用户的家目录主页:
          • setsebool -P httpd_enable_homedirs 1
          • chcon -R -t httpd_sys_content_t ~user/public_html
        • 允许httpd访问终端:
          • setsebool -P httpd_tty_comm 1
        • 关于named、master更新selinux设定:
          • setsebool -P named_write_master_zones 1
        • Selinux将本机的NFS共享设置成只读:
          • setsebool -P nfs_export_all_ro 1
        • SElinux将本机的NFS共享设置成可读可写:
          • setsebool -P nfs_export_all_rw 1
        • 将远程NFS的家目录共享到本机:
          • setsebool -P use_nfs_home_dirs 1
        • 将samba服务器共享目录给多个域:
          • setsebool -P allow_smbd_anon_write=1
        • 允许samba服务器共享家目录:
          • setsebool -P samba_enable_home_dirs 1
        • 在本机上使用远程samba服务器的家目录:
          • setsebool -P use_samba_home_dirs 1
        • 允许rsync其他用户写入:
          • setsebool -P allow_rsync_anon_write=1
        • 允许系统使用kerberos:
          • setsebool -P allow_kerberos 1
    • /usr/sbin/getsebool,用来查询SElinux策略内各项规则的布尔值。
      • 语法
        • getsebool [-a] [布尔值条款]
      • 选项
        • -a:列出当前系统所有布尔值条款设置值。
    • /usr/sbin/semanage,用来查询与修改SELinux默认目录的安全上下文。
      • 语法
        • semanage {login|user|port|interface|fcontext|translation} -l
        • semanage fcontext -{a|d|m} [-frst] file_spec
      • 选项
        • -l:查询。
        • fcontext:主要用在安全上下文方面。
        • -a:增加,你可以增加一些目录的默认安全上下文类型设置。
        • -m:修改。
        • -d:删除。
      • 用例
        • semanage fcontext -l |grep /var/www/html
        • 设置/var/share目录的默认安全性本文为public_content_t
          • semanage fcontext -t public_content_t "/var/share(/.*)?"
          • semanage fcontext -l |grep "/var/share"
        • 规则其实写在这里
          • cat /etc/slinux/targetd/contexts/files/file_contexts.local
          • 尝试给其恢复默认值
            • restorecon -Rv "/var/share"
    • /usr/sbin/restorecon,用来恢复SELinux文件属性即恢复文件的安全上下文。
      • 语法
        restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f
        filename | pathname...]
      • 选项
        • -i: 忽略不存在的文件。
        • -f infilename文件: infilename中记录要处理的文件。
        • -e directory: 需要排除的目录。
        • -R/-r: 递归处理目录。
        • -n: 不改变文件标签。
        • -o outfilename: 在文件不正确的情况下保存文件列表到outfilename。
        • -v:将过程显示到屏幕上。
        • -F:强制恢复文件安全语境
      • 用法
           假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经
        常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网
        页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可
        能是因为这个文件的SELinux配置信息是继承原来那个目录的,与
        /var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一
        起移动过来了,从而导致无法打开页面,具体请看下面的实例:
            cd 
            echo "Hello" >index.html
            mv index.html /var/www/html/
            systemctl start httpd.service
            使用浏览器访问测试
            作如下操作,恢复index.html的安全上下文,再用浏览器访问
                cd /var/www/html/
                ls -Zd ./
                restorecon -R /var/www/html/
        
  • 安全上下文
    • 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),“域”和“域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域;通常,我们认为域、域类型、主体类型和进程类型都是同义的,即都是安全上下文中的“TYPE”。
    • SELinux对系统中的许多命令做了修改,通过添加一个“-Z”选项显示客体和主体的安全上下文。
      • 主体:系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;
      • 客体文件的Security Context规则如下:
        • rpm包安装的:会根据rpm包内记录来生成安全上下文;
        • 手动创建的文件:会根据policy中的规定来设置安全上下文;
        • cp:会重新生成安全上下文;
        • mv:安全上下文则不变。
      • 安全上下文相关的选项:-Z
    • 安全上下文的格式
      • 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文
        • 安全上下文中的用户和角色标识符对类型强制访问控制策略没什么影响;
        • 对于进程,用户和角色标识符显得更有意义,因为它们把控制类型和用户标识符联合,这样就会与Linux用户账号关联起来;
        • 对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用
      • 标准Linux安全(DAC)中的用户ID和SELinux安全上下文(MAC)中的用户标识符分别用于标准(DAC)的和安全增强(MAC)的访问控制机制;两者之间的任何一个相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。
      • USER
        • user identity:类似Linux系统中的UID,提供身份识别,用来记录身份,安全上下文的一部分;
        • 几种常见的 user:
          • user_u :普通用户登录系统后的预设;
          • system_u :开机过程中系统进程的预设;
          • unconfined_u:自由,非限制用户标识,系统预设;
          • root :root登录后的预设;
        • 在 targeted policy中users不是很重要;
        • 在strict policy中比较重要,所有预设的SELinux Users都是以“_u”结尾的,root除外。
      • ROLE
        • 文件、目录和设备的role:通常是object_r;
        • 程序的role:通常是system_r;
        • 用户的role:
          • 用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;
        • targeted policy为system_r;
        • strict policy为sysadm_r、staff_r、user_r;
        • 使用基于RBAC(Roles Based Access Control)的strict(新版已淘汰)和mls策略中,用来存储角色信息。
      • TYPE
        • type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
        • 当一个类型与执行中的进程相关联时,其type也称为domain;
        • type是SElinux security context中最重要的部位,是SELinux类型强制执行安全模型的核心,预设值以_t结尾;
        • LEVEL和CATEGORY:定义层次和分类,只用于MLS策略中;
          • LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高
          • CATEGORY:代表分类,目前已经定义的分类为c0-c1023
  • SELinux和标准Linux的访问控制属性的对比
    • 在SELinux中,访问控制属性总是安全上下文(用户:角色:类型)形式,所有客体和主体都有一个关联的安全上下文。需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。
    • 注意:SELinux是在标准Linux访问控制基础之上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须同时满足才能访问一个客体;
      • 例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w权限,
        那么我们也不能写该文件。
    • 标准Linux基于用户和组ID进行访问控制
    • 系统中每个文件、目录、网络端口等都被指定一个安全上下文,策略(policy)则给出各安全上下文之间的作用规则。
    • SELinux根据策略(policy)及安全上下文(security context)规则来决定存取行为是否可执行
      • 主体(Subject)主体:系统进程,比如/usr/sbin/httpd;
      • 客体(Object)客体:被存取的项目,比如文件、目录、套接字接口等
  • 类型强制(TE)访问控制
    • Type Enforcement(TE),在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用/组ID是什么;所以在SELinux中,没有默认的超级用户。
    • SELinux通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
      • 源类型(Source type(s)),通常是尝试访问的进程的域类型
      • 目标类型(Target type(s)),被进程访问的客体的类型
      • 客体类别(Object class(es)),指定允许访问的客体的类别
      • 许可(Permission(s)),允许源类型访问客体类型的具体权限
    • 举个例子:
      • allow user_t bin_t : file {read execute getattr};
        • 允许主体user_t访问客体bin_t,访问的类别为file(至于其它类别,想都别想),能够行使的权限有读、执行、获取属性。
  • 基于角色的访问控制(RBAC)
    • Role Base Access Control(RBAC)是一种权限与角色相关联的通用访问控制安全模型,用户通过成为适当角色的成员而得到这些角色的权限,从而较为方便的实现不同人员的权限分配。不同于细粒度的能力划分,RBAC更像是一种能力的集合体,由一种管理需求设计角色,然后为角色分配细粒度的能力,使得角色成为与人员较为对等的映射关系。
    • 在RBAC模型中,人员可以应需求切换角色,角色可以应调整进行修改其拥有的能力。对比MAC,管理模式更加人性化,更加适合应用于实际的人员管理。
    • SELinux中的RBAC主要通过其安全上下文的role字段实现。
  • SeLinux中的多级安全
    • MLS(Multi-Level Security)多级安全是BLP(Bell-La-Padula)模型在SELinux中的体现。
    • MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。
    • 为了支持MLS,安全上下文被扩展了,包括了安全级别。
    • 在SELinux下的Type Enforcement(TE)是一个更加灵活和更具表现力的安全策略,在许多情况下,TE比MLS更适合。在一些场景中,MLS是仍然是必须的。如:一个文件服务器上存有混合分类的数据,且客户以不同的许可连接此服务器这将导致在一个简单的系统中,需要大量的安全 级别来强制隔离所有数据。这种场景就适合应用MLS。
    • MLS安全上下文至少必须有一个安全级别(它由敏感度和范畴组成),但可以包括两个安全级别。
[展开全文]

授课教师

高级讲师

课程特色

视频(35)
下载资料(3)