當前位置:首頁 » 文件傳輸 » docker安全訪問
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

docker安全訪問

發布時間: 2022-06-29 01:49:51

A. docker從容器中怎麼訪問宿主機

docker跟宿主機交互的是通過原生網路實現的。

當Docker進程啟動之後,它會配置一個虛擬的網橋叫docker0在宿主機上。這個介面允許Docker去分配虛擬的子網給即將啟動的容器們。這個網橋在容器內的網路和宿主機網路之間將作為介面的主節點。

Docker容器啟動後,將創建一個新的虛擬介面並分配一個網橋子網內的IP地址。這個IP地址嵌在容器內網路中,用於提供容器網路到宿主機docker0網橋上的一個通道。Docker自動配置iptables規則來放行並配置NAT,連通宿主機上的docker0,就可以訪問宿主機的mysql數據文件了。

B. 常見的容器安全威脅有哪些

以Docker 容器的安全問題為例

(1) Docker 自身安全

Docker 作為一款容器引擎,本身也會存在一些安全漏洞,CVE 目前已經記錄了多項與 Docker 相關的安全漏洞,主要有許可權提升、信息泄露等幾類安全問題。

(2) 鏡像安全

由於Docker 容器是基於鏡像創建並啟動,因此鏡像的安全直接影響到容器的安全。具體影響鏡像安全的總結如下。

鏡像軟體存在安全漏洞:由於容器需要安裝基礎的軟體包,如果軟體包存在漏洞,則可能會被不法分子利用並且侵入容器,影響其他容器或主機安全。

倉庫漏洞:無論是Docker 官方的鏡像倉庫還是我們私有的鏡像倉庫,都有可能被攻擊,然後篡改鏡像,當我們使用鏡像時,就可能成為攻擊者的目標對象。

用戶程序漏洞:用戶自己構建的軟體包可能存在漏洞或者被植入惡意腳本,這樣會導致運行時提權影響其他容器或主機安全。

(3) Linux 內核隔離性不夠

盡管目前Namespace 已經提供了非常多的資源隔離類型,但是仍有部分關鍵內容沒有被完全隔離,其中包括一些系統的關鍵性目錄(如 /sys、/proc 等),這些關鍵性的目錄可能會泄露主機上一些關鍵性的信息,讓攻擊者利用這些信息對整個主機甚至雲計算中心發起攻擊。

而且僅僅依靠Namespace 的隔離是遠遠不夠的,因為一旦內核的 Namespace 被突破,使用者就有可能直接提權獲取到主機的超級許可權,從而影響主機安全。

(4) 所有容器共享主機內核

由於同一宿主機上所有容器共享主機內核,所以攻擊者可以利用一些特殊手段導致內核崩潰,進而導致主機宕機影響主機上其他服務。

既然容器有這么多安全上的問題,那麼我們應該如何做才能夠既享受到容器的便利性同時也可以保障容器安全呢?下面我帶你來逐步了解下如何解決容器的安全問題。

如何解決容器的安全問題?

(1) Docker 自身安全性改進

事實上,Docker 從 2013 年誕生到現在,在安全性上面已經做了非常多的努力。目前 Docker 在默認配置和默認行為下是足夠安全的。

Docker 自身是基於 Linux 的多種 Namespace 實現的,其中有一個很重要的 Namespace 叫作 User Namespace,User Namespace 主要是用來做容器內用戶和主機的用戶隔離的。在過去容器里的 root 用戶就是主機上的 root 用戶,如果容器受到攻擊,或者容器本身含有惡意程序,在容器內就可以直接獲取到主機 root 許可權。Docker 從 1.10 版本開始,使用 User Namespace 做用戶隔離,實現了容器中的 root 用戶映射到主機上的非 root 用戶,從而大大減輕了容器被突破的風險。

因此,我們盡可能地使用Docker 最新版本就可以得到更好的安全保障。

(2) 保障鏡像安全

為保障鏡像安全,我們可以在私有鏡像倉庫安裝鏡像安全掃描組件,對上傳的鏡像進行檢查,通過與CVE 資料庫對比,一旦發現有漏洞的鏡像及時通知用戶或阻止非安全鏡像繼續構建和分發。同時為了確保我們使用的鏡像足夠安全,在拉取鏡像時,要確保只從受信任的鏡像倉庫拉取,並且與鏡像倉庫通信一定要使用 HTTPS 協議。

(3) 加強內核安全和管理

由於僅僅依賴內核的隔離可能會引發安全問題,因此我們對於內核的安全應該更加重視。可以從以下幾個方面進行加強。

