Linux 学习笔记 -- 第四部分 Linux 使用着管理 -- 第17章 程序管理与 SELinux 初探

来源:互联网 发布:java解压缩gz文件 编辑:程序博客网 时间:2024/05/01 16:33
进程
Linux 下面执行一个命令时,系统会将相关的权限、属性、程序代码与数据等均加载到内存,并
给予这个单元一个进程标识符(PID),最终该命令可以进行的任务则与这个PID的权限有关。
ps -l 可以查阅进程信息
常驻内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻
进程就会被我们称为服务。

cp file1 file2 & (表示将 file1 复制为 file2,且放置于后台中执行)
放入后台的工作想要运行时,它必须不能够与用户互动,放入后台的工作
是不可以使用 Ctrl+c 来终止的!


工作管理
直接将命令丢到后台中“执行”的 &
tar -zpcf /tmpetc/tar/gz /etc &
[1] 8400 <== [job number] PID
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc


tar -zpcvf /tmp/etc.tar.gz /etc &
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &


将目前的工作丢到后台中“暂停”:[Ctrl]+z
vim ~./bashrc
按下Ctrl+z
[1]+ Stopped vim ~/.bashrc
find / -print
按下Ctrl+z
[2]+ Stopped      find / -print


查看目前的后台工作状态:
jobs [-lrs]
-l 除了列出 job number 与命令串之外,同时列出 PID 的号码
-r 仅列出正在后台 run 的工作
-s 仅列出正在后台当中暂停 (stop) 的工作

jobs -l


将后台工作拿到前台来处理:
fg %jobnumber
%jobnumber jobnumber 为工作号码 (数字)。注意,那个 % 是可有可无的

jobs
fg <== 默认取出带 + 号的工作。立即按下[Ctrl]+z
fg %1 <== 直接取出工作号码为 1 的工作。再按下[Ctrl]+z
jobs


让工作在后台下的状态变成运行中:
find / -perm + 7000 > /tmp/text.txt
#立即按下 [Ctrl]+z 暂停
jobs; bg %4; jobs
管理后台当中的工作:
kill -signal %jobnumber
kill -l
-l 这个是 L 的小写,列出目前 kill 能够使用的信号(signal)有哪些
-signal 代表给予后面接的那个工作什么样的指示。用 man 7 signal 可知:
-1 重新读取一次参数的配置文件(类似 reload)
-2 代表与由键盘输入 [Ctrl]-c 同样的操作
-9 立刻强制删除一个工作
-15 以正常的程序方式终止一项工作。与 -9 是不一样的


jobs
kill -9 %2; jobs
jobs
kill -SIGTERM %1 (-SIGTERM 与 -15 是一样的)

脱机管理问题
工作管理的后台依旧与终端机有关
nohup [命令与参数] <==在终端机前台中工作
nohup [命令与参数] & <==在终端机后台中工作


vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."

chmod a+x sleep500.sh
nohup ./sleep500.sh &

# nohup: appending output to 'nohup.out'

exit


进程管理
进程的查看
ps aux <== 查看系统所有的进程数据
ps -lA <== 也是能够查看所有系统的数据
ps -axjf <== 联通部分进程树状态
-A 所有的进程均显示出来,与 -e 具有相同的作用
-a 不与 terminal 有关的所有进程
-u 有效用户(effective user)相关的进程
x 通常与 a 这个参数一起使用,可列出较完整信息
输出格式规则:
l 较长、较详细地将该 PID 的信息列出
j 工作的格式(job format)
-f 做一个更为完整的输出


仅查看自己的 bash 相关进程:ps -l
查看系统所有进程:ps aux


以ps -l的显示格式显示出所有进程:ps -lA
列出类似进程树的程序显示:ps axjf
找出与 cron 与 syslog 这两个服务有关的 PID 号码
ps aux | egrep '(cron|syslog)'

如果你发现在某个进程的 CMD 后面还接上<defunct>时,就代表该进程是僵尸进程
init是系统第一个执行的程序,他是所有进程的父进程!


动态查看进程的变化:
top [-d 数字] | top [-bnp]
-d 后面可以接秒数,就是整个进程界面更新的秒数。默认是 5 秒
-b 以批次的方式执行 top,还有更多的参数可以使用
  通常会搭配数据流重定向来将批处理的结果输出成文件
-n 与 -b 搭配,意义是,需要进行几次 top 的输出结果
-p 指定某些个 PID 来进行查看检测而已
在 top 执行过程当中可以使用的按键命令:
? 显示在 top 当中可以输入的按键命令
P 以CPU的使用资源排序显示
M 一内存的使用资源排序显示
N 以 PID 来排序
T 由该进程是用的 CPU 时间积累 (TIME+) 排序
k 给予某个 PID 一个信号 (signal)
r 给予某个 PID 重新制定一个 nice 值
q 离开 top 软件的按键

