1.使用dockerfile构建一个镜像,创建一个普通用户qingjun用户,但不指定qingjun用户启用程序。
[root@k8s-master1 ~]# cat dockerfile
from python
run mkdir /data/www -p
run useradd qingjun
copy . /data/www
run pip install flask -i https://mirrors.aliyun.com/pypi/simple/
workdir /data/www
cmd python qingjun.py
##构建镜像。
[root@k8s-master1 ~]# docker build -t dockerfile flask-demo:v3 ./
##将进项推送到harbor仓库的qingjun库里。
[root@k8s-master1 docker]# docker tag flask-demo:v3 192.168.130.152/qingjun/flask-demo:v3
[root@k8s-master1 docker]# docker push 192.168.130.152/qingjun/flask-demo:v3
2.使用刚创建的镜像运行容器,进入容器看到程序是用root用户运行的。
[root@k8s-master1 docker]# docker run -d --name=k8s_qingjun 192.168.130.152/qingjun/flask-demo:v3
[root@k8s-master1 docker]# docker exec -it k8s_qingjun /bin/bash
2.创建pod,使用安全上下文指定普通用户id。
[root@k8s-master1 flask-demo]# cat deploy.yaml
apiversion: apps/v1
kind: deployment
metadata:
labels:
app: qingjun
name: qingjun
spec:
replicas: 1
selector:
matchlabels:
app: qingjun
template:
metadata:
labels:
app: qingjun
spec:
containers:
- image: 192.168.130.152/qingjun/flask-demo:v3
name: flask-demo
securitycontext: ##指定普通用户id。
runasuser: 1000 ##这里的id必须是构建镜像里存在的用户id,创建用户时不指定id默认就是从1000开始。
[root@k8s-master1 flask-demo]# kubectl apply -f deploy.yaml
3.进入pod容器查看,是以普通用户id为1000的qingjun用户启用程序。
4.若构建镜像时没有提前创建普通用户,则在pod.yaml里指定安全上下文创建的容器程序里的普通用户id就是从1000开始。
##构建镜像没有提前创建普通用户。
[root@k8s-master1 ~]# cat dockerfile
from python
run mkdir /data/www -p
copy . /data/www
run pip install flask -i https://mirrors.aliyun.com/pypi/simple/
workdir /data/www
cmd python qingjun.py
[root@k8s-master1 ~]# docker build -t flask-demo:v4 .
##新镜像推送到镜像仓库。
[root@k8s-master1 ~]# docker tag flask-demo:v4 192.168.130.152/qingjun/flask-demo:v4
[root@k8s-master1 ~]# docker push 192.168.130.152/qingjun/flask-demo:v4
##使用新镜像运行一个容器,进入容器查看是否是默认的root用户启动程序的。
[root@k8s-master1 ~]# docker run -d --name=qingjun1 192.168.130.152/qingjun/flask-demo:v4
[root@k8s-master1 ~]# docker exec -it qingjun1 /bin/bash
##创建一个pod,使用安全上下文指定普通用户id启动。
[root@k8s-master1 ~]# cat deploy2.yaml
apiversion: apps/v1
kind: deployment
metadata:
labels:
app: qingjun1
name: qingjun1
spec:
replicas: 1
selector:
matchlabels:
app: qingjun1
template:
metadata:
labels:
app: qingjun1
spec:
containers:
- image: 192.168.130.152/qingjun/flask-demo:v4
name: flask-demo1
securitycontext: ##指定普通用户id。
runasuser: 1000 ##这里的id必须是构建镜像里存在的用户id,创建用户时不指定id默认就是从1000开始。
##导入yaml,进入pod容器查看是否是用户id为1000的普通用户启动的容器。
[root@k8s-master1 ~]# kubectl apply -f deploy2.yaml
1.3 案例2
1.在deployment.yaml文件中添加此参数,重新构建pod容器就会生效。
1.4 linux capabilities方案
1.查看linux capability权能。
[root@k8s-master1 ~]# yum install man-pages
[root@k8s-master1 ~]# man capabilities
capability权能名称 | 释义 |
---|---|
cap_audit_control | 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则 |
cap_audit_read | 允许通过 multicast netlink 套接字读取审计日志 |
cap_audit_write | 将记录写入内核审计日志 |
cap_block_suspend | 使用可以阻止系统挂起的特性 |
cap_chown | 修改文件所有者的权限 |
cap_dac_override | 忽略文件的 dac 访问限制 |
cap_dac_read_search | 忽略文件读及目录搜索的 dac 访问限制 |
cap_fowner | 忽略文件属主 id 必须和进程用户 id 相匹配的限制 |
cap_fsetid | 允许设置文件的 setuid 位 |
cap_ipc_lock | 允许锁定共享内存片段 |
cap_ipc_owner | 忽略 ipc 所有权检查 |
cap_kill | 允许对不属于自己的进程发送信号 |
cap_lease | 允许修改文件锁的 fl_lease 标志 |
cap_linux_immutable | 允许修改文件的 immutable 和 append 属性标志 |
cap_mac_admin | 允许 mac 配置或状态更改 |
cap_mac_override | 覆盖 mac(mandatory access control) |
cap_mknod | 允许使用 mknod() 系统调用 |
cap_net_admin | 允许执行网络管理任务 |
cap_net_bind_service | 允许绑定到小于 1024 的端口 |
cap_net_broadcast | 允许网络广播和多播访问 |
cap_net_raw | 允许使用原始套接字 |
cap_setgid | 允许改变进程的 gid |
cap_setfcap | 允许为文件设置任意的 capabilities |
cap_setpcap | 参考 capabilities man page |
cap_setuid | 允许改变进程的 uid |
cap_sys_admin | 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
cap_sys_boot | 允许重新启动系统 |
cap_sys_chroot | 允许使用 chroot() 系统调用 |
cap_sys_module | 允许插入和删除内核模块 |
cap_sys_nice | 允许提升优先级及设置其他进程的优先级 |
cap_sys_pacct | 允许执行进程的 bsd 式审计 |
cap_sys_ptrace | 允许跟踪任何进程 |
cap_sys_rawio | 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备 |
cap_sys_resource | 忽略资源限制 |
cap_sys_time | 允许改变系统时钟 |
cap_sys_tty_config | 允许配置 tty 设备 |
cap_syslog | 允许使用 syslog() 系统调用 |
cap_wake_alarm | 允许触发一些能唤醒系统的东西(比如 clock_boottime_alarm 计时器) |
案例1
1.查看当前pod容器里具备哪些内核调用权限。
[root@k8s-master1 flask-demo]# kubectl run centos --image=centos – sleep 24h
[root@k8s-master1 flask-demo]# kubectl exec -it centos – bash
[root@centos /]# capsh --print ##查看权能。
2.查看特权用户具备的权限。
3.查看普通用户当前权限。
4.创建一个测试容器,进入容器查看没有挂载权限,因为是普通用户。
[root@k8s-master1 flask-demo]# kubectl run bs --image=busybox – sleep 24h
5.创建pod时指定挂载权限,进入容器测试可以挂载目录。
[root@k8s-master1 flask-demo]# cat pod.yaml
apiversion: v1
kind: pod
metadata:
name: cap-pod
spec:
containers:
- image: busybox
name: test
command: - sleep
- 24h
securitycontext:
capabilities:
add: [“sys_admin”] ##添加挂载权限。
[root@k8s-master1 flask-demo]# kubectl apply -f pod.yaml
案例2
1.容器默认的普通用户是可读可写。
2.deployment.yaml中指定只读参数。
[root@k8s-master1 flask-demo]# cat deploy.yaml
apiversion: apps/v1
kind: deployment
metadata:
labels:
app: qingjun
name: qingjun
spec:
replicas: 1
selector:
matchlabels:
app: qingjun
template:
metadata:
labels:
app: qingjun
spec:
containers:
- image: 192.168.130.152/qingjun/flask-demo:v4
name: flask-demo
securitycontext:
runasuser: 1000
readonlyrootfilesystem: true ##添加此行。
[root@k8s-master1 flask-demo]# kubectl apply -f deploy.yaml
3.进入容器查看,没有写权限,只能读。
二、pod安全策略
2.1 psp(已废弃)
2.1.1 安全策略限制维度
配置项 | 描述 |
---|---|
privileged | 启动特权容器。 |
hostpid,hostipc | 使用主机namespaces。 |
hostnetwork,hostports | 使用主机网络和端口。 |
volumes | 允许使用的挂载卷类型。 |
allowedhostpaths | 允许hostpath类型挂载卷在主机上挂载的路径,通过pathprefix字段声明允许挂载的主机路径前缀组。 |
allowedflexvolumes | 允许使用的指定flexvolume驱动。 |
fsgroup | 配置pod中挂载卷使用的辅组id。 |
readonlyrootfilesystem | 约束启动pod使用只读的root文件系统。 |
runasuser,runasgroup,supplementalgroups | 指定pod中容器启动的用户id以及主组和辅组id。 |
allowprivilegeescalation,defaultallowprivilegeescalation | 约束pod中是否允许配置allowprivilegeescalation=true,该配置会控制setuid的使用,同时控制程序是否可以使用额外的特权系统调用。 |
defaultaddcapabilities,requireddropcapabilities,allowedcapabilities | 控制pod中使用的linux capabilities。 |
selinux | 控制pod使用selinux配置。 |
allowedprocmounttypes | 控制pod允许使用的procmounttypes。 |
annotations | 配置pod中容器使用的apparmor或seccomp。 |
forbiddensysctls,allowedunsafesysctls | 控制pod中容器使用的sysctl配置。 |
2.2 opa gatekeeper方案
2.2.1 安装gatekeeper
1.下载准备安装yaml文件,下载地址
2.导入文件一键部署,并查看。
[root@k8s-master1 opa]# kubectl apply -f gatekeeper.yaml
2.2.2 编写策略
2.2.3 案例1
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加vx:vip204888 (备注网络安全获取)
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版pdf学习资源私我
一个人可以走的很快,但一群人才能走的更远。不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加vx:vip204888 (备注网络安全获取)
[外链图片转存中…(img-rhaou3ri-1712501730340)]
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版pdf学习资源私我
一个人可以走的很快,但一群人才能走的更远。不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-bymocjjn-1712501730340)]
发表评论