dockle の警告 `CIS-DI-0008` をどのように処理すべきか考えた

dockle って?

コンテナイメージのセキュリティチェックツールです。ビルドしたImageを通すと、セキュリティ的に問題がある部分を指摘してくれます

github.com

警告 CIS-DI-0008 って?

これですね

CIS-DI-0008: Remove setuid and setgid permissions in the images

github.com

この警告が出てきた! という記事は多いのですが、それをどういう風に処理した。という記事がなかったので書いてみました

setuidsetgid って?

linuxにおける特殊なアクセス権限で、

  • setuid: ユーザが 所有者の権限 でそのファイルを実行できる設定
  • setgid: ユーザが 所有者グループの権限 でそのファイルを実行できる設定

なので、rootユーザが所有者や所有者グループのままの実行ファイルがあると、それをroot権限で実行できてしまうようです

dockleで警告を受けた、実行ファイルってどれ?

base Imageが debian-slim の時に、これらの実行ファイルについて警告が出ました

/bin/umount
/usr/bin/expiry
/bin/su
/usr/bin/wall
/usr/bin/gpasswd
/bin/mount
/usr/bin/passwd
/sbin/unix_chkpwd
/usr/bin/chage
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/newgrp

それぞれどんな実行ファイルなの?

調べたらこんな感じでした

  • /bin/umount: ファイルシステムのマウントを解除する
  • /usr/bin/expiry: パスワードの有効期限ポリシーを定義する
  • /bin/su: ユーザ切り替えコマンド
  • /usr/bin/wall: ログインしている端末に一斉に通知を送る(昔共有マシンを落とす時とかによく使いましたね...
  • /usr/bin/gpasswd: ユーザが所属するグループを管理する
  • /bin/mount: ファイルシステムをマウントする
  • /usr/bin/passwd: パスワードを管理する
  • /sbin/unix_chkpwd: パスワードをチェックする
  • /usr/bin/chage: パスワードの有効期限を設定する
  • /usr/bin/chsh: ログインシェルを変更する
  • /usr/bin/chfn: ユーザ情報を管理する
  • /usr/bin/newgrp: 新しいグループにログインする

それで、どうしたの?

上記実行ファイルすべての setuid、setgid を外すことにしました

# 特殊なアクセス権、suid, sgid を排除
# 想定外のアクセス権でコマンドを実行されることを防ぐ
#
# see: https://github.com/goodwithtech/dockle/blob/master/CHECKPOINT.md#CIS-DI-0008
RUN \
  chmod u-s /bin/umount && \
  chmod g-s /usr/bin/expiry && \
  chmod u-s /bin/su && \
  chmod g-s /usr/bin/wall && \
  chmod u-s /usr/bin/gpasswd && \
  chmod u-s /bin/mount && \
  chmod u-s /usr/bin/passwd && \
  chmod g-s /sbin/unix_chkpwd && \
  chmod g-s /usr/bin/chage && \
  chmod u-s /usr/bin/chsh && \
  chmod u-s /usr/bin/chfn && \
  chmod u-s /usr/bin/newgrp

そんなことしちゃって大丈夫なの?

それぞれ、Dockerコンテナを運用する限り、普通は使わないコマンドだと思いました

それに、放置して脆弱性が発生した場合に面倒だと思い、最初から上位権限で実行できないようにしたほうが早いなと思ったので

(まだ本番運用はしていないけど多分大丈夫なはず...)

個人的なdockleの運用方針

  • warnも全部潰す(下手に例外を作るとそのほうが最終的に面倒くさくなるので)
  • 警告については、それぞれ公式のgithubに対応方法が書かれているのでそれに従う(めっちゃ親切ですね)
  • (まだやれていないけど)CIに仕込んで、毎回実行して失敗した場合には修正するようにしたい

参考

👇 setuidsetgid の解説ページ

linuxg.net

そんなかんじです