久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

首頁軟件使用教程Docker的安全與底層實現(xiàn)指南

Docker的安全與底層實現(xiàn)指南

2024-07-29 314

Docker作為一種輕量級的容器化平臺,已經(jīng)成為了現(xiàn)代軟件開發(fā)和運維的重要組成部分。本指南將主要深入探討Docker的安全性問題及其底層實現(xiàn)機制,幫助讀者理解如何安全地使用Docker,并采取相應(yīng)的措施來保護容器化環(huán)境免受潛在威脅。

一、Docker安全

1、內(nèi)核命名空間

Docker容器和LXC容器很相似,所提供的安全特性也差不多。當(dāng)用dockerrun啟動一個容器時,在后臺Docker為容器創(chuàng)建了一個獨立的命名空間和控制組集合。命名空間提供了最基礎(chǔ)也是最直接的隔離,在容器中運行的進程不會被運行在主機上的進程和其它容器發(fā)現(xiàn)和作用。

每個容器都有自己獨有的網(wǎng)絡(luò)棧,說明它們不能訪問其他容器的sockets或接口。不過,如果主機系統(tǒng)上做了相應(yīng)的設(shè)置,容器可以像跟主機交互一樣的和其他容器交互。當(dāng)指定公共端口或使用links來連接2個容器時,容器就可以相互通信了(可以根據(jù)配置來限制通信的策略)。

從網(wǎng)絡(luò)架構(gòu)的角度來看,所有的容器通過本地主機的網(wǎng)橋接口相互通信,就像物理機器通過物理交換機通信一樣。實際上,命名空間的想法和設(shè)計提出的時間要更早,最初是為了在內(nèi)核中引入一種機制來實現(xiàn)OpenVZ的特性。而OpenVZ項目早在2005年就發(fā)布了,其設(shè)計和實現(xiàn)都已經(jīng)十分成熟。

2、控制組

控制組是Linux容器機制的另外一個關(guān)鍵組件,負責(zé)實現(xiàn)資源的審計和限制。提供了很多有用的特性;以及確保各個容器可以公平地分享主機的內(nèi)存、CPU、磁盤IO等資源;當(dāng)然,更重要的是,控制組確保了當(dāng)容器內(nèi)的資源使用產(chǎn)生壓力時不會連累主機系統(tǒng)。

雖然控制組不負責(zé)隔離容器之間相互訪問、處理數(shù)據(jù)和進程,它在防止拒絕服務(wù)(DDOS)攻擊方面是必不可少的。尤其是在多用戶的平臺(比如公有或私有的PaaS)上,控制組十分重要。例如,當(dāng)某些應(yīng)用程序表現(xiàn)異常的時候,可以保證一致地正常運行和性能。

3、服務(wù)端防護

運行一個容器或應(yīng)用程序的核心是通過Docker服務(wù)端。Docker服務(wù)的運行目前需要root權(quán)限,因此其安全性十分關(guān)鍵。

首先確保只有可信的用戶才可以訪問Docker服務(wù)。Docker允許用戶在主機和容器間共享文件夾,同時不需要限制容器的訪問權(quán)限,這就容易讓容器突破資源限制。例如,惡意用戶啟動容器的時候?qū)⒅鳈C的根目錄/映射到容器的/host目錄中,那么容器理論上就可以對主機的文件系統(tǒng)進行任意修改了。
但是事實上幾乎所有虛擬化系統(tǒng)都允許類似的資源共享,而沒法禁止用戶共享主機根文件系統(tǒng)到虛擬機系統(tǒng)。將會造成很嚴(yán)重的安全后果。因此,當(dāng)提供容器創(chuàng)建服務(wù)時(例如通過一個web服務(wù)器),要更加注意進行參數(shù)的安全檢查,防止惡意的用戶用特定參數(shù)來創(chuàng)建一些破壞性的容器。

為了加強對服務(wù)端的保護,Docker的RESTAPI(客戶端用來跟服務(wù)端通信)在0.5.2之后使用本地的Unix套接字機制替代了原先綁定在127.0.0.1上的TCP套接字,因為后者容易遭受跨站腳本攻擊。現(xiàn)在用戶使用Unix權(quán)限檢查來加強套接字的訪問安全。

