[关闭]
@mrz1 2017-12-31T15:09:32.000000Z 字数 20912 阅读 1206

2017-12-27课程笔记(定制linux 编译安装 SElinux AWK介绍及变量)

笔记


rm -rf /boot/ /etc/fstab
dd if=/dev/zero of=/dev/sda1 //boot没了数据没了文件系统破坏了

修复需光盘引导 救援模式修复
修复 需要创建文件系统 mkfs.ext4 /dev/sda1
由于/etc/fstab文件被破坏,所以逻辑卷不能被挂载,此时必须先激活卷组,可以查看一下lv和vg,均处于不可用状态。

  1. 查看:lvs lvdisplay 逻辑卷 pvs 卷组
  2. 激活逻辑卷:vgchange ay
  3. 创建一个挂载点:mkdir /mnt/root
  4. 下面进行挂载:mount /dev/VolGroup/lv_root /mnt/root

现在开始恢复之前的fstab文件

  1. 自己手动写入文件内容导入到/etc/fstab,由于驱动也被破坏了,不能使用vim编辑器,所以只能用重定向导入。
  2. cat > /mnt/rootfs/etc/fstab
  3. /dev/sda1/ /boot ext4 defaults 0 0
  4. /dev/mapper/VolGroup/lv_root / ext4 defaults 0 0
  5. /dev/mapper/VolGroup-lv-swap swap swap defaults 0 0

重要:之后必须重新启动让救援模式自动挂载分区
点击shell start shell之后

  1. chroot /mnt/sysimage 切换跟 //要装greb 必须切根
  2. mkdir /mnt/chrom
  3. mount /dev/sr0 /mnt/chrom
  4. rpm -ivh /mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force //引文切跟了 所以不写--root=/mnt/sysimage
  5. greb-install /dev/sda 修复完成
  6. 这里 修复好了 稍等下sync 因为它写到缓存 立即重启有可能会出现问题
  7. 但是唯独没有grub.conf
  1. 之后 编辑grub.conf文件
  2. default=0
  3. timeout=5
  4. titel centos6
  5. kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=uuid=xxxx
  6. initrd /initramfs-2.6.32-696.el6.x86_64.img
  7. r!ls /boot/vmlinuz-2.6.32-696.el6.x86_64 /boot/initramfs-2.6.32-696.el6.x86_64.img
  8. r!blkid /dev/sda2
  9. 现在重启 完成

centos6启动流程

centos6启动流程

