前書き

Dockerを使用してアプリケーションとサービスをコンテナ化すると、すぐにセキュリティ上の利点が得られますが、デフォルトのDockerインストールには、セキュリティ関連の設定を改善する余地がまだあります。 https://www.cisecurity.org [Center for Internet Security](インターネットセキュリティのベストプラクティスを促進することを使命とする非営利団体)は、https://www.cisecurity.org/benchmark/docker/ [a step Dockerを保護するための詳細なチェックリスト]。 その後、Dockerチームは、セキュリティ監査ツールDocker Bench for Securityをリリースし、Dockerホストでこのチェックリストを実行し、見つかった問題にフラグを立てます。

このチュートリアルでは、Docker Bench for Securityをインストールし、それを使用して、Ubuntu 16.04ホスト上の(公式Dockerリポジトリから)デフォルトのDockerインストールのセキュリティスタンスを評価します。 その後、警告される問題の一部を修正します。

修正は主に次の2つの構成の更新で構成されています。

  • `+ auditd +`をインストールし、Dockerデーモンとその関連ファイルの監査ルールを設定する

  • Docker `+ daemon.json`設定ファイルを更新する

このチュートリアルでは、セキュアコンテナの作成に関する詳細は説明しません。Dockerホストセキュリティの更新のみに焦点を当てます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1-Docker Bench Securityのインストール

まず、非ルートユーザーとしてDockerホストにSSHで接続します。

最初に、 `+ git +`を使用してDocker Bench for Securityスクリプトをサーバーにクローンし、次にクローンされたリポジトリからスクリプトを直接実行します。

ユーザーが書き込み可能なディレクトリに移動します。 この例では、スクリプトをユーザーのホームディレクトリにダウンロードします。

cd ~

次に、 + docker-bench-security + Gitリポジトリのクローンを作成します。

git clone https://github.com/docker/docker-bench-security.git

これにより、すべてのファイルがリポジトリからプルされ、ローカルの `+ docker-bench-security +`ディレクトリに配置されます。 次に、この結果のディレクトリに移動します。

cd docker-bench-security

最後に、セキュリティ監査を実行するには、 `+ docker-bench-security.sh +`スクリプトを実行します:

./docker-bench-security.sh
Output# ------------------------------------------------------------------------------
# Docker Bench for Security v1.3.4
#
# Docker, Inc. (c) 2015-
#
# Checks for dozens of common best-practices around deploying Docker containers in production.
# Inspired by the CIS Docker Community Edition Benchmark v1.1.0.
# ------------------------------------------------------------------------------

Initializing Tue Jun  5 18:59:11 UTC 2018


[INFO] 1 - Host Configuration
[WARN] 1.1  - Ensure a separate partition for containers has been created
[NOTE] 1.2  - Ensure the container host has been Hardened
[INFO] 1.3  - Ensure Docker is up to date
[INFO]      * Using 18.03.1, verify is it up to date as deemed necessary
. . .

このスクリプトはさまざまなテストを実行し、それぞれに + INFO ++ NOTE ++ PASS +、または `+ WARN +`の結果を返します。 Ubuntu 16.04へのデフォルトのDockerインストールは、これらのテストの多くに合格しますが、セクション1、2、および4にいくつかの警告が表示されます。

このチュートリアルの残りの部分では、Dockerインストールを保護することでこれらの警告に対処します。

手順2-ホスト構成の警告の修正

監査の最初のセクションでは、強化、パッケージバージョン、監査構成など、ホストのオペレーティングシステムの構成をテストします。 このセクションのテストを見てみましょう。

  • 1.1コンテナ用に個別のパーティションが作成されていることを確認*