用戶仍可以利用HTTP提供RESTAPI訪問。建議使用安全機制,確保只有可信的網(wǎng)絡(luò),或證書保護機制(例如受保護的stunnel和ssl認證)下的訪問可以進行。此外,還可以使用HTTPS和證書來加強保護。

最近改進的Linux命名空間機制將可以實現(xiàn)使用非root用戶來運行全功能的容器。這將從根本上解決了容器和主機之間共享文件系統(tǒng)而引起的安全問題。

終極目標(biāo)是改進2個重要的安全特性:

  • 將容器的root用戶映射到本地主機上的非root用戶,減輕容器和主機之間因權(quán)限提升而引起的安全問題;
  • 允許Docker服務(wù)端在非root權(quán)限(rootless模式)下運行,利用安全可靠的子進程來代理執(zhí)行需要特權(quán)權(quán)限的操作。這些子進程將只允許在限定范圍內(nèi)進行操作,例如僅僅負責(zé)虛擬網(wǎng)絡(luò)設(shè)定或文件系統(tǒng)管理、配置操作等。

最后,建議采用專用的服務(wù)器來運行Docker和相關(guān)的管理服務(wù)(例如管理服務(wù)比如ssh監(jiān)控和進程監(jiān)控、管理工具nrpe、collectd等)。其它的業(yè)務(wù)服務(wù)都放到容器中去運行。

4、內(nèi)核能力機制

能力機制(Capability)是Linux內(nèi)核一個強大的特性,可以提供細粒度的權(quán)限訪問控制。Linux內(nèi)核自2.2版本起就支持能力機制,它將權(quán)限劃分為更加細粒度的操作能力,既可以作用在進程上,也可以作用在文件上。

例如,一個Web服務(wù)進程只需要綁定一個低于1024的端口的權(quán)限,并不需要root權(quán)限。那么它只需要被授權(quán)net_bind_service能力即可。此外,還有很多其他的類似能力來避免進程獲取root權(quán)限。
默認情況下,Docker啟動的容器被嚴(yán)格限制只允許使用內(nèi)核的一部分能力。

使用能力機制對加強Docker容器的安全有很多好處。通常,在服務(wù)器上會運行一堆需要特權(quán)權(quán)限的進程,包括有ssh、cron、syslogd、硬件管理工具模塊(例如負載模塊)、網(wǎng)絡(luò)配置工具等等。容器跟這些進程是不同的,因為幾乎所有的特權(quán)進程都由容器以外的支持系統(tǒng)來進行管理。

ssh訪問被主機上ssh服務(wù)來管理;cron通常應(yīng)該作為用戶進程執(zhí)行,權(quán)限交給使用它服務(wù)的應(yīng)用來處理;日志系統(tǒng)可由Docker或第三方服務(wù)管理;硬件管理無關(guān)緊要,容器中也就無需執(zhí)行udevd以及類似服務(wù);網(wǎng)絡(luò)管理也都在主機上設(shè)置,除非特殊需求,容器不需要對網(wǎng)絡(luò)進行配置。

從上面的例子可以看出,大部分情況下,容器并不需要“真正的”root權(quán)限,容器只需要少數(shù)的能力即可。為了加強安全,容器可以禁用一些沒必要的權(quán)限。完全禁止任何mount操作;禁止直接訪問本地主機的套接字;禁止訪問一些文件系統(tǒng)的操作,比如創(chuàng)建新的設(shè)備、修改文件屬性等;禁止模塊加載。

這樣,就算攻擊者在容器中取得了root權(quán)限,也不能獲得本地主機的較高權(quán)限,能進行的破壞也有限。默認情況下,Docker采用白名單機制,禁用必需功能之外的其它權(quán)限。當(dāng)然,用戶也可以根據(jù)自身需求來為Docker容器啟用額外的權(quán)限。

5、其他安全特性

除了能力機制之外,還可以利用一些現(xiàn)有的安全機制來增強使用Docker的安全性,例如TOMOYO,AppArmor,Seccomp,SELinux,GRSEC等。