top -d 2


top -b -n 2 > /tmp/top.txt


echo $$ (查看自己的 bash PID)
13639
top -d 2 -p 13639


pstree [-A|U] [-up]
-A 各进程树之间的连接以 ASCII 字符来连接
-U 各进程树之间的连接以 utf8 码的字符来连接,在某些终端接口下可能会有错误
-p 同时列出每个进程的 PID
-u 同时列出每个进程的所属账号名称


pstree -A
pstree -Aup


进程的管理
kill -signal PID


killall -signal 命令名称
killall [-iIe] [command name]
-i interactive 的意思,交互式的,若需要删除时,会出现提示符给用户
-e exact 的意思,表示后面接的 command name 要一致,但整个完整的命令
  不能超过 15 个字符
-I 命令名称(可能含参数)忽略大小写


killall -1 syslogd (给予 syslogd 这个命令启动的 PID 一个 SIGHUP 的信号)

killadd -9 httpd (强制终止所有以 httpd 启动的进程)

killadd -i -9 bash (依次询问每个 bash 进程是否需要被终止运行)

关于进程的执行顺序
CPU 调度指的是每个程序被 CPU 运行的验算规则,而例行性工作调度则是将某个程序安排在某
个时间再交由系统执行。CPU 调度与操作系统具有相关性!

如果进程优先级较高则运行次数可以较多次,而不需要与较低优先级的进程抢位置!


PRI (new) = PRI (old) + nice


nice 新执行的命令即给予新的 nice 值
nice [-n 数字] command
-n 后面接一个数值,数值范围为 -20 - 19

nice -n -5 vim & (用 root 给一个 nice 值为 -5,用于执行 vim,并查看该进程)


ps -l


kill -9 %1


renice 已存在进程的 nice 重新调整
renice [number] PID

ps -l 

renice 10 18625


ps -l (找出自己的 bash PID,并将该 PID 的 nice 调整到 10)


nice 值可以在父进程->子进程之间传递


系统资源的查看
free [-b|-k|-m|-g] [-t] 查看内存使用情况
-b 直接输入 free 时,现实的单位是 KB。我们可以使用 b(bytes),
  m(MB),k(KB),以及 g(GB) 来显示单位
-t 在输出的最终结果中显示物理内存与 swap 的总量


free -m (显示目前系统的内存总量)


uname [-asrmpi] 查看系统与内核相关信息
-a 所有系统相关的信息,包括下面的数据都会被列出来
-s 系统内核名称
-r 内核的版本
-m 本系统的硬件名称,例如 i686 或 x86_64 等
-p CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
-i 硬件的平台 (ix86)


uname -a


uptime 查看系统启动时间与工作负载
uptime (显示出 top 界面的最上面一行)


netstat [-atunlp] 跟踪网络
-a 将目前系统上所有的连接、监听、Socket 数据都列出来
-t 列出 tcp 网络数据包的数据
-u 列出 udp 网络数据包的数据
-n 不列出进程的服务名称,以端口号 (port number) 来显示
-l 列出目前正在网络监听 (listen) 的服务
-p 列出该网络服务的进程 PID

netstat


netstat -tlnp (找出目前系统上已在监听的网络连接及其 PID)

kill -9 4597

killall -9 cupsd


dmesg 分析内核产生的信息
dmesg | more (输出所有的内核开机时的信息)


dmesg | grep -i hd (查找开机的时候硬盘的相关信息)


dmesg | grep -i eth (查看网卡信息)


vmstat 检测系统资源变化
[-a] [延迟 [总计检测次数]]<== CPU/内存等信息
[-fs] <== 内存相关
[-S 单位] <== 设置显示数据的单位
[-d] <== 与磁盘有关
[-p 分区] <== 与磁盘有关

-a 使用 inactive/active (活跃与否) 替代 buffer/cache 的内存输出信息
-f 开机到目前为止系统复制 (fork) 的进程数
-s 将一些事件 (开机至目前为止) 导致的内存变化情况列表说明
-S 后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量
-d 列出磁盘的读写总量统计表
-p 后面列出分区,可显示该分区的读写总量统计表

vmstat 1 3 (统计目前主机 CPU 状态,每秒一次,共计三次)

vmstat -d (系统上面所有磁盘的读写状态)

特殊文件与程序
具有 SUID/SGID 权限的命令执行状态 
passwd

pstree -u


find / -perm +6000


