セキュリティベビヌベッドDocker





Dockerコンテナヌは、最も䞀般的なコンテナヌ化テクノロゞヌです。 圓初は、䞻に開発環境ずテスト環境で䜿甚されおいたしたが、埐々に本番環境に移行したした。 雚の埌のキノコのように、生産環境でDockerコンテナが増え始めたしたが、この技術を䜿甚する人のほずんどは、Dockerコンテナを安党に公開する方法に぀いお考えたせんでした。



OWASPに基づいお、Dockerコンテナ䞊に構築された環境を倧幅に保護するルヌルのリストを準備したした。



ルヌル0

ホストマシンずDockerには、珟圚のすべおの曎新が含たれおいる必芁がありたす。



コンテナヌ環境からホストシステムぞの゚スケヌプに぀ながる既知の脆匱性通垞はホストシステムでの暩限昇栌に぀ながるから保護するには、ホストOS、Docker Engine、およびDocker Machineのすべおのパッチをむンストヌルするこずが非垞に重芁です。



さらに、コンテナは仮想マシンずは異なりカヌネルをホストず共有するため、コンテナ内で実行されるカヌネル゚クスプロむトはホストカヌネルで盎接実行されたす。 たずえば、十分に隔離されたコンテナ内で実行されるカヌネル暩限昇栌の悪甚Dirty COWなどは、ホスト䞊のルヌトアクセスに぀ながりたす。



ルヌル1

Dockerデヌモンの゜ケットぞのアクセスを蚱可しないでください



Dockerサヌビスデヌモンは、着信API接続にUNIX゜ケット/var/run/docker.sockを䜿甚したす。 このリ゜ヌスの所有者は、rootナヌザヌでなければなりたせん。 そしお他の方法はありたせん。 この゜ケットぞのアクセス暩を倉曎するこずは、ホストシステムぞのルヌトアクセスを蚱可するこずず本質的に同等です。



たた、/ var / run / docker.sock゜ケットをコンテナヌで操䜜しないでください。コンテナヌを䜿甚しない堎合は、コンテナヌ内のサヌビスを䟵害するずホストシステムを完党に制埡できるためです。 このようなものを䜿甚するコンテナがある堎合



-v /var/run/docker.sock://var/run/docker.sock
      
      





たたはdocker-composeの堎合



 volumes: - "/var/run/docker.sock:/var/run/docker.sock"
      
      





これを早急に倉曎する必芁がありたす。



そしお最埌に、特に远加の保護方法少なくずも認蚌を䜿甚せずに、必芁な絶察的な確実性がない限り、Docker TCP゜ケットを䜿甚しないでください。 デフォルトでは、Docker TCP゜ケットは倖郚むンタヌフェヌス0.0.0.0:2375HTTPの堎合は2376でポヌトを開き、コンテナヌを完党に制埡し、朜圚的にホストシステムを䜿甚できるようにしたす。



ルヌル2

コンテナ内で非特暩ナヌザヌを構成する



特暩のないナヌザヌを䜿甚するようにコンテナを構成するこずは、特暩の昇栌攻撃を回避するための最良の方法です。 これはさたざたな方法で実行できたす。



1.「docker run」コマンドの「-u」オプションを䜿甚したす。



 docker run -u 4000 alpine
      
      





2.むメヌゞのビルド䞭



 FROM alpine RUN groupadd -r myuser && useradd -r -g myuser myuser <      root-, ,  > USER myuser
      
      





3. Dockerデヌモンで「ナヌザヌ名前空間」ナヌザヌ環境のサポヌトを有効にしたす。



 --userns-remap=default
      
      





詳现に぀いおは、 公匏ドキュメントをご芧ください。



Kubernetesでは、埌者はrunAsNonRootオプションを介しおセキュリティコンテキストで構成されたす。



 kind: ... apiVersion: ... metadata: name: ... spec: ... containers: - name: ... image: .... securityContext: ... runAsNonRoot: true ...
      
      





ルヌル3

コンテナの機胜を制限する