Docker當(dāng)前默認只啟用了能力機制。用戶可以采用多種方案來加強Docker主機的安全,例如:

  • 在內(nèi)核中啟用GRSEC和PAX,這將增加很多編譯和運行時的安全檢查;
  • 通過地址隨機化避免惡意探測等。并且,啟用該特性不需要Docker進行任何配置。可以使用一些有增強安全特性的容器模板,比如帶AppArmor的模板和Redhat帶SELinux策略的模板。這些模板提供了額外的安全特性;
  • 用戶可以自定義訪問控制機制來定制安全策略。

跟其它添加到Docker容器的第三方工具一樣(比如網(wǎng)絡(luò)拓撲和文件系統(tǒng)共享),有很多類似的機制,在不改變Docker內(nèi)核情況下就可以加固現(xiàn)有的容器。

二、Docker底層實現(xiàn)

1、基本架構(gòu)

Docker采用了C/S架構(gòu),包括客戶端和服務(wù)端。Docker守護進程(Daemon)作為服務(wù)端接受來自客戶端的請求,并處理這些請求(創(chuàng)建、運行、分發(fā)容器)。

Docker的安全與底層實現(xiàn)指南

客戶端和服務(wù)端既可以運行在一個機器上,也可通過socket或者RESTfulAPI來進行通信。

Docker守護進程一般在宿主主機后臺運行,等待接收來自客戶端的消息。Docker客戶端則為用戶提供一系列可執(zhí)行命令,用戶用這些命令實現(xiàn)跟Docker守護進程交互。

2、命名空間

命名空間是Linux內(nèi)核一個強大的特性。每個容器都有自己單獨的命名空間,運行在其中的應(yīng)用都像是在獨立的操作系統(tǒng)中運行一樣。命名空間保證了容器之間彼此互不影響。

(1)pid命名空間

不同用戶的進程就是通過pid命名空間隔離開的,且不同命名空間中可以有相同pid。所有的LXC進程在Docker中的父進程為Docker進程,每個LXC進程具有不同的命名空間。同時由于允許嵌套,因此可以很方便的實現(xiàn)嵌套的Docker容器。

(2)net命名空間

有了pid命名空間,每個命名空間中的pid能夠相互隔離,但是網(wǎng)絡(luò)端口還是共享host的端口。網(wǎng)絡(luò)隔離是通過net命名空間實現(xiàn)的,每個net命名空間有獨立的網(wǎng)絡(luò)設(shè)備,IP地址,路由表,/proc/net目錄。這樣每個容器的網(wǎng)絡(luò)就能隔離開來。Docker默認采用veth的方式,將容器中的虛擬網(wǎng)卡同host上的一個Docker網(wǎng)橋docker0連接在一起。

(3)ipc命名空間

容器中進程交互還是采用了Linux常見的進程間交互方法(interprocesscommunication-IPC),包括信號量、消息隊列和共享內(nèi)存等。然而同VM不同的是,容器的進程間交互實際上還是host上具有相同pid命名空間中的進程間交互,因此需要在IPC資源申請時加入命名空間信息,每個IPC資源有一個唯一的32位id。

(4)mnt命名空間

類似chroot,將一個進程放到一個特定的目錄執(zhí)行。mnt命名空間允許不同命名空間的進程看到的文件結(jié)構(gòu)不同,這樣每個命名空間中的進程所看到的文件目錄就被隔離開了。同chroot不同,每個命名空間中的容器在/proc/mounts的信息只包含所在命名空間的mountpoint。

(5)uts命名空間

UTS(“UNIXTime-sharingSystem”)命名空間允許每個容器擁有獨立的hostname和domainname,使其在網(wǎng)絡(luò)上可以被視作一個獨立的節(jié)點而非主機上的一個進程。

(6)user命名空間

每個容器可以有不同的用戶和組id,也就是說可以在容器內(nèi)用容器內(nèi)部的用戶執(zhí)行程序而非主機上的用戶。

3、控制組