適切に分離するために、Dockerコンテナとすべての `+ / var / lib / docker +`を独自のファイルシステムパーティションに保持することをお勧めします。 これは、ドライブをパーティション分割する機能がないクラウドホスティングの状況では困難な場合があります。 これらの場合、Dockerのデータディレクトリを外部のネットワーク接続ブロックデバイスに移動することで、このテストを満たすことができます。

  • ドライブをパーティション分割する方法については、https://www.digitalocean.com/community/tutorials/how-to-partition-and-format-storage-devices-in-linux [ストレージのパーティション分割とフォーマットの方法]をご覧ください。 Linuxのデバイス]。

  • ブロックストレージデバイスをDigitalOcean Dropletにマウントするには、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-block-storage [DigitalOceanブロックストレージの概要]をお読みください。

  • 他のクラウドプラットフォームにブロックストレージデバイスをマウントする方法については、プロバイダーのドキュメントを参照してください。

  • 1.2コンテナホストが強化されていることを確認*

このテストは、ホストの強化を検討することを思い出させるための単なるメモです。 強化には通常、ファイアウォールの設定、さまざまなサービスのロックダウン、監査とログの設定、およびその他のセキュリティ対策の実装が含まれます。 これを開始するには、https://www.digitalocean.com/community/tutorials/7-security-measures-to-protect-your-servers [サーバーを保護するための7つのセキュリティ対策]を読んでください。

  • 1.3 Dockerが最新であることを確認する*

このテストは、Dockerバージョンを出力します。 Docker CEリリースノートにアクセスすると、現在の安定リリースであるバージョンを確認できます。 最新ではなく、 + apt-get install y`を使用してDockerをインストールした場合、 + apt-get in`を再度使用してDockerパッケージをアップグレードできます。

sudo apt-get update
sudo apt-get upgrade
  • 1.4信頼できるユーザーのみがDockerデーモンを制御できるようにする*

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04 [前提条件のDockerセットアップチュートリアル]では、非ルートユーザーをDockerデーモンへのアクセスを許可する* docker グループ。 このテストは `+ / etc / group`ファイルから docker *グループ行を出力します:

Outputdocker:x:999:

この行には、* docker グループに含まれるすべてのユーザーが表示されます。 行を確認し、適切なユーザーのみがDockerデーモンの制御を許可されていることを確認します。 上記の例では、許可ユーザー sammy *が強調表示されています。 このグループからユーザーを削除するには、 `+ gpasswd +`を使用できます:

gpasswd -d  docker
  • 1.5–1.13さまざまなDockerファイルに対して監査が構成されていることを確認する*

Dockerのファイル、ディレクトリ、ソケットの一部の監査を有効にするには、「+ auditd +」をインストールして設定する必要があります。 Auditdは、カーネルレベルで注目すべきシステム操作を記録するLinuxアクセス監視およびアカウンティングサブシステムです。

+ apt-get`で + auditd`をインストールします。

sudo apt-get install auditd

これにより、 `+ auditd `デーモンがインストールおよび起動されます。 次に、Dockerファイルとディレクトリを監視するように「 auditd +」を設定します。 テキストエディタで、監査ルールファイルを開きます。

sudo nano /etc/audit/audit.rules

次のテキストが表示されます。

/etc/audit/audit.rules

# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.

# First rule - delete all
-D

# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 320

# Feel free to add below this line. See auditctl man page

ファイルの下部に次のスニペットを貼り付け、保存してエディターを終了します。

/etc/audit/audit.rules

-w /usr/bin/docker -p wa
-w /var/lib/docker -p wa
-w /etc/docker -p wa
-w /lib/systemd/system/docker.service -p wa
-w /lib/systemd/system/docker.socket -p wa
-w /etc/default/docker -p wa
-w /etc/docker/daemon.json -p wa
-w /usr/bin/docker-containerd -p wa
-w /usr/bin/docker-runc -p wa

これらのルールは、指定されたファイルまたはディレクトリを監視( + -w +)し、それらのファイルへの書き込みまたは属性の変更( + -p wa +)を記録するようにauditdに指示します。

変更を有効にするには、 `+ auditd +`を再起動します。

sudo systemctl restart auditd

この時点で、疑わしい変更がないかDockerファイルとディレクトリを監視するように「+ auditd +」を正常に設定しました。 Docker Bench for Securityスクリプトを再実行して、セクション1のテストに合格したことを確認できます。

`+ auditd +`の詳細については、チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-use-the-linux-auditing-system-on-centos-7[How To CentOS 7でLinux監査システムを使用します]。 CentOS用に作成されていますが、監査システムの構成と使用に関するセクションはUbuntuにも同様に適用されます。