/proc/* 代表的意义
ll /proc


ll /proc/1


cmdline 这个进程被启动的命令串


environ 这个进程的环境变量内容


cat /proc/1/cmdline


查询已打开文件或已执行程序打开的文件
fuser [-umv] [-k [i] [-signal]] file/dir 通过文件 (或文件系统) 找出正在使用该文件的程序
-u 除了进程的 PID 之外,同时列出该进程的所有者
-m 后面接的那个文件名会主动上提到该文件系统的顶层,对 umount 不成功很有效
-v 可以列出每个文件与程序还有命令的完整相关性
-k 找出使用该文件/目录的 PID,并试图以 SIGKILL 这个信号给予该 PID
-i 必须与 -k 配合,在删除 PID 之前会先询问用户意愿
-signal 例如 -l 15 等,若不加的话,默认是 SIGKILL (-9)


fuser -uv (找出目前所在目录的使用 PID / 所属账号 / 权限)

fuser -uv /proc (不会显示任何数据,因为没有任何进程会去使用 /proc 这个目录
会被用到的是 /proc 下面的文件)
fuser -mvu /proc


find /var -type p (找到 /var 下面属于 FIFO 类型的文件,并且找出访问该文件的进程)


fuser -uv /var/gdm/.gdmfifo

fuser -ki /var/gdm/.gdmfifo

lsof [-aUu] [+d] 列出被进程所打开的文件名
-a 多项数据需要“同时成立”才显示出结果时
-U 仅列出 Unix like 系统的 socket 文件类型
-u 后面接 username,列出该用户相关进程所打开的文件
+d 后面接目录,即找出某个目录下面已经打开的文件

lsof (找出目前系统上面所有已经被打开的文件与设备)

lsof -u root -a -U (仅列出关于 root 的所有进程打开的 socket 文件)

lsof +d /dev (列出目前系统上面所有的被启动的周边设备)


lsof -u root | grep bash (显示出属于 root 的 bash 这个进程所打开的文件)

pidof [-sx] program_name 找出某个正在执行的进程的 PID
-s 仅列出一个 PID 而不列出所有的 PID
-x 同时列出该 program name 父进程的 PID

pidof init syslogd (列出目前系统上面 init 以及 syslogd 这两个进程的 PID)

SELinux 初探
什么是 SELinux
其实 SELinux 是在进行程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是
程序,因此刚好也是能够控制网络服务能否访问系统资源的一道关卡。


传统的文件权限与账号关系:自主访问控制,DAC
以策略规则制定特定程序读取特定文件:委托访问控制,MAC


SELinux 的启动、关闭与查看
目前 SELinux 支持三种模式:
enforcing:强制模式,代表 SELinux 正在运行中,且已经正确开始限制 domain/type 了
permissive:宽容模式,代表 SELinux 正在运行中,不过仅会有警告信息并不会实际限制
   domain/type 的访问。这个模式可以用来作为 SELinux 的调试之用
disabled:关闭,SELinux 并没有实际运行


查看 SELinux 模式:
getenforce

查看 SELinux 策略:
sestatus [-vb]
-v 检查列于 /etc/sestatus/conf 内的文件与程序的安全上下文内容
-b 将目前策略的规则布尔值列出,即某些规则 (rule) 是否要启动 
  (0/1) 之意


SELinux 的配置文件:vim /etc/selinux/config
SELINUX=enforcing<== 调整 enforcing | disabled | permissive
SELINUXTYPE=targeted<== 目前仅有 targeted 与 strict


SELinux 的启动与关闭
修改 /etc/selinux/config
修改 /boot/grub/menu.lst 确认没有 selinux=0
reboot 
reboot


让 SELinux 在 enforcing 和 permissive 之间切换:(不能在 disabled 模式下进行)
setenforce [0|1]
0 转成 permissive 宽容模式
1 转成 enforcing 强制模式

SELinux 网络服务运行范例
网络服务的启动与查看
/etc/init.d/httpd start (启动网络服务)


pstree | grep http (查看有无此进程,并且查看此进程的 SELinux 安全上下文数据)

ps aux -Z | grep http


echo "This is my first web page." > /var/www/html/index.html

ll -Z /var/www/html/index.html

错误的 SELinux 安全上下文
echo "My 2nd web page..." > index.html

rm /var/www/html/index.html

mv index.html /var/www/html


重设 SELinux 安全上下文
chcon [-R] [-t type] [-u user] [-r role] 文件 (通过直接指定的方式来处理安全上下文的类型)
chcon [-R] --reference=范例文件 文件
-R 连同该目录下的子目录也同时修改
-t 后面接安全上下文的类型字段! 例如 httpd_sys_content_t
-u 后面接身份识别,例如 system_u
-r 后面接角色,例如 system_r
--reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!


chcon -t httpd_sys_content_t /var/www/html/index.html 
(将刚才的 index.html 类型改为 httpd_sys_content_t)

ll -Z /var/www/html/index.html


ll -Z /etc/passwd


chcon -reference=/etc/passwd /var/www/html/index.html

ll -Z /var/www/html/index.html


restorecon [-Rv] 文件或目录
-R 连同子目录一起修改
-v 将过程显示到屏幕上


restorecon -Rv /var/www/html/index.html


SELinux 所需的服务
setroubleshoot 将错误信息写入 /var/log/messages
chkconfig --list setroubleshoot
setroubleshoot0:off 1:off2:off 3:on4:on 5:on6:off
(我们的 Linux 运行模式是在 3 或 5 号,因此这两个要设为 on 即可)
(--list 是列出目前的执行等级是否有启动)


chkconfig setroubleshoot on (on 则开机时启动,off 则开机时不启动)

cat /var/log/messages | grep setroubleshoot


sealter -l 6c028f77-ddb6-4515-91f4-4e3e719994d4

auditd 将详细数据写入 /var/log/audit/audit.log
chkconfig --list auditd
chkconfig auditd on

audit2why < /var/log/audit/audit.log


SElinux 的策略与规则管理
策略查阅
seinfo [-Atrub]
-A 列出 SELinux 的状态、规则布尔值、身份识别、角色、类型等所有信息
-t 列出 SELinux 的所有类型 (type) 种类
-r 列出 SELinux 的所有角色 (role) 种类
-u 列出 SELinux 的所有身份标识 (user) 种类
-b 列出所有规则的种类 (布尔值)


seinfo (列出 SELinux 在此策略下的统计状态)

seinfo -b | grep httpd (列出与 httpd 有关的规则 (booleans) 有哪些)

seseach [-a] [-s 主体类型] [-t 目标类型] [-b 布尔值]
-a 列出该类型或布尔值的所有相关信息
-t 后面还要接类型,例如 -t httpd_t
-b 后面还要接布尔值的规则,例如 -b httpd_enable_ftp_server

sesearch -a -t httpd_sys_content_t 
(找出目标文件资源类型为 httpd_sys_content_t 的有关信息)

sesearch -s httpd_t -t httpd_* -a 
(找出主体进程为 httpd_t 且目标文件类型为 httpd 相关的所有信息)


主体进程能否对某些目标文件进行访问与这个布尔值非常有关系


布尔值的查询与修改
getsebool [-a] [布尔值条款]
-a 列出目前系统上面的所有布尔值条款设置为开启或关闭值


getsebool -a (查询本系统内所有的布尔值设置状况)


setsebool [-P] 布尔值=[0|1]
-P 直接将设置值写入配置文件,该设置数据将来会生效的


getsebool httpd_enable_homedirs 


setsebool -P httpd_enable_homedirs=0


getsebool httpd_enable_homedirs
(查询 httpd_enable_homedirs 是否为关闭,若不为关闭,则关闭它)


默认目录的安全上下文查询与修改
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
fcontext 主要用在安全上下文方面的用途,
-l 为查询的意思
-a 增加的意思,你可以增加一些目录的默认安全上下文类型设置
-m 修改的意思
-d 删除的意思

semanage fcontext -l (列出所有目录的默认安全上下文设置)


mkdir /srv/samba
ll -Zd /srv/samba
semanage fcontext -l | grep '/srv'
semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"
semanage fcontext -l | grep '/srv/samba'
cat /etc/selinux/targeted/contexts/files/file_contexts_local
restorecon -Rv /srv/samba* <== 尝试恢复默认值
ll -Zd /srv/samba


通过 vsftpd 的服务了解程序与 SELinux 的相关限制行为:
1.查看有无这个软件:
rpm -q vsftpd
yum install vsftpd
2.启动 vsftpd 这个服务
/etc/init.d/vsftpd start
3.降低 vsftpd 优先级
renice 10 2377
top -p grep 2377
4.查看使用的端口
netstat -tlunp | grep vsftpd
5.vbird无法登录自己的FTP
1.先用 vbird 的身份登录 vsftpd
ftp localhost
vbird
bye
ls -ld /home/vbird
2.看看日志有没有什么重要信息的说明
tail /var/log/messages
3.照着做一下
sealter -l b8bdaf2d-b083-4e28-9465-91fae8df63b1
4.处理相关规则
setsebool -P ftp_home_dir=1
ftp localhost
vbird
#login successful
bye
0 0
原创粉丝点击