60分钟

第4章 Linux服务管理

【学习目标】

1.知识目标

了解Netfilter管理工具。

了解Nftables命令行工具。

理解防火墙概念。

理解进程和线程的概念。

掌握SELinux强制访问控制。

掌握Firewall防火墙。

掌握设计和配置PAM高级规则。

掌握进程的创建、调度和销毁。

掌握查看系统进程命令。

掌握配置网络的方法。

掌握配置静态路由的方法。

理解双网卡配置方法。

掌握系统定时任务。

掌握at命令的使用。

2.技能目标

SELinux强制访问控制方法。

Firewall防火墙配置。

设计和配置PAM高级规则。

进程的创建、调度和销毁。

查看系统进程命令。

配置网络的方法。

配置静态路由的方法。

系统定时任务。

at命令的使用。

【认证考点】

掌握SELinux强制访问控制方法。

掌握Firewall防火墙配置。

掌握设计和配置PAM高级规则。

掌握进程的创建、调度和销毁。

掌握查看系统进程命令。

掌握配置网络的方法。

掌握配置静态路由的方法。

掌握系统定时任务。

掌握at命令的使用。

了解Netfilter管理工具。

了解Nftables命令行工具。

理解防火墙概念。

理解进程和线程的概念。

项目引导:Linux服务器网络配置与自动化管理

【项目描述】

对于软件工程师、网络运维工程师来说,一定会遇到Linux的典型应用场景,如Linux系统的网络配置、Linux自动化管理等。本次项目以Linux系统为背景,设计一个网络配置案例和自动化管理任务案例。其中网络配置案例主要涉及到自动获取IP、静态IP、静态路由、双网卡绑定、SELiunx等网络安全的基本配置;自动化管理任务案例涉及到crontab周期性计划和at一次性计划等内容。

知识储备

4.1系统安全

Linux操作系统是一种开源的、普遍使用的操作系统,不管是个人还是企业运维人员经常在该系统中进行服务器搭建、网络配置等操作,这也成为许多网络攻击者的目标之一。如何让系统更加安全稳定的运行,也成为大家关注问题之一。本节从访问控制、防火墙、nftables、netfilter及PAM等方面讲解Linux系统安全。

4.1.1 SELinux强制访问控制

SELinux(Secure Enhanced Linux)是提供安全访问控制安全策略的机制,它是一项功能或者服务,主要用于将用户限制为系统管理员而设置的某些政策和规则。

1.SELinux的来源

SELinux是由美国国家安全局针对计算机基础结构安全开发的一个全新的Linux安全策略机制。从Linux2.6内核之后就将SELinux集成在了内核当中,因为SELinux是内核级别的,所以对其配置文件的修改都是需要重新启动操作系统才能生效的。现在主流的Linux版本里面都集成了SELinux机制,如CentOS/RHEL版本都默认开启SELinux机制。

2.SELinux基本概念

Linux操作系统的安全机制其实就是对进程和系统资源(如文件、网络套接字、系统调用等)做出限制。在初级的第6章Linux操作系统基础中已经详细讲解了Linux操作系统是通过用户和组的概念来对系统资源进行限制,每个进程都需要一个用户才能执行。

在SELinux中有了两个新的基本概念,分别为域(domin)和上下文(context)。域就是用来对进程进行限制,而上下文就是对系统资源进行限制。

可以通过ps -Z命令来查看当前进程的域的信息,也是进程的SELinux信息,如图4-1-1所示。

图4-1-1查看进程

通过ls -Z命令查看文件上下文信息,也是文件的SELinux信息,如图4-1-2所示。

图4-1-2 查看文件上下文信息

3.策略

在SELinux中是通过定义策略来控制哪些域可以访问哪些上下文。在SELinux中,预置了多种的策略模式,不需要自己去定义策略,除非是需要对一些服务或者程序进行保护。

在CentOS/RHEL系统中,其默认使用的是目标(target)策略,什么是目标策略呢?目标策略定义了只有目标进程受到SELinux限制,非目标进程就不会受到SELinux限制,通常网络应用程序都是目标进程,如httpd、mysqld,dhcpd等网络应用程序。

CentOS系统中SELinux配置文件是存放在/etc/sysconfig/目录下的selinux文件,通过cat命令查看里面内容,如图4-1-3所示,代码如下:

图4-1-3 查看selinux文件

4.SELinux工作模式

SELinux的工作模式有三种,分别为enforcing、permissive和disabled。

①enforcing强制模式是指只要是违反策略的行动都会被禁止,并作为内核信息记录,如图4-1-4中,SELinux的工作模式设置为enforcing。采用getenforce查看SELLinnux的工作模式,如图4-1-4所示。

图4-1-4 查看SELLinux工作状态

②permissive允许模式是指违反策略的行动不会被禁止,但是会提示警告信息。

③disabled禁用模式是指禁用SELinux,与不带SELinux系统是一样的,通常情况下会在不了解SELinux时,将模式设置成disabled,这样在访问一些网络应用时就不会出问题了。

SELinux默认的工作模式是enforcing,可以将其修改为permissive或者是disabled。查看当前SELinux的工作状态,可以使用“getenforce”命令来查看,如图4-1-5所示。

图4-1-5设置SELinux模式

设置当前的SELinux工作状态,可以使用“setenforce 0|1”命令来修改,setenforce 0表示设置成permissive模式,1表示enforcing模式,如图4-1-5所示。

【注意】通过“setenforce”命令来设置SELinux只是临时修改,当系统重启后就会失效了,所以如果要永久修改,还是需要通过修改SELinux主配置文件selinux来进行修改。“setenforce”无法在disabled的模式下进行模式的切换。

5.上下文信息

通过“ls -Z”命令来查看文件的上下文信息,也就是SELinux信息,比传统的“ls”命令多出来了“system_u:object_r:admin_home_t:s0”信息,如图4-1-6所示。

图4-1-6“ls -Z”与ls对比

分析这段语句所代表的含义。

system_u:object_r:admin_home_t:s0

这条语句划分成了四段,第一段system_u代表的是用户,第二段object_r表示的是角色,第三段是SELinux中最重要的信息,admin_home表示的是类型,最后一段s0是跟MLS、MCS相关。

①system_u是指的是SELinux用户,root表示root账户身份,user_u表示普通用户就是指无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配其权限是不同的,虽然可以使用“su”命令切换用户但对于SELinux的用户并没有发生本质改变,在targeted策略环境下用户标识没有实质性作用。

②object_r为文件目录的角色,system_r为进程的角色,在targeted策略环境中用户的角色为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。

③admin_home文件和进程都有一个类型,SELinux依据类型的相关组合来限制存取权限。

④s0 是与MLS、MCS相关的内容。

4.1.2 Firewall防火墙

防火墙主要作用是及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。

在CentOS 7操作系统中默认使用的是Firewall作为防火墙,采用Firewalld来启动、查看、配置防火墙。

1.Firewalld的基本使用

①启动,代码如下:

systemctl start firewalld

②查看状态,代码如下:

systemctl status firewalld 

③禁用,禁止开机启动,代码如下:

 systemctl disable firewalld

④停止运行,代码如下:

systemctl stop firewalld

Firewalld的基本使用如下图4-1-7所示。

图4-1-7 Firewalld基本使用

2.配置firewalld-cmd

firwall-cmd是Linux提供的操作Firewall的一个工具,firewall-cmd的常见操作如图4-1-8所示。

①查看版本,代码如下:

firewall-cmd –version

②查看帮助,代码如下:

firewall-cmd –help

③显示状态,代码如下:

firewall-cmd –state

④查看防火墙规则,代码如下:

firewall-cmd --list-all
图4-1-8 firewall-cmd命令

