用户权限控制
功能描述
容器引擎支持通过TLS认证方式来认证用户的身份,并依此控制用户的权限,当前容器引擎可以对接authz插件实现权限控制。
接口说明
通过配置iSulad容器引擎启动参数来指定权限控制插件,daemon配置文件默认为/etc/isulad/daemon.json。
约束限制
- authz需要配置用户权限策略,策略文件默认为/var/lib/authz-broker/policy.json,该配置文件支持动态修改,修改完即时生效,不需要重启插件服务。
- 由于容器引擎为root用户启动,放开一般用户使用的一些命令可能会导致该用户不当获得过大权限,需谨慎配置。目前container_attach、container_create和container_exec_create动作可能会有风险。
- 对于某些复合操作,比如isula exec、isula attach等命令依赖isula inspect是否有权限,如果用户没有inspect权限会直接报错。
- 采用SSL/TLS 加密通道在增加安全性的同时也会带来性能损耗,如增加延时,消耗较多的CPU资源,除了数据传输外,加解密需要更大吞吐量,因此在并发场景下,相比非TLS通信,其并发量有一定程度上的下降。经实测,在ARM服务器(Cortex-A72 64核)接近空载情况下,采用TLS并发起容器,其最大并发量在200~250范围内。
- 服务端指定—tlsverify时,认证文件默认配置路径为/etc/isulad。且默认文件名分别为ca.pem、cert.pem、key.pem。
使用示例
确认宿主机安装了authz插件,如果需要安装,安装并启动authz插件服务命令如下:
[root@localhost ~]# yum install authz
[root@localhost ~]# systemctl start authz
要启动该功能,首先需要配置容器引擎和用户的TLS证书。可以使用OPENSSL来生成需要的证书,具体步骤如下:
#SERVERSIDE
# Generate CA key
openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key.pem" 4096
# Generate CA
openssl req -new -x509 -days $VALIDITY -key "ca-key.pem" -sha256 -out "ca.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"
# Generate Server key
openssl genrsa -out "server-key.pem" 4096
# Generate Server Certs.
openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key.pem" -out server.csr
echo "subjectAltName = DNS:localhost,IP:127.0.0.1" > extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf
openssl x509 -req -days $VALIDITY -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "server-cert.pem" -extfile extfile.cnf
#CLIENTSIDE
openssl genrsa -out "key.pem" 4096
openssl req -subj "/CN=$CLIENT_NAME" -new -key "key.pem" -out client.csr
echo "extendedKeyUsage = clientAuth" > extfile.cnf
openssl x509 -req -days $VALIDITY -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "cert.pem" -extfile extfile.cnf
若要直接使用以上过程作为脚本,需替换各变量为配置数值。生成CA时使用的参数若为空则写为“’’”。PASSWORD、COMMON_NAME、CLIENT_NAME、VALIDITY为必选项。
容器引擎启动时添加TLS相关参数和认证插件相关参数,并保证认证插件的运行。此外,为了使用TLS认证,容器引擎必须使用TCP侦听的方式启动,不能使用传统的unix socket的方式启动。容器demon端配置如下:
{
"tls": true,
"tls-verify": true,
"tls-config": {
"CAFile": "/root/.iSulad/ca.pem",
"CertFile": "/root/.iSulad/server-cert.pem",
"KeyFile":"/root/.iSulad/server-key.pem"
},
"authorization-plugin": "authz-broker"
}
然后需要配置策略,对于基本授权流程,所有策略都位于一个配置文件下/var/lib/authz-broker/policy.json。该配置文件支持动态修改,更改时不需要重新启动插件,只需要向authz进程发送SIGHUP信号。文件格式是每行一个策略JSON对象。每行只有一个匹配。具体的策略配置示例如下:
- 所有用户都可以运行所有iSulad命令:{“name”:”policy_0”,”users”:[“”],”actions”:[“”]}。
- Alice可以运行所有iSulad命令:{“name”:”policy_1”,”users”:[“alice”],”actions”:[“”]}。
- 空用户都可以运行所有iSulad命令: {“name”:”policy_2”,”users”:[“”],”actions”:[“”]}。
- Alice和Bob可以创建新的容器:{“name”:”policy_3”,”users”:[“alice”,”bob”],”actions”:[“container_create”]}。
- service_account可以读取日志并运行docker top:{“name”:”policy_4”,”users”:[“service_account”],”actions”:[“container_logs”,”container_top”]}。
- Alice可以执行任何container操作:{“name”:”policy_5”,”users”:[“alice”],”actions”:[“container”]}。
- Alice可以执行任何container操作,但请求的种类只能是get:{“name”:”policy_5”,”users”:[“alice”],”actions”:[“container”], “readonly”:true }。
说明:
- 配置中匹配action支持正则表达式。
- users不支持正则表达式。
- users不能有重复用户,即同一用户不能被多条规则匹配。
配置并更新完之后,客户端配置TLS参数连接容器引擎,即是以受限的权限访问。
[root@localhost ~]# isula version --tlsverify --tlscacert=/root/.iSulad/ca.pem --tlscert=/root/.iSulad/cert.pem --tlskey=/root/.iSulad/key.pem -H=tcp://127.0.0.1:2375
如果想默认配置TLS认证进行客户端连接,可以将文件移动到~/.iSulad,并设置 ISULAD_HOST和ISULAD_TLS_VERIFY变量(而不是每次调用时传递 -H=tcp://$HOST:2375和—tlsverify)。
[root@localhost ~]# mkdir -pv ~/.iSulad
[root@localhost ~]# cp -v {ca,cert,key}.pem ~/.iSulad
[root@localhost ~]# export ISULAD_HOST=localhost:2375 ISULAD_TLS_VERIFY=1
[root@localhost ~]# isula version