一、实验环境:


底层系统为ubuntu18.04,然后在每个node上安装k8s,并构建集群。Master node的IP地址为192.168.26.71/24,两个Worker node的IP地址为192.168.26.72/24、192.168.26.73/24。

二、系统安全:

1.去除多余的系统模块
由于容器运行在在操作系统上,虽然看似独立,其实也使用了宿主机的CPU、内存、内核等资源,我们在容器内做的操作,也会在操作系统内有所反应。同样的,操作系统中的漏洞也可能会影响到容器。例如,容器运行时会加载底层操作系统Linux内核中的模块,如果宿主机Linux的内核中加载了有漏洞的模块, 则也会影响到容器的安全,所以我们也需要在操作系统层面进行加固。

为了保证容器中不会加载底层操作系统的恶意代码,我们首先需要去除底层操作系统中不必要的系统模块。

例如,我们首先生成一个容器pod1,yaml文件如下:

apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod1name: pod1
spec:terminationGracePeriodSeconds: 0containers:- image: centoscommand: ["sh","-c","sleep 10000000"]imagePullPolicy: IfNotPresentname: pod1resources: {}dnsPolicy: ClusterFirstrestartPolicy: Always
status: {}

现在我们可以查看pod1部署在哪个worker node上:

root@vms71:~/system-security# kubectl get pod pod1 -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          86s   10.244.5.238   vms72.rhce.cc   <none>           <none>

可以看到,其运行在worker1上。那么我们可以切换到worker1这台设备,查看其加载了多少个内核模块:

root@vms72:~# lsmod | wc -l
123

可以看到是123个。紧接着,我们进入到pod1中,也查看其中存在多少个内核模块:

[root@pod1 /]# lsmod | wc -l
123

可以看到,也是123三个。紧接着我们在worker1上加载一个存在漏洞的内核模块,然后观察pod1中的变化:

root@vms72:~# modprobe pcspkr
root@vms72:~# lsmod | grep pcspkr
pcspkr                 16384  0

进入pod1中,查看是否变为了124个模块,并且多添加了一个pcspkr模块:

[root@pod1 /]# lsmod | wc -l
124
[root@pod1 /]# lsmod | grep pcspkr
pcspkr                 16384  0

可以看到,在pod1中,也加载了pcspkr模块。那么,一旦宿主机被通过pcspkr模块工具,也会影响到容器。最后,我们需要在worker1上删除掉这个存在漏洞的模块。

modprobe -r pcspkr

注意,我们可以通过修改Linux操作系统的/etc/modprobe.d/xxxx.conf文件,决定Linux能够加载哪些模块。这样的话方便我们将存在风险的模块加入黑名单中,保证Linux系统和容器的安全:

root@vms72:/etc/modprobe.d# cat blacklist.conf
# This file lists those modules which we don't want to be loaded by
# alias expansion, usually so some other driver will be loaded for the
# device instead.# evbug is a debug tool that should be loaded explicitly
blacklist evbug# these drivers are very simple, the HID drivers are usually preferred
blacklist usbmouse
blacklist usbkbd# replaced by e100
blacklist eepro100# replaced by tulip
blacklist de4x5.........

例如,在这里我们可以在其目录下,任何为.conf的文件中,将不必要的模块通过blacklist禁用掉。

2.最小权限原则
最小权限原则 (PoLP) 是一种信息安全概念,即为用户提供执行其工作职责所需的最小权限等级或许可。主要可以通过如下方式在系统中进行实现:

  1. 在内部、云、DevOps环境和端点中,审核整个环境以查找特权帐户(例如密码、SSH密钥、密码哈希和访问密钥)。
  2. 消除不必要的本地管理员权限,并确保所有人类用户和非人类用户仅具有执行其工作所需的权限。
  3. 将管理员帐户与标准帐户分开,并隔离特权用户会话。
  4. 将特权管理员帐户凭据提供给数字保管库,以开始保护和管理这些帐户。
  5. 每次使用后,立即轮换所有管理员密码,以使按键记录软件可能已捕获的所有凭据无效,并降低哈希传递的风险。
  6. 持续监视与管理员帐户有关的所有活动,以快速检测和警告可能表明正在进行攻击的异常活动。
  7. 启用即时访问特权升级,允许用户根据需要临时访问特权帐户或运行特权命令。