⑤查询端口是否开放,命令格式如下:

firewall-cmd –permanent --****

【实例4-1-1】Firewall开放端口、移出端口等操作,如图4-1-9所示。

如开放80、8080-8085端口,代码如下:

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8080-8085/tcp

移除端口,如移出8080端口,代码如下:

firewall-cmd --permanent --remove-port=8080/tcp

查看防火墙的开放的端口,代码如下:

firewall-cmd --permanent --list-ports
#查看所有打开的端口
firewall-cmd --zone=public --list-ports
图4-1-9 firewall-cmd端口命令

⑥重启防火墙,修改配置后要重启防火墙,代码如下:

firewall-cmd –reload
#更新防火墙规则,重启服务
firewall-cmd --completely-reload

【实例4-1-2】新增端口,重启Firewall,如图4-1-10所示。

图4-1-10 重新firewall配置

⑦查看已激活的Zone信息,代码如下

 firewall-cmd --get-active-zones。
#查看指定接口所属区域
firewall-cmd --get-zone-of-interface=eth0

拒绝所有包,代码如下:

firewall-cmd --panic-on

取消拒绝状态,代码如下:

firewall-cmd --panic-off

查看是否拒绝,代码如下:

firewall-cmd --query-panic

3.管理服务

【实例4-1-3】以smtp服务为例, 添加到work zone,如图4-1-11所示。

添加,代码如下:

firewall-cmd --zone=work --add-service=smtp

查看,代码如下:

firewall-cmd --zone=work --query-service=smtp

删除,代码如下:

firewall-cmd --zone=work --remove-service=smtp
图4-1-11 添加、查看、删除tmtp服务

4.配置IP地址伪装

查看,代码如下:

firewall-cmd --zone=external --query-masquerade

打开,代码如下:

firewall-cmd --zone=external --add-masquerade

关闭,代码如下:

firewall-cmd --zone=external --remove-masquerade

5.端口转发

打开端口转发,首先需要打开IP地址伪装,代码如下:

firewall-cmd --zone=external --add-masquerade

如 转发tcp 22 端口至3753,代码如下:

firewall-cmd --zone=external --add-forward-port=22:porto=tcp:toport=3753

如转发端口数据至另一个IP的相同端口,代码如下:

firewall-cmd --zone=external--add-forward-port=22:porto=tcp:toaddr=192.168.1.6

转发端口数据至另一个IP的3753端口,代码如下:

firewall-cmd --zone=external 
--add-forward-port=22:porto=tcp:toport=3753:toaddr=192.168.1.6

4.1.3 Netfilter管理工具

Netfilter是集成到Linux内核协议栈中的一套防火墙系统,用户可通过运行在用户空间的工具来把相关配置下发给Netfilter。Netfilter是Linux 2.4.x引入的一个子系统,它是一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。

Netfilter提供了整个防火墙的框架,各个协议基于Netfilter框架来自己实现自己的防火墙功能。每个协议都有自己独立的表来存储自己的配置信息,他们之间完全独立的进行配置和运行。

1.Netfilter的功能模块

Netfilter的功能模块主要是数据报过滤模块,包括连接跟踪模块(Conntrack)、网络地址转换模块(NAT)、数据报修改模块(mangle)及其它高级功能模块。

2.Netfilter实现

Netfilter主要通过表、链来实现规则。Netfilter是表的容器,表是链的容器,链是规则的容器,最终形成对数据报处理规则的实现。

3.Netfilter工具iptables

防火墙Netfilter工具是iptables。iptables在RHEL7.2之后会被撤掉,这里简单的介绍一下iptables工具。iptables是一个命令行工具,位于用户空间,可以用这个工具操作Netfilter的框架。

4.iptables命令行工具

iptables是按照规则来办事的。规则其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

iptables命令的选项参数有,-t表示指定表,-A表示在最上面增加一条规则,-I表示在最下面增加一条规则,-D表示删除一条规则,-A-I-D表示后面跟链的名称INPUT,-s表示跟源地址,-p表示跟协议(如TCP、UDP、ICMP等协议),--sport/--dport表示后跟源端口/目标端口,-d表示跟目的IP,-j表示跟动作(如DROP表示丢掉,REJECT表示拒绝,ACCEPT表示允许)。

iptables里的三个表,分别为表、链、规则。其中表下有链,链下有规则。

如filter表用于过滤包,是系统预设的表。filter表里有三个链,分别是INPUT、OUTPUT、FORWARD,其中INPUT作用是进入本机的包,OUTPUT作用是送出本机的包,FORWARD作用是与本机无关的包。代码如下:

iptables –t filter -nuL

代码中-t指定表名,-n不针对IP解析主机名,-v详细信息,-L列出的意思。

如表nat用于网络地址转换,它也有三个链,分别是PREROUTING、OUTPUT、POSTROUTING。其中PREROUTING链的作用是在包刚刚到达防火墙时改变它的目的地址,OUTPUT链的作用是改变本地产生的包的目的地址,POSTROUTING链的作用是包就要离开防火墙之前改变其源地址。代码如下:

iptables –t nat –nuL

4.1.4 Nftables命令行工具

Nftables是新的数据包分类框架,是Linux防火墙管理程序,它要求在Linux内核版本高于3.13时使用。Nftables独有命令行工具ntf,它的语法与iptables不同,能在Nftables内核框架之上运行iptables命令。Nftables旨在替换现有的tables(如ip、ip6、arp、eb等)框架,为tables(如ip、ip6等)提供一个新的包过滤框架。

1.Nftables特点

①拥有一些高级的类似编程语言的能力,例如定义变量和包含外部文件,即拥有使用额外脚本的能力。nftables也可以用于多种地址簇的过滤和处理。

②不同于iptables,Nftables并不包含任何的内置表。

③表包含规则链,规则链包含规则。

2.Nftables相比于iptables的优点

①更新速度更快。在iptables中添加一条规则,会随着规则数量增多而变得非常慢。Nftables使用原子的快速操作来更新规则集合。

②内核更新更少。使用iptables,每一个匹配或投递都需要内核模块的支持。在使用iptables时,如果要添加新的功能时都需要重新编译内核。Nftables就不存在这种状况,在Nftables中,大部分工作是在用户状态下完成的,内核只知道一些基本指令就可以了。如icmpv6的支持是通过nft工具的一个简单的补丁来实现的,而在iptables中这种类型的更改需要内核和iptables都升级才可以。

3.Nftables的主要组件

Nftables由三个主要组件组成,分别为内核实现、libnl netlink通信和nftables用户空间前端。内核提供了一个netlink配置接口以及运行时规则和评估,libnl包含了与内核通信的基本函数,nftables前端是指用户通过nft进行交互。

4.安装Nftables

安装用户空间实用程序包nftables或者git版本nftables-git,如图4-1-12所示。

图4-1-12 安装nftables

【注意】大部分iptables前端没有直接或间接支持Nftables,但可以导入到其中。Firewalld是一个同时支持nftables和iptables的图形前端。

5.Nftables用法

Nftables是指区分命令行输入的临时规则、从文件加载、保存到文件的永久规则。Nftables默认配置文件是/etc/nftables.conf,它已经包含一个名为inet filter的简单ipv4/ipv6防火墙列表。

(1)启动nftables

systemctl start nftables

(2)增加表、链、规则

如增加表f1、链、规则,如图4-1-13所示,代码如下:

nft add table f1
#增加链
nft add chain f1 input { type filter hook input priority 0 \; } 
# 要和hook(钩子)相关连
nft add rule f1 input tcp dport 22 accept
图4-1-13 增加表、链、规则

(3)列出规则

