云网牛站
所在位置:首页 > Linux培训 > Linux新人培训第九章:系统安全

Linux新人培训第九章:系统安全

2018-05-07 15:09:05作者:admin稿源:未知

本章节主要内容为:系统安全概要、系统备份、加密措施、账户安全、防火墙(Netfilter/Iptables)、防火墙(Netfilter/Firewalld)、安全审计(Audit)、日志系统、服务安全。

 

注:本Linux新人培训教程以中兴新支点服务器操作系统(CGSL)为例。

 

随着现代通信技术的迅速发展,Internet 使用范围不断扩大、用户人数也在不断增加,而 Internet 上任何一台计算机都可能成为网络黑客试图攻击的对象。对于企业和关键应用领域的服务器系统来说,安全问题就显得更为重要。本章主要介绍 CGSL 的系统安全管理策略。

 

9.1.系统安全概要

网络服务器作为 Internet/Intranet 上的关键设备,往往储存了大量的重要信息,或是向大量用户提供重要服务,一旦遭到破坏,后果是很严重的。所以网络建设者和管理员应认真对待安全方面的问题,以保证服务器的正常运行。

9.1.1.安全管理

CGSL 系统安全包括3个要素:物理安全管理、普通用户安全管理和超级用户安全管理。

物理安全管理

1.保证放置计算机的机房的安全,必要时需加报警系统,同时应提供软件备份方案,把备份好的软件放在安全的地点;

2.保证所有的通信设施(包括有线通讯线、电话线、局域网、远程网等)都不会被非法人员监听;

3.钥匙或信用卡识别设备、用户口令和钥匙分配、文件保护、备份或恢复方案等关键文档资料要保存在安全的位置。

普通用户安全管理

1.系统管理员有责任发现并报告系统的安全问题,当普通用户登录时,其 Shell 在给出提示前先执行</etc/profile>文件,要确保该文件中的 PATH 环境变量指定最后搜索当前工作目录;

2.系统管理员可定期抽取一个用户,将该用户安全检查结果(用户的登录情况简报、SUID/SGID 文件列表等)发送到其部门及相关人员;

3.注意提高安全管理意识。系统管理员应强化安全规则,用户必须遵守个人安全标准,在权限允许的范围内进行操作,也可使用一些提高安全性的工具。

超级用户安全管理

1.在日常使用中最好不要使用 root 账号,以普通用户进入系统可以防止对系统进行破坏性的操作,以 root 身份工作时应保证输入的每个命令的正确性;

2.超级用户不要运行其他用户的程序,如有需要,就选用 su 命令进入普通用户账号;

3.经常改变 root 的用户口令;

4.设置用户口令的时效;

5.不要把当前工作目录排在PATH路径表的前边,以免特洛伊木马的侵入,键入/bin/su 来执行 su 命令;

6.不要没注销帐户就离开终端,特别是作为 root 用户时更不能这样;

7.可以将登录名 root 改成别的名称,使破坏者不能在 root 用户登录名下猜测各种可能的用户口令从而非法进入 root 帐户;

8.查出不寻常的系统使用情况,如大量地占用磁盘、CPU 时间、进程,大量地使用 su 的企图,大量的无效登录与到某一系统的网络传输,以及可疑的 ucp 请求;

9.保持系统文件安全的完整性,检查所有系统文件的存取许可,要特别注意设备文件的存取许可,任何具有 SUID 许可的程序都可能是黑客攻击的对象;

10.将磁盘的备份存放在安全的地方;

11.查出久未使用的登录帐户,并取消此帐户;

12.确保没有无用户口令的登录帐户;

13.启动系统记帐、加密、RSA等安全机制;

14.当安装来源不可靠的软件时,要检查源代码和 makefile 文件,查看特殊的子程序调用或命令;

15.如认为系统已泄密,就设法查出责任人与事故原因,并及时进行补救。

9.1.2.常见安全问题及对策

系统安装时的考虑

在系统安装的分区步骤中,不要只图简单把所有的空间都留给根分区,应该把不同的部分放在不同的分区,如/home、/boot、/var 和/tmp。

关闭不必要的服务

通常情况下,系统默认自带的部分服务可能是用户不需要的,用户可以根据实际需要,关闭不必要的服务,以增强系统的安全性。

可执行如下命令停止指定服务:

# systemctl stop <服务名>.service

可执行如下命令禁止服务在系统启动时自动启动:

# systemctl disable <服务名>.service

其中,<服务名>为需要操作的服务名称,如 vsftpd。

帐户口令安全

CGSL 采用了将系统管理员和普通用户分开的策略,这种策略保证了系统的健壮性,同时也使 CGSL 下的病毒难以编写(用户编写的程序仅对自己的目录有写权限,而与操作系统的其它部分是隔离开的)。

脆弱的口令是系统不安全的最主要原因,建议用下面的规则选择有效的口令:

1.至少要有 6 个字符,最好包含一个以上的数字或特殊字符;

2.口令不能太简单,所谓的简单就是很容易猜出来,避免用自己的名字、电话号码、生日、职业或者其它个人信息作为口令;

3.不要把口令写在日历上或计算机旁边等别人能看到的地方;

4.应该设置口令的有效期,在一段时间之后就要更换口令;

5.如果发现有人试图猜测您的口令,而且已经试过多次了,就必须重新设定口令。

对服务器进行设置

可以采用以下防范措施:

1.设置机器的 BIOS 选项,将从硬盘以外的启动设为不允许状态,并在 BIOS 上加设口令,使无权用户无法改变其设定:

2.为 GRUB 或 Lifo 设置口令,只有输入正确的口令时,才能启动机器:

3.只允许超级用户有使用<Ctrl + Alt + Del>组合键的权利,或者禁止任何用户使用< Ctrl + Alt + Del >组合键的权利。这样可以有效地阻止用户在本地控制台登录后,使用< Ctrl + Alt + Del >来关闭或重启系统,导致服务的中断。

文件系统安全

系统中的文件权限通过设置十位的权限标志位实现。所以对一些关键系统文件的属性设置要十分小心,以免导致不可挽回的损失。

带有文件的附加权限位 SUID 与 SGID 的程序运行时会引起很大的安全漏洞,应该尽量减少使用机会。系统管理员应该经常使用 find 命令来浏览自己的文件系统以检查新的 SUID 程序。

此外,可以用 chattr 命令来改变文件的属性,这里主要注意的是两个属性。

a  只可添加属性;

i  不可改变属性;

对于系统的配置文件,最好设置为不可改变属性,而对于一些日志文件,可设置为只可添加属性。参见下面的示例:

#chattr + I /etc/xinetd.conf

#chattr + a /var/log/secure

如果要去掉这些属性,将上面命令中的“+ ”号改为“-”号即可。

 

9.2.系统备份

世界上没有百分之百的安全,为了防止不可顶料的网络攻击、系统硬件故障或用户的非法操作而发生数据丢失,系统管理员必须制定一个备份计划,并定期对系统进行安全备份,以便在系统万一崩溃时,可以及时将系统恢复到最佳状态。

9.2.1.备份前的准备

选择备份介质

有很多介质可以用来进行数据备份,目前比较常用的备份介质为硬盘。用户需要根据自己系统备份计划的实际情况,从可靠性、速度、可用性、易用性和费用成本几个方面考虑来进行备份介质的选择。

