7.1 网络封包联机进入主机的流程
7.1.1 封包进入主机的流程
-------------------------------------------------------------------------
Internet
|
第一层防火墙:iptables(netfilter)
|
第二层防火墙:TCP_Wrapper
| --------
服务器设定值:http,ftp,samba... ——>| 登 |
| | 录 |
权限的细部设定:SELinux ——>| 档 |
| --------
档案权限的设定(r, w, x)
----------------------------------------------------------------------------------
1. 经过防火墙的分析
(1). 封包过滤防火墙:IP Filtering或 Net Filter
软件: iptables(netfilter) ----分析TCP/IP的封包表头来进行过滤
OSI: 二、三、四
封包阶段: MAC、IP、ICMP、TCP/UDP的端口与状态(SYN、ACK)
(2). 第二层防火墙:TCP Wrappers
/etc/hosts.allow
/etc/hosts.deny
2. 服务(daemon)的基本功能
httpd.conf ----通过这个配置文件规范某些IP开源不能使用httpd这个服务
3. SELinux对网络服务的细部权限控制
注意:比如说通过SELinux将httpd程序的权限控制在啊/var/www/html中
4. 使用主机的文件系统资源
7.1.2 常见的攻击手法与相关保护:猜密码,漏洞,社交工程,程序误用,rootkit,DDoS
1. 取得账户信息后猜密码
应对:
(1)减少信息的曝光机会:Email Address不要随便用
(2)建立较严格的密码设定规则:chattr限制账号文档的更改
(3)完善权限限定
2. 利用系统的程序漏洞主动攻击
应对:
(1)关闭不需要的网络服务:开的端口越少越好
(2)随时保持更新
(3)关闭不需要的软件:比如SSH
3. 利用社交工程作欺骗
(1)追踪对谈者
(2)不要随意透露账号/密码信息
4. 利用程序功能的被动攻击
应对:
(1)随时更新主机上的所有软件
(2)弱化软件的功能
(3)不要连接到不明的主机
5. 蠕虫或木马的rootkit
(1)不要随意安装不明来源的档案或者不明当那数据
(2)不要让系统有太多危险的指令:例如SUID/SGID的程序
(3)可以以rkhunter之类的软件来追查:有个网站提供rootkit程序的检查,可以分析你的主机
6. DDoS攻击法(Distributed Denial of Service: 分布式阻断服务攻击)
注意:比如常见的SYN Flood攻击,就是透过分散在各地的僵尸计算机发送大量SYN封包,如果client端在发送SYN的封包后,却将来子鸡server端的确认封包丢弃,这样server端就会一直空等,如果在你短时间内持续发送这样的SYN封包,那么server就会持续不断发送确认封包。
7. 其它高大上的攻击方法
(1)设定规则完善的防火墙
(2)核心功能
(3)登录文件与系统监控(使用MRTG之类的监控软件)
7.1.3 主机能作的保护:软件更新、减少网络服务、启动SELinux
1. 软件更新的重要性
2. 认识系统服务的重要性
3. 权限与SELinux的辅助
7.2 网络自动升级软件
7.2.1 如何进行软件升级
(1)升级到较新的版本
(2)利用tarball来字型升级核心与软件
7.2.2 CentOS的yum软件更新、映象站使用的原理
-------------------------------------------------------------------------------------------------------
取得清单列表
YUM服务器 <——————> Linux用户端
容器资料清单:/path/repodata 实际安装 清单记录:/var/cache/yum/
实际软件目录:FTP/http均可 <——————>
-------------------------------------------------------------------------------------------------------
1. 先由配置文件判断yum server所在的IP地址、
2. 连接到yum server后,先下载新的RPM档案的表头数据
3. 分析比较使用者所欲安装/升级德尔档案,并提供使用者确认
4. 下载用户选择的档案到系统中的/var/cache/yum,并进行实际安装
7.2.3 yum的使用:安装,软件群组,全系统更新
yum [option] [查询的工作项目] [相关参数]
-----------------------------------------------------------------------------------------------------------
|option:
| -y: 当yum询问使用者的意见时,主动回答yes而不需要由键盘输入
|查询的工作项目:
| install: 安装指定的软件,后面跟软件名称
| update: 进行整体升级的行为;也可以仅升级一个软件,后面接某个软件
| remove: 移除某个软件,后面跟软件名称
| search: 搜寻某个软件或者是重要关键字
| list: 列出目前yum所管理的所有软件的名称与版本,有点类似rpm -qa
| info: 同上,不过有点类似于rpm -qai
| clean:下载的档案被放到/var/cache/yum,可使用cclean将它移除,可清楚的项目:packages|headers|metadata|cache等
| grouplist: 列出所有可以使用的软件群组
| groupinfo: 后面接group_name,则可了解该group内含的所有软件名;
| groupinstall: 可以安装一整组软件;常与--installroot=some/path共享来安装新系统
| groupremove: 移除某个软件群组
--------------------------------------------------------------------------------------------------
1. 利用yum安装
# yum search raid ----查找CentOS官网提供的软件名称和RAID有关的软件# yum info madam ----查看madam功能为何# yum install madam ----安装madam# yum list javacc*# vim /etc/yum.conf ----yum预设会将下载的RPM档案安装完毕后予以删除,通过修改配置文件予以保留[main]cachedir=/var/cache/yum/$basearch/$releaserver ----RPM下载的目录keepcache=1 ----默认不删除debuglevel=2logfile=/var/log/yum.logexactarch=1obsoletes=1# rpm -Fvh*.rpm ----将所有下载好的RPM档案安装2. yum安装软件群组# LANG=C yum grouplist ----查询系统有的软件群组有多少个Installed Group: ----已经安装的软件群组Additional Development...Available Group: --------尚可安装的软件群组...# yum groupinfo "Desktop Platform" ----查看Desktop Platform内含有多少个RPM软件呢Group: 桌面环境平台Description: 受支援的CentOS Linux桌面平台函式库Mandatory Packages: ----主要的会被安装的软件有这些
Optional Packages: ----额外可选择的软件
# yum groupindtsll "Desktop Platform"
3. 全系统更新
# vim /etc/crontab
40 5 * * * root yum -y update $$ yum clean packages ----每天5:40自动更新
7.2.4 挑选特定的映象站:修改yum配置文件与清除yum快取
注意:网址下包含repodata目录则说明这个网址可以作为yum的容器配置文件
1. 修改yum配置文件
方式一:修改系统的默认配置文件(使用特定映象站)
# vim /etc/yum.repos.d/CentOS-Base.repo ----容器的配置文件
#下面仅列出base这个容器
[base] ----容器的名字(一定要有中括号,名字不能重复)
name=CentOS-$releaseerver - Base ----说明容器的意义
mirrorlist=http://mirrorlist.centos.org/release=$releasever&arch=$basearch&repo=os&repo=os ----列出这个容器使用个的映象站台,是有yum程序自行去捉影响站台
gpgcheck=1 ----指定是否需要查阅RPM档案内的数字签名
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 ----数字签名的公钥文件所在位置
# yum clean all ----清除已有的清单
# yum repolist all ----列出目前yum server所使用的容器,enabled才是启动了的
方式二:在.etc.yum.repos.d/下新建档案,扩展名为.repo(为其他软件提供容器)
2. 清除yum缓存
注意:如果修改指定的网址却没有修改容器名称,会造成本机的列表与yum服务器不同步,进而无法步
# yum clean [packages|headers|all]
-----------------------------------------------------
|选项与参数:
| packages: 将已经下载的软件档案清除
| headers: 将下载的软件文件头删除
| all: 将所有容器数据删除
-----------------------------------------------------
# yum clean all ----删除已经下载的所有容器的相关数据(含软件本身与列表)
范例一:提供一个包含自由软件的网址,配置好yum容器
# vim /etc/yum.repos.d/drbl.repo
[drbl]
name=This is DBRL site. ----解释
enable=1 ----激活这个容器
gpgcheck=0 ----不进行签名检验
# yum repolist all ----观察所有的容器,看看有没有新增drbl
7.3 限制联机端口
7.3.1 什么是port
1. 服务器启动的监听端口所对应的服务是固定的
2. 客户端启动端口时,随机启动一个大于1024以上的端口
3. 一部服务器可以同时提供多种服务
4. 共65536(2^16)个端口
只有root才能启动保留的端口;
大于1024用于clent端的端口;
5. 是否需要三次握手
6. 通讯协议可以启动在非正规的端口
7. 所谓端口的安全性
7.3.2 端口的观察:netstat,nmap
1. netstat 在本机上面以自己的程序检测自己的端口
# netstat -tunl ----列出在监听的网络服务
# netstat -tun ----列出已联机的网络联机状态
# netstat -tunp ----观察联机服务的PID并删除之
# kill -9 1342 ----建设监理的联机的PID为1342
2. nmap 透过网络侦测软件辅助,可侦测非本机上的其它网络主机,担忧违法之虞
nmap [扫描类型] [扫描参数] [hosts地址与范围]
------------------------------------------------------------------------------------
|扫描类型:
| -sT: 扫描TCP封包已建立的联机
| -sS: 扫描TCP封包带有SYN卷标的数据
| -sP: 以ping的方式进行扫描
| -sU: 以UDP的封包格式进行扫描
| -sO: 以IP的协议进行主机的扫描
|扫描参数:
| -PT: 使用TCP里头的ping的方式进行扫描,可以获知目前有几部计算机存活(较常用)
| -Pl: 使用实际的ping(带有ICMP封包)来进行扫描
| -p: 这个port range,例如1024-,80-1023,30000-60000等等的使用方式
|Hosts地址与范围:
| 192.168.1.100 ----直接写入HOST IP而已,仅检查一部
| 192.168.1.0/24 ----为C Class的形态
| 192.168.*.* ----B Class的形态,扫描的范围变广了
| 192.168.1.0-50,60-100,103,200 ----这种事变形的主机范围
---------------------------------------------------------------------------------------------------
范例一:使用预设参数扫描本机所启用的port(只会扫描TCP)
# yum install nmap ----安装nmap
# nmap localhost ----扫描本机所有端口,预设仅扫描TCP协议
范例二:同事扫描本机的TCP/UDP端口
# namp -sTU localhost
范例三:透过ICMP封包的检测,分析区网内有几部主机是启动的
# namp -sP 192.168.1.0/24 ----启动的主机的IP对应的MAC也会被记录下来
范例四:将各个主机的启动的端口都作一番侦测
# nmap 192.168.1.0/24
3. 预设启动的服务
服务名称 | 服务内容 |
acpid | 新版的电源管理模块地,通常仓建议开启,不过某系而笔记本如果不支持就得关闭 |
std | 在管理单一预约命令执行的服务,需要启动 |
crond | 管理工作排程的重要服务 |
haldaemon | 作系统硬件变更侦测的服务,务必启动 |
iptables | linux内建的防火墙软件 |
network | 网络服务 |
postfix | 系统内部邮件传递服务 |
rsyslog | 系统的登录文件服务 |
sshd | 远程以文字终端登陆 |
xinetd | 就是super daemon,要启动 |
7.3.3 端口与服务的启动/关闭及开机时状态设定:服务类型,开机启动
7.3.3.1 服务类型
1. Stand alone
2. Super daemon
7.3.3.2 范例
范例一:找到系统上面开启111端口的程序并将其关闭
# netstat -tnlp | grep 111 ----找到程序名
# which rpcbind ----利用程序名找到实际对应的档案
# rpm -qf /sbin/rpcbind ----找到这个档案对应的程序的完整名称
# rpm -qc rpcbind | grep init ----找到启动这支程序的执行文件
# /etc/init.d/rpcbind stop ----关掉它
范例二:启动telnet(super daemon控管)
# rpm -qa | grep telnet-server ----看看有没有安装telnet
# yum install telnet-server ----安装telnet
# vim /etc/xinetd/telnet ----编辑telnet在super daemon,控管下的配置文件
disable=no
# /etc/init.d/xinetd restart ----重新启动super daemon
# netstat -tnlp ----观察23端口是否启动
7.3.4 安全性考虑-关闭网络断端口
范例一:找出目前系统上面正在运作中的服务,并找到相对应的启动脚本(/etc/init.d/)
# netstat -tlunp
# vim rpc.stated ----在这个脚本中写入想要关闭的服务
# rpm -qc $(rpm -qf $(which rpc.stated)) | grep init ----查找对应的启动脚本
# vim /bin/closedaemon.sh ----编写关闭一系列服务的脚本
for daemon in nfslock rpcgssd rpcidmapd rpcsvcgssd xinetd rpcbind
do
chkconfig $daemon off
/etc/init.d/$daemon stop
done
# sh /bin/closedaemon.sh ----启动关闭服务的脚本
# netstat -tlunp ----看看还剩下哪些服务在开启
7.4 SELinux管理原则
7.4.1 SELinux的运作模式:安全性文本,domain/type
范例一:httpd和/var/www/html的安全性本文
# ll -Zd /usr/sbin/httpd /var/www/html
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
SELinux工作流程:
1. 首先,触发/usr/sbin/httpd这个档案,档案类型为httpd_exec_t;
2. 这个档案产生的主体程序具有httpd这个领域(domain),我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;
3. 由于httpd domain被设定为可以读取httpd_sys_content_t这个类型的目标档案(Object),因此你的网页放置到/var/www/html目录下,就能够被htttpd那支程序所读取了;
4. 但最终能不能读到正确地资料,还要看rwx是否符合Linux权限的规范!
7.4.2 SELinux的启动、关闭与观察:gentenforce, setenforce
1. SELinux的观察
# getenforce ----显示目前SELinux所处在的模式
Enforcing ----强制模式,表示已经在运作中,且已经正确地开始限制domain/type
# vim /etc/selinux/config
SELINUX=enforcing ----调整enforcing|disabled|permissive
SELINUXTYPE=targeted ----目前仅有targeted与mls
2. SELinux的启动与关闭
注意:从disabled转到启动SELinux模式时,由于系统必须要针对档案写入安全性文本的信息,因此开机过程会花不少时间等待写入,而且完成之后还要再次重启。
Enforcing
^ <--------->
不需要 | 需要重启 Disabled
v <--------->
Permissive
setenforce [0|1] 在Enforcing与permition之间进行模式的转换,无法在Disabled模式下进行模式的切换
------------------------------------
| 0:转成permissive宽容模式
| 1:转成Enforcing强制模式
-------------------------------------
范例一:将SELinux在Enforcing与permission之间切换与观察
# setenfoerce 0 ----Enforcing-->permission
# getenforce ----查看状态改变了没有
# setenforce 1
范例二:Disabled切换为Enforcing之后,一堆服务无法启动,但切换为permision后正常
# setenforcing 0 ----可能是因为重新写入SELinux type出错,先切换为permission
# restorecon -Rv / ----重新还原所有SELinux的类型
# setenforcing 1 ----再转为Enforcing,然后启动执勤啊出错的服务试试
7.4.3 SELinux type的修改:chcon,restorecon,semanage
注意:复制时,SELinux的type字段会继承目标目录的,移动时SELinux的类型也会被移动过去
范例一:复制,并观察相关的SELinux类型变化
# cp /etc/hosts /root
# ls -dZ /etc/hosts /root/host /root ----发现/root/host继承了/root的类型
范例二:移动,并观察SElinux的类型
# mv /root/hosts /tmp
# ls -dZ /tmp /tmp/hosts ----/tmp和/tmp/hosts类型不相同,也就是说/tmp/hosts保持了原来的类型没
chcon [-R] [-t type] [-u user] [-r role] 档案
chcon [-R] --reference=范例文件 档案
------------------------------------------------------------
|选项与参数:
| -R: 联通该目录下的次目录也同时修改
| -t: 后面接安全性本文的类型字段,比如https_sys_content_t
| -u: 后面接身份识别,例如system_u
| -r: 后面接角色,例如system_r
| --reference=范例文件: 拿某个档案当范例来修改后面接的档案的类型
-------------------------------------------------------------
范例一:将刚刚的/tmp/hosts类型改为net_conf_t的类型
# chcon -t net_conf_t /tmp/hosts
# ll -dZ /tmp/hosts ----观察类型是否改变
范例二:以/var/spool/mail为依据,将/tmp/hosts修改成为该类型
# ll -dZ /var/sspool/mail ----看看它一开始的类型
# chcon --reference=/var/spool/mail /tmp/hosts ----修改类型
# ll -Z /tmp/hosts
restorecon [-Rv] 档案或目录 恢复为预设的设定
-----------------------------------------------
|选项与参数:
| -R: 连同次目录一起修改
| -v: 将过程显示到屏幕上
-----------------------------------------------
范例一:将刚刚的/tmp/hosts移动至/root并以预设的安全性本文改正过来
# mv /tmp/hosts /root
# ll -Z /root/hosts
# restorecon -Rv /root
semanage [login|user|port|interface|fcontext|translation] 默认目录的安全性本文查询与修改
semanage fcontext -[a|d|m] [-first] file_spec 主要用在安全性本文方面的用途(/etc/selinux/targeted/context)
-------------------------------------------------
|选项与参数:
| fontext: 主要用在安全性本文方面的用途
| -l: 查询的意思
| -a: 增加一些目录的默认安全性本文类型设定
| -m: 修改的意思
| -d: 删除的意思
---------------------------------------------------
范例一:查询一下/var/www/的预设安全性本文设定为何
# yum install policycoreutils-python
# semanage fcontext -l | grep '/var/www'
范例二:利用semanage设定/srv/vbird目录的默认安全性本文为public_content_t
# mkdir /srv/vbird
# ll -Zd /srv/vbird ----预设的情况为var_t
# semanage fcontext -a -t public_content_t "/srv/vbird(/.*)?" ----将/srv/vbird/底下所有的目录递归地修改为public_content_t
# semanaeg fcontext -l | grep '/srv' ----查看/src目录的安全性本文
# semanage fontext -a -t public_content_t '/ssrv/vbird(/.*)?' ----增加安全性本文类型
# semanage fcontext -l | grep '/src/vbird' /srv/vbird(/.*)? ----再次查看/srv/vbird及其子文件夹的安全性文本类型
# cat /etc/selinux/targeted/contexts/files/file_context.local ----看看增加新的安全性文本类型对这个文本造成的更改
/srv/vbird(/.*)? system_u:object_r:public_content_t:s0 ----前面的动作就是写入这个内容
# restorecon -Rv /srv/vbird* ----尝试恢复默认值
# ll -Zd /srv/vbird ----看看新的默认值有没有生效
7.4.4 SELinux政策内的规则布尔值修订:seinfo,sesearch,getsebool,setsebool
1. 政策查询
# yum install setools-console
seinfo [-Atrub] 查询政策提供的相关规则
---------------------------------------------------------------------
| -A: 列出SELinux的状态、规则布尔值、身份识别、角色、类别等所有信息
| -t: 列出SELinux的所有类型(type)种类
| -r: 列出SELinux的所有角色(role)种类
| -u: 列出SELinux的所有身份识别
| -b: 列出所有规则的种类(boolean)
------------------------------------------------------------------------
范例一:列出SELinux在此政策下的统计状态(targeted的type有3076中,针对网络服务的Booleans有73个)
# seinfo
范例二:列出与httpd有关的规则
# seinfo -b | grep httpd ----没有规则的详细信息
sesearch [--all] [-s 主体类别] [-t 目标类别] [-b 布尔值]
-------------------------------------------------------------------------------
|选项与参数:
| --all: 列出该类别或布尔值的所有相关信息
| -t: 后面接类别,例如-t httpd_t
| -b: 后面还要接布尔值的规则例如-b httpd_enable_ftp_server
-------------------------------------------------------------------------------
范例一:找出目标档案资源类别为httpd_sys_content_t的有关信息
# sesearch --all -t httpd_sya_content_t ----【allow 主题程序安全性本文类别 目标资源安全性本文类别】,这样可以查看某个主体程序可以读取的目标资源档案
范例二:我知道有个布尔值为httpd_enable_homedirs,请问该布尔值规范多少规则?
# sesearch -b httpd_enable_homedirs --all
2. 布尔值的查询与修改
注意:布尔值决定了一系列的规则的启动与关闭
getsebool [-a] [布尔值条款] 查询布尔值状态
-----------------------------------------------------------------------------
| -a: 列出目前系统上面所有的布尔值条款设定为开启或关闭状态
-----------------------------------------------------------------------------
范例一:查询本系统内所有的布尔值设定状况
# getsebool -a
setsebool [-P] 布尔值=[0|1] 关闭或启动布尔值
-----------------------------------------------------------------
|选项与参数:
| -P: 直接将设定值写入配置文件,该设定数据未来会生效
-----------------------------------------------------------------
范例一:查询httpd_enable_homedirs是否为on,若不为on请启动他
# getsebool http_enable_hoomedirs ----未开启
# setsebool -P httpd_enable_homedirs=1 ----启动这个布尔值,记得一定要加-P选项
# getsebool http_enable_hoomedirs ----已开启
7.4.5 SELinux登记文件记录所需服务-以httpd为范例:setroubleshoot, sealert
1.setroubleshoot 将错误信息写入/var/log/messages和/var/log/setroubleshoot/*
注意:setroubleshoot需要安装两个软件setroubleshoot和setroubleshoot-server
# yum install setroubleshoot setroubleshoot-server ----安装两套软件
# /etc/init.d/auditd restart ----整合到auditd当中
(1)先由auditd去呼叫audispd服务
(2)然后audispd服务去启动sedispatch程序
(3)sedispatch再将原来的auditd讯息转成setroubleshoot的讯息,进一步储存下来
范例一:使用httpd这支程序产生的错误来说明。WWW是由htttpd这支服务提供的,因此你必须要安装且启动它才行
# /et/init.d/httpd start ---- 开启WWW服务
# netstat -tlnp | grep http ----看看80端口是否已经启动
tcp 0 0 :::80 :::* LISTEN 2218/httpd
# echo "My first selinux check" > index.html ----写一个简单的网页
# ll index.html ----看看权限有没有什么问题
# mv index.html /var/www/html ----将其复制到WWW服务器的文件夹中
# links http://localhost/index.html ----文字接口打开网页试试,权限不对劲
# cat /var/log/messages | grep setroubleshoot ----看看有说呢么错误记录信息,有的话会看到错误代码
# sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d ----查阅完整的数据
2. 用email或在指令列上面直接提供setroubleshoot错误讯息
# vim /etc/setroublrshoot/setroubleshoot.cfg ----修改setroubleshoot的配置文件让setroubleshoot主动发送信息到自己的email
recipients_filepath=/var/lib/setroubleshoot/email_alert_recipients (81)----这行必须要存在
console=True (147)----将原来的False修改成True
# vim /var/lib/setroubleshoot/email_alert_recipients ----填写邮件地址
root@localhost
your@email.adderss
# /etc/init.d/auditd restart ----重启auditd
3. SELinux错误克服的总结
1. 在服务与rwx权限都没有问题,却无法成功的使用网络服务时;
2. # setenforce 0 ----先设定为宽容模式
3. 再次使用该网络服务,如果这样能用表示确实是SELinux的问题
4. 分析/var/log/messages内的信息,然后用sealert -l处理
5. 找到AlloowAccess的关键词。照里面的动作进行SELinux的错误克服
6. # setenforce 1 ----再次测试网络服务
7.5 被攻击后的主机修复工作
7.5.1 网管人员应该具备的技能
1. 了解什么是需要保护的内容
2. 预防黑客的入侵
3. 主机环境安全化
4. 防火墙规则的设定
5. 实时维护你的主机:log file、portsentry
6. 良好的教育训练课程
7. 完善的备份计划: rsync工具
7.5.2 主机受攻击或复原工作流程
1. 立即拔出网络线
2. 分析登陆文件信息,搜寻可能的入侵途径
分析登录档;
检查主机开放的服务;
查询Internet上面的安全通报。
3. 重要数据备份
4. 重新全新安装
5. 软件的漏洞修补
6. 关闭或 移除不需要的服务
7. 数据恢复与恢复服务设定
8. 连上Internet
7.6 重点回顾
7.7 本章习题