如列出所有规则、列出所有表、列出f1表等,如图4-1-14所示,代码如下:

图4-1-14 列出规则

【实例4-1-4】若需要监听80或443端口,可以添加以下规则,代码如下:

nft add rule inet f1 TCP tcp dport 80 accept
nft add rule inet f1 TCP tcp dport 443 accept

4.1.5 设计和配置PAM高级规则

在Linux中执行有些程序时,在执行前首先要对启动的用户进行认证,符合一定的要求之后才允许执行,例如login、su等。在Linux中进行身份或是状态的验证程序是由PAM(Pluggable Authentication Modules)来进行的,PAM可动态加载验证模块。PAM可以动态的对验证的内容进行变更,能提高验证的灵活性。

1.PAM简介

PAM也叫Linux可插入认证模块,它是一套共享库,能使本地系统管理员可以随意选择程序的认证方式。在PAM这种方式下,就算升级本地认证机制,也不用修改程序。

PAM使用配置为/etc/pam.d/,它是用来管理对程序的认证方式,如图4-1-15所示。应用程序调用相应的配置文件,从而调用本地的认证模块。认证模块放置在/lib/security目录中,以加载动态库的形式进行,如使用su命令时,系统会提示输入root用户的密码,这就是su命令通过调用PAM模块实现的。

图4-1-15 PAM配置目录

2.PAM的配置文件

PAM配置文件有下面两种写法。方法一是写在/etc/pam.conf文件中,但CentOS 6之后的系统中,这个文件就没有了;方法二是将PAM配置文件放到/etc/pam.d/目录下,其规则内容都是不包含service部分的,即不包含服务名称,在/etc/pam.d目录下文件的名字就是服务名称。如vsftpd、login等,只是少了最左边的服务名列。

如查看/etc/pam.d/sshd,使用cat命令,如图4-1-16所示。

图4-1-16查看sshd

从图4-1-16中,由上面的PAM模块文件内容看,可以将PAM配置文件分为四列,其中第一列代表模块类型,第二列代表控制标记,第三列代表模块路径,第四列代表模块参数。

(1)第一列PAM的模块类型

第一列PAM的模块类型有四种模块类型,分别代表四种不同的任务,它们是认证管理(auth),账号管理(account),会话管理(session)和密码管理(password),一个类型可能有多行,它们按顺序依次由PAM模块调用。

①auth认证管理,表示鉴别类接口模块类型用于检查用户名和密码,并分配权限。这种类型的模块为用户验证提供两方面服务,分别为让应用程序提示用户输入密码或者其他标记,确认用户合法性;通过它的凭证许可权限,设定组成员关系或者其他优先权。

②account账号管理,表示账户类接口,主要负责账户合法性检查,确认账号是否过期,是否有权限登录系统等,它执行的是基于非验证的账号管理。account账号管理主要用于限制/允许用户对某个服务的访问时间和当前有效的系统资源及限制用户位置。

【备注】多数情况下auth和account会一起用来对用户登录和使用服务的情况进行限制,这样的限制会更加完整。

③session会话管理,会话类接口。它实现从用户登录成功到退出的会话控制,处理为用户提供服务之前/后需要做的些事情,主要包括开启/关闭交换数据的信息,监视目录等,设置用户会话环境等。session会话管理是在系统正式进行服务提供之前的最后一道关口。

④password密码管理,是口令类接口,它控制用户更改密码的全过程。

【注意】接口在使用的时候,每行只能指定一种接口类型,如果程序需要多种接口的话,可在多行中分别予以规定。

(2)第二列PAM的控制标记

PAM使用控制标记来处理和判断各个模块的返回值,它规定如何处理PAM模块鉴别认证的结果,简而言之就是鉴别认证成功或者失败之后会发生什么事,如何进行控制。单个应用程序可以调用多种底层模块,通常称为“堆叠”,对某程序按照配置文件中出现顺序执行的所有模块称为“堆”,堆中的各模块的地位与出错时的处理方式由control_flag栏的取值决定,它有四种可能的取值分别为required、include、sufficient或_optional。

①required表示该行以及所涉及模块是成功的,它是用户通过鉴别的必要条件。换句话说,只有当应用程序的所有带required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用他的程序。

required就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以致于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。

requisite与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。

②sufficient是指模块验证成功,它是用户通过鉴别的充分条件。sufficient表示为只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。即便后面的层叠模块使用了requisite或者required控制标志也是一样。当标记为sufficient的模块失败时,sufficient模块会当做optional对待。因此拥有sufficient标志位的配置项在执行验证出错的时候并不会导致整个验证失败,但执行验证成功之时则大门敞开。所以该控制位的使用务必慎重。

③optional表示为即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块,也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块。

④include表示是在验证过程中调用其他的PAM配置文件。在RHEL系统中有相当多的应用通过完整调用/etc/pam.d/system-auth来实现认证而不需要重新逐一去写配置项。这也就意味着在很多时候只要用户能够登录系统,针对绝大多数的应用程序也能同时通过认证。

⑤另外还有一种比较复杂的格式为value = action的语法来设置控制标志,标志之间会以空格分开。格式如下:

value1 = action1 value2 = action2 ……

其中value可以是下列Linux PAM库的返回值有success、open_err、symbol_err、service_err、system_err、buf_err、perm_denied、auth_err、cred_insufficient、authinfo_unavail、user_unknown、maxtries、new_authtok_reqd、acct_expired、session_err、cred_unavail、cred_expired、cred_err、no_module_data、conv_err、authtok_err、authtok_recover_err、authtok_lock_busy、authtok_disable_aging、try_again、ignore、abort、authtok_expired、module_unknown、bad_item和default等。其中后面的default是用来设置上面的返回值无法表达的行为。

action可以是一个非负整数或者如ignore、ok、done、bad、die和reset等标记之一。如果是非负整数J,就表示需要忽略后面J个同样类型的模块。通过这种方式,系统管理者可以更加灵活地设置层叠模块,模块的层叠路径由单个模块的反应决定。

(3)模块路径

模块路径,即要调用模块的位置,如果是64位系统,一般保存在/lib64/security目录中,如pam_unix.so。同一个模块,可以出现在不同的类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块是针对不同的模块类型,编制了不同的执行函数。

(4)模块参数

模块参数,即传递给模块的参数。参数可以有多个,用空格分隔开。如password required pam_unix.so nullok obscure min=4 max=8 md5。

3.PAM模块的工作原理和流程

PAM安装之后有两大部分,分别在/lib/security目录下的各种PAM模块以及/etc/pam.d和/etc/pam.d/目录下的针对各种服务和应用已经定义好的PAM配置文件。当某一个有认证需求的应用程序需要验证的时候,一般在应用程序中就会定义负责对其认证的PAM配置文件。

当程序需要认证的时候已经找到相关的PAM配置文件,认证过程是如何进行的?将解读/etc/pam.d/system-auth文件予以说明。

首先要声明一点的是system-auth是一个非常重要的PAM配置文件,主要负责用户登录系统的认证工作。并且该文件不仅只是负责用户登录系统认证,其它的程序和服务通过include接口也可以调用到它,从而节省了很多重新自定义配置的工作。

下面是/etc/pam.d/system-auth文件的全部内容,如下图4-1-17所示。

图4-1-17 system-auth文件内容

第一部分表示,当用户登录的时候,首先会通过auth类接口对用户身份进行识别和密码认证,所以在该过程中验证会经过几个带auth的配置项。其中的第一步是通过pam_env.so模块来定义用户登录之后的环境变量, pam_env.so允许设置和更改用户登录时候的环境变量,默认情况下,若没有特别指定配置文件,将依据/etc/security/pam_env.conf进行用户登录之后环境变量的设置。

