Docker Container Securityの匷化





「先生、どうやっおハッキングされたの」

-方法ではなく、コンテナ内。

叀いゞョヌク

コンピュヌタヌシステムの䞍芁なコンポヌネントはすべお、完党にオプションの脆匱性の原因ずなる可胜性がありたす。 したがっお、コンテナむメヌゞには、可胜な限りアプリケヌションが必芁ずするもののみを含める必芁がありたす。 そしお、そのサむズは、配垃の容易さだけでなく、所有コストずセキュリティの点でも重芁です。 この蚘事では、Dockerむメヌゞのサむズず攻撃察象領域を最小化する方法ず、脆匱性をスキャンするツヌルに぀いお説明したす。







Dockerを䜿甚したこずがある人なら、おそらく高山のむメヌゞを聞いたこずがあるでしょう。 これは、 Alpine Linuxディストリビュヌションに基づいお䜜成されたした。たずえば、ベヌスむメヌゞサむズが5 MBのDebianやUbuntuず比范するず、攻撃者に攻撃の䜙地がほずんどありたせん。 アプリケヌションが高山で動䜜できる堎合、これは最適化するのに最適な方法です。







バむナリファむルはどうですか アプリケヌションは自埋的に機胜したすか もしそうなら、サむズの远加の瞮小を期埅する理由がありたす。 DebianやUbuntuのようなむメヌゞのベヌスずしお、通垞はscratch



が䜿甚されたすが、golangアプリケヌションを機胜させるこずもできたす。 Gianluca Arbezzanoは、最小サむズの既補のバむナリを含むリポゞトリを䜜成したした。 linux_386を詊しおみたしょう。











 curl -SsL https://github.com/gianarb/micro/releases/download/1.0.0/micro_1.0.0_linux_386 > micro
      
      





このDockerfileを䜿甚しお、このバむナリファむルをスクラッチむメヌゞに含めるこずができたす。







 FROM scratch ADD ./micro /micro EXPOSE 8000 CMD ["/micro"]
      
      





 docker build -t micro-scratch . docker run -p 8000:8000 micro-scratch
      
      





その結果、わずか5 MBのむメヌゞでhttp-applicationを起動するこずができたした。぀たり、高山に基づいお䜜成されたむメヌゞが占有する12 MBに比べお2倍以䞊削枛したした。







どのアプリケヌションでもスクラッチ画像を䜿甚するこずはできたせんが、オヌバヌヘッドを削枛する䟡倀はありたす。







Rubyでは、ベヌスずしおruby2.3-alpineを䜿甚できたす。 その䞭のRubyは、Alpineパッケヌゞからではなく、゜ヌスからむンストヌルされたす。 セマンティックバヌゞョニングに埓っお、リリヌス2.3は開発者から盎接セキュリティアップデヌトを受け取りたす。







それ以倖の堎合は、゜ヌスからRubyを自分でむンストヌルしお新しいバヌゞョンのリリヌスを远跡するか、Alpineのパッケヌゞを䜿甚しお、ディストリビュヌション開発者による曎新を監芖する必芁がありたす。







通知ずWebフック



ベヌスむメヌゞに察しおセキュリティ曎新プログラムが発行された堎合、それに基づいたむメヌゞを曎新する必芁がありたす。 MicroScalingのスタッフが公匏の高山ずルビヌの画像に察しお行うように、たずえばSlackに送信できるMicroBadger通知がここで圹立ちたす。











たた、ベヌスむメヌゞが倉曎された堎合に、アラヌトを䜿甚しおビルド/リアセンブリ手順を自動的に開始したす。 Docker Hubにはそのような機胜がありたすが、MicroBallgerはWebフックをサポヌトするシステムCIやセキュリティスキャナヌなどで䜿甚できるため、MicroBadgerの方が優れおいるず䞻匵しおいたす。







䞀般ナヌザヌ



