首頁>Security>source

我想傳遞一个在Docker容器中執行的應用程式所需的秘密值.這个特定的容器是短暂的 - 它啟動,執行命令,然後终止.

方法1:在啟動容器時通過命令列將值作為環境變數傳遞(Docker支援將此作為啟動容器的命令列引數).我覺得這很糟糕,因為命令將顯示在啟動docker容器的主機上的程序列表中(使用密钥和所有)。

方法2:通過env變數檔案將值作為env變數傳遞.這解決了程序列表問题,但執行了 docker info   在来自主機的執行容器上顯示為该容器設置的所有環境變數的列表.這让我相信Docker將這些儲存在不安全的主機上的磁盤上(因為在正在執行的容器中添加新的環境變數不会更新此列表,所以它不能直接實時讀取它).

一般来說,我覺得環境變數不足以安全地儲存秘密資料(即使只是暂時的),但我没有足够的知識来支援這个想法.

將秘密資料傳遞给容器的安全方法是什麼?

最新回復
  • 2019-12-5
    1 #

    環境變數是執行此操作的最佳方法,特別是方法2.預設情况下,Docker不允许自己執行 由root以外的使用者使用.禁止訪問套接字.我认為方法2是相当安全的,如果攻击者具有root訪問權限(並且可以在你的docker容器中查詢),那麼開箱即用,你已经處於糟糕的狀態.

    一般来說,有两个Docker安全說明.啟用API時要格外小心,因為預設情况下没有加密或身份驗證.他们有办法使用他们記錄的證书和TLS,但請谨慎行事。

    此外,如果可能,請在您的服務器上啟用SELinux.它的较新版本能够實際看到docker容器並自動為每个容器構建安全上下文.這可以防止容器洩漏容易地移迴主機.預設情况下,docker以root使用者身份執行,即使使用USER指令,它仍然直接与內核連線,而不像VM.一旦docker容器受到攻击,這就会將主機暴露给任何本地權限漏洞利用.

  • 2019-12-5
    2 #

    Docker家伙最近為此推出了原生解決方案: https://blog.docker.com/2017/02/docker-secrets- 管理/

    使用模式是:

    $ echo "This is a secret" | docker secret create my_secret_data -
    $ docker service  create --name="redis" --secret="my_secret_data" redis:alpine
    

    然後將未加密的秘密安裝到 /run/secrets/<secret_name>的記憶體檔案系統中的容器中

    虽然只能在 swarm內訪問

    您可以在此處找到完整的文件: https://docs.docker.com/engine/ 群/秘密/

  • 2019-12-5
    3 #

    docker secret   只適用於 swarm   模式.對於本地模式,要傳遞一些簡單的秘密,比如密碼,我们可以將密碼从stdin讀入變數. detach帶来了困难   模式,在讀取容器內的管道時將掛起.這是一个解決方法:

    cid=$(docker run -d -i alpine sh -c 'read A; echo "[$A]"; exec some-server')
    docker exec -i $cid sh -c 'cat > /proc/1/fd/0' <<< _a_secret_
    

    首先,使用 -i建立docker守護程式   選項,命令 read A   將等待来自 /proc/1/fd/0的輸入 ; 然後執行第二个docker命令,从stdin讀取秘密並重定向到最後一个掛起程序.秘密只会被阅讀一次,不会被檢查。

  • encryption:在使用者之間安全地共享密碼
  • virtualization:云和安全中的虛擬化