搜索内容

10.CentOS 8系统服务安全管理

10.CentOS 8系统服务安全管理

针对操作系统(包括各个方面及运行之上的网络服务及应用等)的安全和加固措施,专业术语叫硬化(Harding),如果服务器系统没有安全,那么一切都变得毫无意义,不过对于CentOS 8系统而言,安全可是一个系统工程,首先需要将CIA安全模型烂熟于心,CIA是目前被广泛认同和接受的信息安全模型,即保密性,完整和可用这三个英文单词的首字母。此安全模型是评估敏感信息并构建安全策略的核心要点,更进一步的说明如下:

◆保密性(Confidentiality):机密信息必须只能对授权对象可用,对敏感信息加密及用户进行认证可有效地防止未授权对象访问并获悉敏感内容;
◆完整性(Integrity):不应以任何方式修改信息,限制未授权用户篡改或者破坏机密信息的能力,简而言之就是被篡改的内容不可信;
◆可用性(Availability):授权用户可以持续访问和使用信息,换而言之,没有可用性的任何信息,工具或服务都是无意义的。

掌握安全CIA原理的目的就是下面将要展开的围绕着CIA模型进行的各种安全配置及措施,由于系统安全的知识体系比较庞杂和宽泛,故本章将重点放在服务器的硬化,部分安全内容还被整合到了网络服务的相关章节,安全基本原理CIA如图11-1所示。

