Dockerセキュリティ:
今すぐ役に立つテクニックから,次世代技術まで [Japan Container Days発表レポート]

Akihiro Suda
nttlabs
Published in
7 min readDec 6, 2018

NTTの須田です.Moby (≒Docker),BuildKitcontainerdなど,コンテナ関連のオープンソースソフトウェアのメンテナ (開発委員.コミッタとも.)を務めています.また,Docker Meetup Tokyoの企画・運営も行っています.

2018年12月4日から5日にかけて,日本最大のコンテナ技術カンファレンスである,Japan Container Days (JKD)が開催されました.本記事では,須田の発表 「Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで」の一部をかいつまんでご紹介します.発表の全体についてはSlideshareの資料をご覧ください.

https://twitter.com/containerdaysjp/status/1070177534015197184

プライベートリポジトリを用いるイメージビルド

Dockerfileの中から,プライベートなGitリポジトリなどへアクセスする際は注意が必要です. id_rsaなどの鍵ファイルを COPY ( ADD )して RUN git 等を実行し,後で鍵を削除( RUN rm)すればよいだけのように思われるかも知れませんが,このような方法は危険です.鍵のファイルを後で RUN rm しても, COPY 命令に対応するイメージレイヤ中には,鍵ファイルが残るためです.他者が参照可能なレジストリにイメージをpushすると,鍵ファイルを奪取される恐れがあります.

スライド7

Docker 18.09からは,鍵を用いて安全にイメージをビルドする手法として, docker build --secret 及び docker build --ssh が用意されています.これらのコマンドを利用すると,鍵をイメージに残さずに,安全にイメージをビルドすることが出来ます.(Docker 18.09の新機能については,須田の前回の記事もご覧ください)

スライド9
スライド11

Dockerソケットの保護

dockerコマンドは,リモートのDockerホストにREST APIを用いて接続することが出来ます.Dockerホストが攻撃者に乗っ取られることを防ぐには,TLSを有効化したり,ポートへアクセス可能なIPアドレスを絞ったりする必要があります.しかしながら,こうした設定は容易ではありません.実際,Dockerホストの設定不備を突いて仮想通貨を発掘するマルウェアが確認されています.

Docker 18.09では,須田が2017年より提案してきた,SSHを用いたリモートDockerホスト接続機能採用されています.SSHは,リモートのLinuxホストに接続する最も一般的な方法であり,TLSに比べて簡単に設定することが出来ます.
(須田の前回の記事もご覧ください)

スライド25

SSHを用いたDockerホスト接続機能は,奇しくもJapan Container Daysと同時に開催されたDockerCon EUでも,キーノートにて紹介されたようです.(動画の0:57:16あたり)

非rootユーザでのDockerデーモンの実行

Dockerは,NamespacesやCapabilitiesなどを用いて,アプリケーションをホストや他のアプリケーションから隔離します.Dockerを用いることにより,アプリケーションに脆弱性があっても,その実際の影響範囲を限定することが出来ます.

しかしながら,Docker自体や関連コンポーネントには,過去にさまざまな脆弱性が見つかっています.Dockerデーモンはホストのroot権限で動作するため,Dockerデーモンの脆弱性を攻撃者につかれると,ホストのroot権限を奪取される恐れがあります.

スライド37
スライド38

次期バージョンのDockerでは,非rootユーザにてDockerデーモン及び関連コンポーネントを実行することが可能となる見込み(須田の提案)です.root権限での動作を避けることにより,Dockerデーモン及び関連コンポーネントに脆弱性があったとしても,その影響を軽減することが出来ます.

非rootユーザでのDockerデーモン実行をいち早く試すには,Usernetesを使うと便利です.Usernetesには,非rootユーザでの実行を可能にするパッチが適用された,Docker(およびKubernetes)のバイナリが含まれています.Usernetesは,アーカイブを非rootユーザのホームディレクトリ以下に展開するだけで,簡単にインストールできます.

代替ランタイム

コンテナの機能自体は,DockerではなくruncなどのOCI (Open Container Initiative)ランタイムに実装されています. OCIランタイムは,Dockerがデフォルトで用いるruncの他,Kata ContainersgVisorNabla Containersなどが存在します.これらの代替ランタイムを用いると,コンテナ間のアイソレーションを更に強めることが出来ます.ただし,性能面や互換性面での欠点が存在することに注意が必要です.

スライド51

また,2018年11月27日には,AWSのLambdaFargate向けに開発された軽量VMであるFirecrackerがオープンソース化されました.今のところFirecrackerはDockerのランタイムとしては利用出来ませんが,今後,containerdプラグインを通じて可能になるものと見込まれます.また,FirecrackerはKata Containersでも採用が予定されており,今後更なる注目を集めるものと思われます.

おわりに

私たちNTTは,オープンソースコミュニティで共に活動する仲間を募集しています.ぜひ弊社 ソフトウェアイノベーションセンタ紹介ページ及び,採用情報ページをご覧ください.

--

--