进行备份的时机

进行系统备份要定期执行,备份通常应该选择在系统比较空闲时进行,以免影响系统处理正常任务,如可以选择在 0:00 之后进行。

备份策略的选择

1.完全备份

每隔一定时间对系统进行一次全面备份的方法,是最基本的备份方案。但这样做工作量很大,又需要过多的备份介质,因此不能频繁地进行全面备份,要隔一段较长时间,如一个月,进行一次完整备份。但这样一旦发生数据丢失,就只能恢复到上次备份的数据。

2.增量备份

先进行一次完全备份,然后每隔一个较短时间进行一次备份,仅备份在这个期间更改的内容。当经过一个较长时间的积累后再进行一次完全备份。这样每次备份的工作量小,能够频繁操作,而且也比较经济。

3.更新备份

与增量备份方式有些相似。首先每月进行一次完全备份,然后每天进行一次更新数据的备份。不同之处是:增量备份是备份该天更改的数据,而更新备份是备份从上次进行完全备份后更改的全部数据文件。一旦发生数据丢失,可以使用前一个完全备份恢复到前一个月的状态,再使用前一个更新备份恢复到前一天的情况。

增量备份和更新备份都能以较为经济的方式实现,在不同备份策略之间进行选择不但与系统数据更新的方式有关,也依赖于管理员的习惯。

4.备份工具的选择

有许多工具可用于制作备份。CGSL 中提供了传统的 tar、bzipZ、gzip、cpio 等工具,当然也可以使用其它第三方的软件包。

9.2.2.常用备份命令

有时候,我们需要把一组文件贮存成一个文件以便备份或传输到另一个目录甚至另一台机算机上。我们还需要把一组文件压缩成一个文件,因而它占用少量的磁盘空间并能更快地通过网络上下载。

下面介绍 CGSL 下最常用的归档压缩工具 tar、bzipZ、gzip 和 zip。

9.2.2.1.tar 命令

利用 tar 可以将文件和目录归档,也可以在档案中改变文件,或者向档案中加入新的文件。tar 最初被用来在磁带上创建档案,现在则可以在任何设备上使用。tar 命令实现把一大堆文件和目录全部打成一个包的功能,这对于备份或将几个文件组合成一个文件以便网络传输是非常有用的。

tar 命令的语法格式为:

#tar <operation> [options]  

使用时,主选项是必须的,辅助选项可以选用。主选项主要包括:

1. c :创建新的档案文件。如果用户想备份一个目录或是一些文件,就选择此选项。

2. r :把要存档的文件追加到档案文件末。如用户己完成备份文件,又发现还有一部分文件或目录忘记了,就可以使用此选项。

3. t :列出档案文件的内容,查看已经备份了哪些文件。

4. u :更新文件。即用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。

5. x :从档案文件中释放文件。

辅助选项主要有:

6. b :为磁带机而设定,其后跟一数字,用来说明区块的大小。

7. f :使用档案文件或设备,此选项通常为必选项。

8. k :保存已存在的文件,使用户在还原文件中,遇到相同的文件不会进行覆盖。

9. m :在还原文件时,把所有文件的修改时间设定为现在。

10. M :创建多卷的档案文件,以便在几个磁盘中存放。

11. v :详细报告 tar 处理的文件信息。

12. w :每一步都要求确认。

13. z :用 gzip 来压缩/解压缩文件,加上此选项后可以将档案文件进行压缩,还原时一定要有该选项才能进行解压缩。

下面我们通过一些实例来熟悉对备份命令的使用。

例l:把/home 目录包括其子目录全部做成备份文件 home.tar。

#tar cvf home.taf /home  

例2:把/home 目录包括其子目录全部备份并进行压缩,生成文件名为 home.tar.gz。

#tar czvf home.tar.gz /home  

例3:把 home.tar.gz 文件还原并解压缩。

#tar xzvf home.tar.gz  

例4:查看 home.tar 文件的内容,并以分屏方式显示在屏幕上。

#tar tvf home.taf lmofe  

例5:在软盘/dev/fdo 中创建一个备份文件,将/tmp目录中所有的文件都拷贝进来。

#tar cf /dev/fd0 /tmp  

要恢复设备磁盘中的文件,则可使用 xf 选项。

当需要备份的文件大小超过设备的可用存储空间时,可以创建一个多卷的 tar 文件,使用 M 选项向一个软盘存储过程中,系统在一张软盘己满时会提示放入新的软盘,以实现把 tar 档案存入多张磁盘中。如:

#tar cMf /dev/fd0 /home

9.2.2.2.bzip2 和 bunzip2

要使用 bzip2 来压缩文件,在 sehll 提示符下键入以下命令:

#bzip2 filename  

该文件就会被压缩,并被保存为 filename.bz2。

要解开被压缩的文件,键入以下命令:

#bunzip2 filename.bz2  

filename.bz2 文件会被删除,而代之以 filename 文件。

可以使用 bzip2 命令同时处理多个文件和目录,方法是将它们逐一列出,并用空格隔开。例如:

#bzip2 filename.bz2 filel file2 file3 /usr/local/rfinput  

上面的命令把 filel、file2 、file3 以及/usr/local/rfinput 目录的内容压缩起来,存放到 filename.bz2 文件中。

9.2.2.3.gzip 和 gunzip 命令

gzip 是一个经常使用的文件压缩和解压缩命令。该命令的语法格式为:

#gzip [-acdfhlLnNrtvV19] [-S suffix] [name…]  

常用的选项参数如下:

-c :将输出写到标准输出上,并保留原有文件。

-d :将压缩文件解压缩。

-l :对每个压缩文件显示其大小、未压缩文件的大小、压缩比和名称等。

-r :递归式地查找指定目录并压缩其中的所有文件或是解压缩。

-t :测试、检查压缩文件是否完整。

-v :对每一个压缩和解压缩文件,显示文件名和压缩比。

-num :用指定的数字来调整压缩的速度。

现在假设在目录/home 下有文件 aatxt、bbtxt、cctxt,把它们压缩成 gz 文件的命令如下:

#gzip /home/*

#ls

aa.txt.gz bb.txt.gz cc.txt.gz

要将上例中的文件解压,并列出详细的信息,使用命令

#gzip -dv /home/*  

要解开被压缩的文件,也可以使用以下命令:

#gunzip filename.gz  

filename.gz 会被删除,而代之以 filename。

提示:要获得这两个命令的详细信息,可以在 Shell 提示下键入 man gzip 和 man gunzip 来阅读它们的帮组信息。

9.2.2.4.zip 和 unzip

要使用 zip 命令压缩文件,在Shell提示符下键入下面的命令:

#zip -r filename.zip filesdir  

在上例中,filename.zip 表示要创建的压缩文件,filesdir 表示要压缩的文件目录。-r 选项表示递归地压缩所有包括在 filesdir 目录中的文件。

若要解压缩 filename.zip 文件,键入以下命令:

#unzip filename.zip  

可以使用 zip 命令同时处理多个文件和目录,方法是将它们逐一列出,并用空格隔开:

#zip -r filename.zip filel file2 file3 /usr/local/rfinput  

上面的命令把 filel 、file2 、file3 以及/usr/local/rfinput 目录的内容压缩起来,存放到 filename.zip 文件中。