图11-1 CIA安全模型图(图片来源:https://www.nissatech.com/)

需要提醒大家的是,对于多数企业环境而言,实现信息安全的主体应该是硬件安全产品或安全解决方案,如硬件防火墙,IPS和IDS等,而不能将宝全都压在操作系统上,这将是战略错误,诚然操作系统本身包含一定安全功能,如权限,PAM,SELinux及软件防火墙等,但这些安全措施大多只是常规的防御性性措施,即使在操作系统全副武装,也很难滴水不漏,不发生安全问题,毕竟安全是一个系统工程,操作系统仅是其中的一个重要部分而已,不能只把焦点放在操作系统层面,且操作系统上集中了太多安全措施,同时会降低系统的应用及管理的效率,两全其美是很难的。

此外,实现网络安全的主体应该是专业的安全设备及整体安全解决方案,如思科的ASA或FirePower等核心防火墙,及IPS/VPN等辅助安全技术。统一威胁管理UTM(Unified Threat Management)设备也是中小企业的一个不错的选择,当然条件允许最好的选择是思科或其他有实力的安全厂商的安全解决方案而不是某个或某几个孤立的单独的安全设备,各种安全设备及安全管理规范通力配合,才能达到最大的信息安全。

本章所侧重的服务器硬化,主要包括操作系统层面的硬化和高频使用的网络服务的硬化两大部分,

10.1 操作系统的硬化

  10.1.1 服务器物理安全

如服务器物理安全无法保证,那么服务器的系统安全及无从谈起,因为多数安全措施都是在此前提之下才有效的,服务器物理安全主要是所托管的IDC或企业自己IDC对于服务器硬件的管理,如数据中心的安全和管理等,不能让非授权人员接触及操作企业的服务器。

此外,为服务器设置BIOS密码及GRUB密码也是服务器物理安全的基础,极力推荐为服务器设置,这样即使万一服务器被非授权人员接触,也可以将损失降到最低。至于配置方法,BIOS密码设置请参阅服务器的说明书,而GRUB密码的设置请阅读第4章的相关内容。

  10.1.2. 服务器操作系统安全

1.安装介质的完整性测试
所谓对安装介质的完整性测试,即安全原理CIA中的I,通常是指对所下载的安装镜像使用MD5或SHA算法进行校验,并和官方所公布的相应校验码进行比对,如一致说明安装介质就是官方版本,没有被第三方修改或植入木马,否则就需要重新下载了。

校验的另外一个好处就是防止下载过程中出现错误,导致安装介质不正确。校验不仅只针对下载镜像,还可以对CD/DVD乃至LiveUSB进行,确保安装介质绝对没有问题。很多朋友嫌麻烦,常常跳过校验这一步,推荐大家每次下载后或开始安装系统之前都进行校验,虽然麻烦但其可以实现完整性检测,杜绝安装介质被调包或篡改的可能。

完整行校验命令如下:

md5sum *.iso                                    #以CentOS8的安装镜像为例

或如下命令:
dnf install perl-Digest-SHA -y
shasum -a  1 (default)/224/256/512 *.iso        #可根据具体要求灵活选择参数进行校验

  10.1.3.安全加固共享内存及共享目录

共享内存可能被用于对正在运行的服务进行攻击,这对于服务器来说比较致命,实际只需在挂载文件系统时添加noexec,nosuid,nodev这三个参数即可轻松避免,关键参数说明如下:
◆nodev:表示不允许在这个文件系统上有字符或特殊的块设备,即不存在任何设备文件
◆nosuid:表示在这个文件系统上不允许任何具有SUID和SGID特殊权限的文件,防止升级权限
◆noexec:表示不允许文件系统上有任何可执行的二进制文件,防止执行黑客程序

修改如下配置文件及相关配置就可以消除安全隐患,令系统更加安全,关键配置如下:

vi /etc/fstab

编辑器中添加如下内容硬化共享内存:
tmpfs     /tmp         tmpfs     noexec,nosuid,nodev        0     0

编辑器中添加如下内容硬化共享目录,文件服务器尤其必要(仅适用于home为单独分区的共享文件夹情况):
UUID=XXXX  /home        xfs defaults,noexec,nosuid,nodev 0      0

重启系统后生效。需要注意的是,加固共享内存可能影响到其他应用,如ELK stack的正常运作,如果要应用了此条规则,应该先测试是否对应用有影响。很多时候,安全和应用就是有冲突,最佳的策略是找出安全和应用的平衡点。

  10.1.4.禁用Linux超级管理员用户

成功安装后第一件事就是登录系统,无论哪个CentOS版本,系统安装时就强制创建一个普通账号,完成安装后,默认都是以普通用户身份管理系统,管理员账号默认是不开启的,对于Linux系统管理员而言,固然有不方便的一面,但收获的是安全,普通用户通过sudo进行各种管理操作,用普通用户的身份和密码临时获得超级管理员权限,从而减少了使用超级用户及密码。极力不推荐大家激活超级管理员账号,也不推荐大家使用su命令切换为超级管理员,因为多数管理操作可以通过sudo来实现,实在需要使用超级用户时,可以运行如下命令来实现:

sudo -i
#

或:
sudo -s
#

看到了井号提示符,说明此时已经变身为超级管理员了,需要退出时只需执行exit命令即可,这样既获得了超级用户的便利,又不失起码的安全,一举两得。当然,如果是在安全的环境,直接使用root也无可厚非,毕竟,很多时候使用root权限很方便,不过请大家不要误会,笔者这里是以普通用户henry登录,通过sudo -i命令全程使用root权限,只不过省略了sudo命令而已。

  10.1.5.重视系统的升级包

操作系统定期发布的补丁(Patch)及补丁集或称之为升级包是系统安全的重要保证,或者说系统最最基本的安全措施就是定期安装更新,由于开源软件独特的开发模式,软件测试较为有限,导致开源软件安全堪忧,正因如此,Linux发行版提供商应运而生,如红帽,SUSE及Ubuntu,红帽Linux所谓的订阅服务其实就是付费升级,以保证企业系统的安全和稳定,CentOS和RHEL的维护周期和节奏大致相仿,通常一个版本为十年的维护期限。

所谓补丁其实就是Linux发行版厂商对自己发行版(操作系统及所提供的软件应用)的漏洞(Vulnerabilities)提供的解决之道,厂商定期将其所维护版本系统及相关软件应用的补丁程序的集合集中发布,这就是补丁集,补丁及补丁集可以有效地降低系统或软件漏洞对企业系统安全造成的消极影响,提升操作系统及相关软件应用的安全。

CentOS部署好后,配置完网络之后第一件事情就是手动安装系统更新,这是安装更新的最佳时机,具体方法如下:
dnf check-update #仅检测升级软件包,不升级

或:
dnf update #直接升级,如不需要确认,可以加上y参数

需要大家注意的是,更新是需要定期手动更新才能起到提升安全的目的,更新需要注意应用对服务器系统环境的要求,如十分严格,部署系统时就不要开启自动更新系统,即使是手动更新,一定要先测试更新补丁对在线运行的应用没有影响才考虑系统更新。

  10.1.6.RPM软件包的安全

RPM将所有的软件安装信息记录到RPM数据库中,保存在/var/lib/rpm目录,RPM软件包安装前,rpm命令将通过检查软件包签名可以保证此软件包在分发过程中没有被篡改及破坏,rpm命令所使用的公钥保存在/etc/pki/rpm-gpg目录,CentOS 8的公钥保存在如下文件中,可用如下命令查看:

cat /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

mQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn
rIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ
8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X
5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c
aevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e
f+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7
JINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m
vufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk
nHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry
Gat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y
m4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB
tDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5
QGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB
Ah4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl
Gy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs
N3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD
vOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq
a0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw
byaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg
q4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X
407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z
V6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG
rCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32
o8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy
yy+mHmSv
=kkH7
-----END PGP PUBLIC KEY BLOCK-----

上述公钥文件还保存在系统安装光盘的根目录下名为RPM-GPG-KEY-centosofficial的文件。了解了CentOS公钥之后,就来掌握导入和删除系统公匙,这对于所安装软件的安全很重要,具体操作如下:
◆导入密匙

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

至于dnf和yum命令,在系统安装后第一次运行dnf或yum命令时,将提示确认导入和使用公钥,选择yes即可导入公钥,如果嫌麻烦,可以使用y参数自动回答。

Tips:如何关闭强制导入项目公钥跳过公钥检测
为了系统安全,CentOS默认是进行强制公钥检测的,有时需要临时关闭检测,可以
dnf install命令之后添加--nogpgcheck参数跳过公钥检查安装,至于永久跳过公钥检测,为了安全,不推荐这么干,如果实在需要,直接编辑/etc/yum.repos.d/CentOS-*.repo文件,定位到如下参数:

gpgcheck=1

将其值修改为0即可。

选择安全的软件仓库
一定要选择一个安全的软件仓库,如果软件仓库本身存在安全问题,那从此软件仓库所安装的软件安全自然就成问题,CentOS官方推荐的两个额外的软件仓库如下:
◆EPEL
◆ELRepo

这两个额外的软件仓库可以在生产环境放心使用。

10.2.最为基本的安全措施:文件系统权限管理

关于文件系统的安全,最为基本的措施就是文件系统权限,从最为古老的UGO权限,到限制使用的SSS权限,再到最新的ACL权限,以及EXT文件系统属性,共同构成了系统的最为基本安全措施体系,下面就从这四个方面来保证系统最为基本的安全。

  10.2.1 权限管理

前面已经提到过了,用户身份决定权限,而权限应该说是Linux系统最为基本的安全措施了,Linux的权限系统也从古老的UFO权限和SSS特殊权限进化到了ACL权限,下面就从最古老的UGO权限说起。

CentOS文件系统的安全基础就是权限,基本的权限还是沿用UNIX的UGO权限,虽然老骥伏枥,但却是经典,为文件设置权限可以防止未经许可擅自访问其他用户的文件,系统从文件出发,把用户分为文件属主、同组用户和其他用户三类,其中其他用户的权限最大,其实就是指非文件属主和同组用户之外的所有用户。系统中任何一个文件,默认就被赋予一定的访问权限,如读、写和执行的权限。

◆读(r)权限
如果文件具有读的权限,则对应用户可以读取文件,如获取文件内容以及复制文件等,但不能修改。如果目录具有读权限,则表示允许用户进入某个目录,并可以列出目录下的文件,所以目录至少应赋予读权限,否则无法访问。

◆写(w)权限
如果文件具有写权限,则相应的用户可以读、写文件,包括获取文件内容以及复制、修改、移动和删除文件等。对于目录而言,如果允许用户创建新文件和删除文件,则必须赋予用户写目录的访问权限。

◆执行(x)权限
如果具有执行许可,则相应的用户可以运行文件(如程序文件)。对于目录而言,如果允许用户访问其中的任何子目录,则必须赋予用户“执行”目录的访问权限

可以通过如下命令来查看权限长得是什么样:

ls -l 

可以看到所列出的文件的详细信息中有rwxr-xr-x的信息,这就是权限的样子,如果将其视为三个八进制数的二进制表示,有rwx任何一个权限为置为1,反之置为0,那么前面的权限就变成了111101101,变成八进制就是755,使用三位八进制构成的权限代码表示权限似乎更加常见,它们都是这么计算出来的,下面也会采用这种方式表示权限。

  10.2.2 CentOS默认访问权限

稍微留心一下,新创建的文件或目录都会与生俱来一个默认的权限,这就是CentOS默认的访问权限。默认访问权限默认文件为664,目录是775,那这个权限是如何来的呢?幕后操纵者就是umask命令所设置的值。CentOS系统通过执行/etc/profile初始化文件,利用umask命令,为用户创建的文件设置默认的访问权限。umask命令的语法格式如下:
umask

显示当前umask所设置的值,如果要制定umask值使用如下命令:
umask XXX

其中的XXX为访问权限代码,就是前面所讲三位八进制的数字,很多Linux文章都会告诉你,文件用666减去umask数字码即可得到默认的文件权限,目录用777减去umask数字码即可得到默认的目录权限代码,其实这是一种似是而非的说法,因为默认的umask值是0002,第一位0表示SUID,SGID或Stick等特殊权限,除非必要一般很少用到,可以忽略只取其后三位002,所以666减去002得664,777减去002等于775,下面在CentOS中验证一下:

umask
0002
touch umask002_file.chk
mkdir umask002_dir.chk
ls -l
...
drwxrwx---  2 henry henry     4096 Aug 20 08:30 umask002_dir.chk/
-rwxrwx---  1 henry henry        0 Aug 20 08:30 umask002_file.chk
...

看到结果,貌似就是这么回事,但如果是指定的umask值就不一定行的通了,如umask值为027,777减去027得750,那666减027如何减,该借位还是不借,如何减,其实关于在权限的计算,无论是网文还是图书上一直不是很准确,或者说是一个似是而非的方法,下面就将权限的秘密告诉大家,其实权限的计算不是减法,而是根据权限计算表的对应关系来计算的,标准的权限计算表如下:

umask   file    directory
0        6          7
1        6          6
2        4          5
3        4          4
4        2          3
5        2          2
6        0          1
7        0          0

这时,即使将umask设置为027,文件的默认权限根据查表结果为,文件权限代码640,目录权限代码为750,下面在CentOS中验证一下:

umask=027
touch umask027_file.chk
mkdir umask027_dir.chk
ls -l

...
drwxr-x---  2 henry henry     4096 Aug 20 09:59 umask027_dir.chk/
-rw-r-----  1 henry henry        0 Aug 20 09:59 umask027_file.chk
...

完全正确,如果用减法去减,目录777去减027等于750,那文件666减027等于多少?要借位结果多少?如果用减法来计算这个文件的权限就比较麻烦了。需要特别声明,如果不是遇到特别奇特的umask值,为了效率用减法是没有问题的。但遇到特殊的uamsk值,权限计算表就派上用场了。

  10.2.3 通过权限符号修改访问权限

使用chmod命令修改文件或目录的访问权限,要成功修改需要具有修改文件访问权限的权力,或者sudo为超级用户。chmod命令的语法格式如下:
chmod 指定权限 文件或目录

其中,指定权限可以用权限符号表示,也可以用表示权限的三位八进制数字表示,权限符号如下所示:
u(表示文件属主)
g(表示同组用户)
o(表示其他用户)
a(表示所有用户)

使用加号“+”,减号“-”和等号“=”,分别表示增加,撤销或赋予相应的访问权限,具体权限如下:
r(表示读)
w(表示写)
x(表示执行)

例如要修改家目录中的src目录的访问权限,默认权限给得比较大,为了安全要设置为除了属主之外都没有任何权限,就可以使用如下命令实现:

ll
drwxrwxr-x  2 henry henry     4096 Aug 20 10:48 src/

chmod g-rwx,o-rx src

ll
drwx------  2 henry henry     4096 Aug 20 10:48 src/

上述是一个比较复杂的权限设置,针对不同用户的权限设置可用逗号隔开,下面是添加权限和赋予权限的操作:

chmod g=r,o+r src
drwxr--r--  2 henry henry     4096 Aug 20 10:48 src/

掌握了上述复杂的实例,简单的就不在话下了。

  10.2.4 修改文件的属主信息

和文件的访问权限一样重要的是文件的属主,简而言之,就是这个文件属于哪个用户,哪个组,如何更改文件的属主以及所归属的用户组,一个文件从其被创建就有一个默认的属主和所归属的用户组,默认的属主就是创建该文件的用户,而默认所归属的用户组通常是和用户名相同的用户组,如果要给一个文件指定的用户及用户组就需要用到chown命令了,使用如下命令修改文件的属主以及所归属的用户组:

ll
drwx------  2 henry henry     4096 Aug 20 11:24 src/

现在src目录属主以及所归属的用户组都是henry,如果把这个文件夹的属主以及所归属的用户组改为root,执行如下命令:
sudo chown root:root src

再次运行ll命令:

ll
drwx------  2 root  root      4096 Aug 20 11:24 src/

前面的用户名和后面的所归属的用户组名称都已经变成了root,操作成功。上述命令还可以写成这样:

sudo chown root.root src

和上述命令完全等效,也就是说chown可以识别两种格式,即用户名:所归属的用户组名或用户名.所归属的用户组名,当然,如果只改变用所归属的用户组名,还可以这样执行:

sudo chmod .henry src       #:henry也可以

此外,还可以使用chgrp命令只修改文件或目录的属组,具体操作如下:

chgrp henry file

此命令的执行结果是将file文件的属组改为了henry。其实,chgrp与chown命令的用法基本是一致的,用法也比较简单。可以用-R参数把一个目录下的所有内容都改变用户和组。

  10.2.5 特殊的SSS权限及相关操作

掌握了古老的UGO权限之后,再来看看SSS特殊权限,所谓SSS权限就是SUID(Set User ID ),SGID(Set Group ID)和STICKY权限,是Linux文件系统的特殊权限。SUID权限简而言之就是当一个文件具有SUID权限后,其他的用户也就拥有了这个文件拥有者的权限,而SGID权限则是当一个文件具有SGID权限后,其他的用户就有了这个文件所属的组的权限,其实SUID和SGID就是Linux文件权限的下放,以便于系统的管理和使用,而Sticky权限则是,当一个文件设置了sticky权限,尽管其他用户对该文件拥有写权限, 但却无法删除或移动该文件,必须由文件的属主执行删除或移动等操作,而对一个目录设置了sticky权限,存放在该目录的文件仅准许其属主执行删除或移动等操作。

/usr/bin/passwd命令具有SUID权限,ll命令查看结果如下:

ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 34928 May 11 11:14 /usr/bin/passwd

/usr/bin/locate命令则具有SGID权限,ll命令查看结果如下:

ll /usr/bin/locate
-rwx--s--x. 1 root slocate 48552 May 11 11:00 /usr/bin/locate

而大家常用的/tmp目录则具有Sticky权限,ll命令查看结果如下:

cd /
ll
...
drwxrwxrwt 9 root root       4096 Aug  3 13:54 tmp/
...

可以发现,SUID的表示方法是将属主权限的相应权限位变为s,SGID则将属组权限的相应权限位变为s来表示,而Sticky则是通过在其他组权限中用t来表示,相应操作如下。
执行如下命令配置和撤销SUID权限:

sudo chmod u+s filename         #设置SUID权限
sudo chmod u-s filename         #撤销SUID权限

执行如下命令配置和撤销SGID权限:
sudo chmod g+s filename         #设置SGID权限
sudo chmod g-s filename         #撤销SGID权限

执行如下命令配置和撤销Sticky权限:
sudo chmod o+t filename         #设置Sticky权限
sudo chmod o-t filename         #撤销Sticky权限

  10.2.6 ACL权限

无论是传统的UGO权限,还是超级权限SUID,SGID或Sticky权限,都无法实现对文件权限的精细分配和管理,于是基于EXT文件系统的访问控制(ACL)应运而生,这样一来,Linux文件系统也可以实现类似Windows那样的精细化权限分配和管理,关键命令有gefacl和setfacl这两个。

尽管古来的UGO权限有SSS特殊权限的补充,但仍然满足不了用户的需求,主要问题还是UGO这种分类方法太过笼统,无法实现更为精细的权限分配,于是基于EXT文件系统的访问控制(ACL)应运而生,Kernel 2.6引入了ACL权限,从而弥补UGO权限颗粒度过大的问题,实现了权限的精细分配,并且使用起来十分简单,主要有两个命令,一个是getface,另外一个是setfacl,这两个命令具体使用如下。

◆gefacl命令
gefacl命令可以获得文件的ACL权限,具体使用方法十分简单,实例如下:

getfacl .bashrc                 #查看.bashrc文件的ACL权限
# file: .bashrc
# owner: henry
# group: henry
user::rw-
group::r--
other::r--

getfacl /etc/fstab              #查看/etc/fstab文件的ACL权限
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
other::r--

◆setfacl命令
setfacl命令可以为文件设置ACL权限,已达到精细分配及管理权限的目的,如为henry用户分配对文件/etc/fstab的读写权限,关键操作如下:

setfacl -m u:henry:rw /etc/fstab

上述命令中,m参数表示更改文件的访问控制列表,u表示用户,rw表示读写权限,即授予用户henry对/etc/fstab文件读写权限,此外,经常使用的参数还有x, 用于移除访问控制列表条目。如果是对用户组进行操作,只需将u替换为g即可。成功执行之后,再使用getfacl命令查看结果:

getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
user:henry:rw-
group::r--
mask::rw-
other::r--

这时,/etc/fstab的ACL权限中就多出来一项user:henry:rw-,这样在传统UGO权限体系无法实现的权限精细分配就实现了,再来实现对henry用户组的权限分配,关键操作如下:

setfacl -m g:henry:rw /etc/fstab

再次执行getfacl命令:

getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
user:henry:rw-
group::r--
group:henry:rw-
mask::rw-
other::r--

可以看出/etc/fstab的访问控制列表中又多出一项group:henry:rw-,这就是对用户组权限进行精细分配,此外,如果要对整个目录进行设置,可以使用-R参数,至于setfacl命令的更多参数和用法请参阅其manpage。

至此,传统的UGO权限,再加上特殊权限SSS权限和ACL权限的补充,就实现了一个较为完整的Linux权限体系,实现对文件权限的精细分配和管理,这样一来,Linux文件系统也可以实现类似Windows那样的具有针对性的权限分配和管理,不过,还可以通过EXT文件系统令系统更加安全,具体命令如下。
◆lsattr命令
lsattr命令可以查看一个文件的文件系统属性,具体使用方法如下:

lsattr centos
--------------e--- centos

执行chattr命令为其添加i属性后,再次运行改命令:

chattr +i centos
----i---------e--- centos

centos文件就多出了一个名为i的EXT文件系统属性,此外,lsattr命令的高频参数有-R和-d,其中R参数可以递归显示目录下所有文件及子目录文件系统属性,而d参数则只显示目录的文件系统属性,因为默认显示的是目录下的文件的文件系统属性,具体效果如下:

tree Ubuntu
Ubuntu                                      #Ubuntu为目录
`-- centos                                  #centos为普通文件

chattr -R +i Ubuntu                         #为文件夹Ubuntu递归添加i文件系统属性

lsattr Ubuntu/
----i---------e--- Ubuntu/centos            #默认显示的是centos文件系统属性

◆chattr命令
上面所介绍的chmod只能修改文件的读写和执行权限,更底层的EXT文件系统属性则是由chattr命令来实现的,即可以使用chattr命令来修改EXT文件系统属性,chattr命令高频用法如下:

chattr +i centos        #为centos文件添加i文件属性权限,令其无法被删除

可用lsattr命令查看修改结果:
lsattr centos
----i------------- centos

通常如果用超级用户权限都不能删除某个文件,很有可能是此文件被EXT文件系统的i属性锁定了,如果删除文件,首先需要移除此文件的i属性,具体操作如下:
chattr -i  centos

然后再删除就没有问题了。此外,要保护一个文件夹及其文件,如Ubuntu目录及此目录下的所有文件,可以使用如下命令:
chattr -R +i Ubuntu     #启用保护
chattr -R -i Ubuntu     #解除保护

Tips:chattr命令的高频参数
+:添加某一个特殊参数,其他原本存在参数则不动.
-:移除某一个特殊参数,其他原本存在参数则不动.
=:配置一定,且仅有后面接的参数
A:为文件添加了A属性后,则该文件的存取时间atime将不会被修改,可避免I/O较慢的服务器过度存取磁碟,提升服务器性能
S:为文件添加了S属性后,则进行任何文件的修改,都将会同时写入磁盘
a:为文件添加了a属性后,则此文件将只能追加数据,而不能删除和修改数据
c:为文件添加了c属性后,则将文件写入文件系统时会自动压缩,当读取文件时,又会自动解压
i:为文件添加了i属性后,则此文件不能被删除和修改,可防止文件被删除和篡改,提高系统安全性
R:递归方式修改文件的EXT属性

chattr命令可以随心所欲地配置文件的文件系统属性,和chmod及chown十分类似,此处就不赘述了。

10.3.SELinux增强系统安全

SELinux(Security-Enhanced Linux)是增强Linux系统安全的一项重量级技术,是由美国国家安全局(NAS)开发和维护,Linux Kernel 2.6将其整合到了内核之中,CentOS/RHEL默认就强制开启了SELinux加强系统安全,虽然只是启用了一小部分的SELinux安全功能(完全开启SELinux功能,Linux操作系统理论上可以达到可信计算机系统评估标准(TCSEC)B2安全级别),用于提升Linux服务器的安全,但它的存在使得系统的配置变得复杂,许多朋友都习惯性地手动关闭此功能,可以运行如下命令获得当前系统SELinux的详细信息:

sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

SELinux基于Linux安全模块(LSM)框架,作为Linux内核的一个安全模块,提供了强制访问控制功能,实现SELinux最大限度减小系统中服务进程可访问的资源,从而提升系统的安全性。

所谓的强制访问功能(Mandatory Access Control),即在启用了SELinux的系统中,决定一个资源是否能被访问,除了需要具有足够的用户权限之外,还需判断每一类进程是否拥有对某一类资源的访问权限,而这些安全措施则主要通过安全上下文(Security Context)实现的。

安全上下文则分为文件安全上下文和进程安全上下文,当文件安全上下文和进程安全上下文完全匹配时,进程才能访问文件,这样看来,安全上下文就是SELinux的核心,而这种双重匹配的机制则提升了系统的安全,即文件安全上下文由文件创建的位置和创建文件的进程所决定,创建安全上下文时系统将赋予配套的默认值,且这些值不会受到文件移动的影响

  10.3.1.SELinux的模式

SELinux具有三种模式:
◆强制模式(Enforcing):存在安全上下文,可阻止违反SELinux规则的行为,还要记录到日志
◆宽容模式(Permissive):存在安全上下文,但不阻止违反SELinux规则的行为,但会记录到日志
◆禁用模式(Disabled):关闭SELinux,无安全上下文,这个管理员可能用得最多

如果管理这些模式呢?不复杂,只需牢记两个命令即可掌握,第一个命令是getenforce,可以获得当前SELinux的模式,具体操作如下:

getenforce
Enforcing       #当前模式为强制模式

如果要临时改变模式,如从强制模式切换到宽容模式,可执行如下命令:

setenforce 0

再次运行命令检测:

getenforce
Permissive      #当前模式为宽容模式

如要切换回来,只需执行如下命令:

setenforce 1

如需永久改变SELinux的模式,可直接编辑/etc/selinux/config文件,具体操作如下:

vi /etc/selinux/config

需要注意的是,无论关闭还是开启SELinux,修改完/etc/selinux/config文件,重启生效,而对于已经关闭SELinux的系统而言,再次开启SELinux后,系统必须为磁盘中的文件创建安全上下文,将会使启动变慢。

Tips:SELinux的类型知多少?
/etc/selinux/config文件中的SELINUXTYPE的配置值有那几种?简而言之,SELinux类型主要有如下三种:
◆targeted:系统默认类型,可大部分网络服务进程生效
◆minimum:仅对指定网络服务进程进行生效,此类型不稳定慎用
◆mls:多级安全保护是最严格的类型,对所有的进程生效,除非对安全性有极高的要求,否则不要自讨苦吃

需要说明的是,上述MLS是强制访问控制的一种模式,强制访问控制(MAC)又分为类别安全(MCS)模式和多级安全(MLS)模式,MCS模式下进行安全下文的操作,而MLS模式则更为安全,但不稳定性,慎用。

  10.3.2.SELinux高频操作

由于SELinux使用起来十分庞杂,故总结了如下高频的操作,高频命令及操作如下:
◆查询用户上下文

id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

◆查询文件或目录的安全上下文

ls -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg

◆查询进程的安全上下文

ps -Z
LABEL                              PID TTY          TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 19403 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 19420 pts/0 00:00:00 ps

◆修改文件或目录默认的安全上下文
具体实现如下:

chcon -R -t samba_share_t /shared

然后使用如下命令查询:

cd /
ls -Z
...
unconfined_u:object_r:samba_share_t:s0 shared
...

上述命令中R参数表示递归,主要是针对目录,而t参数则指定安全上下文的类型为samba_share_t。

◆将文件或目录的安全上下文恢复到默认值
具体实现如下:

restorecon -R /shared

再次运行上述命令检测结果,发现已经变为如下默认值了:

unconfined_u:object_r:default_t:s0 shared

◆setsebool命令
setsebool命令是用来修改SElinux内各项规则的布尔值,常和P参数一起使用,令所设置的值成为默认值,永久开启,这样即使重启系统,所设置内容依然有效。

◆getsebool命令
getsebool则是用来获得SELinux规则的布尔值,常和a参数一同使用。

列出SELinux信息

semanage fcontext -l                        #-l表示列出所有SELinux信息
SELinux fcontext                                   type               Context

/.*                                                all files          system_u:object_r:default_t:s0
/[^/]+                                             regular file       system_u:object_r:etc_runtime_t:s0
/a?quota\.(user|group)                             regular file       system_u:object_r:quota_db_t:s0
/nsr(/.*)?                                         all files          system_u:object_r:var_t:s0
/sys(/.*)?                                         all files          system_u:object_r:sysfs_t:s0
/xen(/.*)?                                         all files          system_u:object_r:xen_image_t:s0
/mnt(/[^/]*)?                                      directory          system_u:object_r:mnt_t:s0
/mnt(/[^/]*)?                                      symbolic link      system_u:object_r:mnt_t:s0
/bin/.*                                            all files          system_u:object_r:bin_t:s0
/dev/.*                                            all files          system_u:object_r:device_t:s0
/srv/.*                                            all files          system_u:object_r:var_t:s0
/var/.*                                            all files          system_u:object_r:var_t:s0
/tmp/.*                                            all files          <<None>>
/usr/.*                                            all files          system_u:object_r:usr_t:s0
/run/.*                                            all files          system_u:object_r:var_run_t:s0
/opt/.*                                            all files          system_u:object_r:usr_t:s0
/etc/.*                                            all files          system_u:object_r:etc_t:s0
/lib/.*                                            all files          system_u:object_r:lib_t:s0
/usr/.*\.cgi                                       regular file       system_u:object_r:httpd_sys_script_exec_t:s0
/opt/.*\.cgi                                       regular file       system_u:object_r:httpd_sys_script_exec_t:s0
/root(/.*)?                                        all files          system_u:object_r:admin_home_t:s0
/dev/[0-9].*                                       character device   system_u:object_r:usb_device_t:s0
...

或通过grep命令缩小范围:

semanage fcontext -l|grep /usr/share
/usr/share/.*/gems/.*/helper-scripts/prespawn      regular file       system_u:object_r:passenger_exec_t:s0
/usr/share/man(/.*)?                               all files          system_u:object_r:man_t:s0
/usr/share/rpm(/.*)?                               all files          system_u:object_r:rpm_var_lib_t:s0
/usr/share/doc(/.*)?/README.*                      all files          system_u:object_r:usr_t:s0
/usr/share/glpi(/.*)?                              all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/cups(/.*)?                              all files          system_u:object_r:cupsd_etc_t:s0
/usr/share/gems(/.*)?/helper-scripts(/.*)?         all files          system_u:object_r:bin_t:s0
/usr/share/htdig(/.*)?                             all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/fonts(/.*)?                             all files          system_u:object_r:fonts_t:s0
/usr/share/squid(/.*)?                             all files          system_u:object_r:squid_conf_t:s0
...

◆seinfo命令和sesearch命令
运行如下命令安装:

dnf install setools-console -y

成功安装后,便可运行:

seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.31 (binary, mls)

   Classes:           129    Permissions:       267
   Sensitivities:       1    Categories:       1024
   Types:            4774    Attributes:        258
   Users:               8    Roles:              14
   Booleans:          315    Cond. Expr.:       361
   Allow:          106707    Neverallow:          0
   Auditallow:        155    Dontaudit:       10045
   Type_trans:      18058    Type_change:        74
   Type_member:        35    Role allow:         39
   Role_trans:        416    Range_trans:      5899
   Constraints:       143    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             32
   Genfscon:          102    Portcon:           613
   Netifcon:            0    Nodecon:             0
   Permissives:         0    Polcap:              5 

及如下命令:

sesearch -t samba_share_t --allow
Found 621 semantic av rules:
   allow fail2ban_t file_type : filesystem getattr ;
   allow sandbox_domain sandbox_typeattr_4 : chr_file { ioctl read write getattr lock append } ;
   allow openvpn_t file_type : filesystem getattr ;
   allow sectoolm_t file_type : fifo_file getattr ;
   allow rpm_script_t file_type : fifo_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename open } ;
   allow wine_domain file_type : file execmod ;
   allow readahead_t file_type : dir { ioctl read getattr lock search open } ;
   allow xguest_usertype file_type : filesystem getattr ;
   allow logrotate_t file_type : dir { getattr search open } ;
   allow sendmail_t file_type : filesystem getattr ;
...

10.4.CentOS 8的防火墙

对服务器而言,系统防火墙总是最最基本的安全措施,为什么?前面不是推荐采用硬件防火墙了吗?是这样的,前面推荐采用的硬件防火墙或安全解决方案主要是用来防患外患的,即来自企业网外部的攻击。不过根据对企业安全事件的分析和统计,大约80%的攻击及安全威胁是由企业内部网络发起的,正所谓千防万防家贼难防,而为操作系统安装防火墙,主要是来解决内患,推荐为服务器系统部署和配置防火墙,即使是最为基本的配置也是可以有效地抵挡家贼发起的攻击或嗅探,下面将以CentOS 8为例,就防火墙的部署及配置等多个方面提高系统的安全性。

防火墙的使用思路十分简单,就在一通一堵之间,通的是需要通过防火墙相应端口的流量,堵的是所有非开启端口流量,绝大多数防火墙的使用,通常是先开启所需端口,然后在将默认规则设置为拒绝所有,思路十分简单,其他防火墙的使用思路类似,只是实现方法各不相同而已,不过使用防火墙前,需要先选择一款合适的防火墙。

  10.4.1.动态防火墙FirewallD

从CentOS 7开始,默认的防火墙iptables被一款名为Firewalld的防火墙取代,到了8时代,变化则更大,默认的网络包过滤工具为nftables框架,替代了长期以来的默认框架iptables,为什么要将经典且功能强大的iptables及其框架撤下呢?FirewallD又是怎样一款防火墙呢?FirewallD是一款较新的动态防火墙,青出于蓝而胜于蓝,FirewallD不仅完全支持IPv4和IPv6防火墙设置,并且不需要重启整个防火墙便可应用更改,让配置立即生效,被称作动态管理防火墙,而且强大的区域(Zone)功能令其使用更加便捷和高效,Firewalld的内部结构如图11-2所示。

图11-2 Firewalld的结构原理图(图片来源:https://firewalld.org/)

FirewallD使用区域(zone)的概念来管理,,使用起来比较像较新的硬件防火墙,注意措辞,只是感觉像,改变不了其采用落伍的包过滤防火墙技术的本质,这里的区域其实就是网络端口的集合,每个网卡都属于一个区域,这些区域的配置文件保存在/usr/lib/firewalld/zones/目录下,默认的区域为public,该区域默认网络中其他计算机不能信任,只允许所选中的服务通过,Fiewalld默认的区域为public,该区域只允许SSH以及DHCP客户端这两个服务通过防火墙,除此之外,还有很多其他区域可用。
◆Block
Block区域拒绝任何进入的网络连接,并返回icmp-host-prohibited报文(IPv4)或icmp6-adm-prohibited报文(IPv6),当然初始化的网络连接是例外;

◆DMZ
DMZ区域就是非军事区的意思,其实是一个介于信任网络和非信任网络之间的隔离区域,处于该区域的计算机将有限地被外界网络所访问,且只允许指定的服务通过;

◆Drop
Drop区域任何流入网络的数据包都将被丢弃,也不作出任何响应;

◆Home
家庭区域用在家庭网络,默认信任网络中的大多数主机,且只允许指定的服务通过;

◆Internal
内部网络区域信任网络中的大多数计算机,且只允许指定服务通过;

◆Trusted
信任区域允许所有网络连接,即使没有开放任何服务,此区域的流量照样可以通过;

◆Work
工作网络环境适用,默认信任网络中的大多数计算机,且只允许指定服务通过。

Tips:防火墙分类
防火墙技术发展到今天,从最初的包过滤技术开始,一直到最新的NG防火墙,经历了如下几代:
◆包过滤技术防火墙:又称为无状态防火墙,第一代防火墙技术,基于所定义的过滤规则过滤或丢弃流量;
◆状态包过滤技术防火墙:又称为状态防火墙,第二代防火墙技术,基于包过滤技术并添加状态保存功能,可以监控和保存会话,连接状态等信息;
◆代理服务器:代理服务器可以有效隔离内部网络或外部网络的防火墙技术;
◆下一代(NG)防火墙:第三代防火墙技术,可以实现应用可视性与可控性,深度包检测,高级威胁保护和服务质量。

  10.4.2.管理Firewalld防火墙

可以用如下命令管理Firewalld:

systemctl start firewalld                              #启动Firewalld
systemctl status firewalld                          #获得防火墙服务的状态
systemctl restart firewalld                         #重新启动Firewalld
systemctl stop firewalld                              #停止Firewalld
systemctl enable firewalld                      #启用Firewalld
systemctl disable firewalld                     #停用Firewalld

通常使用默认区域public,如需设置,可使用如下命令来配置Firewalld的默认区域:

firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success

  10.4.3. Firewalld的高频配置

而CentOS服务器端通常使用命令行进行各种配置,由于防火墙配置灵活和复杂,故下面只列出高频配置:
◆获得防火墙工作状态
运行如下命令实现:

firewall-cmd --state
running

◆获得Firewall当前的开放信息
运行如下命令实现:

firewall-cmd --list-all

◆获得当前开放端口
运行如下命令实现:

firewall-cmd --list-port

◆获得当前默认区域
运行如下命令实现:

firewall-cmd --get-default-zone
public

◆获得当前激活区域
运行如下命令实现:

firewall-cmd --get-active-zones
public
  interfaces: ens33 ens34

◆获得当前活动的服务
运行如下命令实现:

firewall-cmd --get-service
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

◆获得永久启用的服务
运行如下命令实现:

firewall-cmd --get-service --permanent
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

◆重新加载防火墙配置
运行如下命令实现:

firewall-cmd --reload

◆设置默认区域设置为trusted
运行如下命令实现:

firewall-cmd --set-default-zone=trusted                         #可以设置任意区域为默认区域

需要强调的是,trusted是信任等级最高的区域,安全度最低,默认允许所有连接,即使没有设置任何的服务。

◆查看端口是否开放
运行如下命令实现:

firewall-cmd --query-port=22/tcp                                    #查询SSH的端口22
firewall-cmd --query-port=80/tcp                                    #查询HTTP端口80
firewall-cmd --query-port=443/tcp                                   #查询HTTP端口443

◆添加所开放的端口
运行如下命令实现:

firewall-cmd --add-port=22/tcp --permanent                          #添加SSH的端口22
firewall-cmd --add-port=80/tcp --permanent                          #添加HTTP的端口80
firewall-cmd --add-port=443/tcp --permanent                         #添加HTTPS的端口443

◆开启服务端口
运行如下命令实现:

firewall-cmd --add-service=ssh --permanent                          #开启SSH的端口22
firewall-cmd --add-service=http --permanent                         #开启SSH的端口80
firewall-cmd --add-service=https --permanent                        #开启SSH的端口443

◆禁用服务端口

firewall-cmd --remove-service=ssh --permanent                       #禁用HTTP的端口80
firewall-cmd --remove-service=http --permanent                      #禁用HTTP的端口80
firewall-cmd --remove-service=https --permanent                     #禁用HTTP的端口80

上述仅是笔者认为比较基础的操作,大家可以灵活地套用,并根据实际需求修改定制,并应用到各种网络服务上,至于Firewalld的更多操作请参考官方主页,地址如下:
https://www.firewalld.org/

官方文档地址如下:
https://www.firewalld.org/documentation/

需要特别注意,本专栏中的各种服务,为了操作方便,且节约篇幅,默认都是关闭防火墙的,大家在实际应用中,应该结合本部分的内容,灵活使用防火墙Firewalld。

  10.4.4.Firewalld高级用法:定制Firewalld区域

前面都是使用现成的区域,要么是默认区域,要么是Fierwalld可以直接修改配置文件进行配置,也可以通过配置工具的命令,这里因为是远程操作为了确保开启后ssh端口是开放的,所以直接修改配置文件:

使用如下命令查看默认的区域的默认配置:

vi /etc/firewalld/firewalld.conf

文件内容如下:
# firewalld config file

# default zone
# The default zone used if an empty zone string is used.
# Default: public
DefaultZone=public
...

定位到DefaultZone关键字,可以看到默认区域为public,下面就可以针对默认区域开始定制了,具体操作如下:

cp /usr/lib/firewalld/zones/public.xml /usr/lib/firewalld/zones/public.xml.bak              #备份默认规则
vim /usr/lib/firewalld/zones/public.xml

根据如下配置修改public.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="cockpit"/>
</zone>

上述配置表示在默认区域public中默认开启了ssh端口,dhcpv6-client端口和cockpit端口,需要添加高频端口http和https端口将public.xml文件修改为如下内容:
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <service name="http"/>                                #添加默认开启HTTP端口
  <service name="https"/>                               #添加默认开启HTTPS端口
</zone>

保存配置后重启Firewalld生效,再查询HTTP和HTTPS服务,默认已经打开了,此外如果要为上述定义的每个服务都对应为/usr/lib/firewalld/services/目录下的一个XML文件,需要进一步的配置,老办法,先备份,再编辑相应文件即可,下面就是几个常用的服务配置文件,可以根据需要修改如下配置:

/usr/lib/firewalld/services/ssh.xml
/usr/lib/firewalld/services/dhcpv6-client.xml
/usr/lib/firewalld/services/cockpit.xml
/usr/lib/firewalld/services/http.xml
/usr/lib/firewalld/services/https.xml

如嫌编辑配置文件修改不方便,还可以使用firewall-cmd进行配置。毫无疑问,基于zone的Firewalld使用起来要比iptables更加简单方便,其动态生效,配置好立马生效,且可以灵活定制,而Iptables功能则更为强大和灵活。

下面顺便来了解一下最新的报过滤框架nftables, 它的出现,主要是替换现有的iptables框架,实现了一个新的包过滤框架,可以认为nftables是iptables 的进化版本。nftables框架主要是由三大组件构成:内核接口,libnl netlink库(与内核通信函数库)及用户空间,其官方网址如下:
https://netfilter.org/projects/nftables/

官方手册地址为:
https://www.netfilter.org/projects/nftables/manpage.html

本章小结
本章较为系统地讲解了安全的基本原理CIA,以及专门针对CentOS服务器系统的硬化流程,重点是文件权限,防火墙,如Firewalld防火墙和SELinux安全机制的实现和使用,及各个高频网络服务的硬化,本章内容多且杂,因此比较零碎。尽管如此,企业的IT安全不能奢望操作系统级的这些措施,更重要的是要有自己的安全设备及解决方案,安全体系和制度,忽视安全将是公司的重大失误,可能导致灾难性的后果。通过本章的学习,掌握系统及各种网络服务的硬化,使用起来更加安全,需要提醒大家的是,本章内容多且杂,因此比较零碎。

EOF

扩展阅读
Using nftables in Red Hat Enterprise Linux 8
https://www.redhat.com/en/blog/using-nftables-red-hat-enterprise-linux-8

40 Linux Server Hardening Security Tips [2019 edition]
https://www.cyberciti.biz/tips/linux-security.html

SECURITY HARDENING
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/security_hardening/index

Install Let's Encrypt to Create SSL Certificates
https://www.linode.com/docs/security/ssl/install-lets-encrypt-to-create-ssl-certificates/

How to enable SSL on NGINX
https://www.techrepublic.com/article/how-to-enable-ssl-on-nginx/

How to install an SSL certificate on a NGINX server
https://helpdesk.ssls.com/hc/en-us/articles/203427642-How-to-install-an-SSL-certificate-on-a-NGINX-server

参考文档
https://en.wikipedia.org/wiki/Uncomplicated_Firewall
https://firewalld.org/
https://firewalld.org/documentation/
https://www.netfilter.org/
https://www.nissatech.com/information-security/
http://www.scap.org.cn/article_home_38.html
https://blog.whsir.com/post-145.html
https://letsencrypt.org/docs/
https://en.wikipedia.org/wiki/Let%27s_Encrypt
https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html
http://www.scap.org.cn/article_home_38.html
https://blog.whsir.com/post-145.html

引用图片索引
10-1 https://www.nissatech.com/wp-content/uploads/2017/05/Picture3-636x534.png
10-2 https://firewalld.org/documentation/firewalld-structure+nftables.png
10-3 https://i.stack.imgur.com/EwGVG.gif/https://s3.amazonaws.com/cp-s3/wp-content/uploads/2015/09/08085516/iptables-Flowchart.jpg

版权声明:
作者:WaterBear
链接:https://l-t.top/2610.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录