Linuxでは、カヌネル2.2以降、 Linuxカヌネル機胜ず呌ばれる特暩プロセスの機胜を制埡する方法がありたす詳现に぀いおはリンクを参照しおください。



Dockerは、デフォルトでこれらのカヌネル機胜の事前定矩されたセットを䜿甚したす。 そしお、次のコマンドを䜿甚しおこのセットを倉曎できたす。



 --cap-drop —     --cap-add —    
      
      





最適なセキュリティ蚭定は、最初にすべおの機胜を無効にし--cap-drop all、次に必芁な機胜のみを接続するこずです。 たずえば、次のように



 docker run --cap-drop all --cap-add CHOWN alpine
      
      





そしお最も重芁な–privilegedフラグを䜿甚しおコンテナヌを実行しないでください!!!



Kubernetesでは、Linux Kernel Capabilities制玄は、機胜オプションを介しおセキュリティコンテキストで構成されたす。



 kind: ... apiVersion: ... metadata: name: ... spec: ... containers: - name: ... image: .... securityContext: ... capabilities: drop: - all add: - CHOWN ...
      
      





ルヌル4

no-new-privilegesフラグを䜿甚したす



コンテナを起動するずき、コンテナ内での暩限昇栌を防ぐ--security-opt = no-new-privilegesフラグを䜿甚するず䟿利です。



Kubernetesでは、Linux Kernel Capabilities制玄は、allowPrivilegeEscalationオプションを介しおセキュリティコンテキストで構成されたす。



 kind: ... apiVersion: ... metadata: name: ... spec: ... containers: - name: ... image: .... securityContext: ... allowPrivilegeEscalation: false ...
      
      





ルヌル5

コンテナヌ間通信をオフにする



デフォルトでは、コンテナ間通信はDockerで有効になっおいたす。これは、すべおのコンテナがdocker0ネットワヌクを䜿甚しお盞互に通信できるこずを意味したす。 この機胜を無効にするには、–icc = falseフラグを指定しおDockerサヌビスを実行したす。



ルヌル6

Linuxセキュリティモゞュヌルを䜿甚するLinuxセキュリティモゞュヌル-seccomp、AppArmor、SELinux



デフォルトでは、DockerはすでにLinuxセキュリティモゞュヌルのプロファむルを䜿甚しおいたす。 したがっお、 セキュリティプロファむルを無効にしないでください。 それらでできる最倧のこずは、ルヌルを匷化するこずです。



seccompのデフォルトプロファむルは、 ここから入手できたす 。



たた、Dockerは保護のためにAppArmorを䜿甚し、Docker Engine自䜓がコンテナヌの起動時にAppArmorのデフォルトプロファむルを生成したす。 ぀たり、次の代わりに



 $ docker run --rm -it hello-world
      
      





起動したす



 $ docker run --rm -it --security-opt apparmor=docker-default hello-world
      
      





ドキュメントには、nginxのAppArmorプロファむルの䟋も蚘茉されおいたすが、これは非垞に可胜です必芁です。



 #include <tunables/global> profile docker-nginx flags=(attach_disconnected,mediate_deleted) { #include <abstractions/base> network inet tcp, network inet udp, network inet icmp, deny network raw, deny network packet, file, umount, deny /bin/** wl, deny /boot/** wl, deny /dev/** wl, deny /etc/** wl, deny /home/** wl, deny /lib/** wl, deny /lib64/** wl, deny /media/** wl, deny /mnt/** wl, deny /opt/** wl, deny /proc/** wl, deny /root/** wl, deny /sbin/** wl, deny /srv/** wl, deny /tmp/** wl, deny /sys/** wl, deny /usr/** wl, audit /** w, /var/run/nginx.pid w, /usr/sbin/nginx ix, deny /bin/dash mrwklx, deny /bin/sh mrwklx, deny /usr/bin/top mrwklx, capability chown, capability dac_override, capability setuid, capability setgid, capability net_bind_service, deny @{PROC}/* w, # deny write for all files directly in /proc (not in a subdir) # deny write to files not in /proc/<number>/** or /proc/sys/** deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w, deny @{PROC}/sys/[^k]** w, # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel) deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w, # deny everything except shm* in /proc/sys/kernel/ deny @{PROC}/sysrq-trigger rwklx, deny @{PROC}/mem rwklx, deny @{PROC}/kmem rwklx, deny @{PROC}/kcore rwklx, deny mount, deny /sys/[^f]*/** wklx, deny /sys/f[^s]*/** wklx, deny /sys/fs/[^c]*/** wklx, deny /sys/fs/c[^g]*/** wklx, deny /sys/fs/cg[^r]*/** wklx, deny /sys/firmware/** rwklx, deny /sys/kernel/security/** rwklx, }
      
      





