Linux

Linux课堂笔记(7)

SElinux三种模式


传统的权限使用读、写和执行的方式控制着用户对资源(文件及目录)的访问。

selinux使用selinux用户、角色、类型和级别控制进程对资源(文件及目录)的访问。

SElinux属性格式:

SElinux User:Role:Type:Level

SElinux用户是SElinux策略的要素,与linux系统的用户存在一种映射关系。
每个linux用户可以映射为一个selinux用户,查看他们之间的映射使用命令:
semanage
selinux策略定义了大量受限制的SElinux用户,linux用户可以映射到受限制的SElinux用户:例如
映射为SElinux用户的user_u的linux用户通常不能运行setuid程序,也不能运行su或sudo命令,
从而防止用户轻易获取root权限。
强制(enforcing):强制执行访问控制规则
许可(permissive):活动状态,不强制执行访问控制规则,记录违反规则警告;用于测试和故障排除
禁用(disabled):关闭selinux
  • SELinux是用于确定哪个进程可以访问哪些文件,目录和端口的一组安全规则。每个文件,进程,目录和端口都具有专门的安全标签,称为SELinux上下文。
  • SElinux策略使用SELinux上下文来确定某个进程能否访问文件,目录或端口。
  • SElinux标签具有多种上下文:用户,角色,类型和敏感度。RHEL中启用的默认策略,根据第三个上下文(即类型上下文)来制定自己的规则。类型上下文名称通常以_t结尾
  • 举例说明:MariaDB服务器具有类型上下文mysqld_t;默认情况下,在/data/mysql中找到的文件具有mysqld_db_t类型上下文。该类型上下文运行MariaDB访问这些文件,但禁止其它服务访问。如:Apache
  • ps,ls,cp和mkdir都可以使用-Z选项显示或设置selinux上下文
  • SELinux配置文件位置:/etc/sysconfig/selinux,修改SELinux模式后重启系统生效
  • getenforce:查看当前selinux模式
  • setenforce  0 | 1       0 代表permissive;1 代表enforcing,重启修改失效

控制SELinux文件上下文


1)	新文件通常从父目录继承selinux上下文,从而确保它们具有适当的上下文
2)	移动到新目录的文件保留自己原始标签;复制到新目录的文件继承了新目录标签
3)	演示实验:/tmp/下建立两个文件,1个移动到/var/www/html下,1个复制到/var/www/html下
  • 更改文件SELinux上下文命令包括:semanage fcontext;restorecon;chcon
1)	semanage fcontext:声明文件的默认标签(修改)
2)	restorecon:将上下文应用于文件
3)	chcon:更改SELinux上下文,它的设置存储在文件系统中的文件安全上下文,不会将上下文更改保存到SELinux上下文数据库;当使用restorecon命令运行时,chcon的更改无法保留;当对整个文件系统重新标记,使用chcon更改的文件的SELinux上下文将恢复
4)	演示实验:创建1个/shida目录,使用chcon  -t  httpd_sys_content_t  /shida修改目录的上下文标签,;使用restorecon  -v  /shida,然后查看/shida目录的最后标签
  • 定义SELinux默认文件上文规则演示
1)	/tmp/下建立两个文件,1个移动到/var/www/html下,1个复制到/var/www/html下
2)	restorecon -Rv /var/www
  • 新目录添加上下文演示
1)	mkdir /d1;touch /d1/index.html;查看它俩的上下文标签
2)	semanage fcontext -a -t httpd_sys_content_t  ‘/d1(/.*)?’// 定义1条selinux文件上下文规则,以便将/d1目录及目录中所有文件的上下文类型设置为httpd_sys_content_t
3)	扩展正则表达式(/.*)? 表示匹配在表达式前面列出的目录并递归的匹配该目录中的所有内容
4)	restorecon -Rv /d1  // 更改文件上下文

演示实验


