# 用户权限控制<a name="ZH-CN_TOPIC_0184808028"></a>

## 功能描述<a name="zh-cn_topic_0182200843_section87111452174118"></a>

容器引擎支持通过TLS认证方式来认证用户的身份，并依此控制用户的权限，当前容器引擎可以对接authz插件实现权限控制。

## 接口说明<a name="zh-cn_topic_0182200843_section194932664212"></a>

通过配置iSulad容器引擎启动参数来指定权限控制插件，daemon配置文件默认为/etc/isulad/daemon.json。

<a name="zh-cn_topic_0182200843_table19691237182514"></a>
<table><thead align="left"><tr id="zh-cn_topic_0182200843_row3969103710257"><th class="cellrowborder" valign="top" width="24.779999999999998%" id="mcps1.1.4.1.1"><p id="zh-cn_topic_0182200843_p1996983712519"><a name="zh-cn_topic_0182200843_p1996983712519"></a><a name="zh-cn_topic_0182200843_p1996983712519"></a>配置参数</p>
</th>
<th class="cellrowborder" valign="top" width="43.47%" id="mcps1.1.4.1.2"><p id="zh-cn_topic_0182200843_p197083782512"><a name="zh-cn_topic_0182200843_p197083782512"></a><a name="zh-cn_topic_0182200843_p197083782512"></a>示例</p>
</th>
<th class="cellrowborder" valign="top" width="31.75%" id="mcps1.1.4.1.3"><p id="zh-cn_topic_0182200843_p163741918172615"><a name="zh-cn_topic_0182200843_p163741918172615"></a><a name="zh-cn_topic_0182200843_p163741918172615"></a>说明</p>
</th>
</tr>
</thead>
<tbody><tr id="zh-cn_topic_0182200843_row169701737132511"><td class="cellrowborder" valign="top" width="24.779999999999998%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200843_p313573395910"><a name="zh-cn_topic_0182200843_p313573395910"></a><a name="zh-cn_topic_0182200843_p313573395910"></a>--authorization-plugin</p>
</td>
<td class="cellrowborder" valign="top" width="43.47%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200843_p1318314512594"><a name="zh-cn_topic_0182200843_p1318314512594"></a><a name="zh-cn_topic_0182200843_p1318314512594"></a>"authorization-plugin":  "authz-broker"</p>
</td>
<td class="cellrowborder" valign="top" width="31.75%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200843_p19601904015"><a name="zh-cn_topic_0182200843_p19601904015"></a><a name="zh-cn_topic_0182200843_p19601904015"></a>用户权限认证插件，当前只支持authz-broker。</p>
</td>
</tr>
</tbody>
</table>

## 约束限制<a name="zh-cn_topic_0182200843_section357173917264"></a>

-   authz需要配置用户权限策略，策略文件默认为/var/lib/authz-broker/policy.json，该配置文件支持动态修改，修改完即时生效，不需要重启插件服务。
-   由于容器引擎为root用户启动，放开一般用户使用的一些命令可能会导致该用户不当获得过大权限，需谨慎配置。目前container\_attach、container\_create和container\_exec\_create动作可能会有风险。
-   对于某些复合操作，比如lcrc exec、lcrc attach等命令依赖lcrc inspect是否有权限，如果用户没有inspect权限会直接报错。
-   采用SSL/TLS 加密通道在增加安全性的同时也会带来性能损耗，如增加延时，消耗较多的CPU资源，除了数据传输外，加解密需要更大吞吐量，因此在并发场景下，相比非TLS通信，其并发量有一定程度上的下降。经实测，在ARM服务器（Cortex-A72 64核）接近空载情况下，采用TLS并发起容器，其最大并发量在200\~250范围内。
-   服务端指定--tlsverify时，认证文件默认配置路径为/etc/isulad。且默认文件名分别为ca.pem、cert.pem、key.pem。

## 使用示例<a name="zh-cn_topic_0182200843_section1473104610423"></a>

1.  确认宿主机安装了authz插件，如果需要安装，安装并启动authz插件服务命令如下：

    ```
    [root@localhost ~]# yum install authz
    [root@localhost ~]# systemctl start authz
    ```

2.  要启动该功能，首先需要配置容器引擎和用户的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为必选项。

3.  容器引擎启动时添加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"
    }
    ```

4.  然后需要配置策略，对于基本授权流程，所有策略都位于一个配置文件下/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 \}。

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >-   配置中匹配action支持正则表达式。  
    >-   users不支持正则表达式。  
    >-   users不能有重复用户，即同一用户不能被多条规则匹配。  

5.  配置并更新完之后，客户端配置TLS参数连接容器引擎，即是以受限的权限访问。

    ```
    [root@localhost ~]#  lcrc 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 ~]# lcrc version
    ```


