Linux 基础篇(05)程序管理与SELinux初探

一、什么是程序

1、程序与进程

  • 程序 (program):通常为 binary program ,存放在硬盘等存储设备,是实体文件
  • 进程 (process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,process就是一个正在运行中的program
    在这里插入图片描述
子程序与父程序
  • 可以通过 PPID 来判断一个程序的父程序是哪一个
  • 杀掉的程序有时候会死灰复燃,排除是定时任务的可能的话,那就是存在父程序,父程序会自动开启子程序
    在这里插入图片描述
程序调用流程
  • 在 Linux 的程序呼叫通常称为 fork-and-exec 的流程 !程序都会藉由父程序以复制 (fork) 的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec 的方式来运行实际要进行的程序,最终就成为一个子程序的存在
    在这里插入图片描述
系统和网络服务
  • 启动在后台一直持续不断的运行,常驻在内存中的程序就会被我们称为服务 (daemon)
  • 例如 Apache 等的网络服务也会常驻内存

2、Linux 的多人多工环境

  • ctrl + alt + F1-F7切换终端
  • 当一个程序出错导致当前的 bash 死掉的时候,我们可以切换到另外的终端把出错的那个程序 kill 掉即可
  • cp file1 file2 & 可以后台复制文件,重点在于那个 & 符号起作用

二、多任务管理

  • 解决在一个bash 界面怎么同时处理多个任务的问题

1、多任务管理

终端多任务管理的限制
  • 工作管理不能跨终端
  • 前台:你可以控制与下达命令的这个环境
  • 后台:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作
  • 后台中运行的程序不能等待终端的输入
多任务管理中常用的操作和命令
  • &tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 & 直接加在命令的最后面就可以在后台运行工作了,配合数据流的重导向可以减少对前台的影响
  • [ctrl]-z:这个操作会直接将当前的任务转入后台,注意不是后台运行,进入后台之后程序是一个暂停的状态,其中的+代表fg命令会默认恢复这个任务
    在这里插入图片描述
  • jobsjobs [-lrs]其中l选项是查看所有的任务的,会列出PID,r是查看运行任务的,s是查看暂停任务的
  • fgfg 1取出工号为 1 的任务,不指定的话,默认取出带 + 的那个任务
  • bg:ctrl+ z切换到前台以后,后台的工作都是处于暂停的状态,bg 4这个命令是将工号为4的任务在后台运行起来
  • kill:用于进程管理的话后面一般跟的PID,如果是用于 bash 的工作管理的话就是 %num
关于 linux 中的 signal 的说明
  • signal 的本质:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。
  • signal 的特点:信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达
  • 通过kill -l可以查看所有可用的信号,通过 man 7 signal可以查看所有信号的详细描述
  • 通常使用 kill 命令的格式是:kill -signal %jobnumber 其中的 signal 我们常用的有以下的几个
-1 :终止前台进程组和后台有终端输出的进程,对于终端无关的程序就是重新读取配置文件
-2 :代表与由键盘输入 [ctrl]-c 同样的动作,就是终止前台程序
-9 :用来立即结束程序的运行.,本信号不能被阻塞、处理和忽略,一般就是用来执行强制退出
-15:kill 默认使用的就是这个信号,该信号可以被阻塞和处理,通常用来要求程序自己正常退出
-17:相当于 ctrl-z 的操作,当前程序转入后台,并且是暂停状态

2、离线管理nohup

  • 这个命令和终端无关,就算是退出登录离开终端依然是可以运行的
  • nohup 并不支持 bash 内建的命令,因此命令必须要是外部命令才行
  • 要让在后台工作在注销后还能够继续运行,那么使用 nohup 搭配 & 是不错的nohup ./sleep500.sh &

三、程序管理

1、程序的观察

获取某一时间点程序运行情况ps
  • 仅观察自己的 bash 相关程序: ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 13639 13637  0  75   0 -  1287 wait   pts/1    00:00:00 bash
4 R     0 13700 13639  0  77   0 -  1101 -      pts/1    00:00:00 ps

# 以上命令显示的内容表示:
bash 的程序属於 UID 为 0 的使用者,状态为睡眠 (sleep), 之所以为睡眠因为他触发了 ps (状态为 run) 之故。
此程序的 PID 为 13639,优先运行顺序为 75 , 下达 bash 所取得的终端介面为 pts/1 ,运行状态为等待 (wait) 
  • 观察系统所有程序: ps aux | egrep '(cron|syslog)'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2064   616 ?        Ss   Mar11   0:01 init [5]
root     13639  0.0  0.2   5148  1508 pts/1    Ss   11:44   0:00 -bash

# 以上命令显示的内容表示:
 root 运行的 bash PID 为 13639,占用了 0.2% 的内存容量百分比,
 状态为休眠 (S),该程序启动的时间为 11:44 , 且取得的终端机环境为 pts/1 。
  • 关于僵尸程序
    • 僵尸程序的产生:就是子程序自己终止了,但是父程序没有进行回收,导致进程描述信息还滞留在内存中,最终的结果就是我们通过 ps 能够查询到这个进程,但是进程实际上已经终止了
    • 用 ps 命令查看进程的时候,状态的那一栏是大写的 Z 的就是僵尸程序了
    • 僵尸程序可以直接 kill ,如果僵尸程序很多又 kill 不掉的话,直接使用 reboot 大法
apache  8683  0.0  0.9 83384 9992 ?   Z  14:33   0:00 /usr/sbin/httpd <defunct>
动态观察程序运行变化top
  • top 使用格式top [-d 数字] | top [-bnp]

  • top 的选项与参数
    -d :后面可以接秒数,就是就是信息刷新的时间间隔,默认是 5 秒;
    -b :以批量的方式运行 top ,还有更多的参数可以使用喔!
    通常会搭配数据流重导向来将批量的结果输出成为文件。
    -n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
    -p :指定某些个 PID 来进行观察监测而已。

  • 在 top 运行中可以使用的按键命令
    ? :显示在 top 当中可以输入的按键命令;
    P :以 CPU 的使用资源排序显示;
    M :以 Memory 的使用资源排序显示;
    N :以 PID 来排序喔!
    T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
    k :给予某个 PID 一个讯号 (signal)
    r :给予某个 PID 重新制订一个 nice 值。
    q :离开 top 软件的按键。

  • top 命令显示内容,其中需要注意的是:

    • 第三行显示的是 CPU 的整体负载,需要特别注意的是 %wa ,那个项目代表的是 I/O等待, 通常系统会变慢都是 I/O 产生的问题比较大!
    • PR :Priority 的简写,程序的优先运行顺序,越小越早被运行;NI :Nice 的简写,与 Priority 有关,也是越小越早被运行;
top - 17:08:21 up  1:01,  2 users,  load average: 0.05, 0.06, 0.05
Tasks: 186 total,   1 running, 185 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  2.9 sy,  0.0 ni, 97.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863248 total,   974796 free,   421608 used,   466844 buff/cache
KiB Swap:  4145144 total,  4145144 free,        0 used.  1247948 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                   
     9 root      20   0       0      0      0 S   6.2  0.0   0:07.53 rcu_sched                                                                 
  3351 root      20   0  162024   2308   1568 R   6.2  0.1   0:00.02 top                                                                       
     1 root      20   0  191264   4208   2608 S   0.0  0.2   0:06.14 systemd                                                                   
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.09 kthreadd     
查看进程树pstree
  • 找程序之间的相关性,这个 pstree 真是好用到不行,具体的解释如下pstree [-A|U] [-up]
-A  :各程序树之间的连接以 ASCII 字节来连接;
-U  :各程序树之间的连接以万国码的字节来连接。在某些终端介面下可能会有错误;
-p  :并同时列出每个 process 的 PID;
-u  :并同时列出每个 process 的所属帐号名称。

通过这个命令我们可以看到在 centos7环境下,一号程序不再是init ,而是 systemd

2、程序运行的优先级

Priority 与 Nice 值
  • CPU 排程的优先级划分更有利于CPU资源的合理分配,PRI和NI值都可以影响程序的优先级
  • 通过 ps 等命令观察到的 PRI 值越低代表越优先的意思,不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的
  • 用户只能通过调整 NI 值来间接影响 PRI 的值(PRI(new) = PRI(old) + nice
nice值说明
  • nice 值可调整的范围为 -20 ~ 19 ;
  • root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ;
  • 一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
  • 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大於 5;
  • 整个 nice 值是可以在父程序 --> 子程序之间传递的,也就是NICE 值是可以继承的
新开程序赋予nice值nice
  • nice -n -5 vi & 这条命令是指定vi程序的nice值为-5
重新调整运行程序nice值renice
  • renice 10 18625 最后面的数字是PID
  • 通过 top 命令也是可以修改程序的 nice 值的,top输出界面按小写的r就可以

3、系统资源的观察netstat

  • 内存资源的观察:free -m
    • 实体内存被用光是正常的,linux 为了加速系统会将常用的数据进行 buffer 和cached
    • swap 的使用经常超过 20% 的话是需要注意的,这意味着最好还是添加一点实体的内存
  • 查阅系统与核心相关资讯:uname -a
  • 观察系统启动时间与工作负载:uptime
  • 追踪网络或socket file:netstat -[atunlp]
-a  :将目前系统上所有的连线、监听、Socket 数据都列出来
-t  :列出 tcp 网络封包的数据
-u  :列出 udp 网络封包的数据
-n  :不以程序的服务名称,以端口号 (port number) 来显示;
-l  :列出目前正在网络监听 (listen) 的服务;
-p  :列出该网络服务的程序 PID 
  • 分析核心产生的信息:dmesg|grep -i hd
  • 侦测系统资源变化:vmstat
    • 可以查看CPU内存等使用情况
    • 系统很卡的时候,可以用这个命令看看(主要观察 IO 的使用)
=>统计目前主机 CPU 状态,每秒一次,共计三次!
vmstat 1 3

=>系统上面所有的磁碟的读写状态
vmstat -d

四、特殊文件与程序

1、具有 SUID/SGID 权限的命令运行状态

SUID 和 SGID 概念回顾
  • SUID 就是可执行文件用户权限那一栏的xs取代,用户在运行这个文件的时候可以暂时获得文件所有者的权限
  • SGID对二进制可执行文件和SUID基本是一样的效果,差异在于获得的是文件群组的权限,对于目录的话就是进入该目录,有效群组变为了该目录的群组

find / -perm /6000 可以查看系统中所有具有特殊权限的文件

2、/proc目录说明

  • 进程都是在内存当中,而内存当中的数据又都是写入到 /proc/* 这个目录下的,所以可以直接在 /proc 这个目录下找到进程对应的文件夹,文件夹都是用 PID 作为名称的
  • 进程的文件夹中比较重要的两个文件是
    • cmdline:程序被启动的命令串
    • environ:程序的环境变量内容
proc文件夹下的其他东西

在这里插入图片描述

3、查看使用文件的程序&程序打开的文件

  • fuser:找出正在使用某个文件(或者文件系统)的程序
=> 针对目录,这里是当前目录
fuser -uv .

=> 针对独立的文件系统
fuser -mvu /proc

=> 针对单独的文件
fuser -uv /var/gdm/.gdmfifo
  • lsof :列出被程序所开启的文件名
=> 仅列出关於 root 的所有程序开启的 socket 文件
lsof -u root -a -U

=> 请列出目前系统上面所有的被启动的周边装置
lsof +d /dev
  • pidof :找出某支正在运行的程序的 PID

很多时候一个目录我们无法删除,显示 busy,其实是我们当前的工作目录就是他,不过没注意而已


五、SELinux 初探

1、什么是 SELinux

  • Security Enhanced Linux的缩写,字面上的意义就是安全强化的 Linux 之意
  • SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)
  • SElinux已经整合到 Linux 的核心
DAC自主式存取控制
  • 之前讲的权限的管理就是DAC,依据用户与文件资源的 rwx 权限来决定有无存取的能力
  • 这种权限控制的主体是用户,root 具有最高的权限,可以在系统上为所欲为,很危险的
MAC委任式存取控制
  • 使用了SElinux,文件的存取修改除了要判断用户是否具有权限之外,还需要判断当前的进程是否具有文件资源的存取修改权限
  • 这种权限管理机制的主体是进程,所以即使是以root身份运行的程序,也不是意味着他就可以为所欲为

2、SELinux 的运行模式

SELinux组件
  • 主体 (Subject): 直接将进程视为主体即可

  • 目标 (Object): 主体访问的目标资源,直接理解为文件或者目录即可

  • 政策和规则 (Policy&Rule):

    • 系统中有大量的文件和进程,通常只是选择性地对某些进程进行管制
    • 哪些进程需要管制、要怎么管制是由政策决定的
    • 一套政策里面有多个规则,规则可以按需开启或禁用
    • CentOS 7中系统内置的三套政策是:
      • targeted:对大部分网络服务进程进行管制,系统默认就是这个
      • minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制,一般不用
      • mls:多级安全保护,对所有的进程进行管制,这是最严格的政策,配置难度非常大
    • 政策可以在 /etc/selinux/config中设定,这个文件的内容如下
      在这里插入图片描述
  • 安全上下文 (security context):

    • 这里的安全上下文分为 进程安全上下文文件安全上下文
    • 只有两者的安全上下文对应上了,进程才能访问文件
      在这里插入图片描述
安全上下文
  • 文件安全上下文是放置到文件的 inode 内的,通过ls -Z 可以查看到文件安全上下文内容
  • 进程安全上下文可以通过命令 ps auxZ | grep -v grep | grep nginx 来查看
  • 安全上下文查询出来的显示如下图
    在这里插入图片描述
  • 安全上下文五个字段的说明
    • User:这个字段就是用来标志文件和进程是哪个身份拥有,常用的值有root\system_u\user_u
    • Role:这个字段就是用来区分文件和进程的(文件:object_r进程:system_r
    • Type:最重要的字段,进程是否可以访问文件,主要就是看二者的类型字段能否匹配了,至于怎么匹配要看政策中的具体规则;类型字段在文件或目录的安全上下文中被称作类型(type),但是在进程的安全上下文中被称作域(domain)
    • Sensitivity:灵敏度一般是用 s0、s1、s2 来命名的,数值越大代表灵敏度越高,Target策略默认使用s0
    • Category:一般我们都看不到这个字段
      在这里插入图片描述
type和domain联合使用:以httpd服务为例

在这里插入图片描述
在这里插入图片描述

3、SELinux 的启动、关闭与观察

相关命令
  • getenforcesetenforce:查看和设置系统的 selinux 状态
  • sestatus:查看 selinux 当前运行的详细的信息
-v  :检查列於 /etc/sestatus.conf 内的文件与程序的安全性本文内容;
-b  :将目前政策的守则布林值列出,亦即某些守则 (rule) 是否要启动 (0/1) 之意;
selinux配置文件:/etc/selinux/config

在这里插入图片描述

  • centos7 环境下,我试图让 selinux 开机启动就将下面的文件中的相关内容设置为 SELINUX=enforcing,但是开机无论是图形界面还是命令行都无法登录,能够启动,但是无法开机,至于具体的原因有知道的老兄可以指导一下
  • 出现上面的内容的拯救的方法就是开机出现开机菜单的时候按 e 进入 grub 启动选项的编辑,在有 UTF-8 字样的那段配置的后面加上 enforcing=0 ,在按 ctrl+x 就可以正常启动登录了
  • 当然正常登录之后文件的内容还是改成 SELINUX=permissive,这个我试了可以正常启动登录的,同时也方便切换状态
selinux状态切换
  • selinux 的三种状态
- enforcing:强制开启,会进行权限的控制
- permissive:这种是消极模式,只会输出相应的警告,但是不做实际的权限的控制
- disabled:禁用,这个模式的话,就没办法通过 setenforce 命令来切换状态了
  • 也就是说实际能相互切换的就是enforcing和permissive,这二者一旦切换到disabled就无法直接切换回来了

setenforce 切换状态 1代表enforcing,0代表permissive

4、SELinux 网络服务运行示例(httpd)

安全上下文修改和还原
  • 我的 centos 是在虚拟机里面装的,虚拟机开启 httpd 的服务之后,暂时关闭防火墙,主机浏览器输入虚拟机的ip即可访问
  • 这里我完全跟着鸟哥的教程做了,但是无论我怎么改index 的类型,我的浏览器都能够访问这个页面,按理说不应该呀,先标记一下
=> 将刚刚的 index.html 类型改为 httpd_sys_content_t 的类型
chcon -t httpd_sys_content_t /var/www/html/index.html

=> 以 /etc/passwd 为依据,将 index.html 修改成该类型
chcon --reference=/etc/passwd /var/www/html/index.html

=> 将错误的 index.html 以默认的安全性本文改正过来
restorecon -Rv /var/www/html/index.html

5、SELinux 错误查看分析

setroubleshoot错误信息写入/var/log/messages
  • centos7 已经默认安装并开启 setroubleshoot
  • cat /var/log/messages|grep setroubleshoot就是查看日志中的selinux的错误信息
  • sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4可以查看错误信息的详细描述,后面的那串错误的id可以在日志里面看到
  • 要解决相关的问题需要关注 sealert 命令的 allow access 的部分内容,通过里面的方法就可以访问到相应的资源
auditd 详细数据写入/var/log/audit/audit.log
  • 这个在 centos7 里面也是默认安装并开启的
  • audit2why < /var/log/audit/audit.log这个命令可以分析日志里面的错误信息,注意 auditd 这个服务并不只是记录错误信息
  • 一般来说用 setroubleshoot 就可以了
关于 centos7 中的service、chkconfig和systemctl
  • 通过 whatis 命令查询到的三个的用途
    • chkconfig 是更新和查询系统服务的运行等级相关信息
    • service 是运行一个 System V 风格的初始化脚本
    • systemctl控制systemd系统和服务管理器
  • systemd 和 systemctl 命令
    • 在centos7 中呢,service和chkconfig基本就是没啥用了,被systemctl给取代了
    • 老版本的 system V风格的初始化脚本被 systemd 所取代,而且还能管理系统各种方面的 daemon
    • 基本来讲systemctl 实现了service和chkconfig的功能集合
  • systemctl 使用
=> 列出所有可用单元
systemctl list-unit-files

=> 列出已加载的单元
systemctl list-units

=> 列出失败的单元
systemctl --failed

=> 检查某个单元是否启用
systemctl is-enabled sound.target

=> 检查某个单元的状态
systemctl status sound.target

=> 启动、重启、停止、重载服务
systemctl start httpd.service
systemctl restart httpd.service
systemctl stop httpd.service
systemctl reload httpd.service

=> 激活/禁止自动启动
systemctl enable httpd.service
systemctl disable httpd.service

=> 杀死服务
systemctl kill httpd

6、SELinux政策&守则管理

政策和规则查阅seinfo、sesearch
  • 查询具体的政策就用 seinfo 这个命令,centos7 输入这个命令显示找不到,原因是没有安装相应的工具,可以使用命令yum install setools 进行安装即可
  • 查询到相关的类别或者是布尔值后,想要知道详细的守则时, 就得要使用 sesearch这个命令
  • selinux-target实际的政策数据都是放置到/etc/selinux/targeted/policy/底下
=> 列出与 httpd 有关的守则 (booleans) 有哪些?
seinfo -b | grep httpd

=> 找出目标文件资源类别为 httpd_sys_content_t 的有关资讯
sesearch -A -t httpd_sys_content_t

=> 找出主体程序为 httpd_t 且目标文件类别为 httpd 相关的所有资讯
sesearch -s httpd_t -t httpd_* -A

=> 我知道有个布林值为 httpd_enable_homedirs ,请问该布林值规范多少守则?
sesearch -b httpd_enable_homedirs -A
布尔值的查询与修改getsebool、setsebool
=> 查看所有的布尔值
getsebool -a

=> 查询 httpd_enable_homedirs 是否为关闭,若不为关闭,请关闭他!
getsebool httpd_enable_homedirs
setsebool -P httpd_enable_homedirs=0
默认安全上下文查询修改semanage
  • 每个目录或文件都会有默认的安全性本文,查询这些目录的默认安全性本文就得要使用 semanage
  • 通过这个命令配置的默认的安全性文本是写入到这个文件的/etc/selinux/targeted/contexts/files/file_contexts.local
semanage fcontext -{a|d|m} [-frst] file_spec
选项与参数:
fcontext :主要用在安全性本文方面的用途
-l 为查询的意思;
-a :添加的意思,你可以添加一些目录的默认安全性本文类型配置;
-m :修改的意思;
-d :删除的意思
=> 查询一下 /var/www/html 的默认安全性本文配置为何!
semanage fcontext -l|grep /var/www/html

=> 给某个目录设置默认的安全性文本
semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"

参考文章
Centos7下的systemctl命令与service和chkconfig

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值