自制linux系统

  1. 分区并创建文件系统
  2. fdisk /dev/sdb
  3. 分两个必要的分区 /dev/sdb1对应 /boot /dev/sdb2对应根 /
  4. mkfs.ext4 /dev/sdb1
  5. mkfs.ext4 /dev/sdb2
  6. 挂载boot
  7. mkdir/mnt/boot 子目录必须为boot
  8. mount /dev/sdb1 /mnt/boot
  9. hexdump -C -n 512 /dev/sdb //有分区 没有grub 1 1.5 2 阶段
  10. 安装grub
  11. grub-install --root-directory=/mnt/dev/sdb
  12. ls /mnt/boot/grub //查看是否生成
  13. 恢复内核和initramfs文件
  14. rpm -ivh /mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force //这条命令会装内核文件磁盘文件各种/lib/modules/*库 这里我们考过去最基本的
  15. cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
  16. cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
  17. 建立grub.conf
  18. vim /mnt/boot/grub.conf
  19. default=0
  20. timemout=3
  21. title costomlinux
  22. kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash //这里写bash是因为简单 如果写init 还得写大量的配置文件/etc/inittab 各种脚本
  23. initrd /initramfs-2.6.32-642.el6.x86_64.img
  24. 创建一级目录
  25. mkdir /mnt/rootfs
  26. mount /dev/sdb2 /mnt/rootfs
  27. mkdir pv /mnt/rootfs/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
  28. 复制bash和相关库文件
  29. 复制相关命令及相关库文件 需要copycmd.sh文件复制
  30. 如:bash ifconfig insmod ping ls cat mv cp mount quit 网卡驱动(modinfo e1000//查看路径)...等
  31. insmod /lib/e1000.ko 加载网卡驱动
  32. ifconfig eth0 192.168.2.03 配置ip
  33. 开机启动配置ip
  34. grub.conf
  35. vim /mnt/boot/grub.conf
  36. kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 //这里不写参数 它会直接去/sbin/init
  37. vim /sbin/init
  38. /bin/bash
  39. insmod /lib/e1000.ko
  40. ifconfig eth0 192.168.2.03
  41. 就会先执行就这脚本 脚本有/bin/bash 加载网卡驱动,配置网络

救援环境

在根文件系统无法使用时需要,如/bin/mount删除
对系统没有特殊要求
从光盘引导(boot.iso或者安装光盘#1)
从USB盘(由boot.iso制作)引导

文件系统重组

  1. Anaconda将会询问是否应该挂载文件系统
  2. /mnt/sysimage/*
  3. /mnt/stage2
  4. $PATH包括硬盘的目录
文件系统节点
提供系统特定的设备文件
mknod了解major/minor

系统配置文件丢失修复

系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。

有备份文件的回复方法

  1. 进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
  2. chroot /mnt/sysimage
  3. cp /etc/inittab.bak /etc/inittab

没有备份文件的恢复办法

  1. 如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM
  2. chroot /mnt/sysimage
  3. rpm -qf /etc/inittab
  4. initscripts-9.03.49-1.el6.centos.x86_64
  5. exit 退出chroot模式
  6. 挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)

mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm命令选项"--replacepkgs"表示覆盖安装,执行完成后,即已经恢复了此文件

如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittabcpetc/inittab/mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可

proc目录

/proc目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出(存的是系统状态信息,很多事内存中的数据)
参数:
只读:输出信息
可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
/proc/sys
(1) sysctl命令用于查看或设定此目录中诸多参数
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=mail.magedu.com
(2) echo命令通过重定向方式也可以修改大多数参数的值
echo "VALUE" > /proc/sys/path/to/parameter
echo "websrv" > /proc/sys/kernel/hostname
  1. /proc/cmdline /boot/grub/grub.conf 内核的启动参数
  2. /proc/sys/net/ipv4/ 目录下是网络相关的 在改只是临时生效存不住(内存信息)
  3. 想要保存住使用命令:sysctl 写配置文件
  4. sysctl -w path.to.parameter=VALUE
  5. 例:net.ipv4.ip_forward=0
  6. [root@centos6 ~]#sysctl -w net.ipv4.ip_forward=0
  7. net.ipv4.ip_forward = 0
  8. 注意: net.ipv4.ip_forward 前面不用加/proc/sys因为sysctl命令只是管就是/proc/sys里面的
  9. net/ipv4/ip_forward 之后把"/"换成"."就成了
  10. 修改hostname
  11. sysctl -w kernel.hostname=mail.magedu.com
  12. 永久保存写文件 /etc/sysconfig/network
  13. [root@centos6 ipv4]#cat /etc/sysconfig/network
  14. NETWORKING=yes
  15. HOSTNAME=centos6.qifei.com
  16. [root@centos7 ~]#cat /etc/hostname
  17. centos7.qifei.com
  18. [root@centos7 ~]#hostnamectl set-hostname centos7.qifei.com //设置hostname

sysctl命令

  1. sysctl命令:
  2. 默认配置文件:/etc/sysctl.conf(不是所有配置文件都在这里有比如禁ping)
  3. (1) 设置某参数
  4. sysctl -w parameter=VALUE
  5. (2) 通过读取配置文件设置参数
  6. sysctl -p [/path/to/conf_file]
  7. (3) 查看所有生效参数
  8. sysctl -a
  9. 常用的几个参数:
  10. net.ipv4.ip_forward
  11. net.ipv4.icmp_echo_ignore_all
  12. vm.drop_caches
  13. [root@centos6 proc]#sysctl -a |grep drop
  14. vm.drop_caches = 0
  15. fs.quota.drops = 0
  16. net.core.xfrm_larval_drop = 1
  17. [root@centos6 proc]#sysctl -w vm.drop_caches=1 //清理内存
  18. vm.drop_caches = 1

禁ping

  1. [root@centos6 ~]#cat /proc/sys/net/ipv4/icmp_echo_ignore_all
  2. 0
  3. net.ipv4.icmp_echo_ignore_all = 1 //把这个写到/etc/sysctl.conf里面就行了 禁ping
  4. sysctl -p //从新读/etc/sysctl.conf 生效禁ping
  5. sysctl -a //查看所有生效的设置
  6. 如果注释net.ipv4.icmp_echo_ignore_all = 1 sysctl -p 是读取内存中的 内存是什么 就是什么 机器重启就恢复成默认0

/sys目录

  1. sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性(硬件相关)
  2. udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序
  3. 专用工具:udevadmin, hotplug
  4. udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
  1. 扫描硬盘
  2. echo '- - -' > /sys/class/scsi_host/host0/scan
  3. /etc/udev/rules.d/70-persistent-net.rules //修改eth0 名称
  4. 自己写一个80-disk.rules文件(意思是发现新硬盘如果是/dev/sdc/ 就创建软连接 disk2 可以参考70-persistent-cd.rules
  5. [root@centos6 rules.d]#vim 80-disk.rules
  6. SUBSYSTEM=="block",KERNEL=="sdc",SYMLINK="disk2"
  7. 块设备 如果是sdc 软连接是disk2
  8. [root@centos6 rules.d]#ll /dev/disk2
  9. lrwxrwxrwx. 1 root root 3 Dec 28 16:20 /dev/disk4 -> sdc

内核编译

  1. 单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
  2. 内核组成部分:
  3. kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASErpm -ql kernel 包)
  4. kernel object: 内核对象,一般放置于(如需加载需要的放到vmlinuz
  5. /lib/modules/VERSION-RELEASE/(例:ntsysv 命令)
  6. [ ]: N 这功能不启用
  7. [M]: M 独立文件
  8. [*]: Y 生成到vmlinuz-VERSION-RELEASE
  9. 辅助文件:ramdisk
  10. initrd
  11. initramfs
  12. /boot/config-3.10.0-693.el7.x86_64

内核版本

运行中的内核:

  1. uname命令:
  2. uname - print system information
  3. uname[OPTION]...
  4. -n: 显示节点名称
  5. -r: 显示VERSION-RELEASE
  6. -a: 显示所有信息

内核模块命令

  1. lsmod命令:
  2. 显示由核心已经装载的内核模块(根据硬件自动加载例:优盘usb
  3. 显示的内容来自于: /proc/modules文件
  1. modinfo命令:显示模块的详细描述信息
  2. modinfo[ -k kernel ] [ modulename|filename... ]
  3. -n: 只显示模块文件路径
  4. -p: 显示模块参数
  5. -a: author 作者
  6. -d: description 描述
  7. -l: license 许可证
  8. lsmod|grep xfs;modinfo xfs
  9. [root@centos7 ~]#modinfo -n usb_storage
  10. /lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/usb/storage/usb-storage.ko.xz

内核模块管理

  1. modprobe命令:装载或卸载内核模块
  2. modprobe[ -C config-file ] [ modulename] [ module parame-ters... ]
  3. 配置文件:
  4. /etc/modprobe.conf
  5. /etc/modprobe.d/*.conf
  6. modprobe[ -r ] modulename...
  7. modprobe -r usb_storage //卸载usb模块
  1. depmod命令:
  2. 内核模块依赖关系文件及系统信息映射文件的生成工具
  3. 装载或卸载内核模块
  1. insmod命令:指定模块文件,不自动解决依赖模块
  2. insmod[ filename ] [ module options... ]
  3. insmod `modinfo –n exportfs`
  4. lnsmod `modinfo –n xfs`
  1. rmmod命令:卸载模块
  2. rmmod[ modulename]
  3. rmmod xfs
  4. rmmod exportfs
  5. rmmod usb_storage //卸载usb模块(有依赖性)

编译内核

前提:
1. 准备好开发环境
2. 获取目标主机上硬件设备的相关信息
3. 获取目标主机系统功能的相关信息例如:需要启用相应的文件系统
4. 获取内核源代码包www.kernel.org

开发环境准备

  1. 包组(CentOS 6):
  2. Server Platform Development
  3. Development Tools
  4. 目标主机硬件设备相关信息:
  5. CPU
  6. cat /proc/cpuinfo
  7. x86info -a //yum search x86info //查看包名
  8. lscpu
  9. lspci
  10. lsusb

硬件设备

PCI设备:

  1. lspci
  2. -v
  3. -vv
  4. lsusb
  5. -v
  6. -vv
  7. lsblk 块设备

CentOS6全部硬件设备信息hal-device
tail /var/log/messages //硬件有没有识别
df -T 查看什么系统

内核编译安装系统

  1. 内核文件一般编译安装大概生成10G,注意空间
  2. 安装开发包组
  3. 下载源码文件
  4. .config:准备文本配置文件
  5. make menuconfig:配置内核选项
  6. make [-j #]
  7. make modules_install:安装模块
  8. make install :安装内核相关文件
  9. 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
  10. 生成initramfs文件
  11. 编辑grub的配置文件

编译安装内核示例

1:

  1. tar xvf linux-4.14.9.tar.xz -C /app //解压
  2. du -sh /app //查看大小 1比9
  3. cd /app/linux-4.14.9/
  4. cp /boot/config-3.10.0-693.el7.x86_64 .config
  5. make menuconfig 配置内核选项(有可能打不开缺少包组 例:ncurses-devel)
  6. grep NTFS .config 查看是否启用
  7. make [-j #] 用几核cpu编译
  8. for i in {1..10};do sleep 0.3;echo -e "\a";done ;make [-j #] 发出声音提醒(有可能还缺少库文件继续安装)
  9. make modules_install:安装模块 //lib/modules
  10. make install :安装内核相关文件
  11. 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
  12. 生成initramfs文件
  13. 编辑grub的配置文件
  14. U盘不可写
  15. yum search ntfs
  16. yum install ntfsprogs
  17. yum history uodo 33(编号)

2:

  1. tar xf linux-3.10.67.tar.xz -C /usr/src
  2. cd /usr/src
  3. ln -sv linux-3.10.67 linux
  4. cd /usr/src/linux
  5. cp /boot/config-$(uname -r) ./.config
  6. make help
  7. make menuconfig
  8. make -j 2
  9. make modules_install
  10. make install
  11. reboot

编译内核

1.配置内核选项

  1. (一)支持"更新"模式进行配置:make help
  2. (a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
  3. (b) make menuconfig:基于curses的文本窗口界面
  4. (c) make gconfig:基于GTK (GNOME)环境窗口界面(鼠标)
  5. (d) make xconfig:基于QT(KDE)环境的窗口界面
  6. (二)支持"全新配置"模式进行配置
  7. (a) make defconfig:基于内核为目标平台提供的"默认"配置进行配置
  8. (b) make allyesconfig: 所有选项均回答为"yes"
  9. (c) make allnoconfig: 所有选项均回答为"no"

2.编译

  1. 全编译:make [-j #]
  2. 编译内核的一部分功能:
  3. (a) 只编译某子目录中的相关代码
  4. cd /usr/src/linux
  5. make dir/ 编译dir里面所有模块驱动
  6. (b) 只编译一个特定的模块
  7. cd /usr/src/linux
  8. make dir/file.ko 编译dir/file.ko这个模块驱动
  9. 例如:只为e1000编译驱动:make drivers/net/ethernet/intel/e1000/e1000.ko

3.如何交叉编译内核:

  1. 编译的目标平台与当前平台不相同(一般在哪编译在哪用)
  2. make ARCH=arch_name

4.要获取特定目标平台的使用帮助

  1. make ARCH=arch_name help
  2. make ARCH=arm help 编译arm用到各种的功能选项

5.在已经执行过编译操作的内核源码树做重新编译
6.需要事先清理操作:

  1. make clean:清理大多数编译生成的文件,但会保留config文件等
  2. make mrproper: 清理所有编译生成的文件、config及某些备份文件
  3. make distcleanmrproperpatches以及编辑器备份文件

7.卸载内核

  1. 删除/lib/modules/目录下不需要的内核库文件
  2. 删除/usr/src/linux/目录下不需要的内核源码
  3. 删除/boot目录下启动的内核和内核映像文件
  4. 更改grub的配置文件,删除不需要的内核启动列表
  5. centous7 /boot/grub/grub2/grub.cfg
  6. grub2-mkconfig -o grub.cfg //生成这个文件

练习

  1. 破解root口令,并为grub设置保护功能
  2. 破坏本机grub stage1,而后在救援模式下修复之
  3. 删除vmlinuz和initramfs文件后无法启动,两种方法恢复之
  4. 增加新硬盘,在其上制作能单独运行kernel和bash的系统
  5. 在U盘上定制linux,使其可启动系统,并具有网络功能
  6. 删除/etc/fstab和/boot目录的所有文件,并恢复之
  7. 编译安装kernel,启用支持ntfs文件系统功能

SELinux

SELinux介绍

SELinux: Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Corporation)开发的Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中

DAC:Discretionary Access Control自由访问控制(没有SELINUX)
MAC:Mandatory Access Control 强制访问控制(有SELINUX)
1. DAC环境下进程是无束缚的
2. MAC环境下策略的规则决定控制的严格程度
3. MAC环境下进程可以被限制的
4. 策略被用来定义被限制的进程能够使用那些资源(文件和端口)
5. 默认情况下,没有被明确允许的行为将被拒绝

  1. [root@centos7 boot]#cat config-3.10.0-693.el7.x86_64 |grep SELINUX
  2. CONFIG_SECURITY_SELINUX=y //7已经集成到内核里面了
  3. ·······

SELinux工作过程

SELinux工作过程

SELinux工作类型

SELinux有四种工作类型:(/etc/selinux/config)
1. strict: centos5,每个进程都受到selinux的控制
2. targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,centos4只保护13个服务,centos5保护88个服务
3. minimum:centos7,修改的targeted,只对选择的网络服务
4. mls:提供MLS(多级安全)机制的安全性

targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再使用

SELINUX启用

/etc/selinux/config

  1. [root@centos7 ~]#getenforce
  2. Permissive
  3. [root@centos7 ~]#sestatus
  4. SELinux status: enabled
  5. SELinuxfs mount: /sys/fs/selinux
  6. SELinux root directory: /etc/selinux
  7. Loaded policy name: targeted
  8. Current mode: permissive
  9. Mode from config file: permissive
  10. Policy MLS status: enabled
  11. Policy deny_unknown status: allowed
  12. Max kernel policy version: 28
  13. [root@centos7 ~]#setenforce 1
  14. [root@centos7 ~]#sestatus
  15. SELinux status: enabled
  16. SELinuxfs mount: /sys/fs/selinux
  17. SELinux root directory: /etc/selinux
  18. Loaded policy name: targeted
  19. Current mode: enforcing
  20. Mode from config file: permissive
  21. Policy MLS status: enabled
  22. Policy deny_unknown status: allowed
  23. Max kernel policy version: 28
  24. [root@centos7 ~]#getenforce
  25. Enforcing
  26. enforcing 变成enabled 必须关机
  27. 安全上下文有五个元素组成:`user:role:type:sensitivity:category`会消失 -rw-r--r--. 点会没有

SELinux安全上下文

  1. 传统Linux,一切皆文件,由用户,组,权限控制访问
  2. 在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问
  3. 所有文件和端口资源和进程都具备安全标签:安全上下文(security context)
  4. 安全上下文有五个元素组成:user:role:type:sensitivity:category
    user_u:object_r:tmp_t:s0:c0(ll -Z//查看)
  5. 实际上下文:存放在文件系统中,ls –Z;ps–Z
  6. 期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中semanage fcontext –l

五个安全元素

安全上下文有五个元素组成:unconfined_u:object_r:admin_home_t:s0
1. User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程
2. Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r
3. Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t
4. Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0
5. Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy,c0-c1023共1024个分类,Target 策略不使用category

SELinux策略

  1. 对象(object):所有可以读取的对象,包括文件、目录和进程,端口等
  2. 主体:进程称为主体(subject)
  3. SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义
  4. 当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC (访问矢量缓存Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问
  5. 安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝的,并且定义了哪种行为是充许或拒绝

设置SELinux

  1. 配置SELinux:
  2. SELinux是否启用
  3. 给文件重新打安全标签
  4. 给端口设置安全标签
  5. 设定某些操作的布尔型开关
  6. SELinux的日志管理
  7. SELinux的状态:
  8. enforcing: 强制,每个受限的进程都必然受
  9. permissive: 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志
  10. disabled: 禁用

配置SELinux

  1. 相关命令:
  2. getenforce: 获取selinux当前状态
  3. sestatus:查看selinux状态
  4. setenforce0|1
  5. 0: 设置为permissive 1: 设置为enforcing
  6. 配置文件:
  7. /boot/grub/grub.conf
  8. 使用selinux=0禁用SELinux
  9. /etc/selinux/config
  10. /etc/sysconfig/selinux
  11. SELINUX={disabled|enforcing|permissive}

修改SELinux安全标签

  1. 给文件重新打安全标签:chcon[OPTION]... [-u USER] [-r ROLE] [-t TYPE] FILE...
  2. chcon[OPTION]... --reference=RFILE FILE...
  3. -R:递归打标;
  4. 恢复目录或文件默认的安全上下文:
  5. restorecon[-R] /path/to/somewhere

默认安全上下文查询与修改

  1. Semanage:来自policycoreutils-python
  2. 查看默认的安全上下文
  3. semanage fcontextl
  4. 添加安全上下文
  5. semanage fcontext -a t httpd_sys_content_t '/testdir(/.*)?' restoreconRv/testdir
  6. 删除安全上下文
  7. semanage fcontext -d t httpd_sys_content_t '/testdir(/.*)?'

Selinux端口标签

  1. 查看端口标签
  2. semanage port l
  3. 添加端口
  4. semanage port -a -t port_label-p tcp|udp PORT
  5. semanage port -a -t http_port_t -p tcp 9527
  6. 删除端口
  7. semanage port -d -t port_label-p tcp|udp PORT
  8. semanage port -d -t http_port_t -p tcp 9527
  9. 修改现有端口为新标签
  10. semanageport -m -t port_label-p tcp|udp PORT
  11. semanageport -m -t http_port_t-p tcp 9527
  12. 注意:httpd自带的端口不可修改不可删

SELINUX实例:以httpd服务为例

  1. [root@centos7 ~]#systemctl start httpd //启动httpd 服务
  2. cp /var/www/html/index.html /root
  3. unconfined_u:object_r:httpd_sys_content_t:s0 //原先的
  4. mv /root/index.html /var/www/html/
  5. unconfined_u:object_r:admin_home_t:s0 //修改后的
  6. 这时httpd服务会找不到html文件
  7. restorecon -R /var/www/html/ //还原这个目录下该有的标签
  8. chcon -t httpd_sys_content_t /var/www/html/index.html //针对单个文件
  9. 修改默认标签
  10. semanage fcontext -a t httpd_sys_content_t '/app(/.*)?'
  11. restorecon -R /app/ //还原这个目录下该有的标签httpd_sys_content_t
  12. 删除默认标签
  13. semanage fcontext -d t httpd_sys_content_t '/app(/.*)?'
  14. restorecon -R /app/ //还原这个目录下该有的标签default
  15. 查看端口标签
  16. semanage port -l |grep http
  17. 编辑/etc/httpd/conf/httpd.conf
  18. #Listen 12.34.56.78:80
  19. Listen 80
  20. Listen 9527 //80改成9527这个端口服务就启动失败了
  21. SE 策略报警信息 tail -n 30 cat /var/log/messages //最后30条
  22. 添加端口
  23. semanage port -a -t http_port_t -p tcp 9527
  24. 删除端口
  25. semanage port -d -t http_port_t -p tcp 9527
  26. 修改现有端口为新标签
  27. semanage port -m -t ssh_port_t -p tcp 9527

SELinux布尔值

  1. 布尔型规则:
  2. getsebool
  3. setsebool 修改布尔值
  4. 查看bool命令:
  5. getsebool[-a] [boolean]
  6. semanage boolean l
  7. semanage boolean -l C 查看修改过的布尔值
  8. 设置bool值命令:
  9. setsebool [-P] booleanvalueon,off
  10. setsebool [-P] Boolean=value01
  11. getsebool -a semanage boolean -l相比?
  12. getsebool -a 只显示生效的
  13. semanage boolean -l 显示当前生效和磁盘上保存的(内存)(磁盘)
  1. [root@centos7 ~]#semanage boolean -l|grep ftpd_anon_write
  2. ftpd_anon_write (off(内存) , off(磁盘)) Allow ftpd to anon write
  3. [root@centos7 ~]#setsebool ftpd_anon_write=1 //等于1 或者on 等价 只改的内存 下次重启失效
  4. ftpd_anon_write (on(内存) , off(磁盘)) Allow ftpd to anon write
  5. [root@centos7 ~]#setsebool -P ftpd_anon_write=1 //等于1 或者on 等价 改的全部 保存下次重启不失效
  6. ftpd_anon_write (on(内存) , on(磁盘)) Allow ftpd to anon write
  7. [root@centos7 ~]#semanage boolean -l C 查看修改过的布尔值
  8. ftpd_anon_write (on(内存) , on(磁盘)) Allow ftpd to anon write

SELinux日志管理

  1. yum install setroubleshoot(重启生效)
  2. 将错误的信息写入/var/log/message
  3. grep setroubleshoot /var/log/messages
  4. sealert -l UUID
  5. 查看安全事件日志说明
  6. sealert -a /var/log/audit/audit.log
  7. 扫描并分析日志

SELinux帮助

  1. yum y install selinux-policy-devel (centos7.2帮助)
  2. yum y install selinux-policy-doc centos7.3以后)
  3. yum info selinux-policy-doc 查看
  4. yum search selinux-policy-doc 搜索
  5. mandb | makewhatis 更新数据库
  6. man -k _selinux 查看与selinux相关的文档服务

httpd为例

  1. [root@centos7 ~]#mandb 更新数据库
  2. [root@centos7 ~]#man -k _selinux |grep httpd_selinux 看在哪个章节
  3. httpd_selinux(8) -XXXXXXXXXXXXXXXXXXXX
  4. [root@centos7 ~]#man 8 httpd_selinux 查看文档
  5. [root@centos7 ~]#man 8 ftpd_selinux 查看文档
  6. 有的配置文件都告诉你怎么改 /etc/ssh/sshd_config

SELinux练习

  1. 启用SELinux策略并安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,使网站可访问
  2. 修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问
  3. 启用相关的SELinux布尔值,使上述网站的用户student的家目录可通过http访问
  4. 编写脚本selinux.sh,实现开启或禁用SELinux功能/etc/selinux/config

    case $1 in
    on)
    sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
    ;;
    off)
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    echo "please reboot"
    ;;
    *)
    echo 'SELinux on or off'
    ;;
    esac

AWK

awk介绍

  1. awkAho, Weinberger, Kernighan,报告生成器,格式化文本输出
  2. 有多种版本:New awknawk),GNU awkgawk
  3. gawk:模式扫描和处理语言
  4. 基本用法:
  5. awk [options] 'program' var=value file...
  6. awk [options] -f programfile var=value file...
  7. awk [options] 'BEGIN{ action;... } pattern{ action;... } END{ action;... }' file ...
  8. awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成
  9. program通常是被单引号或双引号中
  10. 选项:
  11. -F 指明输入时用到的字段分隔符
  12. -v var=value: 自定义变量

awk语言

  1. 基本格式:
  2. awk [options] 'program' file...
  3. program:pattern{action statements;..}
  4. patternaction
  5. pattern部分决定动作语句何时触发及触发事件
  6. BEGIN,END
  7. action statements对数据进行处理,放在{}内指明
  8. print, printf
  9. 注意: 内部命令也有printf,处理字符串和echo差不多
  10. 分割符、域和记录
  11. awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同
  12. 文件的每一行称为记录
  13. 省略action,则默认执行print $0 的操作

awk工作原理

  1. 第一步:执行BEGIN{action;... }语句块中的语句
  2. 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;... }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  3. 第三步:当读至输入流末尾时,执行END{action;...}语句块
  4. BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
  5. END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
  6. pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

awk

print格式:print item1, item2, ...
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0

示例:

  1. awk '{print "hello,awk"}' //输入什么打印hello,awk
  2. awk -F: '{print}' /etc/passwd //打印所有
  3. awk -F: '{print "wang"}' /etc/passwd //打印用户名全是wang
  4. awk -F: '{print $1}' /etc/passwd //打印用户名
  5. awk -F: '{print $0}' /etc/passwd //打印所有
  6. awk -F: '{print $1"\t"$3}' /etc/passwd //打印用户名和uid制表符分开
  7. tail -3 /etc/fstab | awk '{print $2,$3}' //打印/etc/fstab后三行取出挂载点和什么系统

实例:

  1. 支持\n
  2. [root@centos7#echo "QQ" |awk '{print "qq\nqq"}'
  3. qq
  4. qq
  5. 支持运算
  6. [root@centos7]#echo "QQ" |awk '{print 2*2}'
  7. 4
  8. [root@centos7]#echo "QQ" |awk '{print 2^3}'
  9. 8
  10. [root@centos7]#echo "QQ" |awk '{print 2/3}'
  11. 0.666667
  12. 取出特定的格式
  13. [root@centos7]#awk -F: '{print $1,$3,$4}' passwd
  14. root 0 0
  15. [root@centos7]#df -h |grep /dev/sd |awk '{print $1,$5}'
  16. /dev/sda2 8%
  17. /dev/sda1 16%
  18. /dev/sda3 1%
  19. 支持\t
  20. [root@centos7]#df -h |grep /dev/sd |awk '{print $1"\t"$5}'
  21. /dev/sda2 8%
  22. /dev/sda1 16%
  23. /dev/sda3 1%

awk默认分隔符是空白符 字符串必须用双引号

awk变量

  1. 变量:内置和自定义变量
  2. FS:输入字段分隔符,默认为空白字符(变量)
  3. awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
  4. awk -F: '{print $1,":",$7}' /etc/passwd
  5. OFS:输出字段分隔符,默认为空白字符
  6. awk -v FS=':' -v OFS=':' '{print $1,$3,$7}'' /etc/passwd
  7. RS:输入记录分隔符,指定输入时的换行符
  8. awk -v RS=' ' '{print }' /etc/passwd
  9. ORS:输出记录分隔符,输出时用指定符号代替换行符
  10. awk -v RS=' ' -v ORS='###' '{print }' /etc/passwd
  11. NF:字段数量
  12. awk -F'{print NF}' /etc/fstab 引用内置变量不用$
  13. awk -F: '{print $(NF-1)}' /etc/passwd
  14. NR:记录号
  15. awk '{print NR}' /etc/fstab; awkEND'{print NR}' /etc/fstab
  16. FNR:各文件分别计数,记录号
  17. awk '{print FNR}' /etc/fstab /etc/inittab
  18. FILENAME:当前文件名
  19. awk '{print FILENAME}’ /etc/fstab
  20. ARGC:命令行参数的个数
  21. awk '{print ARGC}' /etc/fstab /etc/inittab
  22. awk 'BEGIN {print ARGC}' /etc/fstab/etc/inittab
  23. ARGV:数组,保存的是命令行所给定的各参数
  24. awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
  25. awk 'BEGIN {print ARGV[1]}' /etc/fstab/etc/inittab

练习1(可以调用bash变量)

  1. FS(以它为分隔符找出$1$3)
  2. [root@centos7]#awk -v FS=':' '{print $1,$3}' /etc/passwd
  3. root 0
  4. [root@centos7]#seq=":";awk -v FS="$seq" '{print $1FS$3}' /etc/passwd
  5. root:0
  6. OFS(输出分隔符默认是空白符)
  7. [root@centos7]# awk -v FS=':' -v OFS='#' '{print $1,$3}' /etc/passwd
  8. root#0
  9. RS:(以;为分隔符(aa bb cc)(ee ff oo)(xx yy zz)分三组$2 bb ff yy
  10. [root@centos7]#cat f1.txt
  11. aa bb cc ;ee
  12. ff oo ;xx
  13. yy zz
  14. [root@centos7]#awk -v RS=";" '{print $2}' f1.txt
  15. bb
  16. ff
  17. yy
  18. ORS:(RS找以空格分割 ORS是用---替换)
  19. [root@centos7]#cat f1.txt
  20. aa bb cc ;ee
  21. ff oo ;xx
  22. yy zz
  23. [root@centos7]#awk -v RS=' ' -v ORS="---" '{print $1 $2 }' f1.txt
  24. aa---bb------cc---;eeff---oo---;xxyy---zz---
  25. NF:字段数量
  26. [root@centos7]#awk -F: '{print NF}' /etc/fstab
  27. 0
  28. 1
  29. 1
  30. 3
  31. 1
  32. 1
  33. 1
  34. 1
  35. 1
  36. 1
  37. 1
  38. 1
  39. 在文件中找以":"分割的 如果这一行没东西是0 有东西但是没有:是1 有:看下分成几段
  40. [root@centos7]#awk -F: '{print NF}' /etc/passwd 字段7
  41. 7
  42. 7
  43. [root@centos7]#awk -F: '{print $NF}' /etc/passwd 倒数一
  44. /bin/bash
  45. [root@centos7]#awk -F: '{print $(NF-1)}' /etc/passwd 倒数二
  46. /root
  47. [root@centos7]#ss -nt |grep ESTAB |awk '{print $NF}'|awk -F: '{print $1}'
  48. 172.18.101.65
  49. [root@centos7]#df |grep /dev/sd | awk '{print $1,$(NF-1)}'|awk -F\% '{print $1}'
  50. /dev/sda2 8
  51. /dev/sda1 16
  52. /dev/sda3 1
  53. [root@centos7]#awk '{print $1}' /var/log/httpd/access_log
  54. 172.18.0.100 ....
  55. NR:记录号
  56. [root@centos7]#awk '{print NR,$0}' /etc/passwd 一个文件
  57. 1 root:x:0:0:root:/root:/bin/bash
  58. 2 bin:x:1:1:bin:/bin:/sbin/nologin ...
  59. [root@centos7]#awk '{print NR,$0}' /etc/passwd /etc/issue 多个文件,行号累加 (空白行也算一行)
  60. 1 root:x:0:0:root:/root:/bin/bash
  61. 2 bin:x:1:1:bin:/bin:/sbin/nologin
  62. 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
  63. 48 time is \t
  64. 49 tty is \l
  65. 50 \S
  66. 51 Kernel \r on an \m
  67. 52
  68. FNR 独立编号
  69. [root@centos7]#awk '{print FNR,$0}' /etc/passwd /etc/issue 多个文件 行号不累加(空白行也算一行)
  70. 1 root:x:0:0:root:/root:/bin/bash
  71. 2 bin:x:1:1:bin:/bin:/sbin/nologin
  72. 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
  73. 48 time is \t
  74. 49 tty is \l
  75. 50 \S
  76. 51 Kernel \r on an \m
  77. 52
  78. FILENAME:当前文件名
  79. [root@centos7]# awk '{print FNR,FILENAME,$0}' /etc/passwd /etc/issue
  80. 1 /etc/passwd root:x:0:0:root:/root:/bin/bash
  81. 2 /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
  82. 1 /etc/issue The hostname is \n
  83. 2 /etc/issue time is \t
  84. ARGC:命令行参数的个数
  85. [root@centos7]# awk '{print ARGC}' /etc/fstab /etc/inittab
  86. 3 (awk /etc/fstab /etc/inittab 这三个)
  87. [root@centos7]# awk '{print ARGV[0]}' /etc/fstab /etc/inittab
  88. awk
  89. ARGV:数组,保存的是命令行所给定的各参数
  90. [root@centos7]# awk '{print ARGV[0]}' /etc/fstab /etc/inittab
  91. 3 (awk /etc/fstab /etc/inittab 这三个)
  92. [root@centos7]# awk '{print ARGV[1]}' /etc/fstab/etc/inittab
  93. 2 (awk /etc/fstab/etc/inittab 这两个/etc/fstab/etc/inittab是一个整体 )

自定义变量

自定义变量(区分字符大小写)(两种方式定义变量)
(1) -v var=value
(2) 在program中直接定义
示例:

  1. [root@centos7 app]#awk -v seq='---' -F: '{print $1seq$2}' /etc/passwd seq自定义变量
  2. root---x
  3. bin---x
  4. 这种写法可以调用bash变量
  5. [root@centos7]#awk -v username="username" -v uid="uid" -v seq=":" -F: '{print username seq $1"\t"uid seq $3}' /etc/passwd
  6. username:root uid:0
  7. username:bin uid:1
  8. [root@centos7]#seq=":";awk -v seq="$seq" -F: '{print $1seq$3}' /etc/passwd
  9. root:0
  10. 下面这两种写法没发调用bash变量
  11. [root@centos7]#awk -F: '{sex="male";print$1,sex,age;age=18}' /etc/passwd (变量需先定义)
  12. root male
  13. bin male 18
  14. [root@centos7]#awk -F: '{ username="username" ;print username,$1}' /etc/passwd
  15. username root
  16. [root@centos7]#vim awkscript
  17. {username="username" ;print username,$1}
  18. [root@centos7]#awk -F: -f awkscript /etc/passwd
  19. username root
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注