提示:要获得这两个命令的详细信息,请参考 man zip 和 man unzip 的说明页。

 

9.3.加密措施

CGSL 在设计中充分考虑了安全因素,使用了多种有代表性的加密程序来保护系统与用户的安全。

9.3.1.SSH 和 RSA/DSA 认证

SSH ( Secure Shell)是一个用来登录远程服务器并在远程服务器上执行命令的程序,在缺少安全防护的网络上,能为两台互相信任的主机间提供安全可靠的加密通信。SSH 缺省是打开的,可以直接使用。

OpenSSH 是 SSH 协议的免费开源实现。使用OpenSSH工具能够增强系统的安全性。OpenSSH 加密所有的通信(包括口令),有效的防止了窃取和网络攻击。除此之外,OpenSSH 还提供了多种安全认证方法。而 telnet、riogin、ftp 等连接工具使用纯文本口令,并被明文发送,这些信息可能会被截取,未经授权的人员可能会使用截取的口令登录系统并造成危害。

OpenSSH 包括:ssh(替代了 rlogin 和 telnet)、scp(替代了 rcp)、sftp(替代了 ftp)和服务器端的 sshd。其他的基本工具包括 ssh-add、ssh-agent、ssh-keygen 等。

9.3.1.1.使用 RSA/DSA 认证

OpenSSH 不仅是安全的而且是加密的。OpenSSH 的一个更加吸引人的特性是其功能组件一一RSA/DSA 密钥认证系统,它可以代替 OpenSSH 缺省使用的标准安全密码认证系统。

RSA 和 DSA 认证协议基于一对专门生成的密钥(公钥和私钥)的来认证用户。经过适当的配置,能够不必提供密码就同远程机器建立安全的连接。

RSA 和 DSA 认证需要一些初始配置。要设置 RSA 和 DSA 认证,首先需要生成一对密钥,一把私钥和一把公钥。公钥用于对消息进行加密,只有拥有私钥的人才能对该消息进行解密。公钥只能用于加密,而私钥只能用于解密由匹配的公钥编码的消息。

钥匙必须单独为每个用户生成。要为某用户生成密匙,用将要连接到远程机器的用户身份来执行下面的步骤。如果以 root 身份执行下列步骤,就只有 root 用户才能使用这对密匙。

生成 RSA 密钥对

要生成 RSA 密匙对,先在 Shell 提示符下键入下列命令:

#ssh-keygen -t rsa  

当要求输入存放密钥的位置时,按回车键接受<-/ssh/id_rsa>的默认位置。接下来输入一个与用户账号口令不同的口令,再输入一次以确认。

命令完成后,公钥被写入<-/ssh/id_rsapub>;私钥被写入<-/ssh/id_rsa>。注意,一定不要把私钥出示给任何人。

使用 chmod 755 -/ssh 命令改变用户主目录下 ssh 目录的许可权限。

把公钥<-/ssh/id_rsapub>的内容复制到想要连接的远程机器上的<-/ssh/authorized_keys>文件中。如果文件<-/ssh/authorized_keys>不存在,可以把<-/ssh/id_rsapub>文件复制为远程机器的<-/ssh/authorized_keys>文件。

生成 DSA 密钥对

要生成 DSA 密匙对,先在 Shell 提示符下键入下面的命令:

#ssh-keygen -t dsa  

当要求输入存放密钥的位置时,接受<-/ssh/id_dsa>的默认位置。接下来输入一个与用户账号口令不同的口令,再输入一次以确认。

命令完成后,公钥被写入<-/ssh/id_dsapub>;私钥被写入<-/ssh/id_dsa>。注意,一定不要把私钥出示给任何人。

使用 chmod 755 -/ssh 命令改变用户主目录下的 ssh 目录的许可权限。

把公钥<-/ssh/id_dsapub>的内容复制到想要连接的远程机器中的<-/ssh/authorized_key2>文件中。如果文件<-/ssh/authorized_key2>不存在,可以把<-/ssh/id_dsapub>文件复制为远程机器上的<-/ssh/authorized_key2>文件。

配置 ssh-agent

ssh-agent 是一个用于保存私钥的授权代理。只要使用 ssh-add 命令把私钥添加到ssh-agent 的高速缓存中,ssh 将从 ssh-agent 获取您的私钥,而不会提示要密码了。

在 Shell 提示符下,键入下面的命令:

#exec /usr/bin/ssh-agent $SHELL  

然后,键入下面的命令:

#ssh-add  

接着,输入我们的密钥口令。如果配置了不止一个密钥对,会被提示输入每个口令。

当用户注销后,口令就会被忘记。必须在每次登录到虚拟控制台或打开终端窗口时都执行这两条命令。

提示:默认情况下,系统禁止 root 用户通过ssh远程登陆,只能以普通用户身份登陆。

9.3.2.PGP

PGP一Pretty Good Privacy,是一个基于 RSA 公匙加密体系的邮件加密软件。可以用它对您的邮件加密以防止非授权者阅读,它还能在邮件中加上数字签名从而使收信人可以确信邮件的来源。它让用户可以安全地和从未见过的人们通讯,事先并不需要任何保密的渠道用来传递密匙。它采用了审慎的密匙管理,这一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等。

PGP 的创始人是美国的 Phil Zimmermann。它的创造性在于把 RSA 公匙体系的方便和传统加密体系的高速度结合起来,并且在数字签名和密匙认证管理机制上有巧妙的设计。

9.3.3O.PENSSL

Openssl 是一个协议独立的加密方案,在网络信息包的应用层和传输层之间提供了安全的通道。

一些服务器软件,例如 IMAP、POP、Samba、FTP、Apache 等等,在提供服务时需要对用户进行认证,只有认证通过后服务才会被许可。然而对于 server/client 方式的服务,客户端和服务端之间通讯都是以明文方式进行的,Openssl 正是提供了对传输的数据的一种加密方式。

Openssl 可以安装在 CGSL 服务器上,它需要一些第三方提供的应用程序来为服务提供加密。简单说来,就是HTML或CGI经过幕后的服务器进行了加密处理,然而对 HTML和 CGI 的作者来说是透明的。

openssl 软件包提供了 SSL(Secure Sockets Layer)及 TLS(Tansport Layer Security)协议的加密保护,而且提供了 apache 方式的许可证,从而强化了 HTTP 服务器的安全性。

 

9.4.账户安全

9.4.1.用户认证(PAM)

用户认证是操作系统对登录到系统中的用户的身份进行确认和授权的机制,是整个系统安全的重要关卡。PAM 框架是实现用户认证的基础,通过将应用程序与具体的认证机制分离,使得系统改变认证机制时,不再需要修改采用认证机制的应用程序,仅需由管理员配置应用程序的认证服务模块,极大的提高了认证机制的通用性和灵活性。

9.4.2.用户密码强度配置

对用户密码强度的限制是在/etc/pam.d/system-auth 文件中设置的。在这个文件中缺省有下面的一行内容:

Password  requisite  pam_cracklib.so try_first_pass retry=3 minlen=1  

可以在这一行后面附加和密码强度有关的配置选项:

difok=N

这个选项用于定义新旧密码之间的最低差异,缺省值为 5。

minlen=N

这个选项用于定义密码的最短长度,缺省值为 9。

dcredit=N