宿主機及時升級內核漏洞

宿主機內核應該盡量安裝最新補丁,因為更新的內核補丁往往有著更好的安全性和穩定性。

使用Capabilities 劃分許可權

Capabilities 是 Linux 內核的概念,Linux 將系統許可權分為了多個 Capabilities,它們都可以單獨地開啟或關閉,Capabilities 實現了系統更細粒度的訪問控制。

容器和虛擬機在許可權控制上還是有一些區別的,在虛擬機內我們可以賦予用戶所有的許可權,例如設置cron 定時任務、操作內核模塊、配置網路等許可權。而容器則需要針對每一項 Capabilities 更細粒度的去控制許可權,例如:

cron 定時任務可以在容器內運行,設置定時任務的許可權也僅限於容器內部;

由於容器是共享主機內核的,因此在容器內部一般不允許直接操作主機內核;

容器的網路管理在容器外部,這就意味著一般情況下,我們在容器內部是不需要執行ifconfig、route等命令的 。

由於容器可以按照需求逐項添加Capabilities 許可權,因此在大多數情況下,容器並不需要主機的 root 許可權,Docker 默認情況下也是不開啟額外特權的。

最後,在執行docker run命令啟動容器時,如非特殊可控情況,–privileged 參數不允許設置為 true,其他特殊許可權可以使用 --cap-add 參數,根據使用場景適當添加相應的許可權。

使用安全加固組件

Linux 的 SELinux、AppArmor、GRSecurity 組件都是 Docker 官方推薦的安全加固組件。下面我對這三個組件做簡單介紹。

SELinux (Secure Enhanced Linux): 是 Linux 的一個內核安全模塊,提供了安全訪問的策略機制,通過設置 SELinux 策略可以實現某些進程允許訪問某些文件。

AppArmor: 類似於 SELinux,也是一個 Linux 的內核安全模塊,普通的訪問控制僅能控制到用戶的訪問許可權,而 AppArmor 可以控制到用戶程序的訪問許可權。

GRSecurity: 是一個對內核的安全擴展,可通過智能訪問控制,提供內存破壞防禦,文件系統增強等多種防禦形式。

這三個組件可以限制一個容器對主機的內核或其他資源的訪問控制。目前,容器報告的一些安全漏洞中,很多都是通過對內核進行加強訪問和隔離來實現的。

資源限制

在生產環境中,建議每個容器都添加相應的資源限制。下面給出一些執行docker run命令啟動容器時可以傳遞的資源限制參數:

1--cpus 限制 CPU 配額

2-m, --memory 限制內存配額

3--pids-limit 限制容器的 PID 個數

例如我想要啟動一個1 核 2G 的容器,並且限制在容器內最多隻能創建 1000 個 PID,啟動命令如下:

1 $ docker run -it --cpus=1 -m=2048m --pids-limit=1000 busybox sh

推薦在生產環境中限制CPU、內存、PID 等資源,這樣即便應用程序有漏洞,也不會導致主機的資源完全耗盡,最大限度降低安全風險。

(4) 使用安全容器

容器有著輕便快速啟動的優點,虛擬機有著安全隔離的優點,有沒有一種技術可以兼顧兩者的優點,做到既輕量又安全呢?

答案是有,那就是安全容器。安全容器是相較於普通容器的,安全容器與普通容器的主要區別在於,安全容器中的每個容器都運行在一個單獨的微型虛擬機中,擁有獨立的操作系統和內核,並且有虛擬化層的安全隔離。

安全容器目前推薦的技術方案是Kata Containers,Kata Container 並不包含一個完整的操作系統,只有一個精簡版的 Guest Kernel 運行著容器本身的應用,並且通過減少不必要的內存,盡量共享可以共享的內存來進一步減少內存的開銷。另外,Kata Container 實現了 OCI 規范,可以直接使用 Docker 的鏡像啟動 Kata 容器,具有開銷更小、秒級啟動、安全隔離等許多優點。

C. 如何配置docker遠程訪問 驗證

前篇筆記中搞定了一個鏡像並安裝了jdk
本想著這tomcat會更簡單,後來發現我錯了。
且看下面過程:
我這個鏡像原始的系統就有openssh,只需要進到鏡像里 passwd一個新的密碼。退出後commit一下就添加了一個ssh服務。
之後通過以下命令在後台啟動鏡像,執行ssh服務,開放22埠

1

docker run -d -p 22 ubuntu64:14.04 /usr/sbin/sshd -D