第二部分的三个配置项主要表示通过account账户类接口来识别账户的合法性以及登录权限。通过pam_unix.so模块来提示用户输入密码,并将用户密码与/etc/shadow中记录的密码信息进行对比,如果密码比对结果正确则允许用户登录,而且该配置项的使用的是sufficient控制位,即表示只要该配置项的验证通过,用户即可完全通过认证而不用再去走下面的认证项。不过在特殊情况下,用户允许使用空密码登录系统,例如当将某个用户在/etc/shadow中的密码字段删除之后,该用户可以只输入用户名直接登录系统。

第三部分表示通过password接口来确认用户使用的密码或者口令的合法性。第一行配置项表示需要的情况下将调用pam_cracklib来验证用户密码复杂度。如果用户输入密码不满足复杂度要求或者密码错,最多将在三次这种错误之后直接返回密码错误的提示,否则期间任何一次正确的密码验证都允许登录。需要指出的是,pam_cracklib.so是一个常用的控制密码复杂度的PAM模块。

第四部分通过session会话类接口为用户初始化进行会话连接。使用pam_keyinit.so表示当用户登录的时候为其建立相应的密钥环,并在用户登出的时候予以撤销。不过该行配置的控制位使用的是optional,表示这并非必要条件。之后通过pam_limits.so限制用户登录时的会话连接资源,相关pam_limit.so配置文件是/etc/security/limits.conf,默认情况下对每个登录用户都没有限制。

4.常用的PAM模块介绍

常用的PAM模块有pam_unix.so、pam_shells.so、pam_deny.so等,见表4-1-1所示。

表4-1-1 常见PAM模块

pam_limits.so

session