ホスト構成を確認したので、Dockerセキュリティ監査のセクション2であるDockerデーモン構成に進みます。

ステップ3-Dockerデーモン構成の警告を修正する

監査のこのセクションでは、Dockerデーモンの構成を扱います。 これらの警告はすべて、「+ daemon.json +」と呼ばれるデーモンの構成ファイルを作成することで対処できます。このファイルにセキュリティ関連の構成パラメーターを追加します。 最初にこの構成ファイルを作成して保存し、次に構成内のテストと対応する行を1つずつ確認します。

まず、お気に入りのエディターで構成ファイルを開きます。

sudo nano /etc/docker/daemon.json

これにより、空のテキストファイルが表示されます。 以下に貼り付けます。

/etc/docker/daemon.json

{
   "icc": false,
   "userns-remap": "default",
   "log-driver": "syslog",
   "disable-legacy-registry": true,
   "live-restore": true,
   "userland-proxy": false,
   "no-new-privileges": true
}

ファイルを保存して閉じ、Dockerデーモンを再起動して、この新しい構成を取得します。

sudo systemctl restart docker

これで、監査を再実行して、セクション2のすべての警告に対処したことを確認できます。

このファイルに挿入した構成変数は、監査警告と同じ順序で配置されます。 それぞれを見ていきましょう。

  • 2.1デフォルトブリッジ上のコンテナ間でネットワークトラフィックが制限されていることを確認する*

この警告は、設定ファイルの `” icc “:false +`で対処されています。 この設定は、Dockerコマンドラインで `-link = `またはDocker Compose設定ファイルの ` links:+`パラメーターを使用して明示的にリンクされた場合にのみ相互に通信できるコンテナーを作成します。 この利点の1つは、攻撃者が1つのコンテナを侵害した場合、同じホスト上の他のコンテナを見つけて攻撃するのが困難になることです。

  • 2.8ユーザー名前空間のサポートを有効にする*

Linux名前空間は、コンテナで実行されているプロセスをさらに分離します。 ユーザー名前空間の再マッピングにより、プロセスはコンテナ内で* root *として実行され、ホスト上の特権の低いユーザーに再マッピングされます。 設定ファイルの `” userns-remap “:” default “`行でユーザー名前空間の再マッピングを有効にします。

パラメーターを `+ default `に設定します。これは、Dockerが、コンテナユーザーが再マップされる* dockremap *ユーザーを作成することを意味します。 ` id +`コマンドを使用して、* dockremap *ユーザーが作成されたことを確認できます。

sudo id dockremap

次のような出力が表示されます。

Outputuid=112(dockremap) gid=116(dockremap) groups=116(dockremap)

コンテナユーザーを別のホストユーザーに再マッピングすることがユースケースにとってより意味がある場合、設定ファイルの `+ default `の代わりにユーザーまたは ` user:group +`の組み合わせを指定します。

  • 2.11 Dockerクライアントコマンドの許可が有効になっていることを確認する*

Dockerソケットへのネットワークアクセスを許可する必要がある場合は、https://docs.docker.com/engine/security/https/ [Dockerの公式ドキュメントを参照]を実行して、実行に必要な証明書とキーの設定方法を確認する必要があります。とても安全に。

詳細は個々の状況に大きく依存しているため、ここではこのプロセスを取り上げません。 デフォルトのローカルのみのDockerソケットへのアクセスは* docker *グループのメンバーシップを要求することで保護されますが、これは無視しても問題ありませんが、監査はこのテストに `+ WARN +`のフラグを立て続けます。

  • 2.12集中ログおよびリモートロギングが設定されていることを確認*

Dockerデーモン構成ファイルでは、 `” log-driver “:” syslog “`行を使用して標準のsyslogロギングを有効にしました。 次に、ログを中央のsyslogサーバーに転送するようにsyslogを構成する必要があります。 これにより、ログをDockerホストから取得し、それらを変更または削除できる攻撃者から遠ざけます。

