kubernetes高級之建立只讀文件系統以及只讀asp.net core容器

系列目錄html

使用docker建立只讀文件系統

容器化部署對應用的運維帶來了極大的方便,同時也帶來一些新的安全問題須要考慮.好比黑客入侵到容器內,對容器內的系統級別或者應用級別文件進行修改,會形成難以估量的損失.(好比修改hosts文件致使dns解析異常,修改web資源致使網站被嵌入廣告,後端邏輯被更改致使權限驗證失效等,因爲是分佈式部署,哪些容器內的資源被修改也很難以發現).解決這個問題的辦法就是建立建立一個具備只讀文件系統的容器.下面介紹使用docker run命令和docker compose來建立具備只讀文件系統的容器.linux

使用docker run命令建立只讀文件系統

好比說要建立一個只讀文件系統的redis容器,能夠執行如下命令web

docker run --read-only redis

docker compose/swarm建立只讀文件系統

yaml編排文件示例以下redis

version: '3.3'
 
services:
  redis:
    image: redis:4.0.1-alpine
    networks:
      - myoverlay
    read_only: true

networks:
  myoverlay:

問題:建立只讀文件系統看起來很不錯,可是實際上每每會有各類各樣的問題,好比不少應用要寫temp文件或者寫日誌文件,若是對這樣的應用建立只讀容器則極可能致使應用沒法正常啓動.對於須要往固定位置寫入日誌或者臨時文件的應用,能夠掛載宿主機的存儲卷,雖然容器是隻讀的,可是掛載的盤仍然是可讀寫的.docker

建立只讀的asp.net core容器

上面一節咱們講到了建立容器只讀文件系統以增長安全性,以及如何解決須要寫入日誌文件或者臨時文件這樣常見的問題.咱們嘗試建立一個只讀的asp.net應用時,即使不使用任何log組件(即不寫入日誌),仍然沒法正常啓動鏡像.解決這個問題其實也很是簡單,只須要把環境變量COMPlus_EnableDiagnostics的值設置爲0便可.windows

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 52193

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY . .
WORKDIR "/src"
RUN dotnet build "ReadOnlyTest.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "ReadOnlyTest.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
ENV DOTNET_RUNNING_IN_CONTAINER=true
ENV DOTNET_CLI_TELEMETRY_OPTOUT=1

ENV COMPlus_EnableDiagnostics=0

COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ReadOnlyTest.dll"]

咱們對這些環境變量進行簡單介紹後端

  • DOTNET_RUNNING_IN_CONTAINER值設置爲true時則表示應用運行在容器內,方便咱們獲取程序的運行環境,而後根據環境作出不一樣決策(好比單元測試的時候,可能要根據項目是運行在windows,linux或者linux容器作出不一樣的測試策略).固然,你也能夠設置其它的環境變量來方便本身使用,好比你鍵名稱設置爲IsRunningInDocker,可是DOTNET_RUNNING_IN_CONTAINER安全

  • DOTNET_CLI_TELEMETRY_OPTOUT是否輸出遙測信息,若是設置爲1則是關閉,這樣dotnet.exe就不會向調試窗口輸出遙測信息.bash

  • COMPlus_EnableDiagnostics目前沒有找到太多關於這個參數的詳細信息,只是查閱資源發現這開啓這項配置能夠建立只讀權限 aspnet 應用程序.app

微軟官方基礎鏡像裏還包含一項名稱叫做ASPNETCORE_VERSION的環境變量,咱們能夠直接讀取它,這樣使用公共的環境變量一來避免息手動設置和更新的麻煩,二來便於和社區交流(本身定義約束的只能用於內部團隊交流)

咱們如何使用這些環境變量呢,其它能夠在程序裏面暴露一個helper方法,好比

private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true";} }

這樣咱們就能夠根據實際的需求來使用它.

上面咱們介紹瞭如何使用docker run命令以及docker-compose建立只讀文件系統.然而在kubernetes集羣裏,咱們須要使用k8s的編排方法來建立只讀文件系統.那麼在k8s裏如何建立只讀文件系統.其實這裏涉及到了另外一個高級主題:那就是k8s的安全策略(Pod Security Policies)咱們將在下一節介紹它.

相關文章
相關標籤/搜索