ドッカー安全管理(本当!)

ドッカーセキュリティ

仮想マシン間のドッカー差

分離と共有

  • その後、仮想マシンのハイパーバイザ層、仮想カード、メモリ、CPUや他の仮想ハードウェアを追加することにより、および各仮想マシンは、独自のシステムのカーネルを持っている上で仮想マシンを作成します
  • ドッカー容器を単離するための方法、ファイルシステム、プロセス、装置、ネットワーク、および他のリソースによって単離し、次いで許可は、CPUリソースが、制御は、最終的に容器間で互いに影響を及ぼしている、
    容器はホストに影響を与えることができません。コンテナとホストは、カーネル、ファイルシステム、ハードウェアおよびその他のリソースを共有しました。

パフォーマンスと損失

  • 仮想マシン、リソースの枯渇コンテナ少ないと比較すると。
  • 同じホストの下では、仮想マシンよりもコンテナの数を確立します。
  • しかし、感染した仮想マシンからホストまたは他の仮想マシンへの仮想マシンのセキュリティわずかに良いよりもコンテナは、あなたがハイパーバイザ層を分割する必要があり、それは非常に困難です
  • カーネル、ファイルシステム、およびその他のリソースを共有ドッキングウィンドウコンテナとホストは、
    他のコンテナへの影響、ホストを持っている可能性があります。

    ドッカーのセキュリティ問題

    ドッカー独自の脆弱性

  • ドッカーアプリケーション自体は、コード欠陥上に実装されるように。20個の穴の上履歴ドッカー合計のCVE公式バージョン。
    - GJハッカー一般的に用いられる手段でコードが実行される、特権エスカレーション、情報開示、特権バイパス等があります。変更の現在のバージョンは非常に高速であるドッキングウィンドウ、ドッカードッカーユーザーが最新のバージョンにアップグレードしてください。

    ドッカーソースの問題

  • ハッカーは、ミラーの生産で、ウイルス、バックドアやその他の悪意のあるソフトウェアを挿入した場合1)悪意のあるハッカーのミラーをアップロードし、その後、最初から環境には、フォローアップの危険なてきましたが、話すためにはセキュリティがありません。
  • ダウンロードすることができます2)ミラーリングソフトウェアドッカーハブ欠陥のあるミラーは、ミラーの75%が脆弱なソフトウェアがインストールされています。だから、イメージをダウンロードした後、あなたはパッチを適用するソフトウェアの内部情報、抜け穴がある場合、対応するバージョン、およびアップデートのバージョンを確認する必要があります。
  • 3)ミラーミラー改ざん仲介GJは、送信時とドッカーこの問題を防止するために適切な検証メカニズムを提供している現在の新しいバージョンを改ざんすることができます。

    ドッカーアーキテクチャの欠陥とセキュリティ・メカニズム

    アーキテクチャの欠陥

  • コンテナ間のLAN GJ
    ホスト上のコンテナの間には、彼らが過ごすことができ、ブロードキャストストームGJの道を盗聴、LAN ARPスプーフィングのために、したがって、ローカル・エリア・ネットワークを構成し、することができます。したがって、ホストにおける複数の容器の配置は、ネットワーク設定のiptableルールの合理的な配分を必要とします。

  • DDoS攻撃GJは、リソースが不足し
    てcgroupのセキュリティメカニズムは、このようなGJを防ぐためである、このような問題を回避するために、単一の容器の中にあまりにも多くのリソースを割り当てません。

  • システムコールの抜け穴があります
    ドッカードッカー仮想マシンがホストオペレーティングシステムのカーネルで共有されている重要な区別がされます。
    オーバーライド回またはドッカーコンテナがRQである場合、GJは、カーネルがより行う利用ホストにジャンプするために使用することができる通常のユーザを使用して行っているが、ホストカーネル特権昇格の脆弱性に存在してもよいです。

  • シェアrootユーザの特権
    は、root権限をコンテナで実行している場合は、コンテナ内のrootユーザーは、root権限のホストを持つことになります。

    ドッカーベースラインの安全規格6つの側面

    1.カーネルレベル

    (1)カーネルを更新します。
    (2)ユーザの名前空間(容器の非高い特権状態外における容器内のルート権限)。
    (3)のcgroup(リソースクォータと指標)。
    (4)SELiux / AppArmorの/ GRSEC ( 制御ファイルのアクセス許可)。
    (5)機能(権限の分割)。
    (6)Seccomp(定義されたシステムコール)。
    (7)が、容器の命名空間とホストプロセスの名前空間の共有を禁止します。

2.ホストレベル