Dockerログのみを転送し、syslogを出荷したくない場合は、次のパラメーターをファイルに追加することにより、Docker設定ファイルでリモートsyslogサーバーを指定できます。

/etc/docker/daemon.json

   `"log-opts": { "syslog-address": "udp://:" }`

IPアドレスを独自のsyslogサーバーアドレスに置き換えてください。

別の方法として、 `+ splunk `や ` fluentd +`のようなログドライバーを指定して、他のログ集約サービスを使用してDockerデーモンログを送信することもできます。 Dockerログドライバーとその構成の詳細については、https://docs.docker.com/config/containers/logging/configure/ [Dockerロギングドライバーの公式ドキュメントをご覧ください]。

  • 2.13レガシーレジストリ(v1)の操作が無効になっていることを確認する*

この警告は、デーモン設定ファイルの `+” disable-legacy-registry “:true +`行で修正されています。 これにより、安全でないレガシーイメージレジストリプロトコルが無効になります。 このプロトコルのサポートはDockerデーモンから既に削除されているため、このフラグは廃止される予定です。

  • 2.14ライブ復元が有効になっていることを確認*

デーモンの設定で `+” live-restore “:true +`を指定することにより、Dockerデーモンが実行されていない場合でもコンテナの実行を継続できます。 これにより、ホストシステムの更新時のコンテナーの稼働時間とその他の安定性の問題が改善されます。

  • 2.15ユーザーランドプロキシが無効になっていることを確認する*

`” userland-proxy “:false +`行はこの警告を修正します。 これにより、デフォルトでホストポートをコンテナに転送する「 docker-proxy 」ユーザーランドプロセスが無効になり、「 iptables +」ルールに置き換えられます。 ヘアピンNATが利用可能な場合、ユーザーランドプロキシは不要であり、ホストの攻撃対象領域を減らすために無効にする必要があります。

  • 2.18コンテナが新しい特権の取得を制限されていることを確認する*

デーモン設定の `” no-new-privileges “:true +`行は、コンテナ内部からの権限昇格を防ぎます。 これにより、コンテナは ` setuid `または ` setgid +`バイナリを使用して新しい権限を取得できなくなります。

Dockerデーモンの構成を更新したので、監査のセクション4に残っている警告を修正しましょう。

手順4-コンテンツの信頼を有効にする

監査によってフラグが付けられる最終テストは、「+ 4.5 Dockerのコンテンツの信頼が有効になっていることを確認する」です。 コンテンツの信頼は、Dockerイメージに署名し、実行前に署名を検証するためのシステムです。 ` DOCKER_CONTENT_TRUST +`環境変数でコンテンツの信頼を有効にできます。

現在のシェルセッションにこの変数を設定するには、シェルに次のように入力します。

export DOCKER_CONTENT_TRUST=1

この `+ export `コマンドの後に監査を実行すると、コンテンツの信頼が有効になっていることが示され、この警告がクリアされます。 すべてのユーザーとすべてのセッションで自動的に有効にするには、システム全体の環境変数を割り当てるファイルである ` / etc / environment `ファイルに ` DOCKER_CONTENT_TRUST +`変数を追加します。

echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment

Dockerコンテンツの信頼の詳細については、https://docs.docker.com/engine/security/trust/content_trust/ [Dockerコンテンツの公式信頼ドキュメント]を参照してください。

この時点で、Docker Bench for Securityスクリプトによってフラグが立てられたすべての警告に対処しました。 これで、コンテナを実行するためのより安全なDockerホストができました。

結論

このチュートリアルでは、Docker Bench for Securityスクリプトをインストールし、それを使用してDockerインストールのセキュリティを監査し、 `+ auditd +`とDockerデーモンの構成ファイルをインストールして構成することで警告に対処しました。

このチュートリアルを完了した後、監査スクリプトを実行すると、エラーや警告はほとんど発生しません。また、永続的なエラーを無視する理由を理解し、十分な理由があるはずです。

Dockerセキュリティ構成オプションの詳細については、https://docs.docker.com/ [Docker documentation]を参照し、このチュートリアル全体に含まれているドキュメントの特定のサブセクションへのリンクを参照してください。