回車後打出容器的ID號就返回了

那我們怎麼知道這容器當前什麼情況呢?

1

docker ps

列出當前還在運行中的容器

能看到列表中的容器id。還有一條有用的信息是PORTS列,說明宿主機的49153映射到的容器22埠上了。

這時就可以通過putty或scp之類的連接上去進行操作了。
現在我已經把tomcat解壓放到/usr/local/java目錄下了。
並通過startup.sh啟動測試正常.

ok exit +commit

怎麼能在鏡像啟動時就把tomcat啟起來呢??
學著之前的命令

1

docker run -it ubuntu_tomcat:7.0.55 /usr/local/java/apache-tomcat-7.0.55/bin/startup.sh

結果得到了如下的響應:

沒有環境變數
進到鏡像里,查看/etc/profile,明明是有的。之前通過ssh進去也是可以啟動的,這是為什麼呢?
linux的啟動過程里,/etc/profile是在用戶登錄的時候執行,在命令行run的時候可能是不會進行登錄操作,所以沒有相應的環境變數。但是我們啟動了ssh服務,從遠程是通過登錄進的系統,這時候就會有環境變數了。
猜出了這原因,怎麼解決呢?
run命令是可以掛環境變數參數的。但是這樣命令本身就會很復雜。
ok,這個時候就要Dockerfile出場了。
Dockerfile是一個用於創建鏡像的工具,它的用法是這樣。在當前目錄建一個名為Dockerfile的文件。執行docker build:

1

docker build -t="tomcat:7.0.55" .

就會創建一個tomcat:7.0.55的鏡像。
那麼docker怎麼知道這個鏡像怎麼建呢。需求要我們在Dockerfile文件中說明。
現在來看一下我這次用的Dockerfile文件的內容:

1
2
3
4
5
6

FROM ubuntu_tomcat:7.0.55
ENV JAVA_HOME /usr/local/java/jdk1.7.0_67
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin
CMD /usr/local/java/apache-tomcat-7.0.55/bin/catalina.sh run

FROM 指源自哪個鏡像創建
ENV 指定環境變數
CMD 鏡像啟動時默認執行的命令,在這里我們默認把tomcat跑起來。
執行完build以後用images看一下新的鏡像

啟動一下。

1

docker run -d -p 80:8080 tomcat:7.0.55

把宿主機的80埠映射給鏡像的8080。
再用ps命令看一下當前容器:

鏡像已經正常跑起來了,埠與已經映射好了。
訪問宿主機IP,就可以看到大貓圖了。
用logs命令可以看到tomcat的日誌。

1

docker logs ff5533

ff5533就是容器的ID
還可以用stop指令關閉容器

1

docker stop ff5533

ok,一個tomcat的服務鏡像就搞定了。

D. win7怎麼訪問docker容器

安裝Docker
藉助apt-get命令,安裝Docker是件輕而易舉的事。
$
sudo
apt-get
install
docker.io
為了允許非根用戶也可以運行Docker,將你自己添加到docker群組。下面這個命令會允許當前用戶運行Docker,無需根用戶許可權。
$
sudo
usermod
-a
-G
docker
$USER
退出,然後重新登錄,以激活群組成員的變化。
下一步,編輯Docker配置文件,以便更新Docker二進制代碼的位置。
$
sudo
vi
/etc/default/docker.io
DOCKER="/usr/bin/docker.io"
重啟Docker服務。
$
sudo
service
docker.io
restart
管理Docker容器
如果你想啟動Ubuntu操作系統的一個新的Docker容器,首先需要獲取Ubuntu
Docker映像文件。下面這個命令會通過網路下載Docker映像文件。
$
docker
pull
ubuntu
你可以以一種交互模式來開啟Ubuntu
Docker,如下所示。最後一個參數「/bin/bash」是一旦啟動就將在容器裡面執行的命令,這里是一個簡單的bash外殼命令。
$
docker
run
-i
-t
ubuntu
/bin/bash

E. Docker安全性――Docker容器真的安全嗎

我聽到和讀到了很多人假定Docker的容器實際上是沙箱利用程序,這意味著他們可以在他們的系統以root身份運行的Docker隨機的利用程序。他們相信Docker容器實際上保護他們的主機系統。
?我聽到有人說,Docker容器一樣是安全的,由於在不同的虛擬機/ KVM正在運行的進程。
?我知道人們正在下載隨機Docker鏡像,然後啟動他們自己的主機上。
?我乃至看到的PaaS伺服器(還不是OpenShift)可讓用戶上傳自己的照片,以在多租戶系統上運行。
?我有1個同事誰說:「Docker行將運行從Internet下載的隨機代碼,並作為root運行它」
「你能走進我的客廳里?」蜘蛛對蒼蠅說。
停止假定Docker和Linux內核保護你免受歹意軟體侵害。