三、Apparmor:

1.Apparmor概述:
Apparmor 是一个 Linux 内核安全模块,它补充了标准的基于 Linux 用户和组的安全模块将程序限制为有限资源集的权限。

AppArmor 可以配置为任何应用程序减少潜在的攻击面,并且提供更加深入的防御。 AppArmor 是通过配置文件进行配置的,这些配置文件被调整为允许特定程序或者容器访问,如 Linux 功能、网络访问、文件权限等。 每个配置文件都可以在强制(enforcing)模式(阻止访问不允许的资源)或投诉(complain)模式 (仅报告冲突)下运行。

注意:Apparmor存在于ubuntu系统,如果是在centos/redhat系统中,请使用selinux。

2.操作系统层面的apparmor运用
因为在很早的 Debian 和 Ubuntu 发行版内核中,就自带了 AppArmor 模块。因此只需要使用 apt 安装用户空间的命令组件即可。apparmor-utils 是一组用户空间的命令行实用工具,可以帮助我们很好的管理 AppArmor 。后两者是一些预先配置的配置文件,这些配置文件一般来说是比较完善的,但是也需要根据实际需要进行修改。

apt install apparmor-utils apparmor-profiles apparmor-profiles-extra

然后查看apparmor是否开启:

root@ubuntu:~# aa-enabled
Yes

AppArmor 通过配置文件来管理各个程序的权限。配置文件的文件名通常是其控制的程序的完整路径名(比如 /etc/apparmor.d/usr.sbin.nginx 是控制 Nginx 的配置文件) 。生效的配置文件的位置是 /etc/apparmor.d,而提供的一些可选配置文件夹位于 /usr/share/apparmor/profiles 里。可以通过软连接的方法,将这些配置连接到 /etc/apparmor.d,从而启用配置。

ln -s /usr/share/apparmor/extra-profiles/usr.sbin.sshd /etc/apparmor.d

进入到/etc/apparmor.d/目录下,可以查看到如下的内容:

root@ubuntu:/etc/apparmor.d# ls
abstractions    nvidia_modprobe           usr.bin.evince            usr.lib.libreoffice.program.oosplash     usr.sbin.cups-browsed  usr.sbin.nscd
apache2.d       sbin.dhclient             usr.bin.firefox           usr.lib.libreoffice.program.senddoc      usr.sbin.cupsd         usr.sbin.rsyslogd
bin.ping        sbin.klogd                usr.bin.irssi             usr.lib.libreoffice.program.soffice.bin  usr.sbin.dnsmasq       usr.sbin.smbd
disable         sbin.syslogd              usr.bin.man               usr.lib.libreoffice.program.xpdfimport   usr.sbin.identd        usr.sbin.smbldap-useradd
force-complain  sbin.syslog-ng            usr.bin.pidgin            usr.lib.snapd.snap-confine.real          usr.sbin.ippusbxd      usr.sbin.sshd
local           tunables                  usr.bin.totem             usr.sbin.apt-cacher-ng                   usr.sbin.mdnsd         usr.sbin.tcpdump
lsb_release     usr.bin.chromium-browser  usr.bin.totem-previewers  usr.sbin.avahi-daemon                    usr.sbin.nmbd          usr.sbin.traceroute

例如usr.bin.evince文件,则是表示对操作系统中/usr/bin/evince进行管控。我们可以通过配置对应的文件,达到对于程序进行访问控制的要求。下面我们来看一个典型的配置文件 /etc/apparmor.d/usr.sbin.nginx (需要自己生成):

#include <tunables/global>/usr/sbin/nginx {#include <abstractions/apache2-common>#include <abstractions/base>capability dac_override,capability setgid,capability setuid,deny /srv/private/** rw,/etc/nginx/** r,/srv/www/** r,/var/lib/nginx/ rw,/var/log/nginx/* w,/var/www/html r,/etc/group r,/etc/nginx/cert.d/* r,/etc/nginx/conf.d/* r,/etc/nsswitch.conf r,/etc/passwd r,/etc/ssl/openssl.cnf r,/run/nginx.pid rw,/usr/lib/nginx/** m,/usr/share/nginx/modules-available/* r,/var/lib/nginx/** rw,
}

