?
This document uses PHP Chinese website manual Release
默認(rèn)情況下,Docker通過(guò)一個(gè)非聯(lián)網(wǎng)的Unix套接字運(yùn)行。它還可以選擇使用HTTP套接字進(jìn)行通信。
如果您需要以安全的方式通過(guò)網(wǎng)絡(luò)聯(lián)系到Docker,則可以通過(guò)指定tlsverify
旗幟和指點(diǎn)碼頭tlscacert
標(biāo)記為可信CA證書(shū)。
在守護(hù)進(jìn)程模式中,它將只允許來(lái)自由該CA簽名的證書(shū)驗(yàn)證的客戶(hù)端的連接。在客戶(hù)端模式下,它將只連接到由該CA簽名的證書(shū)的服務(wù)器。
警告使用TLS和管理CA是一個(gè)高級(jí)主題。在生產(chǎn)中使用OpenSSL、x 509和TLS之前,請(qǐng)熟悉它。警告這些TLS命令將只在Linux上生成一組有效的證書(shū)。MacOS附帶的OpenSSL版本與Docker所需的證書(shū)不兼容。
注*替換所有的實(shí)例
$HOST
在下面的示例中,使用Docker守護(hù)進(jìn)程主機(jī)的DNS名稱(chēng)。
首先,在Docker守護(hù)進(jìn)程的主機(jī),生成CA私鑰和公鑰:
$ openssl genrsa -aes256 -out ca-key.pem 4096Generating RSA private key, 4096 bit long modulus............................................................................................................................................................................................++........++e is 65537 (0x10001)Enter pass phrase for ca-key.pem:Verifying - Enter pass phrase for ca-key.pem:$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem Enter pass phrase for ca-key.pem:You are about to be asked to enter information that will be incorporated into your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blank For some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:State or Province Name (full name) [Some-State]:Queensland Locality Name (eg, city) []:Brisbane Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc Organizational Unit Name (eg, section) []:Sales Common Name (e.g. server FQDN or YOUR name) []:$HOST Email Address []:Sven@home.org.au
現(xiàn)在我們有一個(gè)CA,您可以創(chuàng)建一個(gè)服務(wù)器密鑰和證書(shū)簽名請(qǐng)求(CSR)。確?!癈ommon Name”(即服務(wù)器FQDN或您的姓名)與您將用于連接到Docker的主機(jī)名匹配:
注*替換所有的實(shí)例
$HOST
在下面的示例中,使用Docker守護(hù)進(jìn)程主機(jī)的DNS名稱(chēng)。
$ openssl genrsa -out server-key.pem 4096Generating RSA private key, 4096 bit long modulus.....................................................................++.................................................................................................++e is 65537 (0x10001)$ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
接下來(lái),我們將使用我們的CA簽署公鑰:
由于TLS連接可以通過(guò)IP地址和DNS名稱(chēng)進(jìn)行,所以在創(chuàng)建證書(shū)時(shí)需要指定IP地址。例如,若要允許連接使用10.10.10.20
和127.0.0.1
*
$ echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 > extfile.cnf
將Docker守護(hù)進(jìn)程密鑰的擴(kuò)展使用屬性設(shè)置為僅用于服務(wù)器身份驗(yàn)證:
$ echo extendedKeyUsage = serverAuth > extfile.cnf
現(xiàn)在,生成密鑰:
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -extfile extfile.cnf Signature ok subject=/CN=your.host.com Getting CA Private Key Enter pass phrase for ca-key.pem:
授權(quán)插件提供更細(xì)粒度的控制,以補(bǔ)充來(lái)自互TLS的身份驗(yàn)證。除了上述文檔中描述的其他信息之外,運(yùn)行在Docker守護(hù)進(jìn)程上的授權(quán)插件還接收連接Docker客戶(hù)端的證書(shū)信息。
對(duì)于客戶(hù)端身份驗(yàn)證,創(chuàng)建客戶(hù)端密鑰和證書(shū)簽名請(qǐng)求:
注:為了簡(jiǎn)化接下來(lái)的幾個(gè)步驟,您也可以在Docker守護(hù)進(jìn)程的主機(jī)上執(zhí)行這個(gè)步驟。
$ openssl genrsa -out key.pem 4096Generating RSA private key, 4096 bit long modulus.........................................................++................++e is 65537 (0x10001)$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr
要使密鑰適合客戶(hù)端身份驗(yàn)證,請(qǐng)創(chuàng)建一個(gè)擴(kuò)展名配置文件:
$ echo extendedKeyUsage = clientAuth > extfile.cnf
現(xiàn)在簽署私鑰:
$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out cert.pem -extfile extfile.cnf Signature ok subject=/CN=client Getting CA Private Key Enter pass phrase for ca-key.pem:
生成后cert.pem
和server-cert.pem
您可以安全地刪除兩個(gè)證書(shū)簽名請(qǐng)求:
$ rm -v client.csr server.csr
在默認(rèn)情況下umask
022歲的時(shí)候,你的秘密鑰匙世界可讀性也可以為你和你的團(tuán)隊(duì)寫(xiě)。
為了保護(hù)您的密鑰不受意外損壞,您需要?jiǎng)h除它們的寫(xiě)權(quán)限。若要使它們僅供您閱讀,請(qǐng)按以下方式更改文件模式:
$ chmod -v 0400 ca-key.pem key.pem server-key.pem
證書(shū)可以具有世界可讀性,但您可能希望刪除寫(xiě)入訪問(wèn),以防止意外損壞:
$ chmod -v 0444 ca.pem server-cert.pem cert.pem
現(xiàn)在,您可以讓Docker守護(hù)進(jìn)程只接受來(lái)自客戶(hù)端的連接,這些客戶(hù)端提供了我們的CA信任的證書(shū):
$ dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem \ -H=0.0.0.0:2376
要連接到Docker并驗(yàn)證其證書(shū),現(xiàn)在需要提供客戶(hù)端密鑰、證書(shū)和可信CA:
注此步驟應(yīng)在您的Docker客戶(hù)端計(jì)算機(jī)上運(yùn)行。因此,您需要將CA證書(shū)、服務(wù)器證書(shū)和客戶(hù)端證書(shū)復(fù)制到該計(jì)算機(jī)。注*替換所有的實(shí)例
$HOST
在下面的示例中,使用Docker守護(hù)進(jìn)程主機(jī)的DNS名稱(chēng)。
$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \ -H=$HOST:2376 version
注意:通過(guò)TLS的Docker應(yīng)該在TCP端口2376上運(yùn)行。警告:如上例所示,當(dāng)您使用證書(shū)身份驗(yàn)證時(shí),不必
docker
使用sudo
或docker
組運(yùn)行客戶(hù)端。這意味著任何擁有密鑰的人都可以給你的Docker守護(hù)進(jìn)程提供任何指令,讓他們可以訪問(wèn)托管守護(hù)進(jìn)程的機(jī)器。保護(hù)這些密鑰,就像你使用root密碼一樣!
如果您想默認(rèn)保護(hù)您的Docker客戶(hù)端連接,您可以將文件移動(dòng)到.docker
您的主目錄中的目錄 - 并設(shè)置DOCKER_HOST
和DOCKER_TLS_VERIFY
變量(而不是傳遞-H=tcp://$HOST:2376
和--tlsverify
每次調(diào)用)。
$ mkdir -pv ~/.docker $ cp -v {ca,cert,key}.pem ~/.docker $ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1
默認(rèn)情況下,Docker現(xiàn)在將安全地連接:
$ docker ps
如果您不想擁有完全的雙向身份驗(yàn)證,可以通過(guò)混合標(biāo)志在其他各種模式下運(yùn)行Docker。
tlsverify
,tlscacert
,tlscert
,tlskey
集:驗(yàn)證客戶(hù)端
tls
,tlscert
,tlskey
:不要驗(yàn)證客戶(hù)端
tls
*基于公共/默認(rèn)CA池的服務(wù)器身份驗(yàn)證
tlsverify
,tlscacert
:根據(jù)給定的CA驗(yàn)證服務(wù)器
tls
,tlscert
,tlskey
:以驗(yàn)證客戶(hù)端證書(shū),不驗(yàn)證服務(wù)器基于給定CA
tlsverify
,tlscacert
,tlscert
,tlskey
:以驗(yàn)證客戶(hù)端證書(shū)并認(rèn)證服務(wù)器基于給定CA
如果找到,客戶(hù)端將發(fā)送其客戶(hù)端證書(shū),因此您只需將鑰匙放入~/.docker/{ca,cert,key}.pem
?;蛘撸绻雽⒚荑€存儲(chǔ)在其他位置,則可以使用環(huán)境變量指定該位置DOCKER_CERT_PATH
。
$ export DOCKER_CERT_PATH=~/.docker/zone1/$ docker --tlsverify ps
curl
使用curl
要發(fā)出測(cè)試API請(qǐng)求,需要使用三個(gè)額外的命令行標(biāo)志:
$ curl https://$HOST:2376/images/json \ --cert ~/.docker/cert.pem \ --key ~/.docker/key.pem \ --cacert ~/.docker/ca.pem
使用證書(shū)進(jìn)行存儲(chǔ)庫(kù)客戶(hù)端驗(yàn)證
使用可信映像