这个选项用于定义密码中数字出现次数的上限(正数)或下限(负数),缺省值为 1。

ucredit=N

这个选项用于定义密码中大写字母出现次数的上限(正数)或下限(负数),缺省值为 1。

lcredit=N

这个选项用于定义密码中小写字母出现次数的上限(正数)或下限(负数),缺省值为 1。

ocredit=N

这个选项用于定义密码中其它字符出现次数的上限(正数)或下限(负数),缺省值为 1。

 

9.5.防火墙(Netfilter/Iptables)

9.5.1.防火墙(Netfilter/Iptables)介绍

netfilter/iptables(简称 iptables)组成 Linux 平台下的包过滤防火墙,可以完成封包过滤,封包重定向和网络地址转换(NAT)等功能。用户可以根据自己特定的需求来配置防火墙,在防火墙解决方案上节省费用和对IP信息包过滤具有完全控制权。netfilter/iptables IP 信息包过滤系统可用来添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 CGSL 内核中。 在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。下文将详细讨论这些规则以及如何建立这些规则,并将它们分组在链中。

9.5.2.建立规则和链

通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,以设置相关规则来控制信息包的过滤。通过使用 netfilter/iptables 系统提供的特殊命令 iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:

$ iptables [-t table] command [match] [target]  

表(table)

[-t table]表是包含仅处理特定类型信息包的规则和链的信息包过滤表。 有三种可用的表选项:filter、nat 和 mangle。该选项不是必需的,如果未指定,则 filter 用作缺省表。

filter 表用于一般的信息包过滤,它包含 INPUT、OUTPUT 和 FORWARD 链。nat 表用于要转发的信息包,它包含 PREROUTING、OUTPUT 和 POSTROUTING 链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包,该表包含 PREROUTING 和 OUTPUT 链。

注:PREROUTING 链由指定信息包一到达防火墙就改变它们的规则所组成,而 POSTROUTING 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。

命令(command)

上面这条命令中具有强制性的 command 部分是 iptables 命令的最重要部分。它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令:

-A 或--append:该命令将一条规则附加到链的末尾。

示例:

$ iptables -A INPUT -s 205.168.0.1 -j ACCEPT  

该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT。

-D 或--delete:通过用-D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。

示例:

$ iptables -D INPUT --dport 80 -j DROP  

$ iptables -D OUTPUT 3  

第一条命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包。第二条命令只是从 OUTPUT 链删除编号为 3 的规则。

-P 或--policy:该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。

示例:

$ iptables -P INPUT DROP  

该命令将 INPUT 链的缺省目标指定为 DROP。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。

-N 或--new-chain:用命令中所指定的名称创建一个新链。

示例:

$ iptables -N allowed-chain  

-F 或--flush:如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。

示例:

$ iptables -F FORWARD  

$ iptables -F  

-L 或--list:列出指定链中的所有规则。

示例:

$ iptables -L allowed-chain  

匹配(match)

iptables 命令的 match 部分(可选项)指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。下面是一些重要且常用的通用匹配及其示例和说明:

-p 或--protocol:该通用协议匹配用于检查某些特定协议。协议示例有 TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及 ALL(用于所有协议)。ALL 是缺省匹配。可以使用 ! 符号,它表示不与该项匹配。示例:

$ iptables -A INPUT -p TCP, UDP  

$ iptables -A INPUT -p ! ICMP  

在上述示例中,这两条命令都执行同一任务—它们指定所有 TCP 和 UDP 信息包都将与该规则匹配。通过指定 ! ICMP,我们打算允许所有其它协议(在这种情况下是 TCP 和 UDP),而将 ICMP 排除在外。

-s 或--source:该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有IP地址匹配。示例:

$ iptables -A OUTPUT -s 192.168.1.1  

$ iptables -A OUTPUT -s 192.168.0.0/24  

$ iptables -A OUTPUT -s ! 203.16.1.89  

第二条命令指定该规则与所有来自 192.168.0.0 到 192.168.0.24 的 IP 地址范围的信息包匹配。第三条命令指定该规则将与除来自源地址 203.16.1.89 外的任何信息包匹配。

-d 或--destination:该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内IP地址进行匹配,可以使用 ! 符号,表示不与该项匹配。示例:

$ iptables -A INPUT -d 192.168.1.1  

$ iptables -A INPUT -d 192.168.0.0/24  

$ iptables -A OUTPUT -d ! 203.16.1.89  

目标(target)

目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:

ACCEPT:当信息包与具有ACCEPT目标的规则完全匹配时,会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。该目标被指定为 -j ACCEPT。

DROP:当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP。

REJECT:该目标的工作方式与DROP目标相同,但它比 DROP 好。和 DROP 不同,REJECT 不会在服务器和客户机上留下死套接字。另外,REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT。示例:

$ iptables -A FORWARD -p TCP --dport 22 -j REJECT  

RETURN:在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。它被指定为 -jump RETURN。示例:

$ iptables -A FORWARD -d 203.16.1.89 -jump RETURN  

还有许多用于建立高级规则的其它目标,如 LOG、REDIRECT、MARK、MIRROR 和 MASQUERADE 等。

保存规则

用上述方法所建立的规则会被保存到内核中,当重新引导系统时,会丢失这些规则。所以,将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则,那么必须将该规则集保存在文件中。可以使用 iptables-save 命令来做到这一点:

$ iptables-save > iptables-script  

现在,信息包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统,都可以使用 iptables-restore 命令将规则集从该脚本文件恢复到信息包过滤表,如下所示:

$ iptables-restore iptables-script  

如果您愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化shell脚本中。

9.5.3.启动与关闭防火墙

1.检查 iptables 的状态

# systemctl status iptables  

2.检查防火墙规则

#iptables -L -n  

3.检查防火墙 nat 规则

#iptables -t nat -L -n  

4.关闭防火墙

# systemctl stop iptables  

5.开启防火墙

# systemctl start iptables

 

9.6.防火墙(Netfilter/Firewalld)

9.6.1.防火墙(Netfilter/Firewalld)介绍

在 CGSL V5 里一个相互作用的 netfilter 被引入:firewalld。firewalld 是一个系统守护进程,可以配置和监控系统的防火墙规则。应用程序可以使用 DBus 消息系统请求 firewalld 打开端口,它可以禁用或锁定开放的端口。firewalld 涵盖了 IPv4、IPv6 和 ebtables 的设置。firewalld 守护进程来源于 firewalld 包。这个包在 Basice 安装方式会被安装,而在 minimal 安装方式不会被安装。系统默认使用 firewalld 为防火墙,而不是 iptables。

firewalld 是所有网络流量划分为区(zones),简化防火墙管理。例如一个包传入的网络接口时,会根据源IP地址把流量转移到用于相应的区域(zone)的防火墙规则。每个区域(zone)都预设开放的或关闭的端口和服务列表。

9.6.2.区域(zones)概念

firewalld 附带了一些预定义的区域,以适合各种用途。默认区域设置为 public,网络接口将被分配到 public 区,但 lo 接口被分配到 trusted 区。下面的表详细介绍这些区域的结构,但系统管理员可能需要定制这些区域具有不同的设置。默认情况下,由系统发起的通信所有区域都允许任何入站流量与部分出站流量。