(1)コンテナの別のパーティションを作成します。
(2)のみ必要なサービスを実行します。
(3)容器に敏感ホストにマッピングするディレクトリを禁止します。
ドッカーデーモン、監査関連のファイルとディレクトリの(4)。
(5)は、ファイルディスクリプタの適切なデフォルトの数を設定します。
(ファイル記述子:ファイルディスクリプタ非負の整数にアクセスするためのファイルディスクリプタ(ファイルディスクリプタ)を使用して、カーネル(カーネル)
と、新しいファイルまたは既存のファイルを開いて、カーネルが読むためにファイル記述子を返し、書き込みファイルが必要です。読み込まれるファイルを指定するためのファイルディスクリプタ)
関連付けられているアクセス許可が644以下である必要があり、ユーザー権利ドッカールートファイルの(6)。
(7)各ホストの容器のための定期的なチェックリスト、および不必要なコンテナをクリーンアップします。

3.ネットワークレベル

(1)ルールを設定してiptablesを介して容器との間のネットワークトラフィックを禁止または許可実装しました。
Dokcerてiptablesを変更することを可能にする(2)。
(3)は、他のIP /ポートまたはUnixのソケットにドッカーバインドを禁止しています。
(4)コンテナ上の特権ポートマッピングを禁止します。
(5)コンテナのポートを開くだけです。
(6)容器上のホストネットワークモードの使用を禁止します。
(7)は、ホストが複数のカードを持っている場合、特定のホスト・カードに結合するように容器に流入します。

4.ミラーレベル

(1)ローカルミラーリングウェアハウス・サーバーを作成します。
(2)最新バージョンにソフトウェアをミラーリング。
(3)信頼された画像ファイルを使用して、安全なチャネルを介してダウンロード。
(4)ミラーではなく、容器とミラーのパッチを再構築します。
(5)合理的な管理イメージタグ、速やかに使用されなくなった画像を削除しません。
走査ミラーを用いて(6)。
(7)署名をミラーリング。

コンテナレベル

(1)容器が最小化され、オペレーティングシステムイメージの最小セット。
(2)は、単一の容器本体のプロセスとして実行します。
(3)は、特権特権マークされた容器の使用を禁止します。
(4)容器上のSSHサービスを実行禁止します。
(5)システムのルートは、読み取り専用コンテナをマウント。
(6)定義された文字データは、コンテナに属します。
容器を繰り返し容易に失われたデータを再起動を再起動する試みの数を提供することによって、容器(7)上の障害限界。
(8)フォーク爆弾を防ぐために、容器内の利用可能なプロセスツリーを制限します。(フォーク爆弾、子の急速な成長は、システム・プロセスの数を枯渇しました)

6.その他の設定

(1)定期的にホストシステムとコンテナセキュリティ監査。
(2)コンテナを実行するために最小限のリソースと最小限の権限を使用しています。
(3)管理可能な数に維持し、同じホスト上の大型コンテナの展開を避けます。
(4)モニタの使用、および他の性能指標ドッカーコンテナ。
(5)リアルタイム検出およびインシデント応答に妨げられる機能を増大させます。
(6)使用センターやリモートログ収集サービス

ドッカーの安全規則

容器最小化

  • sshのように、容器の中にのみ必要なサービスを実行し、他のサービスが開かれていません
    [root@localhost ~]# docker exec -it mycontainer bash

    ドッカーリモートAPIアクセス制御

  • ドッカーリモートコールAPIの不正アクセスの脆弱性が存在するインタフェース、外部ネットワークへのアクセスを制限する必要があります
    [root@localhost ~]# docker -d -H uninx:///var/run/docker.sork -H tcp://192.168.142.128:2375
  • ドッキングウィンドウでは、デフォルトの設定ファイルは、アクセス制御には、ホストのiptables \ firewalldに指定されています

    リミットトラフィックフロー

  • iptablesのフィルタは範囲外でソースIPアドレスドッカーコンテナが通信を制限するために使用することができます
Iptables -A FORWARD -s <source_ip_range> -j REJECT --reject-with icmp-admin-prohibited

Iptables -A FORWARD -i docker0 -o eth0 -j DROP 
Iptables -A FORWARD -i docker0 -o eth0 -m state -state ESTABLISHED -j ACCEPT

普通のユーザーは、サービスドッカーの使用を開始します

  • マッピング・ユーザは、ユーザ0は、特定のコンテナ内の問題はLXCのユーザーおよびグループIDを再マッピングできるように、ホスト・システム上のルートに等しい解決します
[root@localhost ~]# yum -y install lxc uidmap
[root@localhost ~]# vim /etc/lxc/default.conf
lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536

ファイルシステムの制限

  • 絶対ルートコンテナは、読み取り専用でマウントし、ファイルディレクトリのアクセス許可を対応する異なる容器は、各容器は、ホスト上の別のパーティションを有する最適化を分離しました
    su test01
    docker run -v dev:/home/mc_server/test01 -it centos:latest /bin/bash
    su test02
    docker run -v dev:/home/mc_server/test02 -it centos:latest /bin/bash

    ミラーリングセキュリティ

  • 通常の状況下では、信頼できるデータベースミラーリングから取得し、--insecure-レジストリ= []パラメータを使用していないことを確認してください
    ここに画像を挿入説明

    安全ドッカークライアント通信端末とドッカーデーモン

  • 配置問題をハイジャックリンクするために、通信セッションがドッカー中間GJ、C / Sの結果として維持されるべき暗号化通信によって終了