ルヌル7

コンテナリ゜ヌスを制限する



このルヌルは非垞に単玔です。次のDoS / DDoS攻撃䞭にコンテナがすべおのサヌバヌリ゜ヌスを䜿い果たすのを防ぐために、各コンテナのメモリ䜿甚制限を個別に蚭定できたす。 制限できるのは、メモリの量、CPU、コンテナの再起動の回数です。



順番に行きたしょう。



蚘憶



-mたたは--memoryオプション



コンテナが䜿甚できるメモリの最倧量。 最小倀は4m4メガバむトです。



オプション--memory-swap



スワップを構成するオプションスワップファむル。 巧劙に蚭定





ホステスぞの泚意コンテナ内で起動された無料のナヌティリティは、コンテナで利甚可胜なスワップの実際の倀ではなく、ホストスワップの数を衚瀺したす。



オプション--oom-kill-disable



OOMメモリ䞍足キラヌを有効たたは無効にできたす。



泚意 OOM Killerをオフにできるのは--memoryオプションが蚭定されおいる堎合のみです。そうしないず、コンテナ内のメモリ䞍足により、カヌネルがホストシステムプロセスの匷制終了を開始する可胜性がありたす。



--memory-swappiness、-memory-reservation、-kernel-memoryなどの他のメモリ管理蚭定オプションは、コンテナのパフォヌマンスを調敎するためのものです。



CPU



オプション--cpus



このオプションは、コンテナが䜿甚できる䜿甚可胜なプロセッサリ゜ヌスの量を蚭定したす。 たずえば、2぀のCPUを持぀ホストがあり、-cpus = "1.5"を蚭定した堎合、コンテナは1.5プロセッサを䜿甚するこずが保蚌されたす。



オプション--cpuset-cpus



特定のコアたたはCPUの䜿甚を構成したす。 倀は、ハむフンたたはコンマで指定できたす。 最初のケヌスでは、蚱可されたコアの範囲が瀺され、2番目のケヌスでは特定のコアが瀺されたす。



コンテナの再起動回数



 --restart=on-failure:<number_of_restarts>
      
      





この蚭定は、コンテナが予期せずクラッシュした堎合にDockerがコンテナの再起動を詊行する回数を蚭定したす。 コンテナの状態が実行䞭に倉曎されるず、カりンタヌはれロにリセットされたす。



皌働しおいないサヌビスの無限の再起動を回避するために、5などの小さな正の数を蚭定するこずをお勧めしたす。



ルヌル8

読み取り専甚のファむルシステムずボリュヌムを䜿甚する



コンテナがどこかに䜕かを曞き蟌む必芁がない堎合は、可胜な限り読み取り専甚ファむルシステムを䜿甚する必芁がありたす。 これは、朜圚的な䟵入者の生掻を倧きく耇雑にしたす。



読み取り専甚ファむルシステムでコンテナを起動する䟋



 docker run --read-only alpine
      
      





読み取り専甚モヌドでボリュヌムを接続する䟋



 docker run -v volume-name:/path/in/container:ro alpine
      
      





ルヌル9

コンテナの安党性分析ツヌルを䜿甚する



既知の脆匱性を持぀コンテナを怜出するには、ツヌルを䜿甚する必芁がありたす。 それらの倚くはただありたせんが、それらは



•無料





•コマヌシャル





たた、Kubernetesには、構成゚ラヌを怜出するためのツヌルがありたす。






All Articles