区域名字

   默认设置

  trusted

  允许所有的流量传入。

  home

  默认拒绝传入流量,除非是涉及到出站流量或预设的 sshmdnsipp-clientsamba-client 与 dhcpv6-client 服务。

 internal

  默认拒绝传入流量,除非是涉及到出站流量或预设的 sshmdnsipp-  clientsamba-client 与 dhcpv6-client 服务(与 home 区相同)。

  work

  默认拒绝传入流量,除非是涉及到出站流量或预设的 sshipp-client 与 dhcpv6-client 服务。

  public

  默认拒绝传入流量,除非是涉及到出站流量或预设的 ssh 与 dhcpv6-client 服务。新加的网络接口默认会被分配到此区。

external

  默认拒绝传入流量,除非是涉及到出站流量或预设的 ssh 服务。IPv4 传出流量通过该区域转发会被伪装成从 IPv4 网络接口上传出。

  dmz

  默认拒绝传入流量,除非是涉及到出站流量或预设的 ssh 服务。

  block

  默认拒绝所有的传入流量,除非是涉及到出站流量。

  drop

  默认丢弃所有的传入流量,除非是涉及到出站流量(甚至不使用 ICMP 错误回应)。

firewalld 还附带了一些预设的服务。这些服务可以用来容易地使特定网络服务流量穿过防火墙。下面的表格详细介绍防火墙中的区域的默认配置使用的预设服务的设置。

注:其他预设的服务可使用”firewall-cmd –get-services”命令查看,或者查看/usr/lib/firewalld/services 目录下的文件。

Linux新人培训第九章:系统安全

引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化shell脚本中。

9.6.3.防火墙(Netfilter/ firewalld)配置

修改防火墙配置有三种主要方式:

1.通过修改/etc/firewalld 目录下的配置文件。

2.通过使用图形化工具 firewall-config;

3.通过使用命令 firewall-cmd;

注:firewalld 需要依赖 NetworkManager 区分网络接口属于哪个区域,使用 firewalld 配置防火墙前需要确定 NetworkManager 是正在运行。

配置防火墙(firewall-config)

图形化工具 firewall-config,可以检查或者修改防火墙正在运行的、和持续性的配置。通过安装 firewall-config 的 RPM 包里,firewall-config 工具可以从命令行上打开,或从应用程序菜单下 Applications > Sundry > Firewall 打开。如果是普通用户打开 firewall-config 工具需要 root 密码。

Linux新人培训第九章:系统安全

防火墙配置(firewall-config)主界面

在防火墙(firewall-config)配置主界面上,系统管理员可以选择修改当前的或是持续性(永久性)的配置。在大多数情况下,系统管理员将需要调整持久性(永久性)的配置,然后使用 Options > Reload Firewalld 菜单项激活防火墙的改变。

如果要修改网络接口和源 IP 地址/范围所属区域,选择左侧的菜单区的 Zones 选项卡。在右侧的 Interfaces 和 Sources 标签下分别填写网络接口和源IP地址/范围。

端口开放需要在 Services 标签下勾选,或通过在该区域的 Ports 标签下添加一个自定义的端口。

如果一个特定的端口组在多个区域中被开放时,系统管理员也可以定义为那些端口的服务。这可以在左侧的菜单区的 Services 选项卡来完成(配置模式需要选择 Permanent/永久配置)。

注:在 Permanent(永久性配置)所做的任何更改需要重新启动或重新加载 firewalld 服务才生效,在 Runtime(运行时配置)所做的任何更改不会保留在 firewalld 服务重新启动或重新加载后。

配置防火墙(firewall-cmd)

对于那些偏好工作在命令行上的管理员或没有图形环境的情况,可以使用 firewalld 的命令行接口 firewall-cmd。firewall-cmd 接口为主体 firewalld 包的一部分,firewall-config 上执行的操作也可以通过 firewall-cmd 实现。

下面的表列出了一些常用的 firewall-cmd 选项以及描述。注意,除非指定了--permanent 选项,几乎所有的命令都将是临时的配置。命令需要采取--zone=<ZONE>选项,以确定它们影响哪些区域。

firewall-cmd选项

描述

--get-default-zone

查询现在的默认区域。

--set-default-zone=<ZONE>

设置默认区域。修改默认区域会影响临时的配置(runtime)和永久的配置(permanent)。

--get-zones

列出所有可用的区域。

--get-active-zones

列出当前所有正在使用的区域(具有依赖于它们的接口或源IP地址/范围),以及它们的接口或源IP地址/范围。

--add-source=<CIDR> [--zone=<ZONE>]

添加流量路由,所有从IP地址或网络/子网掩码<CIDR>的流量转到指定区域。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--remove-source=<CIDR> [--zone=<ZONE>]

删除流量路由,所有从IP地址或网络/子网掩码<CIDR>的流量转到指定区域的规则将被删除。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--add-interface=<INTERFACE> [--zone=<ZONE>]

添加流量路由,所有从接口<INTERFACE>的流量转到指定区域。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--change-interface=<INTERFACE> [--zone=<ZONE>]

将接口<INTERFACE>与区域<ZONE>关联,旧的关联将被移除。所有从接口<INTERFACE>的流量转到指定区域<ZONE>。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--list-all [--zone=<ZONE>]

列出区域<ZONE>内所有已关联的接口,源,服务和端口。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--list-all-zones

检索并列出所有的所有区域的信息。

--add-service-<SERVICE> [--zone=<ZONE>]

允许服务<SERVICE>通信。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--remove-service-<SERVICE> [--zone=<ZONE>]

在区域<ZONE>允许列表中移除服务<SERVICE>。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--add-port-<PORT/PROTOCOL> [--zone=<ZONE>]

开放端口<PORT/PROTOCOL>通信。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--remove-port-<PORT/PROTOCOL> [--zone=<ZONE>]

在区域<ZONE>允许列表中端口<PORT/PROTOCOL>。如果没有使用--zone=<ZONE>选项指定区域,将使用默认区域。

--reload

重新加载firewall。临时的配置将被移除,加载永久的配置。

firewall-cmd示例

下面的示例默认区域设置为 dmz,来自 192.168.0.0/24 网络的所有流量被分配到 internal 区域,开放 internal 区域的MySQL 网络端口。

#firewall-cmd  --set-default-zone=dmz

#firewall-cmd  --permanent  --zone=internal  --add-source=192.168.0.0/24

#firewall-cmd  --permanent  --zone=internal  --add-service=mysql

#firewall-cmd  --reload

9.6.4.启动与关闭防火墙

6.检查 firewalld 的状态

# systemctl status firewalld  

7.关闭防火墙

# systemctl stop firewalld  

8.开启防火墙

# systemctl start firewalld

 

9.7.安全审计(Audit)

CGSL 内核有用日志记录事件的能力,比如记录系统调用和文件访问。然后,管理员可以评审这些日志,确定可能存在的安全裂口,比如失败的登录尝试,或者用户对系统文件不成功的访问,这种功能称为审计(Audit),CGSL 审计功能由 auditd 服务提供。要使用审计系统,可采用下面的步骤:

(1) 配置审计守护进程(auditd)。

(2) 添加审计规则和观察器来收集所需的数据。

(3) 启动守护进程,它启用了内核中的审计系统并开始进行日志记录。

(4) 通过生成审计报表和搜索日志来周期性地分析数据。

9.7.1.配置审计守护进程(auditd)

