本番環境でdockerを実行するときに考慮すべきベストで包括的なプラクティスは何ですか?


42

最後に、Dockerに非常に興味があるため、重要な顧客データを含むオンラインのビジネスクリティカルな実稼働システムをDocker Swarmに移動したいと考えています。すでにそうしている人もいるかもしれません。他の組織は、ルートモードで実行されているプロダクションプロセスを禁止するポリシーによってそれを買う余裕はありません。

Docker実稼働環境で考慮するビルディングブロックのチェックリストは何ですか?それらのすべてを必要とするわけではありませんが、それらすべてを評価することが重要です。

免責事項:「大きな無限リスト」を回避するためのSEポリシーがあることは知っていますが、このチェックリストは非常に大きくすることはできません...とにかく無限です。

だから-これらのビルディングブロックは何ですか?

  1. まだ展開されていない場合は、高度なセキュリティ設定(強化カーネル、SELinuxなど)でLinuxホストシステムを実行することを検討してください。
  2. 高山、busybox、またはスクラッチなどの小さなDockerベースイメージの使用を検討してください。たとえば、空のベースイメージから始めます。
  3. ルート以外のユーザー設定を使用する
  4. コンテナに付与されている既に縮小されているカーネル機能のセットをさらに削減するために慎重に評価する
  5. プロセスを起動するコンテナごとに実行可能なバイナリを1つだけ持つことを検討します。理想的には静的にリンクします
  6. シェルアクセスを取得するためにシステムを破壊したい人は、コンテナがすべてのシェルを無効にしていることがわかったのではないかと思うかもしれません
  7. 可能な場合にのみ読み取り専用ボリュームをマウントする

質問:他に何ですか?


これは非常に広いと思います。しかし、同時に、私は質問が好きでした。したがって、私はコミュニティにこれを決定させます:)
Dawny33

タグのdevsecops意味は何ですか?
030


これがConsider using a tiny Docker base image, like alpine, busybox or even scratch e.g. start with an empty base imageセキュリティを強化する理由を説明していただけますか?
030

3
@ 030インストールする数が少なければ少ないほど、メンテナンスが不十分であるか悪用される可能性のある不要なサービス/ソフトウェアから保護できます。各コンテナは単一のサービスを提供するために使用されることになっているため、最小限に抑えることは常に適切に機能します。
レオン

回答:


23

コンテナが実行されているホスト

Dockerコンテナを実行するすべてのノードでDockerセキュリティベンチを実行しますhttps://github.com/docker/docker-bench-security

Dockerコンテナを実行するノードで次のコマンドを実行します。

docker run -it --net host --pid host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

チェックのリストを返します。

[INFO] 1 - Host Configuration

[WARN] 1.1  - Ensure a separate partition for containers has been created

[NOTE] 4.2  - Ensure that containers use trusted base images

