长期支持版本

    社区创新版本

      安全性和隔离性

      user-namespace多对多

      功能描述

      user namespace是将容器的root映射到主机的普通用户,使得容器中的进程和用户在容器里有特权,但是在主机上就是普通权限,防止容器中的进程逃逸到主机上,进行非法操作。更进一步,使用user namespace技术后,容器和主机使用不同的uid和gid,保证容器内部的用户资源和主机资源进行隔离,例如文件描述符等。

      系统容器支持通过--user-remap接口参数将不同容器的user namespace映射到宿主机不同的user namespace,实现容器user namespace隔离。

      参数说明

      命令

      参数

      参数指定值说明

      isula create/run

      --user-remap

      参数格式为<uid>:<gid>:<offset>,参数说明如下:

      • uid、gid为整数型,且必须大于等于0。
      • offset为整数型,且必须大于0,并且小于65536。取值不能太小,否则容器无法启动。
      • uid加上offset的值必须小于等于232-1,gid加上offset的值必须小于等于232-1,否则容器启动会报错。

      约束限制

      • 如果系统容器指定了--user-remap,那么rootfs目录必须能够被--user-remap指定的uid/gid用户所访问,否则会导致容器user namespace无法访问rootfs,容器启动失败。
      • 容器内所有的id都应该能映射到主机rootfs,某些目录/文件可能是从主机mount到容器,比如/dev/pts目录下面的设备文件,如果offset值太小可能会导致mount失败。
      • uid、gid和offset的值由上层调度平台控制,容器引擎只做合法性检查。
      • --user-remap只适用于系统容器。
      • --user-remap和--privileged不能共存,否则容器启动会报错。
      • 如果uid或gid指定为0,则--user-remap参数不生效。

      使用指导

      说明:
      指定--user-remap参数前,请先将rootfs下所有目录和文件的uid和gid做整体偏移,偏移量为--user-remap指定uid和gid的偏移量。
      例如将dev目录的uid和gid整体uid和gid偏移100000的参考命令为:
      chown 100000:100000 dev

      系统容器启动指定--user-remap参数:

      [root@localhost ~]# isula run -tid --user-remap 100000:100000:65535 --system-container --external-rootfs /home/root-fs none /sbin/init
      eb9605b3b56dfae9e0b696a729d5e1805af900af6ce24428fde63f3b0a443f4a
      

      分别在宿主机和容器内查看/sbin/init进程信息:

      [root@localhost ~]# isula exec eb ps aux | grep /sbin/init
      root         1  0.6  0.0  21624  9624 ?        Ss   15:47   0:00 /sbin/init
      [root@localhost ~]# ps aux | grep /sbin/init
      100000    4861  0.5  0.0  21624  9624 ?        Ss   15:47   0:00 /sbin/init
      root      4948  0.0  0.0 213032   808 pts/0    S+   15:48   0:00 grep --color=auto /sbin/init
      

      可以看到/sbin/init进程在容器内的owner是root用户,但是在宿主机的owner是uid=100000这个用户。

      在容器内创建一个文件,然后在宿主机上查看文件的owner:

      [root@localhost ~]# isula exec -it eb bash
      [root@localhost /]# echo test123 >> /test123
      [root@localhost /]# exit
      exit
      [root@localhost ~]# ll /home/root-fs/test123
      -rw-------. 1 100000 100000 8 Aug  2 15:52 /home/root-fs/test123
      

      可以看到,在容器内生成了一个文件,它的owner是root,但是在宿主机上看到的owner是id=100000这个用户。

      用户权限控制

      功能描述

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

      接口说明

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

      配置参数

      示例

      说明

      --authorization-plugin

      "authorization-plugin": "authz-broker"

      用户权限认证插件,当前只支持authz-broker。

      约束限制

      • 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。

      使用示例

      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的方式启动。容器daemon端配置如下:

        {
            "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 }。

        说明:

        • 配置中匹配action支持正则表达式。
        • users不支持正则表达式。
        • users不能有重复用户,即同一用户不能被多条规则匹配。
      5. 配置并更新完之后,客户端配置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
        

      proc文件系统隔离

      场景描述

      容器虚拟化带来轻量高效,快速部署的同时,也因其隔离性不够彻底,给用户带来一定程度的使用不便。由于Linux内核namespace本身还不够完善,因此容器在隔离性方面也存在一些缺陷。例如,在容器内部proc文件系统中可以看到宿主机上的proc信息(如meminfo, cpuinfo,stat, uptime等)。利用lxcfs工具可以将容器内的看到宿主机/proc文件系统的内容,替换成本容器实例的相关/proc内容,以便容器内业务获取正确的资源数值。

      接口说明

      系统容器对外提供两个工具包:一个是lxcfs软件,另外一个是配合lxcfs一起使用的lxcfs-tools工具。其中lxcfs作为宿主机daemon进程常驻,lxcfs-tools通过hook机制将宿主机的lxcfs文件系统绑定挂载到容器。

      lxcfs-tools命令行格式如下:

      lxcfs-tools [OPTIONS] COMMAND [COMMAND_OPTIONS]
      

      命令

      功能说明

      参数

      remount

      将lxcfs重新mount到容器中

      --all:对所有的容器执行remout lxcfs操作

      --container-id:remount lxcfs到特定的容器ID

      umount

      将lxcfs从容器中umount掉

      --all:对所有的容器执行umout lxcfs操作

      --container-id:对特定容器执行umount lxcfs操作

      check-lxcfs

      检查lxcfs服务是否运行

      prestart

      在lxcfs服务启动前将/var/lib/lxcfs目录mount到容器中

      约束限制

      • 当前只支持proc文件系统下的cpuinfo, meminfo, stat, diskstats, partitions,swaps和uptime文件,其他的文件和其他内核API文件系统(比如sysfs)未做隔离 。
      • 安装rpm包后会在/var/lib/isulad/hooks/hookspec.json生成样例json文件,用户如果需要增加日志功能,需要在定制时加入--log配置。
      • diskstats只能显示支持cfq调度的磁盘信息,无法显示分区信息。容器内设备会被显示为/dev目录下的名字。若不存在则为空。此外,容器根目录所在设备会被显示为sda。
      • 挂载lxcfs时必须使用slave参数。若使用shared参数,可能会导致容器内挂载点泄露到主机,影响主机运行 。
      • lxcfs支持服务优雅降级使用,若lxcfs服务crash或者不可用,容器内查看到的cpuinfo, meminfo, stat, diskstats, partitions, swaps和uptime均为host信息,容器其它业务功能不受影响。
      • lxcfs底层依赖fuse内核模块以及libfuse库,因此需要内核支持fuse。
      • lxcfs当前仅支持容器内运行64位的app,如果容器内运行32位的app可能会导致app读取到的cpuinfo信息不符合预期。
      • lxcfs只是对容器cgroup进行资源视图模拟,对于容器内的系统调用(例如sysconf)获取到的仍然是主机的信息,lxcfs无法做到内核隔离。
      • lxcfs使用隔离后的cpuinfo显示的cpu信息具有如下特征:
        • processor:从0开始依次递增。
        • physical id:从0开始依次递增。
        • sibliing:固定为1。
        • core id:固定为0。
        • cpu cores:固定为1。

      使用示例

      1. 首先需要安装lxcfs和lxcfs-tools这两个包,并启动lxcfs服务。

        [root@localhost ~]# yum install lxcfs lxcfs-tools 
        [root@localhost ~]# systemctl start lxcfs
        
      2. 容器启动完成之后查看容器内是否存在lxcfs挂载点。

        [root@localhost ~]# isula run -tid -v /var/lib/lxc:/var/lib/lxc --hook-spec /var/lib/isulad/hooks/hookspec.json --system-container --external-rootfs /home/root-fs none init
        a8acea9fea1337d9fd8270f41c1a3de5bceb77966e03751346576716eefa9782
        [root@localhost ~]# isula exec a8 mount | grep lxcfs
        lxcfs on /var/lib/lxc/lxcfs type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/cpuinfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/diskstats type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/meminfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/partitions type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/stat type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/swaps type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        lxcfs on /proc/uptime type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
        
      3. 执行update命令更新容器的cpu和mem资源配置,然后查看容器资源。根据如下回显可知,容器资源视图显示的是容器真实资源数据而不是宿主机的数据。

        [root@localhost ~]# isula update --cpuset-cpus 0-1 --memory 1G a8
        a8
        [root@localhost ~]# isula exec a8 cat /proc/cpuinfo
        processor       : 0
        BogoMIPS        : 100.00
        cpu MHz         : 2400.000
        Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
        CPU implementer : 0x41
        CPU architecture: 8
        CPU variant     : 0x0
        CPU part        : 0xd08
        CPU revision    : 2
        
        processor       : 1
        BogoMIPS        : 100.00
        cpu MHz         : 2400.000
        Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
        CPU implementer : 0x41
        CPU architecture: 8
        CPU variant     : 0x0
        CPU part        : 0xd08
        CPU revision    : 2
        
        [root@localhost ~]# isula exec a8 free -m
                      total        used        free      shared  buff/cache   available
        Mem:           1024          17         997           7           8        1006
        Swap:          4095           0        4095
        

      文档捉虫

      “有虫”文档片段

      问题描述

      提交类型 issue

      有点复杂...

      找人问问吧。

      PR

      小问题,全程线上修改...

      一键搞定!

      问题类型
      规范和低错类

      ● 错别字或拼写错误;标点符号使用错误;

      ● 链接错误、空单元格、格式错误;

      ● 英文中包含中文字符;

      ● 界面和描述不一致,但不影响操作;

      ● 表述不通顺,但不影响理解;

      ● 版本号不匹配:如软件包名称、界面版本号;

      易用性

      ● 关键步骤错误或缺失,无法指导用户完成任务;

      ● 缺少必要的前提条件、注意事项等;

      ● 图形、表格、文字等晦涩难懂;

      ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

      正确性

      ● 技术原理、功能、规格等描述和软件不一致,存在错误;

      ● 原理图、架构图等存在错误;

      ● 命令、命令参数等错误;

      ● 代码片段错误;

      ● 命令无法完成对应功能;

      ● 界面错误,无法指导操作;

      风险提示

      ● 对重要数据或系统存在风险的操作,缺少安全提示;

      内容合规

      ● 违反法律法规,涉及政治、领土主权等敏感词;

      ● 内容侵权;

      您对文档的总体满意度

      非常不满意
      非常满意
      提交
      根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
      文档捉虫
      编组 3备份