仮想マシンずコンテナの䞻な違いの1぀は、コアシステムの最新の䜿甚です。 デフォルトでは、Dockerコンテナはルヌト暩限で実行されたす。これは、ルヌトの䞋で実行されおいる䟵害されたコンテナがメむンシステムぞのルヌトアクセスを取埗できるため、分離が壊れた堎合に深刻な問題に぀ながる可胜性がありたす。







ただし、コンテナを通垞のナヌザヌずしお実行するこずにより、リスクを軜枛できたす。 Railsアプリケヌションでこれを行う方法は次のずおりです。







 #    WORKDIR /app #   Rails-   COPY . ./ #   ,      RUN addgroup rails && adduser -D -G rails rails \ && chown -R rails:rails /app USER rails
      
      





セキュリティスキャン



盎接のストレヌゞに加えお、コンテナレゞストリは、そこにロヌドされたむメヌゞの脆匱性をスキャンできたす。 たずえば、DockerはDocker Cloudにアップロヌドされた公匏画像ずナヌザヌ画像のセキュリティをスキャンしたす 。







Quay.ioは、CoreOSのオヌプン゜ヌス補品であるClairを䜿甚しお、画像セキュリティをスキャンしたす。 最近では、AlpineのサポヌトがClairに远加されたした。これは実際には非垞にクヌルです。 この機胜がQuayですぐに利甚できるこずを期埅したしょう。 Clairに加えお、 TwistLockおよびAquaスキャナヌがありたすが、ほずんどの堎合、それらの䜿甚に察しお料金を支払う必芁がありたす。







Clairは、画像をアップロヌド、ダりンロヌド、および分析するためのHTTP APIのセットを実装するGolangアプリケヌションです。 脆匱性デヌタは、 Debian Security TrackerやRedHat Security Dataなどのさたざたな゜ヌスからダりンロヌドされ、Postgresに保存されたす。 Clairは静的アナラむザヌの原理で動䜜するため、コンテナヌをスキャンするためにコンテナヌを実行する必芁はありたせん。むメヌゞファむルシステムのみがチェックされたす。







 docker run -it -p 5000:5000 registry
      
      





このコマンドを䜿甚しお、独自のレゞストリを起動し、スキャン甚の画像の゜ヌスずしお䜿甚したした。 Gianluca Arbezzanoからmicro



画像を読み蟌んでみたしょう







 docker pull gianarb/micro:1.0.0 docker tag gianarb/micro:1.0.0 localhost:5000/gianarb/micro:1.0.0 docker push localhost:5000/gianarb/micro:1.0.0
      
      





次に、Clairをむンストヌルしたす。







 mkdir $HOME/clair-test/clair_config cd $HOME/clair-test curl -L https://raw.githubusercontent.com/coreos/clair/v1.2.2/config.example.yaml -o clair_config/config.yaml curl -L https://raw.githubusercontent.com/coreos/clair/v1.2.2/docker-compose.yml -o docker-compose.yml
      
      





デヌタベヌスに接続するための蚭定を$HOME/clair_config/config.yml



したすpostgresql://postgres:password@postgres:5432?sslmode=disable









Postgres and Clairを起動するには、次のコマンドを実行したす。







 docker-compose up
      
      





テスト手順を容易にするために、Hyperclairず呌ばれるCLIを䜿甚したすこれはClairず連携するためのクラむアントです。 Mac OSのコマンドは次のずおりです別のOSを䜿甚しおいる堎合は、 https  //github.com/wemanity-belgium/hyperclair/releasesを参照しおください 。







 curl -SSl https://github.com/wemanity-belgium/hyperclair/releases/download/0.5.2/hyperclair-darwin-386 > ~/hyperclair chmod 755 ~/hyperclair
      
      





〜/ hyperclairに実行可胜ファむルができたした







 ~/hyperclair pull localhost:5000/gianarb/micro:1.0.0 ~/hyperclair push localhost:5000/gianarb/micro:1.0.0 ~/hyperclair analyze localhost:5000/gianarb/micro:1.0.0 ~/hyperclair report localhost:5000/gianarb/micro:1.0.0
      
      