审计守护进程(auditd)的默认配置文件为/etc/audit/auditd.conf,用户可以修改该文件定制产生的审计日志。配置文件示例如下:

log_file = /var/log/audit/audit.log

log_format = RAW

log_group = root

priority_boost = 4

flush = INCREMENTAL

freq = 20

num_logs = 4

disp_qos = lossy

dispatcher = /sbin/audispd

name_format = NONE

##name = mydomain

max_log_file = 5

max_log_file_action = ROTATE

space_left = 75

space_left_action = SYSLOG

action_mail_acct = root

admin_space_left = 50

admin_space_left_action = SUSPEND

disk_full_action = SUSPEND

disk_error_action = SUSPEND

##tcp_listen_port =

tcp_listen_queue = 5

tcp_max_per_addr = 1

##tcp_client_ports = 1024-65535

tcp_client_max_idle = 0

enable_krb5 = no

krb5_principal = auditd

##krb5_key_file = /etc/audit/audit.key

其中

log_file

审计日志文件的完整路径。

log_format

写日志时要使用的格式。

priority_boost

审计应采用多少优先级推进守护进程。必须是非负数。0 表示没有变化。

flush

多长时间向日志文件中写一次数据。值可以是 NONE、INCREMENTAL、DATA 和 SYNC 之一。如果设置为 NONE,则不需要做特殊努力来将数据刷新到日志文件中。如果设置为 INCREMENTAL,则用 freq 选项的值确定多长时间发生一次向磁盘的刷新。如果设置为DATA,则审计数据和日志文件一直是同步的。如果设置为SYNC,则每次写到日志文件时,数据和元数据是同步的。

freq

如果 flush 设置为 INCREMETNAL,审计守护进程在写到日志文件中前从内核中接收的记录数。

num_logs

max_log_file_action 设置为 ROTATE 时要保存的日志文件数目。必须是 0~99 之间的数。如果设置为小于 2,则不会循环日志。默认为 0,意味着从来不循环日志文件。

dispatcher

当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式产生它们。非必须选项。

disp_qos

控制调度程序与审计守护进程之间的通信类型。有效值为 lossy 和 lossless。如果设置为 lossy,若审计守护进程与调度程序之间的缓冲区已满(缓冲区为 128 千字节),则发送给调度程序的引入事件会被丢弃。然而,只要 log_format 没有设置为 nolog,事件就仍然会写到磁盘中。如果设置为 lossless,则在向调度程序发送事件之前和将日志写到磁盘之前,调度程序会等待缓冲区有足够的空间。

max_log_file

以兆字节表示的最大日志文件容量。当达到这个容量时,会执行 max_log_file_action 指定的动作。

max_log_file_action

当达到 max_log_file 的日志文件大小时采取的动作。值必须是 IGNORE、SYSLOG、SUSPEND、ROTATE 和 KEEP_LOGS 之一。如果设置为 IGNORE,则在日志文件达到 max_log_file 后不采取动作。如果设置为 SYSLOG,则当达到文件容量时会向系统日志/var/log/messages 中写入一条警告。如果设置为 SUSPEND,则当达到文件容量后不会向日志文件写入审计消息。如果设置为ROTATE,则当达到指定文件容量后会循环日志文件,但是只会保存一定数目的老文件,这个数目由 num_logs 参数指定。老文件的文件名将为 audit.log.N,其中 N 是一个数字。这个数字越大,则文件越老。如果设置为 KEEP_LOGS,则会循环日志文件,但是会忽略 num_logs 参数,因此不会删除日志文件。

space_left

以兆字节表示的磁盘空间数量。当达到这个水平时,会采取 space_left_action 参数中。

space_left_action

当磁盘空间量达到 space_left 中的值时,采取这个动作。有效值为 IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE 和 HALT。如果设置为 IGNORE,则不采取动作。如果设置为 SYSLOG,则向系统日志/var/log/messages 写一条警告消息。如果设置为 EMAIL,则从 action_mail_acct 向这个地址发送一封电子邮件,并向/var/log/messages 中写一条警告消息。如果设置为 SUSPEND,则不再向审计日志文件中写警告消息。如果设置为 SINGLE,则系统将在单用户模式下。如果设置为 SALT,则系统会关闭。

action_mail_acct

负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名,则假定主机名为本地地址,比如 root。必须安装 sendmail 并配置为向指定电子邮件地址发送电子邮件。

admin_space_left

以兆字节表示的磁盘空间数量。用这个选项设置比 space_left_action 更多的主动性动作,以防万一 space_left_action 没有让管理员释放任何磁盘空间。这个值应小于 space_left_action。如果达到这个水平,则会采取 admin_space_left_action 所指定的动作。

admin_space_left_action

当自由磁盘空间量达到 admin_space_left 指定的值时,则采取动作。有效值为 IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE 和 HALT。与这些值关联的动作与 space_left_action 中的相同。

disk_full_action

如果含有这个审计文件的分区已满,则采取这个动作。可能值为 IGNORE、SYSLOG、SUSPEND、SINGLE 和 HALT。与这些值关联的动作与 space_left _action 中的相同。

如果不循环审计日志文件,则含有/var/log/audit/的分区可能变满并引起系统错误。因此,建议让/var/log/audit/位于一个单独的专用分区。

disk_error_action

如果在写审计日志或循环日志文件时,检测到错误时采取的动作。其值必须是 IGNORE、SYSLOG、SUSPEND、SINGLE 和 HALT 之一。这些值的含义与 space_left_action 中的相同。

9.7.2.编写审计规则

要添加审计规则,可在/etc/audit/audit.rules 文件中使用下面的语法:

-a <list>,<action> <options>  

列表名(list)必须是下列名称之一

task

每个任务的列表。只有当创建任务时才使用。只有在创建时就已知的字段(比如 UID)才可以用在这个列表中。

entry

系统调用条目列表。当进入系统调用确定是否应创建审计时使用。

exit

系统调用退出列表。当退出系统调用以确定是否应创建审计时使用。

user

用户消息过滤器列表。内核在将用户空间事件传递给审计守护进程之前使用这个列表过滤用户空间事件。有效的字段只有 uid、auid、gid 和 pid。

exclude

事件类型排除过滤器列表。用于过滤管理员不想看到的事件。用 msgtype 字段指定您不想记录到日志中的消息。

动作(action)必须下面的参数之一:

never

不生成审计记录。

always

分配审计上下文,总是把它填充在系统调用条目中,总是在系统调用退出时写一个审计记录。

<options>可以包括下面几个选项中的一个或多个。

-S <syscall>

根据名称或数字指定一个系统调用,要指定所有系统调用,可使用 all 作为系统调用名称。如果程序使用了这个系统调用,则开始一个审计记录。可以为相同的规则指定多个系统调用,每个系统调用必须用-S 启动。在相同的规则中指定多个系统调用。

- F <name[=,!=,<,>,<=]value>

指定一个规则字段。如果为一个规则指定了多个字段,则只有所有字段都为真才能启动一个审计记录。每个规则都必须用-F 启动,最多可以指定 64 个规则。如果用用户名和组名作为字段,而不是用 UID 和 GID,则会将它们解析为 UID 和 GID 以进行匹配。下面是有效的字段名:

pid       进程 ID。

ppid       父进程的进程 ID。

uid       用户 ID。