(1)	安装httpd服务,开启httpd服务,设置开机自动启动
(2)	echo  hello   >>  /var/www/html/index.html
(3)	打开火狐浏览器输入http://x.x.x.x/index.html,观察现象
(4)	删除/var/www/html/index.html文件,其它位置做1个新文件index.html,移动到/var/www/html
(5)	打开火狐浏览器输入http://x.x.x.x/index.html,观察现象
(6)	semanage fcontext  -a  -t httpd_sys_content_t   /var/www/html/index.html
(7)	restorecon  -v  /var/www/html/index.html
(8)	打开火狐浏览器输入http://x.x.x.x/index.html,观察现象

SELinux布尔值:启用或者禁用SELinux策略


1)	getsebool  -a        //   查看所有selinux布尔值及状态
2)	setsebool httpd_enable_homedirs off(on)
3)	setsebool  -P  httpd_enable_homedirs  on: -P选项重启后持久保留
4)	semanage  boolean  -l:查看布尔值是否为持久值,并提供该布尔值简短描述
5)	semanage  boolean  -l  -C:列出当前状态与默认状态不同的布尔值  

SELinux端口标记


  • SELinux端口标记:SELinux除了进行文件和进程标记,还可以通过标记网络端口来控制网络流量。例如:某个进程希望侦听端口时, SELinux检查是否允许与该进程相关联的标签绑定该端口标签。
  • 列出端口标签:semanage  port  -l
  • 管理端口标签:分配新端口标签;删除端口标签;改端口标签
  • 向现有端口标签中添加端口:a 添加;t 类型;p 协议
# semanage port -a -t  port_label    -p   tcp|udp   PORTNUMBER
# semanage port -a -t  http_port_t   -p  tcp          82
# semanage port  -l  –C:查看对默认策略的本地更改
  • 删除端口标签: # semanage port  -d -t  http_port_t   -p  tcp   82
  • 修改端口绑定:-m 选项

单次计划


1)	at   now +1day  |   now +5min  |  now +2hour  | now  +1mon  | now  +1year
2)	举例:at now +1day回车,然后一行一个命令(touch  file1),使用crtl+d退出
3)	atq;at  -l查看计划任务的列表
4)	at   -c  编号   //查看计划任务的详细信息(包含环境变量信息)
5)	atrm  编号  //删除尚未执行的计划任务

周期性计划任务


  • 周期性计划任务crond:基于crond守护进程,需用启用crond守护进程
  • Crontab的配置文件位置:/etc/crontab
第一个星号:分钟(0-59)
第二个星号:小时(0-23)
第三个星号:号(天)(1-31)
第四个星号:月(1-12)
第五个星号:星期几(0-6)
user-name:周期性计划任务的执行者(如果使用命令在外部指定,这里就不需要)
0 3-5 * * *  /bin/echo  hh   // 每天3点,4点,5点执行输出hh,合计3次
* 3-5 * * *  /bin/echo  hh   // 每天3点到5点每分钟都执行1次输出hh,合计180次
  • crontab  -e 编辑当前用户的作业
  • crontab  -l  列出当前用户的计划作业
  • crontab  -r  删除当前用户的所有作业

通过命令行管理配置文件


  • 安装并启用tuned守护进程:yum install tuned  -y;systemctl  enable tuned –now
  • 命令
tuned-adm   list                  // 列出所有可用的profile
tuned-adm   active                // 列出当前使用的profile
tuned-adm   recommend             // 查看当前系统推荐的profile
tuned-adm   profile    PROFILE    // 切换profile
tuned-adm   off                   // 关闭调优程序

Firewalld


  • Firewalld:动态防火墙管理器。检查进入系统的每个数据包源地址。如果该源地址被分配给特定区域,则应用该区域规则;如果源地址未分配给特定区域,则将数据包与传入网络接口所在区域相关联,并应用该区域规则;如果网络接口未定义区域,则将数据包与默认区域相关联。
  • 区域允许与特定端口和协议或者预定义服务的列表匹配的流量通过防火墙。如果流量与允许的端口和协议或者服务不匹配,则会被拒绝通过。
  • Firewalld区域默认配置