你關心嗎?

如果你是否是在多租戶系統運行Docker,你正在使用1個容器中運行的服務,良好的安全實踐,你或許其實不需要擔心。姑且認為在容器內運行的特權進程是相同的運行在容器外部特權進程。
有些人做容器的認為比正在運行的虛擬機的更好,更快的方法的毛病。從安全的角度來看,容器要弱很多,我將在本文後面掩蓋。
如果你相信,我這樣做, - 意思視為運行Apache你把Apache服務的系統上運行的方式相同容器中Docker的容器應被視為「容器服務」,這意味著你會做以下幾點:
?盡快刪除許可權
?盡量以非root運行您服務
?容器內招待root,就好像它是root容器的之外
目前,我們正在告知人們在1般條件到1個容器內處理許可權的進程具有相同條件的容器外運行的特權進程。
不要在系統上運行隨機的Docker圖象。在很多方面我看Docker容器革命類似於1999年左右的Linux的革命。在那個時候,當管理員聽到1個新酷Linux的服務,他們會:
?在像rpmfind.net的地方或只是隨機的的網站在Internet上搜索包
?下載程序到他們的系統
?如果通過RPM安裝或使安裝
?與特權運行它

怎樣會錯呢?

兩個星期後,管理員聽到關於zlib的脆弱性和具有弄清楚,如果,同時希望並祈禱這不是,他們的軟體是脆弱的!
這是Red Hat分發等少數可信方已加強在改變敗局。紅帽企業Linux管理員提供:
?1個值得信賴的存儲庫,他們可以從下載軟體
?安全更新修復漏洞
?1個安全響應小組發現和管理漏洞
?1個工程師團隊來管理/保護包和安全增強工作
?通用標准認證檢查操作系統的安全性
僅運行可信方容器。我相信你應當繼續從誰你已從過去得到它1樣的人得到您的代碼/包。如果代碼不是來自內部或受信任的第3方,不靠容器技術來保護你的主機。

那末,問題是甚麼?為何容器中不包括那些內容?