定义使用系统资源的上限,root用户也会受此限制,可以通过“/etc/security/limits.conf”或“/etc/security/limits.d/*.conf”来设定。

5.PAM模式使用说明

(1)pam_access.so模块

pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制。pam_access.so模块的具体工作行为根据配置文件“/etc/security/access.conf”来决定。该配置文件的主体包含了三个字段,分别为权限、用户和访问发起方。格式上是一个用“”””隔开的表。

第一个字段权限(permission),使用“+”表示授予权限,用“-”表示禁止权限。第二个字段用户(user),定义了用户、组以及用“@”表示的在不同主机上的同名用户和同一主机上不同名用户。第三个字段访问发起方(origins),定义了发起访问的主机名称、域名称、终端名称。

【实例4-1-5】vsftp搭建FTP服务器。如果要在网络内架设一个FTP服务器,而且在该FTP服务器上需要强制地指定某个用户只能通过某个IP地址登录,这个时候pam_access.so模块就派上用场了。假设FTP服务器是使用vsftp来构建的,具体操作步骤如下。

【步骤1】修改FTP服务器的/etc/pam.d/vsftpd文件,在调用account接口处插入account required pam_access.so这行内容,代码如下:

vi /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth      required         pam_listfile.so
item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth         required pam_shells.so
auth      include  password-auth
account    include  password-auth
//添加这一行内容
account    required     pam_access.so                    session    required     pam_loginuid.so
session    include  password-auth

添加的配置表示当针对FTP访问执行用户类接口的时候会增加pam_access.so的认证。

【步骤2】修改/etc/security/access.conf配置文件,在配置文件底部添加两行代码,代码如下:

vi /etc/security/access.conf
- : kevin : ALL EXCEPT 192.168.10.6
- : grace : ALL EXCEPT 192.168.10.7

前提是已经在系统上事先建立了kevin和grace两个用户。上面的配置的含义是kevin用户不能从192.168.10.6之外的任何客户端访问FTP服务器;grace用户不能从192.168.10.7之外的任何客户端访问FTP服务器。

【步骤3】修改/etc/vsftpd/vsftpd.conf文件,禁用匿名登录,代码如下:

vi /etc/vsftpd/vsftpd.conf
......
Anonymous_enable = NO

通过上面的配置后,重启vsftpd服务,用户kevin将只能从192.168.10.6访问ftp服务,而grace用户将只能从192.168.10.7访问ftp服务。所以有这种需求而不想使用防火墙以及应用程序自带的认证机制的时候,可以通过pam_access.so来实现。

(2)pam_listfile.so模块

pam_listfile.so模块的功能和pam_access.so模块类似,目标是实现基于用户/组、主机名/IP、终端的访问控制。不过它实现的方式和pam_access.so会有些不同,因为它没有专门的默认配置文件。访问控制是靠PAM配置文件中的控制选项和一个自定义的配置文件来实现的。除此,pam_listfile.so模块还能够控制到ruser、rhost所属用户组和登录Shell。

【实例4-1-6】不允许bobo账号通过ssh方式登录。

【步骤1】更改/etc/pam.d/sshd文件,并在该文件中添加一行(一定要添加到第一行),如图4-1-18所示,代码如下:

vi /etc/pam.d/sshd
auth   required   pam_listfile.so  
item=user sense=deny file=/etc/pam.d/denyusers onerr=succeed
......
图4-1-18 更改“/etc/pam.d/sshd”文件

【步骤2】创建bobo账号,如图4-1-19所示。

图4-1-19 创建bobo账号

【步骤3】建立文件/etc/pam.d/denyusers,并在文件中写入用户信息,如图4-1-20所示。

图4-1-20 用户信息写入文件

【步骤4】测试bobo账号通过ssh方式。如图4-1-21所示。

图4-1-21 测试bobo用户登录

表示用户以ssh登录必须要通过pam_listfile.so模块进行认证,认证的对象类型是用户,采用的动作是禁止,禁止的目标是/etc/pam.d/denyuser文件中所定义的用户。通过设置,使bobo账号从其它主机远程ssh访问服务器会出现密码错误的提示,但是使用root或者其它用户则访问能够成功。

(3)pam_limits.so模块

pam_limits.so模块的主要功能是限制用户会话过程中对各种系统资源的使用。缺省情况下该模块的配置文件是/etc/security/limits.conf。而该配置文件的基本格式实际上是由4个字段组成的表,见表4-1-2所示。

表4-1-2 配置文件的基本格式

【注意】如果没有任何限制可以使用“-”号,并且针对用户限制的优先级一般要比针对组限制的优先级更高。

【实例4-1-7】pam_limits.so模块也可以使用在对一般应用程序使用的资源限制方面。如果需要在ssh服务器上对来自不同用户的ssh访问进行限制,就可以调用该模块来实现相关功能。例如,当需要限制用户bobo登录到SSH服务器时的最大连接数(防止同一个用户开启过多的登录进程)。

由于/etc/pam.d/system-auth中,默认就会通过pam_limits.so限制用户最多使用多少系统资源,如图4-1-22所示。

图4-1-22 显示limits.so

在/etc/security/limits.conf文件中增加一行对bobo用户产生的连接数进行限定,如图4-1-22所示。

vi /etc/security/limits.conf
......
bobo     hard    maxlogins     2

测试从客户端以bobo身份登录SSH服务器时,在客户端上可以打开两个控制台登录。但当客户端开启第三个登录窗口的时候会被服务器拒绝,但其它用户不会受到限制。

【注意】限制的只是从客户端以ssh方式登录次数的场景,如果从xshell登录,则不受限制。

(4)pam_rootok.so模块

pam_rootok.so模块的主要作用是使uid为“0”的用户即root用户能够直接通过认证而不用输入密码。pam_rootok.so模块的一个典型应用是插入到一些应用程序的认证配置文件中,当root用户执行这些命令的时候可以不用输入口令而直接通过认证。如su命令,当以root用户执行su切换到普通用户身份的时候是不需要输入任何口令可以直接切换过去。

【实例4-1-8】root用户使用su切换到其他用户需要输入口令。

【步骤1】查看一下/etc/pam.d/su文件的内容,如图4-1-23所示。

图4-1-23 查看su文件

在su文件第一行,sufficient不是登录pam_rootok.so的必要条件,所以不需要输入口令。

【步骤2】将该行配置注释掉的情况下,就会发现即便以root用户切换普通用户的时候仍然要求输入口令,如图4-1-24所示。

图4-1-24 “root”用户使用su命令

(5) pam_userdb.so模块

pam_userdb.so模块的主要作用是通过一个轻量级的Berkeley数据库来保存用户和口令信息。这样用户认证将通过该数据库进行,而不是传统的/etc/passwd和/etc/shadow或者其它的一些基于LDAP或者NIS等类型的网络认证。所以存在于Berkeley数据库中的用户也称为虚拟用户。

pam_userdb.so模块的一个典型用途就是结合vsftpd的配置实现基于虚拟用户访问的FTP服务器。

(6)pam_cracklib.so模块

pam_cracklib.so是一个常用并且非常重要的PAM模块。该模块主要的作用是对用户密码的强健性进行检测。即检查和限制用户自定义密码的长度、复杂度和历史等。如不满足上述强度的密码将拒绝用户使用。

(7)pam_pwhistroy.so模块

pam_pwhistory.so模块是一个常用模块,一般辅助pam_cracklib.so、pam_tally.so及pam_unix.so等模块来加强用户使用密码的安全度。pam_pwhistory.so模块的另一个作用是专门为用户建立一个密码历史档案,防止用户在一定时间内使用已经用过的密码。

4.2 进程管理

在Linux操作系统中,每个执行的程序(代码)都称为一个进程,每一个进程都分配一个ID号。每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程,每个进程都可能以两种方式存在的,分别为前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的,后台进程则是实际在操作,但由于屏幕上无法看到的进程。一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。

4.2.1 进程和线程的概念

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

1.进程的状态

运行中的进程可能具有以下三种基本状态:

①就绪状态(Ready)。进程已获得除处理器外的所需资源,等待分配处理器资源,只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。

②运行状态(Running)。进程占用处理器资源,此状态的进程的数目小于等于处理器的数目。

③阻塞状态(Blocked)。由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。

2.线程

线程(Hhread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在多线程操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。

4.2.2 进程的创建、调度和销毁

1.进程的创建

在Linux中主要提供了fork、vfork、clone三个进程创建方法。在Linux源码中这三个调用的执行过程是执行fork()或vfork()或clone()函数,通过一个系统调用表映射到sys_fork()或sys_vfork()或sys_clone()函数,再在这三个函数中去调用do_fork()去做具体的创建进程工作。

(1)fork

fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和PID,但却复制父进程其它所有的资源。如父进程打开了五个文件,那么子进程也有五个打开的文件,而且这些文件的当前读写指针也停在相同的地方,这一步所做的是复制。这样得到的子进程独立于父进程,具有良好的并发性,但是二者之间的通讯需要通过专门的通讯机制,如“pipe”、共享内存等机制,另外通过fork创建子进程,需要将上面描述的每种资源都复制一个副本。

fork是一个开销十分大的系统调用,这些开销并不是所有的情况下都是必须的,比如某进程fork出一个子进程后,其子进程仅仅是为了调用exec执行另一个可执行文件,那么在fork过程中对于虚存空间的复制将是一个多余的过程。但由于现在Linux中是采取了copy-on-write(COW写时复制)技术,为了降低开销,fork最初并不会真的产生两个不同的拷贝,因为在那个时候,大量的数据其实完全是一样的。写时复制是在推迟真正的数据拷贝。若后来确实发生了写入,那意味着parent和child的数据不一致了,于是产生复制动作,每个进程拿到属于自己的那一份,这样就可以降低系统调用的开销。

fork()调用执行一次返回两个值,对于父进程,fork函数返回子程序的进程号,而对于子程序,fork函数则返回零,这就是一个函数返回两次的本质。

【实例4-2-1】用fork函数创建进程。

【步骤1】fork函数的原型,代码如下:

pid_t fork(void);

其中pid_t是一个long类型的量。

【步骤2】编写程序,取名为“fork.c”,代码如下:

#include  <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void){
  pid_t pid;
  char *message;
  int x;
  pid=fork();
  if(pid<0){
  perror("fork failed");
exit(1);
  }
  if(pid==0){
message="this is the child\n";
x=0;
  }
  else{
  message="this is the parent\n";
  x=10;
  sleep(2);  
}
  printf(%s I am %d,my father is :%d\n",message.getpid(),getppid());  
  return 0;
  }
} 

【步骤3】编译,执行“fork.c”程序,如图4-2-1所示。

图4-2-1编译执行程序

【步骤4】程序分析。在图4-2-1中,fork在创建一个进程时,先执行父进程,然后执行子进程,子进程复制父进程的资源,子进程有自己的task_struct结构和pid。

(2)vfork

vfork系统调用不同于fork,用vfork创建的子进程与父进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,如果这时子进程修改了某个变量,这将影响到父进程。

【实例4-2-2】用vfork函数创建进程。

【步骤1】创建vfork.c文件,代码如下:

#include  <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void){
  pid_t pid;
  char *message;
  int x;
  pid=vfork();
  if(pid<0){
  perror("fork failed");
  exit(1);
  }
  if(pid==0){
message="this is the child\n";
x=0;
  }
  else{
  message="this is the parent\n";
  x=10;
  sleep(2);  
}
  printf(%s I am %d,my father is :%d\n",message.getpid(),getppid());  
  return 0;
  }
} 

【步骤2】编译、执行vfork.c文件,如图4-2-2所示。

图4-2-2 编译执行vfork.c文件

【步骤3】程序分析。vfork创建的子进程与父进程共享地址空间,父进程与子进程运行的变量值相等。

【注意】用vfork()创建的子进程必须显示调用exit()来结束,否则子进程将不能结束,而fork()则不存在这个情况。vfork也是在父进程中返回子进程的进程号,在子进程中返回0。

用vfork创建子进程后,父进程会被阻塞直到子进程调用exec或exit。vfork的好处是在子进程被创建后往往仅仅是为了调用exec执行另一个程序,因为它就不会对父进程的地址空间有任何引用,所以对地址空间的复制是多余的,因此通过vfork共享内存可以减少不必要的开销。

(3)clone

 系统调用fork()和vfork()是无参数的,而clone()则带有参数。fork()是全部复制,vfork()是共享内存,而clone()是将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定。另外,clone()返回的是子进程的PID。

2.进程的调度

进程调度决定了将哪个进程进行执行,以及执行的时间。操作系统进行合理的进程调度,使得资源得到最大化的利用。

(1)进程的优先级

现在的操作系统为了协调多个进程“同时”运行,最基本的手段就是给进程定义优先级。进程的优先级有两种方式确定,这两种方法分别为由用户程序指定、由内核的调度程序动态调整。

Linux内核将进程分成两个级别普通进程和实时进程。实时进程的优先级都高于普通进程,除此之外,它们的调度策略也有所不同。

(2)进程的调度策略

①先进先出策略SCHED_FIFO表示为直到先被执行的进程变为非可执行状态,后来的进程才被调度执行。先来的进程可以执行sched_yield系统调用,自愿放弃CPU,让权给后来的进程;

②轮转策略SCHED_RR。轮转策略表现为实时进程分配时间片,在时间片用完时,让下一个进程使用CPU。

在Linux操作系统中,实时进程采用的调度策略为SCHED_FIFO和SCHED_RR。 SCHED_FIFO进程运行前,实时优先级更高的先执行,SCHED_FIFO进程开始执行后除非有优先级更高的实时进程就绪、或者当前SCHED_FIFO进程主动休眠、或者SCHED_FIFO进程执行完毕,否则该进程将会一直占用CPU。SCHED_RR进程运行前,实时优先级最高的先执行,执行的时间片由SCHED_RR进程的nice值决定,SCHED_RR进程开始执行后时间片到0时,则执行下一个SCHED_RR进程。所有RR进程可以自行休眠或者被更高优先级的实时进程所抢占。

3.进程的销毁

销毁进程现象为释放资源,表现为进程的终止、进程的退出等。

(1)进程终止方式

Linux的进程终止方式有8种,其中5种是正常终止,分别是从main函数返回;调用exit函数;调用_exit或_Exit;最后一个线程从其启动例程返回;最后一个线程调用pthread_exit。异常终止有3种,分别为调用abort函数;接收到信号并终止;最后一个线程对取消请求做出响应。

(2)进程退出

当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit()。

4.2.3 查看系统进程

进程是在CPU及内存中运行的程序代码,而每个进程可以创建一个或多个进程,在Linux操作系统中进程属性有那些?如何查看进程呢?

1.进程的属性

Linux操作系统在管理进程时,按照进程的相关属性对进程进行管理,常见进程的属性有:

(1)进程标识(PID):每个进程在创建时会分配一个唯一的PID。

(2)父进程标识(PPID):通过父进程标识和进程标识可以判别进程之间的亲缘关系。

(3)进程的状态:运行态running(运行或准备运行)、等待态sleeping(包括可中断不可中断状态)、停止台stopped、僵死态zombie。

(4)进行执行的优先级、进程连接的终端以及进程占用的CPU、内存等资源。

2.进程的查看

(1)ps指令

ps指令是一条基本且强大的进程查看命令,可以查看有哪些进程信息:如进程的运行状态、是否结束、有没有僵死,进程占用的资源;也可以监控后台进程的工作情况,ps的语法结构:

ps [选项]

当ps指令无参数时,显示当前终端的系统进程,ps的选项,见表4-2-1所示。

表4-2-1 ps指令的选项

【实例4-2-3】查看进程的详细信息,如图4-2-3。

图4-2-3显示进程详细信息

在图4-2-3中,进程的信息如下:

①S:表示进程状态。R表示进程运行转态,S表示休眠状态,T表示暂停或终止状态,Z表示僵死状态。

②UID:进程启动者用户的ID。

③C:表示进程最近使用CPU的估算。

④PRI:表示进程的优先级。

⑤TIME:表示进程启动后占用CPU的总时间。

⑥CMD:表示启动该进程的命令名称。

⑦TTY:表示进程所在的终端的终端号,启用图形界面用pts/0表示,字符界面的终端用tty2-tty6,“?”表示进程不占用终端。

【实例4-2-4】查看ssh进程是否正在运行,如图4-2-4所示。

图4-2-4查询ssh进程

【实例4-2-5】显示所有用户正在运行的进程,代码如下:

ps –aux|more

3.top指令

top命令与ps命令的基本作用是相同的,显示当前进程及其状态。但top命令是一个动态显示的过程,用户通过按刷新键不断刷新当前的状态。如果在前台执行该命令,直到用户按下“q”键终止该程序。

top命令提供了实时的对系统处理器的监控状态,它可以显示系统中最敏感的任务列表,该命令可以按CPU、内存使用或执行时间对任务进行排序。top的语法格式:

top [选项]

top常见选项的含义,见表4-2-2所示。

表4-2-2 top常见选项

【实例4-2-6】使用top命令动态显示进程,代码如下:

top

【实例4-2-7】使用top –u root显示root用户的进程,部分进程信息如图4-2-5所示。

图4-2-5显示root用户的进程

4.2.4 系统管理命令

系统中每一个进程都有一个进程号,用于系统识别和系统调用,启动一个进程主要有两个途径,分别为手工启动和调度启动。用户输入命令,直接启动一个进程叫手工启动,手动启动分为前台启动和后台启动。

1.进程的前后台

(1)前台启动

前台就是指一个程序控制着标准的输出和输入,当前台运行一个程序的时候,用户不能执行其他程序。

(2)后台启动

后台就是指一个程序不从标准输入设备接收输入,一般也不将结果输出到标准输出设备上。

如ls –a> text &,表示Shell检测到命令后面后一个&,就生成一个子Shell在后台运行这个程序,并立即显示提示符等待用户下一个命令。

如cat fork.c| grep file|wc –l,表示同时启动了3个进程,他们都是当前Shell的子程序,称为兄弟进程。

2.进程的前后台调用

(1)Ctrl+Z组合键

将当前进程挂起,即调入后台并停止运行。

(2)jobs命令

查看处理后台的任务列表,如图4-2-6所示。

图4-2-6查看后台任务列表

(3)bg命令

将前台作业切换到后台运行,若没有指定作业号,则将前台作业切换后台。

(4)fg命令

将处于后台的进程恢复到前台运行,需指定任务序号。

(5)Ctrl+C组合键

中断正在执行的命令。

【实例4-2-8】进程前后台调度,代码如下:

man bg
#Ctrl+Z将man挂起
vi &   #vi启动后台运行
jobs 1  #查看后台任务
bg 1   #将1号作业man bg从前台切换到后台
fg 1    #将1号作业man bg从后台恢复到前台

3.kill命令

kill命令是终止进程的命令,用于终止指定PID号的进程,语法格式如下:

kill [-9] 进程号

-9表示可选项,表示强制终止。

4.进程的优先级

nice值是Linux/UNIX系统反应一个进程优先级状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程优先级越高,而值越大优先级越低。

【实例4-2-9】通过nice命令来对一个将要执行的bash命令进行nice值设置,如图4-2-7所示。

【步骤1】打开bash,设置nice值,代码如下:

 nice -n 10 bash 

打开了一个bash,并且设置nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。

【步骤2】查看nice值,通过nice命令直接查看到nice值,代码如下:

nice 
10 

【步骤3】退出bash,如退出当前nice值为10的bash,代码如下:

exit

【步骤4】打开一个正常的bash,查看下其nice值,代码如下:

bash
nice
图4-2-7 设置nice值

项目实施

对于软件工程师、网络运维工程师来说,一定会遇到Linux的应用场景,如Linux网络配置、Linux防火墙设置、Linux进程管理及Linux自动化管理等。尤其Linux服务器网络配置和自动化管理是软件工程师和网络运维工程师必备要掌握知识和技能。

需要完成的任务:

  • 网络配置与管理。
  • 自动化管理。

4.3 任务1:网络配置与管理

Linux系统的底层配置参数都存储在相应的配置文件中,启动系统或网络服务时,系统通过读取这些配置文件获得相应的参数,从而实现对系统和网络设备的控制。搭建网络服务前要先完成系统的基本网络设置,尤其是IP配置。当Linux运行在虚拟机环境下时,进行基本网络配置时还需要注意结合虚拟机的配置,综合理解联网问题。

4.3.1 配置网络

1.配置IP地址

配置主机IP地址有三种方式,分别为图形界面配置、命令行命令配置和直接修改配置文件。以CentOS系统为例配置IP地址。

(1)图形界面配置IP

在CentOS系统下,操作IP配置通过应用程序主菜单下的层级菜单系统工具→设置→网络打开网络连接设置接口,如图4-3-1所示。

图4-3-1网络连接接口配置

在图4-3-1中,选择有线,点击带齿轮形状的按钮,打开更高级的设置参数,可以查看连接的IP地址、硬件MAC地址、默认路由地址等重要信息,勾选“自动连接”,如果“自动连接”未勾选,每次系统启动时,网络接口卡不会自动联网,如图4-3-2所示。

图4-3-2 IP地址界面

在图4-3-2中,点击窗口IPv4进入配置IP标签页面,可以查看或修改IP的具体设置,如图4-3-3所示。

图4-3-3 IPv4设置

2.IP地址命令

在Linux操作系统中查询IP的命令有ifconfig、ip addr,如图4-3-4所示。

图4-3-4 查询IP命令

网络配置文件。不同Linux版本、配置文件名及所处的目录是不同的,以CentOS 7系统为例进行讲解。网络配置文件在“/etc/sysconfig/network-scripts”目录下,如图4-3-5所示。

图4-3-5 配置文件目录

使用cat命令查看配置文件,默认情况下配置为动态获取IP,配置内容如图4-3-6所示。

图4-3-6 配置文件内容

如果用户要修改网络配置文件,使用vim文本编辑修改配置文件,配置静态IP地址,如图4-3-7所示。

图4-3-7配置静态IP

配置文件修改后,需要重启服务,代码如下:

service network restart
#用systemctl 重启
systemctl restart network.service

4.3.2 配置静态路由

路由器的功能是实现一个网段到另一个网段之间的通信,路由分为静态路由、动态路由、默认路由和直连路由。静态路由是手工指定的,使用静态路由的好处是网络安全保密性高。动态路由因为需要路由器之间频繁地交换各自的路由表,而对路由表的分析可以揭示网络的拓扑结构和网络地址等信息。因此,网络出于安全方面的考虑也可以采用静态路由,不占用网络带宽,因为静态路由不会产生更新流量。

1.查看本机网络环境或路由信息

本机的网路环境网络信息及路由信息使用ip addr或route –n命令查看,如图4-3-8所示,默认网关为172.16.0.1。

图4-3-8 查看路由

2.使用route命令

使用route命令添加的路由,其常用参数有add增加路由、del删除路由、-net设置到某个网段的路由、-host设置到某台主机的路由、gw出口网关IP地址、dev出口网关物理设备名。

【注意】route命令,机器重启或者网卡重启后路由就失效了。

(1)添加到主机的路由

【步骤1】确认当前工作的网卡,这里使用的是eth0,如图4-3-9所示。

图4-3-9 查看网卡

【注意】如果计算机中存在多块网卡,可以为不同网卡指定不同的静态路由。如有eth1、eht2两张网卡,依次为每块网卡创建一个对应的路由配置文件,route-eth0,route-eth1,oute-eth2。

【步骤2】路由添加到主机,如图4-3-10。

添加两条静态路由,如网卡eth0,设置主机路由IP地址172.16.2.0,设置网关地址为172.16.0.1,代码如下:

route add –host 172.16.2.0 dev eth0
route add –host 172.16.2.0 gw 172.16.0.1
图4-3-10 添加主机路由1

(2)添加到网络的路由

添加网络路由,如图4-3-11所示,代码如下:

route add -net 172.16.2.0 netmask 255.255.255.0 gw 172.16.0.1
图4-3-11 添加网络路由

(3)添加默认网关

# route add default gw 172.16.0.1

(4)删除路由

# route del –host 172.16.2.0 dev eth0

3.添加永久路由

通过编辑配置文件,实现添加永久路由。假设访问172.16.2.100时通过172.16.0.1;访问172.16.2.100时通过172.16.1.1。通过修改网卡配置文件,执行vi /etc/sysconfig/network-scripts/route-eth0命令打开配置文件,如图4-3-12所示,在配置文件中添加的代码如下:

图4-3-12 编辑文件

通过命令service network restart重启网络服务,用route –n命令查看配置是否生效,如图4-3-13所示,此时发现路由信息已经添加到路由表了,这时无论是重启主机还是重启网络服务路由信息都不会丢了。

图4-3-13重启网络服务

4.3.3 双网卡配置

双网卡绑定特别适合利用再生产环境7×24小时的网络传输服务,采取双网卡绑定模式不仅可以提高网络传输速度,更重要的是,还可以确保其中一块网卡出现故障时,依然可以正常高效可靠的措施。Linux主机安装双网卡,共享一个IP地址,对外提供访问,其目的是实现路由器功能、网关、实现冗余、负载均衡等。

1.常用的三种模式

①平衡负载模式mode0:平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。

②自动备援模式mode1:平时只有一块网卡工作,在它故障后自动替换为另外的网卡。

③平衡负载模式mode6:平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。

2.逻辑网卡bond

网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,是一种常用的技术。Kernels 2.4.12及以后的版本均供bonding模块,以前的版本可以通过patch实现。

(1)bond的模式

bond的模式常用的有两种:mode=0和mode=1。其中mode=0表示负载分担round-robin,并且是轮询的方式比如第一个包走eth0,第二个包走eth1,直到数据包发送完毕,它的优点流量提高一倍,缺点为需要接入交换机做端口聚合,否则可能无法使用mode=1表示主备模式,即同时只有1块网卡在工作,它的优点是冗余性高,它的缺点是链路利用率低,两块网卡只有1块在工作。

(2)bond配置

【步骤1】配置前准备。

查看当前操作系统,如图4-3-14所示。

图4-3-14查看当前操作系统

关闭当前的两张网卡,如图4-3-15。

图4-3-15关闭网卡

【步骤2】配置网络文件。

①创建绑定文件,配置逻辑网卡bond0

配置网卡bond0,如果没有这个配置文件,就新建一个,代码如下:

TYPE="bond"
BOOTPROTO="none"
NAME="bond0"
DEVICE="bond0"
IPADDR="192.168.1.20"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
DNS1="192.168.1.1"
DNS2="8.8.8.8"
ONBOOT="yes"

查看绑定文件,如图4-3-16所示。

图4-3-16查看绑定文件

②配置物理网卡

编辑需要绑定的物理网卡,并且指定主从。物理网卡1为ifcfg-enp0s3,配置代码如下:

TYPE="Ethernet"
BOOTPROTO="none"
NAME="enp0s3"
DEVICE="enp0s3"
MASTER="bond0"
SLAVE="yes"
ONBOOT="yes"

查看配置文件,如图4-3-17所示。

图4-3-17查看物理网卡1的配置文件

③配置物理网络2

物理网卡2为ifcfg-enp0s8,配置代码如下:

TYPE="Ethernet"
BOOTPROTO="none"
NAME="enp0s8"
DEVICE="enp0s8"
MASTER="bond0"
SLAVE="yes"
ONBOOT="yes"

查看配置文件,如图4-3-18所示。

图4-3-18查看配置文件

【步骤3】创建bond文件,并设定为主备的模式,让系统支持bonding。

配置“cat/etc/modprobe.conf”文件,如果该目录不存在的话,手动创建,也可以放在modprobe.d下面,如图4-3-19所示,代码如下:

vi /etc/modprobe.d/bonding.conf 
alias bond0 binding
options bond0 miimon=100 mode=1
图4-3-19创建bond文件

配置bond0的链路检查时间为100ms,模式为1。关于mode的说明,其中mode=0表示平衡循环,mode=1表示主备,mode=3 表示广播,mode=4表示链路聚合。

运用service network restart命令,重启网络服务。

4.4 任务2:自动化管理

Linux操作系统的自动化管理主要分为定时任务和一次性任务管理。通过系统定时任务可以周期性来对Linux操作系统进行定时管理,通过at命令对Linux操作系统进行一次性管理。

4.4.1 系统定时任务

在Linux操作系统中,定时任务命令是crond,crond就是计划任务,类似闹钟,定点执行。

1.为什么要用定时任务

计划任务主要是做一些周期性的任务,比如凌晨3点定时备份数据、晚上23点开启网站抢购接口、凌晨0点关闭抢占接口等。计划任务主要分为以下两种使用情况,场景1,系统级别的定时任务,主要是临时文件清理、系统信息采集、日志文件切割等;场景2,用户级别的定时任务,主要是定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据等。

2.安装crontabs服务

安装crontabs并设置开机自启,如图4-4-1所示,代码如下:

yum install crontabs
systemctl enable crond
图4-4-1安装crontabs

3.crontab配置文件

crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表。它的配置文件有:

①“/var/spool/cron/”目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。

②“/etc/crontab”这个文件负责调度各种管理和维护任务。

③“/etc/cron.d/”这个目录用来存放任何要执行的crontab文件或脚本。

也可以把脚本放在“/etc/cron.hourly”、“/etc/cron.daily”、“/etc/cron.weekly”、“/etc/cron.monthly”目录中,让它每小时/天/星期/月执行一次。

使用cat命令查看配置文件,如图4-4-2所示。

图4-4-2查看配置文件

【注意】每行是一条命令,crontab的命令构成为时间+动作,其时间有分、时、日、月、周五种,操作符有“”表示任意的(分、时、日、月、周)时间都执行;“-”表示一个时间范围段,如5-7点;“,”表示分隔时段,如6,0,4表示周六、日、四;“/1”表示每隔n单位时间,如“/10”每10分钟。

4.crontab命令

(1)crontab命令选项

crontab命令选项,-e表示编辑定时任务,-l表示查看定时任务,-r表示删除定时任务,-u表示指定其他用户,如图4-4-3所示。

图4-4-3 crontab命令选项

(2)crontab运用

例:每隔30分钟root执行一次updatedb命令,如图4-4-4和图4-4-5所示,代码如下:

crontab -e
*/30 * * * * root updatedb1
图4-4-4每个30分钟智能root updatedb1
图4-4-5查看编辑的crontab内容

