一、什么是程序
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
命令会默认恢复这个任务
- jobs:
jobs [-lrs]
其中l
选项是查看所有的任务的,会列出PID,r
是查看运行任务的,s
是查看暂停任务的 - fg:
fg 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 就是可执行文件用户权限那一栏的
x
被s
取代,用户在运行这个文件的时候可以暂时获得文件所有者的权限 - 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:一般我们都看不到这个字段
- User:这个字段就是用来标志文件和进程是哪个身份拥有,常用的值有
type和domain联合使用:以httpd服务为例
3、SELinux 的启动、关闭与观察
相关命令
getenforce
和setenforce
:查看和设置系统的 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(/.*)?"