本发明涉及容器,尤其涉及在主机中使用的容器系统、可动态将主机数据挂载至容器的挂载方法,以及对应的应用程序。
背景技术:
1、容器(container)是一种将作业系统虚拟化的技术。一台主机(host)中可视需求建立多个容器,各个容器可分别用于执行小型服务、小型程序乃至于大型应用程序等任何作业。具体地,一个容器中包含了执行应用程序所需的程序档(process)、程序库(library)与组态档(config)等,但不需包含作业系统映像,因此相当轻巧,也容易被携带。
2、容器技术的最大特点就是可以把应用程序的执行环境封装(isolated)起来,使容器内的应用程序的执行不会影响到容器外的环境。举例来说,若多个应用程序需要分别使用不同版本的程序库,则使用者可以让这些应用程序分别执行在不同的容器中,藉此克服这些应用程序所需的程序库版本不同而造成互相冲突的问题。
3、于常见情况下,容器被建立后的执行期间很短,并且在任务达成(例如一个指定的程序执行完毕)后就会被关闭。于此情况下,容器的相关资讯不会被储存下来,故又称为无状态(stateless)的容器。部分容器内所执行的程序较为特殊(例如nfs-ganesha、samba等用于连接不同通讯协定的软件),因此执行期间较长,且不常被关闭。于此情况下,容器的相关资讯需要被保存,故又称为有状态(stateful)的容器。
4、上述有状态的容器中的应用程序可在架构上区分为控制路径(control path)与数据路径(data path),其中控制路径用以提供应用程序界面(application programinterface,api)给外部的管理者来对应用程序进行配置(例如通过网络来连接),而数据路径则用以依据从控制路径获得的指令来分享对应的数据。由于控制路径提供了容器向外连接的途径,因此较容易成为骇客攻击的主要来源。
5、虽然容器可将应用程序的执行环境封装起来,以与外部环境隔离,但应用程序的执行仍需使用主机中的数据。然而,在建立容器时,系统并无法事先预测应用程序需要什么数据。若管理者为了便利,直接将主机中的所有储存空间(storage)皆挂载给容器,或是不当地开放可以自由查询并挂载主机中的任意储存空间的特权(privilege)给容器,则当骇客经由所述控制路径侵入容器后,即可反向获得主机内的档案系统(file system,fs)的所有数据。如此一来,即违反了容器最原始要将执行环境与外部环境隔离的本意,并且增加了资安风险。
6、参阅图1,为于主机中的容器使用示意图。如图1所示,主机1中主要可具备由多个目录(directories)组成的档案系统11,并且可运用至少一容器12,其中容器12内运行至少一个应用程序。于图1中,所述应用程序于架构上区分为应用程序界面服务器(api server)13与应用行程(daemon)14,其中应用程序界面服务器13对外提供控制路径r1,应用行程14提供数据路径r2。
7、如前文所述,由于无法预测应用程序执行时需要使用主机1中的什么数据,因此部分管理者可能会为了便利,直接将整个档案系统11皆绑定挂载(bind mount)给容器12中的分享目录15。于此情况下,若骇客经由控制路径r1入侵容器12,就可以直接经由分享目录15来获得主机1内的所有数据。
8、另一方面,部分管理者亦可能为了便利,直接于建立容器12时开放不恰当的特权给容器12。于此情况下,若骇客经由控制路径r1入侵容器12,即可通过特定指令(例如docker下的cli指令)来查询并获取主机1的所有数据。一旦上述情况发生,将使得容器12的隔离机制形同虚设。
技术实现思路
1、本发明的主要目的,在于提供一种主机的容器系统、动态挂载主机数据至容器的方法及应用程序,可于容器有需要时才将主机中的特定数据动态挂载给容器,降低主机内部的数据曝露在外的风险。
2、为了达成上述目的,本发明的容器系统包括:
3、一主机(host),具有由多个目录(directories)组成的一档案系统(file system,fs);
4、一应用行程(daemon),运行于该主机的一容器(container),并具有至少一分享目录(shared directory);
5、一容器管理站,运行于该主机,于该档案系统中建立一来源目录,并且该来源目录挂载至该分享目录;及
6、一应用程序界面服务器(api server),接收一外部管理者对于该档案系统中的一目标子目录的一请求指令,并将该请求指令转送至该容器管理站;
7、其中,该容器管理站依据该请求指令将该目标子目录绑定挂载(bind mount)至该来源目录的一来源子目录,并告知该应用程序界面服务器该目标子目录于该分享目录中的位置,藉此该容器通过该分享目录分享该目标子目录供内部运算或分享给外部用户。
8、如上所述,其中该来源目录以从属挂载(slave mount)的方式挂载至该分享目录,该目标子目录被绑定挂载至该来源子目录后,通过从属挂载的特性自动出现于该分享目录的一分享子目录,其中该容器分享该分享子目录供内部运算或分享给外部用户。
9、如上所述,其中该应用程序界面服务器与该应用行程运行于该主机的不同容器。
10、如上所述,其中该应用程序界面服务器通过一第一行程间通讯(inter-processcommunication,ipc)与该应用行程进行本地端沟通,并且通过一第二行程间通讯转传该请求指令给该容器管理站并接收该容器管理站的告知。
11、如上所述,其中更包括一绑定数据库,储存该容器的一组态档,该组态档包括该分享目录于该容器中的一路径名称(path name)、该来源目录与该分享目录的一挂载关系、以及该目标子目录与该来源子目录的一绑定挂载关系的至少其中之一。
12、如上所述,其中容器管理站查询该绑定数据库以取得该组态档,依据该组态档建立该容器,并于该容器中运行该应用行程。
13、为了达成上述目的,本发明的方法应用于具有一档案系统的一主机,其中该主机运行一应用行程、一应用程序界面服务器及一容器管理站,该应用程序界面服务器运行于一第一容器,该应用行程运行于一第二容器,并且该方法包括:
14、a1)该容器管理站于该档案系统中建立一来源目录;
15、a2)该容器管理站将该来源目录挂载至该应用行程的一分享目录;
16、a)该容器管理站由该应用程序界面服务器接收一请求指令,其中该请求指令为一外部管理者针对该档案系统中的一目标子目录所发出;
17、b)该容器管理站依据该请求指令将该目标子目录绑定挂载至该来源目录的一来源子目录;及
18、c)该步骤b)后,该容器管理站告知该应用程序界面服务器该目标子目录于该分享目录中的位置,以令该第二容器通过该分享目录分享该目标子目录供内部运算或分享给外部用户。
19、如上所述,其中该步骤a01)通过从属挂载的方式将该来源目录挂载至该分享目录,并且该步骤b)后,该目标子目录通过从属挂载的特性自动出现于该分享目录的一分享子目录,该步骤c)由该第二容器分享该分享子目录供内部运算或分享给外部用户。
20、如上所述,其中该应用程序界面服务器于该步骤a)中通过一第一ipc转传该请求指令给该容器管理站,并且于该步骤c)中通过该ipc接收该容器管理站的告知,并通过一第二ipc要求该应用行程分享该分享子目录。
21、如上所述,其中该步骤a)之前更包括下列步骤:
22、a01)于一绑定数据库中查询该第二容器的一组态档,其中该组态档包括该分享目录于该第二容器中的一路径名称、该来源目录与该分享目录的一挂载关系、以及该目标子目录与该来源子目录的一绑定挂载关系的至少其中之一;
23、a02)于该绑定数据库中存在该组态档时,依据该组态档的内容将已被允许分享的该目标子目录绑定挂载至该来源子目录;及
24、a03)该步骤a02)后,基于该来源目录与该分享目录的该挂载关系建立该第二容器,并于该第二容器中运行该应用行程。
25、如上所述,其中该步骤a)之前更包括下列步骤:
26、a04)于该绑定数据库中不存在该组态档时,确定要建立的该分享目录到该第二容器的一命名空间(namespace);
27、a05)将该分享目录的一路径名称(path name)储存至该绑定数据库做为该组态档;及
28、a06)基于该来源目录与该分享目录的该挂载关系建立该第二容器,并于该第二容器中运行该应用行程。
29、如上所述,其中该步骤a)之前更包括一步骤a07):该容器管理站于该步骤a03)或该步骤a06后建立该第一容器,并于该第一容器中运行该应用程序界面服务器。
30、如上所述,其中该步骤a)之前更包括下列步骤:
31、a08)该容器管理站由该应用程序界面服务器接收一查询请求,其中该查询请求为该外部管理者针对该主机的一可分享目录所发出;及
32、a09)该容器管理站依据该查询请求回复该可分享目录的一清单给该应用程序界面服务器,藉此提供给该外部管理者,其中该目标子目录记录于该清单中。
33、如上所述,其中更包括下列步骤:
34、d)该容器管理站由该应用程序界面服务器接收一停止分享请求,其中该停止分享请求为该外部管理者针对该目标子目录所发出;
35、e)该容器管理站告知该应用程序界面服务器该目标子目录于该分享目录中的位置,藉此该应用程序界面服务器请求该应用行程停止分享该目标子目录;
36、f)该容器管理站卸载该目标子目录并移除该来源子目录;及
37、g)将卸载动作记录于一绑定数据库。
38、本发明相对于相关技术所能达到的技术功效在于,容器管理站可于容器运行中,动态地将主机中的特定数据提供给容器,通过降低容器一般可存取的数据量以避免主机的数据曝露于外。并且,容器管理站不需要先关闭容器并修改组态档后再重建容器,如此可同时兼顾安全性及便利性。
39、以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的限定。