最大的問題就是1切在Linux中沒有命名空間。目前,Docker使用5個命名空間來改變系統的流程視圖:進程,網路,安裝,主機名,同享內存。
雖然這些給用戶的安全性的某種程度它絕不是全面,像KVM。在KVM環境中虛擬機進程不跟主機內核直接。他們沒有任何訪問內核的文件系統,如/ sys和/sys/fs, /proc/*。
裝備節點用來交換內核的虛擬機不是主機。因此,為了有1個特權提升了虛擬機,該進程必須subvirt(1個基於虛擬機的後門)虛擬機的內核,發現在管理程序中的漏洞,通過SELinux的控制突破(sVirt),這是非常緊的在虛擬機上,最後攻擊主機內核。
當你在1個容器中運行你已讀懂了你在哪裡聊到主機內核。
主要的內核子系統都沒有命名空間,如:
?SELinux的
?cgroup中
?在/ sys下的文件系統
?/proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
裝備沒有命名空間:
?/ dev/ MEM
?/ dev/ SD*文件系統裝備
?內核模塊
如果你能溝通或攻擊的其中之1作為特權的進程中,你可以具有自己的系統。

F. 有哪些問題使用docker解決不掉

1 系統方面
docker可以運行各版本的linux,但唯獨windows系統無法直接運行
2進程方面
docker運行進程1的初始化服務需要特權模式,所有root是共享進程的,無法單獨root用戶運行
3 資源方面
無法直接獨占硬體資源,且對單容器網路流量和速度控制目前沒有很好的支撐方案
4 安全方面
docker並不是虛擬機,目前仍然有漏洞可以通過操作docker所在宿主機
5 監控方面
無法監控docker所在硬碟分區,往往對其監控是基於宿主機的硬碟監控。cpu和內存的資源因為是共享指定,不通過壓力測試無法直接監控所使用的cpu和內存資
6 網路訪問
docker無法直接通過內部ip互相訪問,跨宿主機容器訪問需要藉助第三方工具如weave等解決方案
7 host文件
docker容器內的host文件修改後,重啟會消失,因為啟動容器時候host是重新從宿主機載入的。如果要重啟不變,需要在啟動容器時命令指定
8 固定ip
docker默認情況內部ip地址會發生變化,固定ip需要單獨命令指定
9 埠
除非host模式,否則默認docker容器內部的所有埠外部無法直接訪問,需要啟動容器時命令里指定埠映射
另外,啟動容器後再新增埠映射是不允許的,如需要增加可通過iptables的nat間接實現

暫時想到這么多,希望可以幫到你

G. 如何訪問docker容器的web

需要前目錄建立三文件

1).gitignore

node_moles/*
2)package.json

{
"name": "docker-centos-hello",
"private": true,
"version": "0.0.1",
"description": "Node.js Hello world app on CentOS using docker",
"author": "Daniel Gasienica ",
"dependencies": {
"express": "3.2.4"
}
}
3)server.js

var express = require('express'),
app = express(),
redis = require('redis'),
RedisStore = require('connect-redis')(express),
server = require('http').createServer(app);

app.configure(function() {
app.use(express.cookieParser('keyboard-cat'));
app.use(express.session({
store: new RedisStore({
host: process.env.REDIS_HOST || 'localhost',
port: process.env.REDIS_PORT || 6379,
db: process.env.REDIS_DB || 0
}),
cookie: {
expires: false,
maxAge: 30 * 24 * 60 * 60 * 1000
}
}));
});

app.get('/', function(req, res) {
res.json({
status: "ok"
});
});

var port = process.env.HTTP_PORT || 3000;
server.listen(port);
console.log('Listening on port ' + port);
配置Dockerfile

我需要通Dockerfile配置我docker鏡像

FROM ubuntu:14.04
MAINTAINER zengjinlong

RUN apt-get update

#Install Redis
RUN apt-get -y -qq install python redis-server

RUN apt-get -y -qq install wget

#Install Node
RUN cd /opt && \
wget && \
tar -xzf node-v0.10.33-linux-x64.tar.gz && \
mv node-v0.10.33-linux-x64 node && \
cd /usr/local/bin && \
ln -s /opt/node/bin/* . && \
rm -f /opt/node-v0.10.33-linux-x64.tar.gz

#Set the working directory
WORKDIR /src
j
CMD ["/bin/bash"]
Dockerfile通docker build建立我鏡像

docker build -t minimicall/node_web:0.1 .
需要說明需要靈根據ubuntu真實環境變化間指令例,我第執行候告訴我找python redis-server我想應該我apt 源太out所我加RUN apt-get update.解決問題

我wget候說沒指令我安裝wget.nodejs址我nodejs官網查找所碰問題具體問題具體析

查看我建立鏡像

micall@micall-ThinkPad:~/docker/nodejs_web_app$ sudo docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
minimicall/node_web 0.1 730770dff17f 6 minutes ago 268.7 MB
centos centos6 70441cac1ed5 2 weeks ago 215.8 MB
ubuntu 14.04 5506de2b643b 4 weeks ago 199.3 MB
啟我鏡像:

sudo docker run -i -t --rm \
> -p 3000:3000 \
> -v `pwd`:/src \
> minimicall/node_web:0.1
候我已經進入鏡像啟容器面

root@d80a2ed6b4c0:/src#
執行列命令

root@d80a2ed6b4c0:/src# npm install --quiet > /dev/null
npm WARN engine [email protected]: wanted: {"node":"<0.9.0"} (current: {"node":"0.10.33","npm":"1.4.28"})
root@d80a2ed6b4c0:/src# npm install -g nodemon --quiet > /dev/null
root@d80a2ed6b4c0:/src# ls
Dockerfile Dockerfile~ index.js~ package.json server.js src
Dockerfile.centos index.js node_moles package.json~ server.js~
root@d80a2ed6b4c0:/src# nodemon server.js
22 Nov 14:37:31 - [nodemon] v1.2.1
22 Nov 14:37:31 - [nodemon] to restart at any time, enter `rs`
22 Nov 14:37:31 - [nodemon] watching: *.*
22 Nov 14:37:31 - [nodemon] starting `node server.js`
Listening on port 3000
候用瀏覽器打:結

{
"status": "ok"
}

H. 訪問Docker容器有哪些方法

docker attach
docker exec

I. 如何解決docker宿主機無法訪問容器中的服務

1、每個鏡像都定義了可對外提供的介面,Nginx鏡像只默認提供了80和443埠,你自然無法訪問到容器內的8080埠。
2、只需要在docker create或者docker run創建容器時攜帶--expose參數,就能把指定的埠開放出來。
--expose Expose a port or a range of ports