控制組(cgroups)是Linux內(nèi)核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當(dāng)多個容器同時運行時的對系統(tǒng)資源的競爭。
控制組技術(shù)最早是由Google的程序員在2006年提出,Linux內(nèi)核自2.6.24開始支持。
控制組可以提供對容器的內(nèi)存、CPU、磁盤IO等資源的限制和審計管理。

4、聯(lián)合文件系統(tǒng)

聯(lián)合文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(uniteseveraldirectoriesintoasinglevirtualfilesystem)。

聯(lián)合文件系統(tǒng)是Docker鏡像的基礎(chǔ)。鏡像可以通過分層來進行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。另外,不同Docker容器就可以共享一些基礎(chǔ)的文件系統(tǒng)層,同時再加上自己獨有的改動層,大大提高了存儲的效率。

Docker中使用的AUFS(AdvancedMulti-LayeredUnificationFilesystem)就是一種聯(lián)合文件系統(tǒng)。AUFS支持為每一個成員目錄(類似Git的分支)設(shè)定只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)權(quán)限,同時AUFS里有一個類似分層的概念,對只讀權(quán)限的分支可以邏輯上進行增量地修改(不影響只讀部分的)。

Docker目前支持的聯(lián)合文件系統(tǒng)包括OverlayFS,AUFS,Btrfs,VFS,ZFS和DeviceMapper。
各Linux發(fā)行版Docker推薦使用的存儲驅(qū)動。

在可能的情況下,推薦使用overlay2存儲驅(qū)動,overlay2是目前Docker默認的存儲驅(qū)動,以前則是aufs。你可以通過配置來使用以上提到的其他類型的存儲驅(qū)動。

5、容器格式

最初,Docker采用了LXC中的容器格式。從0.7版本以后開始去除LXC,轉(zhuǎn)而使用自行開發(fā)的libcontainer,從1.11開始,則進一步演進為使用runC和containerd。

6、網(wǎng)絡(luò)

Docker的網(wǎng)絡(luò)實現(xiàn)其實就是利用了Linux上的網(wǎng)絡(luò)命名空間和虛擬網(wǎng)絡(luò)設(shè)備(特別是vethpair)。

(1)基本原理

首先,要實現(xiàn)網(wǎng)絡(luò)通信,機器需要至少一個網(wǎng)絡(luò)接口(物理接口或虛擬接口)來收發(fā)數(shù)據(jù)包;此外,如果不同子網(wǎng)之間要進行通信,需要路由機制。

Docker中的網(wǎng)絡(luò)接口默認都是虛擬的接口。虛擬接口的優(yōu)勢之一是轉(zhuǎn)發(fā)效率較高。Linux通過在內(nèi)核中進行數(shù)據(jù)復(fù)制來實現(xiàn)虛擬接口之間的數(shù)據(jù)轉(zhuǎn)發(fā),發(fā)送接口的發(fā)送緩存中的數(shù)據(jù)包被直接復(fù)制到接收接口的接收緩存中。對于本地系統(tǒng)和容器內(nèi)系統(tǒng)看來就像是一個正常的以太網(wǎng)卡,只是它不需要真正同外部網(wǎng)絡(luò)設(shè)備通信,速度要快很多。

Docker容器網(wǎng)絡(luò)就利用了這項技術(shù)。它在本地主機和容器內(nèi)分別創(chuàng)建一個虛擬接口,并讓它們彼此連通(這樣的一對接口叫做vethpair)。

(2)創(chuàng)建網(wǎng)絡(luò)參數(shù)

Docker創(chuàng)建一個容器的時候,會執(zhí)行如下操作:

  • 創(chuàng)建一對虛擬接口,分別放到本地主機和新容器中;
  • 本地主機一端橋接到默認的docker0或指定網(wǎng)橋上,并具有一個唯一的名字,如veth65f9;
  • 容器一端放到新容器中,并修改名字作為eth0,這個接口只在容器的命名空間可見;
  • 從網(wǎng)橋可用地址段中獲取一個空閑地址分配給容器的eth0,并配置默認路由到橋接網(wǎng)卡veth65f9。
  • 完成這些之后,容器就可以使用eth0虛擬網(wǎng)卡來連接其他容器和其他網(wǎng)絡(luò)。