1)	Trusted区域:允许所有传入流量
2)	Home域:拒绝传入流量,除非与传出流量相关,或者匹配相关预定义的服务ssh,mdns,ipp-client,samba-client,dhcpv6-client
3)	Internal域:拒绝传入流量,除非与传出流量相关,或者匹配相关预定义的服务ssh,mdns,ipp-client,samba-client,dhcpv6-client
4)	Work域:拒绝传入流量,除非与传出流量相关,或者匹配相关预定义的服务ssh,ipp-client,dhcpv6-client
5)	Public域:拒绝传入流量,除非与传出流量相关,或者匹配相关预定义的服务ssh,dhcpv6-client;新添加的网路接口的默认区域
6)	External域:拒绝传入流量,除非与传出流量相关,或者匹配相关预定义的服务ssh
7)	Dmz域:拒绝传入流量,除非与传出流量相关,或者匹配相关预定义的服务ssh
8)	Block域:拒绝所有传入流量,除非域传出流量相关
  • Firewalld 预定义服务:firewalld-cmd  –get-service列出预定义服务
  • Firewalld 预定义服务的配置位于:/usr/lib/firewalld/services目录中
  • Firewall-cmd命令行配置防火墙基础命令介绍
# firewall-cmd --list-all-zones:列出系统预制的防火墙
  • 设置默认规则
# firewall-cmd --set-default-zone=drop          互联网环境
# firewall-cmd --set-default-zone=block         企业局域网环境
# firewall-cmd --set-default-zone=trusted       自己试验的主机之间
  • 放行服务
# firewall-cmd  --add-service=http
# firewall-cmd --get-services               查看当前firewalld支持的服务名称
# firewall-cmd --add-port=80/tcp       直接指定端口号
# firewall-cmd --remove-service=http      从放行列表中删除指定服务,执行默认规则
# firewall-cmd --remove-port=80/tcp      从放行列表中删除指定端口,执行默认规则
以上放行操作代表单次行为,如果需要下次启动生效,需要指定--permanent,并且通过运行firewall-cmd  --reload命令激活设置
  • 当前和下次启动系统都放行http服务
# firewall-cmd --add-service=http
# firewall-cmd --add-service=http --permanent
# firewall-cmd --list-all               //列出当前所在的zone,已经生效的规则
# firewall-cmd --get-zones        //列出当前可用的zone
# firewall-cmd --list-all-zones    //列出所有可用的zone已经所包含的默认规则
  • 临时切换运行级别命令
systemctl  isolate  poweroff.target	
systemctl  isolate  multi-user.target 
systemctl  isolate  graphical.target	
systemctl  isolate  reboot.target
  • 设置启动默认运行级别
systemctl  get-default	
systemctl  set-default  multi-user.target

容器技术简介


传统软件应用部署,依赖于运行时环境提供的库,配置文件或者服务

软件应用的运行时环境安装在物理主机

  • 传统方式部署软件应用问题

依赖项会受到运行时环境的束缚

应用所需的支持软件的版本可能比操作系统提供的软件更旧或者更新

同一系统上的两个应用可能需要同一软件互不兼容的不同版本

  • 解决冲突方法:虚拟化和容器

虚拟化特点总结


单一硬件平台运行多个操作系统

Hypervisor将硬件拆分成多个虚拟硬件,允许多个操作系统并行运行

需要一个完整的操作系统来支持应用程序运行

容器特点总结


直接在操作系统上运行

跨系统上的所有容器共享硬件和操作系统资源;

共享相同的操作系统内核,将容器化应用进程与系统其余进程隔离开,并使用与该内核兼容的软件

需要的硬件资源比虚拟机少,能够快速启动和停止 由于物理机底层系统是Linux,所以执行的应用只能是基于linux应用

从容器镜像运行容器


容器镜像作为创建容器的蓝图

容器镜像将应用与其所有依赖项一起打包:例如系统库,编程语言库,配置设置,静态数据文件等

容器镜像只读,不可更改;但是可以在它上面增加新层产生新的镜像