[root@localhost harbor]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=0.0.0.0:2376

リソースの制約

  • 制限事項コンテナのリソースだけでなく、ビジネスに影響を与えることはありません。セキュリティ上のリスクを減らすことができます

    docker run -tid -name ec2 -cpuset-cpus 3 -cpu-shares 2048 -memory 2048m -rm -blkio-weight 100 --pids--limit 512

カーネルの脆弱性をアップグレードするホストの時間

  • ホストの障害や問題のカーネルをアップグレードする必要があります
  • ドッカーコンテナは、ライブマイグレーションをサポートする必要があります
  • あなたは、カーネルのアップグレードプログラムの計画、実装、および移動バックプログラムを検討すべきです

インストールのセキュリティ強化

  • 使用は、SELinuxの、AppArmorの、などのLinuxカーネル、カーネルパッチ、セキュリティで保護
    grsecなど

ドッカーは、コンテナ情報の漏洩を回避するために、

  • テンプレートを作成するには、コンテナの中身を確認します
# check created users
grep authorized keys $dockerfile
# check OS users
grep "etc/group" $dockerfile
# Check sudo users
grep "etc/sudoers.d" $dockerfile
# Check ssh key pair
grep " .ssh/.*id rsa" $dockerfile
# Add your checks in below

ログ分析

  • 収集と利用rsyslogのか、標準出力+ ELK方法ログの収集、保存、分析を監視する目的を達成するためにドッカーの監査とセキュリティログに関連付けられたアーカイブが
  • ホスト上で外側容器のアクセスログファイルに次のコマンドを使用します。
docker run -v /dev/log:/dev/log <container_name> /bin/sh
  • ドッカーは、組み込みコマンド
docker logs -f

セキュリティのためのドッカーベンチ

  • 本番環境の展開ドッカーコンテナをチェックするための一般的なベストプラクティスの数十のためのスクリプトです
  • 環境インストール
    バイナリファイルをダウンロードした後、PATH環境変数に追加します
[root@localhost ]# git clone
https://github.com/docker/docker-bench-security.git
[root@localhost ]# cd docker-bench-security
[root@localhost ]# sudo sh docker-bench-security.sh

ulimitの

  • コアダンプファイルサイズの大きさ、クラスファイルを作成するためのプロセスデータセグメントのサイズ、メモリ常駐セットサイズ、開いているファイルの数、最大の仮想メモリのプロセスのスタックサイズ、CPU時間、スレッドの最大数単一のユーザーのプロセスを含んでいてもよいですおよび他のタイプのリソースは、規制で遊びます
  • CPU時間の設定
docker daemon --default-ulimit cpu=1200
docker run --rm -ti --ulimit cpu=1200 ubuntu bash
  • ビューにコンテナを入力した後
ulimit -t

ドッカー-TLS暗号化通信

  • 通信をハイジャックセッションは、暗号化通信によってドッカー中間GJ、C / Sべき終了のときハイジャックリンク、およびその他の問題を防止するために起因します

1.展開マスターサーバー

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# vim /etc/hosts
127.0.0.1  master
[root@master ~]# mkdir /tls
[root@master ~]# cd /tls/
#创建ca秘钥
[root@master tls]# openssl genrsa -aes256 -out ca-key.pem 4096
#创建ca证书
[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pen
#创建服务器私钥
[root@master tls]# openssl genrsa -out server-key.pem 4096
#签名私钥
[root@master tls]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
#使用ca证书与私钥证书签名、输入123123
[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
#生成客户端秘钥
[root@master tls]# openssl genrsa -out key.pem 4096
#签名客户端
[root@master tls]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr
#创建配置文件
[root@master tls]# echo extendedKeyUsage=clientAuth > extfile.cnf
#签名证书,输入123123需要(签名客户端、ca证书、ca秘钥)
[root@master tls]# openssl x509 -req -days 1800 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
#删除多余文件
[root@master tls]# rm -rf ca.srl client.csr extfile.cnf server.csr
#配置docker
[root@master tls]# vim /lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock
#重启进程
[root@master tls]# systemctl daemon-reload
#重启服务
[root@master tls]# systemctl restart docker

#将/tls/ca.pem /tls/cert.pem /tls/key.pem三个文件复制到另一台主机
[root@master tls]# scp ca.pem [email protected]:/etc/docker
[root@master tls]# scp cert.pem [email protected]:/etc/docker
[root@master tls]# scp key.pem [email protected]:/etc/docker 

2.配備クライアント・サーバ

[root@localhost ~]# hostnamectl set-hostname client
[root@localhost ~]# su
[root@client ~]# vim /etc/hosts
192.168.45.129 master

3.clientテスト

[root@client docker]# docker --tlsverify --tlscacert=ca.pen --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version

読んでくれてありがとう!

おすすめ

転載: blog.51cto.com/14449521/2466804