可以在dockerrun的時候通過–net參數(shù)來指定容器的網(wǎng)絡(luò)配置,有4個可選值:

  • –net=bridge這個是默認值,連接到默認的網(wǎng)橋;
  • –net=host告訴Docker不要將容器網(wǎng)絡(luò)放到隔離的命名空間中,即不要容器化容器內(nèi)的網(wǎng)絡(luò)。此時容器使用本地主機的網(wǎng)絡(luò),它擁有完全的本地主機接口訪問權(quán)限。容器進程可以跟主機其它root進程一樣可以打開低范圍的端口,可以訪問本地網(wǎng)絡(luò)服務(wù)比如D-bus,還可以讓容器做一些影響整個主機系統(tǒng)的事情,比如重啟主機。因此使用這個選項的時候要非常小心。如果進一步的使用–privileged=true,容器會被允許直接配置主機的網(wǎng)絡(luò)堆棧;
  • –net=container:NAME_or_ID讓Docker將新建容器的進程放到一個已存在容器的網(wǎng)絡(luò)棧中,新容器進程有自己的文件系統(tǒng)、進程列表和資源限制,但會和已存在的容器共享IP地址和端口等網(wǎng)絡(luò)資源,兩者進程可以直接通過lo環(huán)回接口通信;
  • –net=none讓Docker將新容器放到隔離的網(wǎng)絡(luò)棧中,但是不進行網(wǎng)絡(luò)配置。之后,用戶可以自己進行配置。

(3)網(wǎng)絡(luò)配置細節(jié)

用戶使用–net=none后,可以自行配置網(wǎng)絡(luò),讓容器達到跟平常一樣具有訪問網(wǎng)絡(luò)的權(quán)限。通過這個過程,可以了解Docker配置網(wǎng)絡(luò)的細節(jié)。

首先,啟動一個/bin/bash容器,指定–net=none參數(shù)。

$dockerrun-i-t--rm--net=nonebase/bin/bash
root@63f36fc01b5f:/#

在本地主機查找容器的進程id,并為它創(chuàng)建網(wǎng)絡(luò)命名空間。

$dockerinspect-f'{{.State.Pid}}'63f36fc01b5f
2778
$pid=2778
$sudomkdir-p/var/run/netns
$sudoln-s/proc/$pid/ns/net/var/run/netns/$pid

檢查橋接網(wǎng)卡的IP和子網(wǎng)掩碼信息。

$ipaddrshowdocker0
21:docker0:...
inet172.17.42.1/16scopeglobaldocker0
...

創(chuàng)建一對“vethpair”接口A和B,綁定A到網(wǎng)橋docker0,并啟用它。

$sudoiplinkaddAtypevethpeernameB
$sudobrctladdifdocker0A
$sudoiplinksetAup

將B放到容器的網(wǎng)絡(luò)命名空間,命名為eth0,啟動它并配置一個可用IP(橋接網(wǎng)段)和默認網(wǎng)關(guān)。

$sudoiplinksetBnetns$pid
$sudoipnetnsexec$pidiplinksetdevBnameeth0
$sudoipnetnsexec$pidiplinkseteth0up
$sudoipnetnsexec$pidipaddradd172.17.42.99/16deveth0
$sudoipnetnsexec$pidiprouteadddefaultvia172.17.42.1

以上,就是Docker配置網(wǎng)絡(luò)的具體過程。

當(dāng)容器結(jié)束后,Docker會清空容器,容器內(nèi)的eth0會隨網(wǎng)絡(luò)命名空間一起被清除,A接口也被自動從docker0卸載。

此外,用戶可以使用ipnetnsexec命令來在指定網(wǎng)絡(luò)命名空間中進行配置,從而配置容器內(nèi)的網(wǎng)絡(luò)。

  • 廣告合作

  • QQ群號:4114653

溫馨提示:
1、本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。郵箱:2942802716#qq.com(#改為@)。 2、本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)裁,轉(zhuǎn)載請注明出處“站長百科”和原文地址。

相關(guān)文章