例:每天早上5点定时重启系统,代码如下:

0 5 * * * root reboot1

例:每晚的21:30重启smb,代码如下:

30 21 * * * /etc/init.d/smb restart

例:每月1、10、22日的4 : 45重启smb,代码如下:

45 4 1,10,22 * * /etc/init.d/smb restart

4.4.2 使用at计划一次性任务

at是Linux操作系统的单次的计划任务,如果在某时间点只是要求任务运行一次,这就用到at命令了。以CentOS 7为例,讲解at命令。

1.安装at

如果系统没有at,就需要安装,代码如下:

yum –y install at

2.启动atd服务

at是由atd服务提供的,启动atd服务,如图4-4-6所示,代码如下:

systemctl status atd.service  #查看服务状态
systemctl start atd      #启动服务
systemctl stop  atd      #关闭服务
图4-4-6 启动与查看atd

3.at语法

at [option] TIME

option(常用的选项):

①-V表示显示版本信息。

②-l表示列出指定队列中等待运行的作业,相当于atq。

③-d表示删除指定的作业,相当于atrm。

④-c表示查看具体作业任务。

⑤-f表示从指定的文件中读取任务。

⑥-m表示当任务被完成后,将给用户发送邮件,即使没有标准输出。作业执行命令的结果中的标准输出和错误以邮件通知给相关用户。