euid       有效用户 ID。

suid       设置用户 ID。

fsuid       文件系统用户 ID。

gid       组 ID。

egid       有效组 ID。

sgid       设置组ID。

fsgid       文件系统组 ID。

auid       审计 ID,或者用户登录时使用的原始 ID。

msgtype       消息类型号。只应用在排除过滤器列表上。

pers       OS Personality Number。

Arch       系统调用的处理器体系结构。指定精确的体系结构,比如 i686(可以通过 uname -m 命令检索)或者指定 b32 来使用 32 位系统调用表,或指定 b64 来使用 64 位系统调用表。

inode        Inode Number。

exit       从系统调用中退出值。

success       系统调用的成功值。1 表是真/是,0 表示假/否。

a0,a1,a2,a3      分别表示系统调用的前 4 个参数。只能用数字值。

Key                设置用来标记事件的审计日志事件消息的过滤键。当添加观察器时,类似于使用-k 选项。

obj_user       资源的 SELinux 用户。

obj_role        资源的 SELinux 角色。

obj_type        资源的 SELinux 类型。

obj_lev_low            资源的 SELinux 低级别。

obj_lev_high           资源的 SELinux 高级别。

subj_role                 程序的 SELinux 角色。

subj_type                程序的 SELinux 类型。

subj_sen                 程序的 SELinux 敏感性。

subj_clr                   程序的 SELinux 安全级别(clearance)。

-a 选项向列表末尾添加规则。要向列表开头添加规则,可用-A 替换-a。删除语法相同的规则,用-d 替换-a。要删除所有规则,可指定-D 选项。审计规则示例:

#Record all file opens from user 501

#Use with caution since this can quickly

#produce a large quantity of records

-a exit,always -S open -F uid=501 -F key=501open

#Record file permission changes

-a entry,always -S chmod

审计规则日志消息例子:

type=SYSCALL

msg=audit(1168206647.422:5227):

arch=c000003e

syscall=success=no

exit=-2

a0=7fff37fc5a40

a1=0

a2=2aaaaaaab000

a3=0

items=1

ppid=26640

pid=2716

auid=501

uid=501

gid=501

euid=501

suid=501

fsuid=501

egid=501

sgid=501

fsgid=501

tty=pts5 comm="vim"

exe="/usr/bin/vim"

key="501open"。

9.7.3.使用审计监控文件

CGSL 审计系统也允许管理员监控文件和目录。通过设置观察器在一个文件或目录上,可以监控文件和目录上发生的指定动作,如:打开、读写和执行。

示例如下:

/etc/security/  

/etc/selinux/ 

/etc/bashrc  

/etc/profile

-w /etc/security -p wa -k ETC_SECURITY

-w /etc/selinux -p wa -k ETC_SELINUX

-w /etc/bashrc -p wa -k ETC_BASHRC

-w /etc/profile -p wa -k ETC_PROFILE

其中,-w 表示观察(watch)的对象,即需要观察的文件或目录;-p 用于指定观察的动作,wa 表示观察“write”和“append”动作,即当被观察对象发生“write”和“append”动作时,记录相关的审计日志信息;-k用于指定本条规则的 key,利用该关键字可以过滤指定规则相关的审计日志信息。

设置好审计规则后,auditd 服务将根据设定的规则,对指定文件和目录进行监控,并将相关的审计日志信息默认记录于/var/log/audit/audit.log 文件中,用户可以通过该日志文件查看相关的审计信息。由于记录的审计信息量比较大,也可以使用 ausearch 工具通过审计规则中设定的 key 来对审计信息进行过滤,获取用户需要的信息,如:如果需要查看/etc/selinux/目录相关的审计信息,可以使用如下命令来获取:

#ausearch -k ETC_SELINUX  

审计观察器的示例日志如下:

time->Mon Dec 20 10:16:05 2017 

type=CONFIG_CHANGE

msg=audit(1292811365.978:24):

auid=4294967295

op=add

rule

key="ETC_SELINUX"

list=4

res=1

提示:如果在运行守护进程时通过修改配置文件/etc/audit/audit.rules 修改审计规则,则须要以根用户身份用 systemctl auditd restart 命令启用修改。

 

9.8.日志系统

系统日志是操作系统安全事件的重要记录机制。CGSL 操作系统提供了完善的系统日志体系,日志记录内容涵盖常规日志、用户登录日志、用户操作日志、系统性能日志、系统审计日志等,为操作系统安全事件的记录、分析、追踪提供了有力的支撑。

9.8.1.定位日志文件

大多数日志文件都位于目录/var/log/目录下。一些应用程序,如 httpd,samba 等,这些应用程序会就在目录/var/log 下生成一个存放对应应用程序日志文件的目录。

在存放日志文件的目录中,我们会注意到每个日志文件后面都有一个数字编号,这些编号是在每个轮换周期结束的时候,有一个脚本或者工具程序更改每个文件的名字,然后把较早的数据向文件链的结尾推。例如,假设某个日志文件的名字叫做 logfile,则它的备份文件可能叫做 logfile.1、logfile.2,依此类推。如果每周轮换一次,并且保存 8 周的数据,那么就会有一个 logfile.8 文件但没有 logfile.9 文件。每周随着 logfile.7 文件覆盖 logfile.8 文件,logfile.8 中原来的数据就没了。由于日志文件在不停得轮转使用,所以每个日志文件都不会很大。日志文件轮转里有一个 cron 守护线程,它能依照/etc/logrotate.conf 配置文件和/etc/logrotate.d/目录下的配置文件在各日志文件之间进行轮转。默认情况下,轮转周期为一周,日志保存周期为 4 周。

大多数日志文件都是文本文件的格式,我们可以直接使用文本阅读器进行查看,例如 Vi、Emaces 工具等。某些日志文件可供系统中的所有用户查看,管理员权限的 root 帐户可以查看绝大多数的日志文件。

9.8.2.重要日志说明

/var/log/messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,可以在 messages 文件中观察它的活动。通常,/var/log/messages 是在做故障诊断时首先要查看的文件。

/var/log/secure 日志是用户登录信息日志文件。它包含用户登录登出信息。

/var/log/maillog 日志是系统的邮件日志。它包含邮件服务器的发送和接收邮件信息。

/var/log/dmesg 日志是系统硬件的日志。

/var/log/mcelog 日志是记录系统运行过程中发现的硬件错误信息,包含内存错误,io 错误等日志。

9.8.3.rsyslog

rsyslog 是 CGSL V5 版本默认的日志管理软件,rsyslog 是一个 syslogd 的多线程增强版,它提供了 MySQL 和完全可配置的输出格式(包括大时间戳)的支持。

9.8.3.1.rsyslog 配置

rsyslog 的配置文件是</etc/rsyslog.conf>,如下介绍其基本配置。

/etc/rsyslog.conf 根据如下的格式定义规则:

facility.level action  

设备.优先级 动作  

facility.level 字段也被称为 seletor(选择条件),选择条件和动作之间用空格或 tab 分割开。#号开头的是注释,空白行会自动跳过。

facility(设备)

facility 定义日志消息的范围,其可使用的 key 有:

auth -由 pam_pwdb 报告的认证活动

authpriv -包括特权信息如用户名在内的认证活动

cron -与 cron 和 at 有关的计划任务信息