如何一步步完成这个文件的配置,为如下5给步奏:

  1. 首先使用 aa-autodep <程序名,比如 nginx> 来生成一个初始化的配置文件。这个文件目前没有任何规则。

  2. 第二步,使用 aa-complain <程序名> 来将这个配置文件启动complain,这时候会记录所有需要授权的行为。

  3. 第三步,过一段时间后,使用 aa-logprof。这一步非常关键,这个命令会读取日志中所有操作,然后逐条询问之后是否允许这样的操作。(A 运行,D 不允许, I 忽略,G 改用通配符,N 修改规则)。然后把你的要求写入到对应的配置文件中去,从而形成了符合你需求的配置文件。

  4. 第四步,根据你的预期可以直接修改规则配置文件。

  5. 第五步,测试一段时间且规则没有问题后,可以使用 aa-enforce <程序名> 开启 enforce 模式。

具体步骤请参考: https://www.elliot98.top/post/tech/apparmor/

3.K8s中的apparmor运用
上面提到了apparmor在Linux系统中的使用,我们也可以将apparmor的规则运用在pod中。

首先,由于我们不知道pod部署具体部署在哪个node上,于是可以在所有的worker node上的/etc/apparmor.d写下如下的规则(文件名自定义即可,不需要和在Linux上直接使用apparmor一样表示具体的管控路径):

#include <tunables/global>
profile k8s-apparmor-example-deny-write flags=(attach_disconnected) {#include <abstractions/base>file,# Deny all file writes.deny /** w,
}

其中,#include <abstractions/base>表示允许预定义的一些操作,file的表示允许了所有的读写操作,deny /** w表示不允许对所有文件的写操作。这也是我们编写apparmor规则的方式,由于deny的优先级高于permit的优先级,所以我们可以先permit比较大范围的操作,然后通过deny的方式,拒绝掉其中一些我们存在问题的操作。

接下来,我们可以在worker上启用这一个规则,命令如下:

apparmor_parser -q k8s-apparmor-example-deny-write #规则的文件名

启用完成后,我们可以使用命令查看是否运行成功:

apparmor_status | grep k8s-apparmor-example-deny-write # 规则名

除此之外,如下命令表示删除规则:

apparmor_parser -R 规则文件名

而在规则更新后,可以使用如下命令替换规则:

apparmor_parser -r 规则文件名

接下来,我们将运行一个带有拒绝写入配置文件的简单 “Hello AppArmor” pod,yaml文件如下:

apiVersion: v1
kind: Pod
metadata:name: hello-apparmorannotations:# Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".# Note that this is ignored if the Kubernetes node is not running version 1.4 or greater.container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write
spec:containers:- name: helloimage: busyboxcommand: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

相比于没有使用apparmor规则的pod,此pod特殊在添加了如果的内容:

  annotations:# Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".# Note that this is ignored if the Kubernetes node is not running version 1.4 or greater.container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write

首先,container.apparmor.security.beta.kubernetes.io内容为固定;由于一个pod中可以存在多个容器,所以hello指定了具体应用规则的容器;localhost为关键字,表示运行在pod所在的节点;最后k8s-apparmor-example-deny-write为运行节点上所使用的apparmor规则。

容器创建完成后,我们可以通过检查该配置文件的 proc attr 来验证容器是否实际使用该配置文件运行:

root@vms71:~/system-security# kubectl exec hello-apparmor -- cat /proc/1/attr/current
k8s-apparmor-example-deny-write (enforce)

最后,我们可以看到如果试图通过写入文件来违反配置文件,会发生什么情况:

root@vms71:~/system-security# kubectl exec hello-apparmor -- touch /tmp/test
touch: /tmp/test: Permission denied
command terminated with exit code 1

可以看到,操作已经被deny掉了。

参考资料来源:
《老段CKS课程》
最小权限原则 (PoLP):https://www.cyberark.com/zh-hans/what-is/least-privilege/
浅谈Linux 强制访问控制 AppArmor:https://www.elliot98.top/post/tech/apparmor/
K8s apparmor:https://kubernetes.io/zh/docs/tutorials/clusters/apparmor/#举例