生成されるレポヌトは次のようになりたす。











Railsアプリケヌションの朜圚的に脆匱なビルド䟝存関係の削陀



Rubyはむンタヌプリタヌ蚀語であるため、Rubyで䜜成されたアプリケヌションを䜿甚する堎合、かなりの量の䟝存関係がありたす。 アプリケヌションに必芁なすべおのRuby gem、およびこれらのgemに必芁なすべおのオペレヌティングシステムパッケヌゞをむンストヌルする必芁がありたす。







スキャンによっおlibxml2およびlibxsltの重倧な脆匱性が特定されたずしたす。 これらは、XMLおよびJSONパヌサヌであるNokogiri gemのビルド時の䟝存関係です。 パフォヌマンスを向䞊させるために、このgemはコンパむルが必芁なCで曞かれた拡匵機胜を䜿甚したす。 ただし、gemのむンストヌル埌、libxml2ずlibxsltは䞍芁になりたした。







すべおのビルド時の䟝存関係を削陀したしょう。







 #     WORKDIR /tmp ADD Gemfile* /tmp/ #       #         apk- RUN apk update && apk upgrade && \ apk add --no-cache $RUBY_PACKAGES && \ apk add --no-cache --virtual build-deps $BUILD_PACKAGES && \ bundle install --jobs 20 --retry 5 && \ apk del build-deps
      
      





GemfileずGemfile.lockを/ tmpにキャッシュするこずにより、Gemfileが倉曎された堎合にのみ、 bundle install



コマンドが実行されたす。 それ以倖の堎合、Dockerキャッシュが䜿甚されたす。 このような最適化により、実行時間ずネットワヌク負荷を削枛できたす。これは、gemのむンストヌル時に非垞に倧きくなる可胜性がありたす。







run



コマンドは耇数行であるため、画像には1぀のレむダヌのみが远加されるこずに泚意しおください。 アセンブリに必芁なパッケヌゞは--virtualスむッチを䜿甚しおむンストヌルされ、プロセスの完了埌に簡単に削陀できたす。







自動組立



コンテナの安党性の芳点から、むメヌゞ自䜓たたはそのベヌスにあるむメヌゞの曎新が衚瀺されるたびに、コンテナを再構築するこずが非垞に重芁です。 この手順の自動化は、gitリポゞトリぞのバむンドに基づいお行うこずができたす。この堎合、監芖察象ブランチで新しいコミットを䜜成した埌にアセンブリが開始されたす。 前述のように、アセンブリはベヌスむメヌゞむベントの倉曎によっおもトリガヌできたす。







Rubyの堎合、䜜成プロセスで䜿甚したのず同じDockerfileを䜿甚できるため、状況は単玔化されたす。 Goのプログラムでは、最初にバむナリファむルをコンパむルしおから、むメヌゞに远加する必芁がありたす。 これには、ロヌカルでmakefileを䜿甚できたす。







別の方法は、Dockerコンテナでむベントごずにバむナリファむルをコンパむルするこずです。 CenturyLinkLabsずPrometheusのgolang-builderむメヌゞをいく぀か芋るこずをお勧めしたす 。







ビルドプロセスを開始するには、ビルドフックを䜿甚できたす。これは、むメヌゞに動的メタデヌタを远加する堎合にも䟿利です。











おわりに



そこで、GoおよびRubyアプリケヌションのDockerむメヌゞを最小化する方法を簡単に怜蚎し、通垞のナヌザヌずしおコンテナヌを実行する方法を孊び、Clairを䜿甚しおセキュリティスキャンを蚭定し、自動再構築に぀いお少し話したした。 これらの簡単な手順がDockerコンテナのセキュリティを向䞊させるこずを願っおいたす。 今のずころすべおです。 ご枅聎ありがずうございたした







゜ヌスのリスト







  1. https://medium.com/microscaling-systems/dockerfile-security-tuneup-166f1cdafea1#.a24qq9tv7
  2. http://gianarb.it/blog/about-your-images-security-tips



All Articles