linux怎么查看本机内存大小
291
2022-11-27
Kubernetes 系统强化 Pod安全上下文
安全上下文(Security Context):K8s对Pod和容器提供的安全机制,可以设置Pod特权和访问控制。
背景:容器中的应用程序默认以root账号运行的,这个root与宿主机root账号是相同的, 拥有大部分对Linux内核的系统调用权限, 这样是不安全的, 所以我们应该将容器以普通用户运行,减少应用程序对权限的使用。 (容器是宿主机上面的进程,该进程有非常大的权限,容器只是在宿主机上面封装了状态,也是一个实际进程)
可以通过两种方法设置普通用户:
Dockerfile里使用USER指定运行用户K8s里指定spec.securityContext.runAsUser,指定容器默认用户UID
[root@master ~]# cd flask-demo[root@master flask-demo]# lsDockerfile main.py templates#正常开发了网站程序,现在要将该网站程序容器化,第一步要写dockerfile制作镜像#要基于某个镜像去制作镜像,一般基于java,或者操作系统centos #下面是基于官方的python镜像去制作,也就是将程序打包到我的镜像,然后再到镜像准备python应用的环境[root@master flask-demo]# lsDockerfile main.py templates[root@master flask-demo]# cat Dockerfile FROM python#RUN useradd pythonRUN mkdir /data/-pCOPY . /data/chown -R python /dataRUN pip install flask -i && \ pip install prometheus_client -i /data/pythonCMD python main.py
现在将上面用户这些注释掉。先构造镜像将其跑起来
[root@master flask-demo]# docker build -t flask-demo .
[root@master flask-demo]# docker run -itd --name=demo -p 88:8080 flask-demo66703f73e8e6f15b1cefe28c9c4f5dd65f3696a6382c79b7480e88df822bba94[root@master flask-demo]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES66703f73e8e6 flask-demo "/bin/sh -c 'python ?? 6 seconds ago Up 5 seconds 0.0.0.0:88->8080/tcp, :::88->8080/tcp demo[root@master flask-demo]# curl localhost:88
可以看到业务可以访问,在构造镜像的时候应该设置为普通用户,这样可以减少里面的应用对linux内核系统调用的权限,阻断一些异常的系统调用。
[root@master flask-demo]# docker exec -it demo bashroot@66703f73e8e6:/data/iduid=0(root) gid=0(root) groups=0(root)uid=0的就具有Linux内核所有的操作权限[root@master flask-demo]# docker exec -it demo bashroot@66703f73e8e6:/data/iduid=0(root) gid=0(root) groups=0(root)root@66703f73e8e6:/data/ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 14:18 pts/0 00:00:00 /bin/sh -c python main.pyroot 7 1 0 14:18 pts/0 00:00:00 python main.pyroot 9 0 0 14:26 pts/1 00:00:00 bashroot 16 9 0 14:28 pts/1 00:00:00 ps -efroot@66703f73e8e6:/data/lsDockerfile main.py templatesroot@66703f73e8e6:/data/ls -ltotal 12-rw-r--r-- 1 root root 297 Jul 6 14:15 Dockerfile-rw-r--r-- 1 root root 200 Jul 2 02:35 main.pydrwxr-xr-x 2 root root 4096 Jul 2 02:17 templates#可以看到可以安装工具root@66703f73e8e6:/data/apt-get install wgetReading package lists... DoneBuilding dependency tree Reading state information... Donewget is already the newest version (1.20.1-1.1).0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
在dockerfile里面指定用户,那么宿主机上面就应该先有这个用户。
FROM pythonRUN useradd pythonRUN mkdir /data/-pCOPY . /data/chown -R python /dataRUN pip install flask -i && \ pip install prometheus_client -i /data/pythonCMD python main.py
重新构建
[root@master flask-demo]# docker build -t flask-demo .[root@master flask-demo]# docker run -itd --name=demo1 -p 87:8080 flask-demob658c8b614eb7b903d3f9cca0351a8a3a652b7166804a8b3336114abb9f654c3[root@master flask-demo]# docker exec -it demo1 bashpython@b658c8b614eb:/data/iduid=1000(python) gid=1000(python) groups=1000(python)python@b658c8b614eb:/data/ps -efUID PID PPID C STIME TTY TIME CMDpython 1 0 0 14:43 pts/0 00:00:00 /bin/sh -c python main.pypython 7 1 0 14:43 pts/0 00:00:00 python main.pypython 8 0 0 14:43 pts/1 00:00:00 bashpython 16 8 0 14:43 pts/1 00:00:00 ps -efpython@b658c8b614eb:/data/ls -ltotal 12-rw-r--r-- 1 python root 294 Jul 6 14:41 Dockerfile-rw-r--r-- 1 python root 200 Jul 2 02:35 main.pydrwxr-xr-x 1 python root 4096 Jul 2 02:17 templates
RUN useradd python 先添加这个用户 USER python 这个用户必须系统当中包含,否则怎么帮你去设置这个用户?当容器起来的时候,被禁锢在了python用户的环境下,python和root区别在于uid是不一样的,这样就在权限方面是不一样的,权限非常有限。注意网站根目录也需要设置权限,要不然网站不能正常访问。
可以看到是以普通用户去运行镜像的。
python@b658c8b614eb:/data/apt-get install wgetE: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
除了在dockefile里面去指定用户,还可以在securitycontext下面去指定。
案例1:设置容器以普通用户运行
背景:容器中的应用程序默认以root账号运行的,这个root与宿主机root账号是相同的, 拥有大部分对Linux内核的系统调用权限,这样是不安全的,所以我们应该将容器以普通用户运行,减少应用程序对权限的使用。
可以通过两种方法设置普通用户:
Dockerfile里使用USER指定运行用户K8s里指定spec.securityContext.runAsUser,指定容器默认用户UID在这里只能指定ID,不能指定用户名了
[root@k8s-master ~]# cat flask-demo1.yaml apiVersion: v1kind: Podmetadata: name: flask-1spec: securityContext: runAsUser: 1000 # 镜像里必须有这个用户UID fsGroup: 1000 # 数据卷挂载后的目录属组设置为该组 containers: - name: web image: lizhenliang/flask-demo:root volumeMounts: - name: tmp mountPath: /opt/data securityContext: allowPrivilegeEscalation: false # 不允许提权 volumes: - name: tmp emptyDir: {} [root@k8s-master ~]# kubectl get podNAME READY STATUS RESTARTS AGEflask-1 1/1 Running 0 46s[root@k8s-master ~]# kubectl exec -it flask-1 shkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.$ iduid=1000(python) gid=1000(python) groups=1000(python)[root@k8s-master ~]# kubectl get podNAME READY STATUS RESTARTS AGEflask-1 1/1 Running 0 9s[root@k8s-master ~]# kubectl exec -it flask-1 sh$ ls -l /opt/data total 0$ ls -ld /opt/datadrwxrwsrwx 2 root python 6 Jul 8 20:17 /opt/data$ iduid=1000(python) gid=1000(python) groups=1000(python)
案例2:避免使用特权容器
背景:容器中有些应用程序可能需要访问宿主机设备、修改内核等需求,在默认情况下, 容器没这个有这个能力,因此这时会考虑给容器设置特权模式。
启用特权模式:
containers:- image: lizhenliang/flask-demo:root name: web securityContext: privileged: true
启用特权模式就意味着,你要为容器提供了访问Linux内核的所有能力,这是很危险的,为了减少系统调用的供给,可以使用Capabilities为容器赋予仅所需的能力。
Linux Capabilities: Capabilities 是一个内核级别的权限,它允许对内核调用权限进行更细粒度的控制,而不是简单地以 root 身份能力授权。
Capabilities 包括更改文件权限、控制网络子系统和执行系统管理等功能。在securityContext 中,可以添加或删除 Capabilities,做到容器精细化权限控制。
securityContext: allowPrivilegeEscalation: true capabilities: drop: - ALL add: - NET_BIND_SERVICE # -> 101 runAsUser: 101
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~