daemon -与 inetd 守护进程有关的后台进程信息

kern -内核信息,首先通过 klogd 传递

lpr -与打印服务有关的信息

mail -与电子邮件有关的信息

mark - syslog 内部功能用于生成时间戳

news -来自新闻服务器的信息

syslog -由 syslog 生成的信息

user -由用户程序生成的信息

uucp -由 uucp 生成的信息

local0-local7 -与自定义程序使用

* 通配符代表除了 mark 以外的所有功能

level 级别(优先级)

level 定义消息的紧急程度。按严重程度由高到低顺序排列为:

emerg -该系统不可用,等同 panic

alert -需要立即被修改的条件

crit -阻止某些工具或子系统功能实现的错误条件

err -阻止工具或某些子系统部分功能实现的错误条件,等同 error

warning -预警信息,等同 warn

notice -具有重要性的普通条件

info -提供信息的消息

debug -不包含函数条件或问题的其他信息

none -没有重要级,通常用于排错

* 所有级别,除了 none

selector 选择条件

通过小数点符号“.”把 facility 和 level 连接在一起则成为 selector(选择条件)。

可以使用分号“;”同时定义多个选择条件。也支持三个修饰符:

* - 所有日志信息

= - 等于,即仅包含本优先级的日志信息

! - 不等于,本优先级日志信息除外

action(动作)

由前面选择条件定义的日志信息,可执行下面的动作:

file-指定日志文件的绝对路径

terminal 或 print -发送到串行或并行设备标志符,例如/dev/ttyS2

@host -远程的日志服务器

username -发送信息本机的指定用户信息窗口中,但该用户必须已经登陆到系统中

named pipe -发送到预先使用 mkfifo 命令来创建的 FIFO 文件的绝对路径

例如:

*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages

#把除邮件、新闻组、授权信息、计划任务等外的所有通知性消息都写入 messages 文件中。

mail,news.=info /var/adm/info

#把邮件、新闻组中仅通知性消息写入 info 文件,其他信息不写入。

mail.*;mail.!=info /var/adm/mail

#把邮件的除通知性消息外都写入 mail 文件中。

mail.=info /dev/tty12

#仅把邮件的通知性消息发送到 tty12 终端设备

*.* @finlandia

#把所有信息都导向到 finlandia 主机(通过/etc/hosts 或 dns 解析其 IP 地址)

提示:默认的配置文件在多数情况下应该可以胜任。如果要进行更细致的定制,请阅读 rsyslog 的手册页。

9.8.3.2.设置 rsyslog 接收远程日志

默认情况下,rsyslog 进程是不能接受其他日志服务器发过来的消息的。而通过修改其启动参数,可实现远程日志接收功能。

修改/etc/sysconfig/rsyslog 文件中的 SYSLOGD_OPTIONS 配置,其中:

-r :打开接受外来日志消息的功能;

-x :关闭自动解析对方日志服务器的 FQDN 信息,这能避免 DNS 不完整所带来的麻烦;

-m :修改 syslog 的内部 mark 消息写入间隔时间(0 为关闭),例如 240 为每隔 240 分钟写入一次“--MARK--”信息;

-c :打开兼容模式

CGSL 默认情况下,/etc/sysconfig/rsyslog 实际配置文件参数为:

SYSLOGD_OPTIONS="-c2 -r -x"  

修改配置并保存后,重启服务即可使其生效:

#systemctl restart rsyslog  

客户机只要通过修改 rsyslog.conf,定义动作为@主机或IP,即可发送日志信息到本服务器中。

9.8.4.Logrotate

logrotate 是 CGSL 系统日志的管理工具。它可以轮换,压缩,邮件系统日志文件。默认的 logrotate 被加入 cron 的/etc/cron.daily 中作为每日任务执行。

/etc/logrotate.conf 为其默认配置文件指定每个日志文件的默认规则。/etc/logrotate.d/* 为/etc/logrotate.conf 默认包含目录其中文件也会被 logrotate 读取。指明每个日志文件的特定规则。var/lib/logrotate.status 中默认记录 logrotate 上次轮换日志文件的时间。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数

  功能描述

  compress

  通过gzip 压缩转储以后的日志

  nocompress

  不需要压缩时,用这个参数

 copytruncate

  用于还在打开中的日志文件,把当前日志备份并截断

  nocopytruncate

   备份日志文件但是不截断

  create mode owner group

  转储文件,使用指定的文件模式创建新的日志文件

  nocreate

  不建立新的日志文件

  delaycompress

  与compress 一起使用时,转储的日志文件到下一次转储时才压缩

  nodelaycompress

  覆盖 delaycompress 选项,转储同时压缩。

  errors address

  专储时的错误信息发送到指定的Email 地址

  ifempty

  即使是空文件也转储,这个是 logrotate 的缺省选项。

  notifempty

  如果是空文件的话,不转储

  mail address

  把转储的日志文件发送到指定的E-mail 地址

  missingok

  如果日志不存在则忽略该警告信息

  nomail

  转储时不发送日志文件

  olddir directory

  转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

  noolddir

  转储后的日志文件和当前日志文件放在同一个目录下

  prerotate/endscript

  在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

  postrotate/endscript

  在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

  daily

  指定转储周期为每天

  weekly

  指定转储周期为每周

  monthly

  指定转储周期为每月

  rotate count

  指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份

  tabootext [+] list

  不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig .rpmsave size size当日志文件到达指定的大小时才转储,可以指定bytes(缺省)以及K或者M

  dateext

  使用日期作为命名格式

  dateformat

  配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数

CGSL 中 logrotate 缺省的配置如下

# see "man logrotate" for details

# rotate log files weekly

weekly

# keep 4 weeks worth of backlogs

rotate 4

# create new (empty) log files after rotating old ones

create

# use date as a suffix of the rotated file

dateext

# uncomment this if you want your log files compressed

#compress

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here

/var/log/wtmp {

monthly

create 0664 root utmp

minsize 1M

rotate 1

}

/var/log/btmp {

missingok

monthly

create 0600 root utmp

rotate 1

}

# system-specific logs may be also be configured here.

默认参数解析:

weekly:指定所有的日志文件每周转储一次

rotate 4:指定转储文件的保留 4 份

create:指定 logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。

dateext:使用日期作为命名格式

include /etc/logrotate.d:选项允许系统管理员把分散到/etc/logrotate.d 目录下几个文件的转储信息,集中到一个主要的配置文件。

为指定的文件配置转储参数:

经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

/full/path/to/file

{

option(s)

}

下面的例子就是每月转储/var/log/wtmp 一次:

#Use logrotate to rotate wtmp

/var/log/wtmp

{

monthly

rotate 1

}

Logrotate 默认是按天执行,任务计划存放在/etc/cron.daily/logrotate 文件里,如果需要修改 logrotate 立即生效,可执行以下命令:

#logrotate /etc/logrotate.conf

 

9.9.服务安全

CGSL 系统为满足用户需求默认启动了相关服务,而带来一定的安全风险,可以通过相关系统命令对系统中的服务进行控制。包括:服务的启动、停止和状态查询;查看系统服务在各运行级别下的默认启动情况;在系统启动时默认启动指定服务;去除在系统启动时默认启动的服务。

 

相关主题

使用iptables保护Linux桌面系统安全

精选文章
热门文章