二十五、K8s系统强化1- 系统安全与apparmor相关推荐

  1. Reflex WMS入门系列二十五:将叉车纳入系统进行管理

    Reflex WMS入门系列二十五:将叉车纳入系统进行管理 据笔者所知,SAP WM 模块里是不对仓库里常用的叉车等仓库管理工具进行管理的.笔者发现,Reflex WMS系统则会在很多仓库部门日常操作 ...

  2. 无人驾驶汽车系统入门(二十五)——基于欧几里德聚类的激光雷达点云分割及ROS实现

    无人驾驶汽车系统入门(二十五)--基于欧几里德聚类的激光雷达点云分割及ROS实现 上一篇文章中我们介绍了一种基于射线坡度阈值的地面分割方法,并且我们使用pcl_ros实现了一个简单的节点,在完成了点云 ...

  3. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  4. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  5. 二十五岁零基础转行做软件测试怎么样?

    俗话说得好:男怕入错行,女怕嫁错郎,那么你的入行方向决定着你的整个职业发展!! 所以在考虑要进入什么行业之前,必须要了解清楚这个行业的发展前景怎么样? 我们都知道,随着社会的发展,互联网行业涉及也越来 ...

  6. 二十五个软件测试经典面试题,你确定不收藏一波?

    二十五个软件测试经典面试题全在这里了,有兴趣的朋友建议收藏一波,或者留言交流! 1.在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试? 建立测试计划,确定测试标准和测 ...

  7. 激荡二十五年:wind、同花顺、东方财富、大智慧等金融服务商争霸史

    激荡二十五年:wind.同花顺.东方财富.大智慧等金融服务商争霸史 2017-03-08 朱琼华 智囊财经 2017年3月8日,经历开春后风霜雨雪后的黄浦江,这一刻恢复了平静.倒映在江水里的高楼,随着 ...

  8. Citrix 服务器虚拟化之二十五 桌面虚拟化之XenDesktop高可用性

    Citrix 服务器虚拟化之二十五 桌面虚拟化之XenDesktop高可用性 CitrixXenDesktop 中DesktopDelivery Controller (DDC)服务器是整个Xende ...

  9. 二十五个深度学习相关公开数据集

    转 [干货]二十五个深度学习相关公开数据集 2018年04月18日 13:42:53 阅读数:758 (选自Analytics Vidhya:作者:Pranav Dar:磐石编译) 目录 介绍 图像处 ...

  10. JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...

最新文章

  1. locust===官方说明文档,关于tasks
  2. nagios视频教程【原创】
  3. 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
  4. 【转】Android应用开发allowBackup敏感信息泄露的一点反思
  5. 【NLP】NLP提效,除了选择合适的模型,就是数据增强了
  6. java开发工程师的自我评价
  7. ajax需要引用什么js文件吗,如何在ajax调用中包含js文件?
  8. (四)Linux内核模块化编程
  9. MySQL学习笔记_3_MySQL创建数据表(中)
  10. mysql非必现数据插不进去_MySQL必知必会:数据插入(Insert)
  11. html表单中按钮添加超链接,JS 实现点击按钮实现超链接功能
  12. 第 37 章 ACOS - CLI
  13. oracle表分析都分析什么,oracle表分析
  14. android shape 画阴影_android 阴影的实现方式
  15. 【职业经验】测试转研发的一年总结
  16. html的字母u代表什么意思,html元素 u 标签的使用方法及作用
  17. CAD用直线绘制矩形
  18. RAID 磁盘列阵与阵列卡
  19. 企业微信公众号怎么建立和运营?
  20. 【深度学习原理第1篇】前馈神经网络,感知机,BP神经网络

热门文章

  1. 300小时人工智能学习视频课程,从数理基础到爬虫实战!
  2. 爬虫_抓取51job招聘数据
  3. 十大经典算法_家庭用电预测:线性回归算法(时间与功率功率与电流之间的关系)
  4. 双非院校,0项目经验,三个月入职大厂NLP算法岗,月薪30k+
  5. NLP学习—23.基于Transformer的机器翻译实战
  6. bug1-tensorflow中自定义模型的bug-input_signature
  7. 在ASP.NET中清除页面状态
  8. 「13」朴素贝叶斯Python实战:计算打喷嚏的工人患上新冠肺炎的概率
  9. hc06蓝牙模块介绍_微测评 | 小米智能插座蓝牙网关版
  10. jsp 与html 如何结合使用方法,jsp中如何写javascript?