TIME定义出什么时候进行at这项任务,TIME的时间格式为:

①HH:MM YYYY-mm-dd。

②noon、midnight、teatime(4pm)。

③tomorrow。

④now+#{minutes,hours,days, OR weeks}。

⑤HH:MM表示在今日的HH:MM进行,若该时刻已过,则明天此时执行任务,命令。如at 02:00。

⑥HH:MM YYYY-MM-DD表示规定在某年某月的某一天的特殊时刻进行该项任务。如at 02:00 2016-09-20、at 04pm March 17、at 17:20 tomorrow等。

⑦HH:MMam|pm + number minutes|hours|days|weeks表示在某个时间点再加几个时间后才进行该项任务。如at now + 5 minutes、at 02pm + 3 days。

4.at命令实例

【实例4-4-1】在当前时间1分钟后,修改ca2目录名为at2,如图4-4-7所示。

图4-4-7 1分钟后修改ca2目录名为at2

【注意】退出at用Ctrl +d或者Crtl+\键退出。

【实例4-4-2】同时执行多个任务命令,如用echo输出123、678、90等3个任务,如图4-4-8所示。

图4-4-8 同时执行多个任务

【实例4-4-3】多个执行的命令全部放在专门的文件里然后去调用的方法。

创建atcmd任务文件,如图4-4-9所示,代码如下:

vi atcmd 
mkdir cd1
mkdir cd2
mv cd1 cd
mv cd2 cd22 
pwd 

用at -f atcmd now +1min 命令去调用执行这个文件 ,-f表示调用。

at -f  atcmd now +1min 
图4-4-9 at调用文件执行

【实例4-4-4】计划任务没有标准输入,加上-m表示强制发邮件来提醒计划任务执行完毕,如图4-4-10所示。

图4-4-10 邮件提醒任务完成

【实例4-4-5】查看任务列表,用at –l命令,如图4-4-11所示。

图4-4-11查看任务列表

【实例4-4-6】创建用户的白名单,xingxing用户加入白名单,默认是没有/etc/at.allow,所以需要创键,代码如下:

vim  /etc/at.allow
xingxing
cat /etc/at.allow  

【注意】超级用户及白名单中用户能使用at命令,其他用户不可以使用at命令。删除白名单将这个文件直接删除就可以了,如图4-4-12所示。

图4-4-12白名单

【注意】创建黑名单里的用户用vim /etc/at.deny文件就可以了。

本章小结

本章主要讲解了Linux系统安全、Linux进程管理、Linux的网络配置与管理、及Linux自动化管理。通过本章的学习,读者应掌握SELinux强制访问控制、Firewall防火墙的配置、了解Netfilter管理工具的使用和Nftables命令行工具、掌握PAM高级规则的设计和配置、理解进程和线程的概念、掌握进程的创建、调度和销毁、掌握网络配置的方法、掌握静态路由的配置方法、掌握系统定时任务和at一次性任务等知识和技能。

本章习题

一、单项选择题

1.SELinux是( )。

A.文件传输机制

B.安全访问控制安全策略的机制

C.邮件传输机制

D.Linux读写访问机制

2.ls Z命令表示为( )。

A.查看文件上下文信息

B.列出当前目录下文件

C.搜索文本文件

D.复制文件的命令

3.( )模式指违反策略的行动不会被禁止,但是会提示警告信息。

A.disabled

B.enforcing

C.permissive

4.Firewalld的启动的命令为( )。

A.systemctl start firewalld

B.systemctl status firewalld

C.systemctl disable firewalld

D.systemctl stop firewalld

5.修改配置后要重启防火墙,命令为( )。

A.firewall-cmd –reload

B.Firewalld –reload

6.Nftables有独有命令行工具( )。

A.iptables

B.ntf

C.firewall-cd

D.sshd

7.创建“cc”账号命令( )。

A.useadd cc

B.add users cc

C.users cc

D.useradd cc

二、多选题

1.SELinux的工作模式有三种,分别( )。

A. enforcing

B. permissive

C. disabled

D. ppt

2.Natfilter是集成到Linux内核协议栈中的一套防火墙系统,它主要作用有( )。

A. 数据包过滤

B. 网络地址转换(NAT)

C. 基于协议类型的连接跟踪

D. 文件传输

3.下列哪些属于PAM的模块类型( )。

A.认证管理(auth)

B.账号管理(account)

C.会话管理(session)

D.文件管理(file)