備忘録

頭の整理のために書いています

コンテナの動作環境をセキュアにするためのtips

  • ユーザーを設定する

rootユーザーを使ってはいけません。笑

Dockerfileで非特権ユーザーを作成しましょう。

RUN groupadd -r user_grp && useradd -r -g user_grp user
USER user

こうすることで、user_grpというグループと、それに属するuserという新しいユーザーが作成できます。

ソフトウェアのインストールでrootユーザーが必要な場合がありますので、USERコマンドのタイミングには気をつけて下さいまし。

※もちろん、エントリーポイントのシェルで切り替えるのもありです。

簡易的には

RUN useradd hoge
USER hoge
  • 不要なバイナリを削除する

setuidあるいは、setgidされたバイナリは、アプリケーションの実行に不要な場合があります。
そういうバイナリは削除して、コンテナ から"牙"を抜いておくことで、権限昇格攻撃からアプリを守ることができます。
イメージ内のそういったバイナリのリストは、以下のコマンドで確認できます。

$ find / -perm +6000 -type f -exec ls -id {} \ ; 2> /dev/null

chmod a-s としてsuidビットをオフにすればいいです。
以下は、Debianの例です。

FROM debian:wheezy

RUN find / -perm +6000 -type f -exec chmod a-s {} \ ; || true
  • CPUを制限する

攻撃が特定のコンテナ を乗っ取り、CPUの制限をしていなかった場合、相対的に他のコンテナをCPUリソース不足に陥れて、DoS攻撃が実現できることになります。
Dockerでは、CPUの割り当ては1024をデフォルト値とする相対的な重みで決定されます。
よって、デフォルトでは全てのコンテナが等しくCPUを割り当てられることになります。
runコマンドにショートオプション:-cを渡すことで相対値を指定できます。

※詳しくは、
Docker run リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

  • メモリを制限する

メモリを制限することで、DoS攻撃や、ホストのメモリを消費するようなメモリリークの可能性を持つアプリに対する対策を立てることができます。-mおよび、--memory-swapオプションをrunコマンドに渡すことで、コンテナ が使用できるメモリの量とスワップメモリの量を制限することができます。

攻撃者がファイルに書き込みできないようにすることで防げる攻撃があり、概して、そうすることで攻撃者の行動は難しくなります。

Docker1.5から、--read-onlyオプションをrunコマンドに渡して、コンテナ内のファイルシステムを完全にROにできるようになりました。
ボリュームについては:roを渡すことで実現できます。

$ docker run --read-only alpine
$ docker run -v `pwd`:/hoge:ro alpine
  • Docker Bench for Security

こちらは長くなりそうなので、別チケットで書きます。笑

  • 機密情報の扱い(例えば、APIやDBの認証情報など)

こちらみなさんどうしてますかね。。笑

環境変数を利用する場合と、外部から取得する場合とがありますが、
やっぱり現時点ではマネージドサービスに任せるのがいいように思います。

まとまってきたら、改めて記載します。。笑