容器镜像构建规范:OCI定义镜像的格式,镜像支持的容器主机操作系统以及硬件架构的元数据

设计基于容器的结构


一个容器中运行一个完整的应用。例如:有前端,有后端,php,mysql,apache

一个容器只运行一个应用的一个组件,组件之间通过网络连;优点:轻量化,便于后期维护,简化升级

使用Podman管理容器


RHEL提供了一组可用于执行操作的容器工具(container-tools)

podman:直接管理容器和容器镜像

skopeo:用于检查,复制,删除和签署镜像

注意:这些工具与开放容器项目(OCI)兼容,可用于管理有OCI兼容的容器引擎(如:docker)创建的任何linux容器,它们被设计用于在单节点容器主机上的RHEL下运行容器

无根容器


在容器主机上,可以以root用户或者普通非特权用户运行容器。非特权用户运行的容器称为无根容器

无根容器更安全,但有限制,无根容器无法通过容器主机的特权端口(低于1024的)发布其网络服务

安装容器管理工具


  • 选择容器镜像image和注册表registry
  • 容器注册表:用于存储和检索容器镜像的存储库,包括共有镜像仓库和私有镜像仓库
  • 红帽镜像仓库
registry.redhat.io:适用于基于官方红帽产品的容器
registry.connect.redhat.com:适用于基于第三方产品的容器
https://access.redhat.com/containers:基于web界面
  • 容器命名规则
容器镜像命名格式:registry_name/user_name/image_name:tag
registry_name:存储镜像的注册表的名称,通常是注册表的完全限定域名
user_name:镜像所属的用户或组织
image_name:镜像名,在用户命名空间中必须唯一
tag:区分镜像版本,如果镜像名称中不含tag,将默认使用latest
  • 运行容器
本地系统上运行容器,通过命令podman search ubi 搜索
从registry中下载镜像:podman pull registry.access.redhat.com/ubi8/ubi:latest
  • 查看本地存储镜像:podman images
  • 从镜像运行一个容器:podman run -it registry.access.redhat.com/ubi7/ubi:latest
-i   容器接受标准输入
-t   给容器分配一个终端
-d  容器在后台运行
podman run -it --name=rhel7 registry.access.redhat.com/ubi7/ubi:latest
--name 设置容器名称,容器名称必须唯一
若不指定--name,随机生成
podman login  registry.redhat.io
podman  ps:     查看正在运行的容器
podman  ps  -a:查看所有容器
podman  start  -i   container id :开启容器
podman  exec  -it   container id   /bin/bash:进入正在运行的容器
podman run  --rm:在不与容器交互的情况运行容器且在容器中运行命令后直接删除容器
  • 容器隔离
容器使用namespace提供独立的隔离环境
容器内运行的进程与主机上的所有其它进程隔离

配置容器注册表


  • 注册表信息:cat /etc/containers/registries.conf
[registries.search]:配置搜索的注册表列表;搜索时可以补全域名
registries = ['registry.access.redhat.com', 'registry.redhat.io']

[registries.insecure]:配置搜索的不安全的注册表列表(注册表被列为不安全,则不会使用TLS加密)
registries = []

[registries.block]:配置不要搜索的注册表列表
registries = []
  • podman info:显示podman配置信息,包括其配置的注册表

podman search 搜索特定容器镜像的容器注册表


  • podman search registry.redhat.io/rhel8    // 在容器注册表registry.redhat.io中搜索包含名称rhel8的所有镜像
  • podman search 命令选项列表
  • skopeo inspect:检查注册表中的远程容器镜像,显示它的相关信息
  • podman inspect:检查本地存储的镜像信息

移除本地容器镜像


1)	默认删除容器镜像前,先删除使用此镜像的容器
2)	容器镜像更新时,发布者通过修改latest标签
3)	由红帽提供的 image 受益于红帽在管理 RHEL 和其他产品的安全 漏洞和缺陷方面的长期经验。红帽安全团队加固这些 images。当发现新的漏洞时,它们将被重新构建,并通过质保流程
4)	podman rmi 移除本地容器的image