rhca-openshift里scc的设置
使用bob用户登录openshift,后续操作均在bob-p2项目里执行。
[root@node1 ~]# oc whoami
bob
[root@node1 ~]# oc project
Using project "bob-p2" on server "https://master:443".
[root@node1 ~]#
[root@node1 ~]# oc new-app --docker-image=registry.lab.example.com/rhscl/httpd
--> Found Docker image e74fcb5 (2 years old) from registry.lab.example.com for "registry.lab.example.com/rhscl/httpd"
....输出...
--> Success
Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
'oc expose svc/httpd'
Run 'oc status' to view your app.
[root@node1 ~]#
查看pod的运行状态:
可以看到pod运行失败,查看此pod的日志:
大概意思是此pod里端口80运行不起来。
原因分析
通过命令oc edit dc httpd修改名字为httpd这个dc信息,增加如下内容:
这样的目的是用command里指定的命令 替代镜像里自带的命令,保存退出之后可以发现pod是可以正常运行的:
进入到pod httpd-2-lt4m5里:
可以看到pod里是以uid=1000250000的用户运行的,因为安全性,selinux不允许容器内部的进程以root身份运行,但是httpd-foreground进程需要以root来运行,所以导致刚才pod是没法运行。
下面看scc的信息(可以用system:admin用户通过oc get scc查看)
看RUNASUSER那列,RunAsAny具有最高权限,MustRunAsRange具有最低权限,restricted这个scc使用的则是MustRunAsRange。
每个项目里都有3个sa(serviceaccount),可以理解为Linux系统内置用户,是专门做某件事的”人”,查看项目内的sa:
[root@node1 ~]# oc get sa
NAME SECRETS AGE
builder 2 30m
default 2 30m
deployer 2 30m
[root@node1 ~]#
其中default这个sa是用户运行pod的,它使用的是restricted这个scc,因为restricted使用的是MustRunAsRange(权限低),所以它运行pod时,不能让httpd-foreground进程以root身份运行。
修改
要是想让pod能正常运行起来,可以有两种方法:
1.修改项目bob-p2的default这个sa,让其使用anyid这个scc
语法:oc adm policy add-scc-to-user scc名-z sa名 -n 项目名
在master上,以system:admin用户执行如下命令
[root@master ~]# oc adm policy add-scc-to-user anyuid -z default -n bob-p2
scc "anyuid" added to: ["system:serviceaccount:bob-p2:default"]
[root@master ~]#
修改dc httpd,把command去掉,让其使用镜像里自带的命令运行:
改成
保存退出之后,查看pod的状态:
可以看到pod正常运行了。如果取消default这个sa使用anyuid这个scc可以用如下命令:
[root@master ~]# oc adm policy remove-scc-from-user anyuid -z default -n bob-p2
scc "anyuid" removed from: ["system:serviceaccount:bob-p2:default"]
[root@master ~]#
删除httpd-3-q4hwg,看是否还能自动运行起来一个新pod:
已经运行不起来了,因为权限不满足。
2.修改restricted这个scc,设置其RUNASRUN的值为RunAsAny
语法:
oc patch scc scc-名 -p '{"runAsUser":{"type":"RUNASUSER的值"}}'
再次确认restricted的RUNASUSER值:
下面开始修改
[root@master ~]# oc patch scc restricted -p '{"runAsUser":{"type":"RunAsAny"}}'
securitycontextconstraints "restricted" patched
[root@master ~]#
然后再次查看:
现在restricted有了足够的权限,然后删除httpd-3-c9q8l之后,看是否能运行起来:
已经可以正常运行了。