[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image

リポジトリのREADMEから引用:

Docker Bench for Securityは、実稼働環境でのDockerコンテナーの展開に関する一般的なベストプラクティスをチェックするスクリプトです。テストはすべて自動化されており、CIS Docker Community Edition Benchmark v1.1.0に触発されています。

セキュリティベンチによって報告される問題の一部は、公式のドッカーセキュリティ記事を読み、質問で定義されている箇条書きと比較することで解決できます。次のことも重要です。

  • sslを実装してdockerデーモンソケットを保護する
  • 公証人とDOCKER_CONTENT_TRUST変数を使用したコンテンツの信頼

7

Dockerはまだ開発中です。

他のすべてのソフトウェア開発中のバグと同様に、安全でない機能が追加される可能性があり、セキュリティ違反につながるアーキテクチャ上の欠陥がある可能性があります。これを過小評価しないでください!あなたのシステムは今日完全に安全かもしれませんが、来週からのパッチで誰かがバグを見つけ、エクスプロイトを書き、突然あなたのシステムはオープンになります。

必要な場合を除き、最新バージョンに更新しないでください。代わりに、十分にテストされた最新バージョンを使用してください。

Dockerは仮想化ではありません

誰かがDockerコンテナから脱出した場合、その攻撃者はすぐに実際のマシンにいます。侵害を防ぐ仮想化のような第2のゲートはありません。

Dockerコンテナーを他のプログラムと同様に扱います。最低限のユーザー権限で実行し、不要なネットワークトラフィックをすべてブロックし、パフォーマンスが許せばDockerホスト全体を仮想化します。

Dockerは保護されていません

Dockerコンテナ内で実行されるコードはすべて、Dockerから問題なく実行されます。攻撃者は誰でもソフトウェアをコンテナ内にインストールするだけで、Dockerは他のコードと同様にそれを実行します。

質問で言及したことは別として、メトリックとアラートを使用して、Dockerイメージが奇妙なことをしている場合に通知を受け取ることを検討してください。突然の継続的なCPUスパイクがありますか?プログラムは突然ネットワークポートをスキャンしていますか?疑わしいディスクアクセスはありますか?そのいずれかが発生した場合、通知を受け取る必要があります。これらのことを測定するために利用できる多くのツールがあります、あなたはそれらを使うべきです。


7

Dockerイメージ自体

追加のオプションはClairを使用することです。

Clairは、アプリケーションコンテナー(現在appcとdockerを含む)の脆弱性の静的分析のためのオープンソースプロジェクトです。

Clairは定期的に、設定された一連のソースから脆弱性メタデータを取り込み、データベースに保存します。

クライアントはClair APIを使用して、コンテナーイメージのインデックスを作成します。これにより、画像に存在する機能のリストが作成され、データベースに保存されます。

クライアントはClair APIを使用してデータベースに特定の画像の脆弱性を照会します。リクエストごとに脆弱性と機能の関連付けが行われ、画像を再スキャンする必要がなくなります。

脆弱性メタデータの更新が発生すると、変更が発生したことをシステムに警告する通知を送信できます。

私たちの目標は、コンテナベースのインフラストラクチャのセキュリティのより透明なビューを有効にすることです。したがって、このプロジェクトは、クリアで明るく透明なものに翻訳されるフランス語の用語にちなんでクレアと名付けられました。


5

このスレッドのポイントに加えて、私の推奨事項は次のとおりです。

  • dumb-initを使用してDocker PID1を制御する
  • コンテナオーケストレーションシステムなしで本番環境でdockerを実行しないでください
    • Kubernetes、Mesos、Swarmなどから選択してください。
  • 使用gosuドッキングウィンドウの画像内のユーザーコントロールのために
  • コンテナでステートフルアプリを実行している場合は、12要素のアプリパラダイムに従ってください。
    • コンテナでステートフルアプリ(mysql、zookeeper、elasticsearch)を実行する必要がある場合は、Kubernetes Statefulsetsなどのオーケストレーターパラダイムを活用してください
  • hashicorp vault / consulなどのツールを使用して堅牢なシークレット/構成管理を行う
  • 開発者が作成した同じコンテナを、CIパイプラインを介して製品化し、ステージング、統合テストを徹底的に行います。
  • CVEおよびパッチに関する通知を作成し、patch-notifyでビルドをトリガーします
  • 実行中のコンテナについての洞察を得るための広範なロギングがあり、ホストまたはコンテナのいずれかに開発者にSSHアクセスを許可したくない
    • 推奨:fluentd
  • コンテナとホストの両方のメトリックを持っている
    • 推奨事項:prometheus + node-exporter

2

Dockerエントリポイントをsedコマンドで埋める場合は、次のプラクティスを検討してください。

  • confdなどのツールを使用して、Dockerイメージの構成ファイルを管理し、最新の状態に保ちます

Confdは、サポートされている多くのキーと値のストアからデータを読み取り、構成テンプレートを動的にレンダリングします。


0

A2Dを使用して、特定の事項(非ルート、アクセス許可、アプリの場所など)を考慮しながらアプリをドッカーイメージに焼き付けることができます。

docker run -v $PWD:/projectName utrecht/a2d:1.0.0 \
       -projectName someProjectName -dockerfile /projectName/Dockerfile

返却値:

FROM golang:1.12.4-alpine as builder
COPY . ./someProjectName/
WORKDIR someProjectName
RUN adduser -D -g '' someProjectName && \
    apk add git && \
    CGO_ENABLED=0 go build && \
    cp someProjectName /someProjectName && \
    chmod 100 /someProjectName

FROM scratch
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder --chown=someProjectName:someProjectName /someProjectName /usr/local/someProjectName
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER someProjectName
ENTRYPOINT ["/usr/local/someProjectName"]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.