選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
3 分鐘閱讀時間 (521 個字)

每日小知識 #14 - Container 資安(5)

shutterstock_198004562

從今天開始的資安處理,都會是針對 container 本身在部署時會需要注意的重點,再請各位多留意。

  • 設定一個使用者
    • 這邊是在說 Dockerfile 裡面最後一定要設定一個 User,否則預設會是 root
    • 一種方式是透過 RUN 設定如下:
      RUN groupadd -r user_grp && useradd -r -g user_grp user USER user
    • 要特別留意的是如果是用方法一,要注意一下擺放的順序,因為前面可能有一些需要 root 權限才能執行的指令像是 yum install 或是 apt-get … 等。
    • 除了透過 USER,另一種方式就是透過 entrypoint 所定義的 shell,例如 redis 官方的 shell 就如下定義:
      set -e if [ "$1" = 'redis-server' ]; then chown -R redis . exec gosu redis "$@" fi
    • 這段腳本有幾個重點:
      • 如果 Dockerfile 裡用了 USER,那這段就會失效了,要多加留意
      • exec gosu redis “$@” 的意思是以 redis 的身份啟動 redis
      • exec 的目的是為了讓目前的 shell 以 redis 取代,所以 container 執行時的 PID 會是 1,而且可以正確的收到任何指令
  • 限制 Container 的網路通訊
    • container 應該只開放必要的 port,而且這些 port 只應該開放給需要跟它連線的 container
    • 預設所有的 container 都是可以互相以 ip + 任何 port 的方式通訊的,在 production 環境這並不夠安全
    • 承上,要避免這種情形就要在 docker daemon 的啟動參數中加上 icc: false(就是加在/etc/docker/daemon.json 裡),再重啟 docker(各位可以自己做個小試驗
    • 但如果設定 icc=false,真的需要通訊的 container 該怎麼辦?答案很簡單,加入同一個 bridge network 就可以了
  • 移除 binary 的 setuid/setuid
    • 不知道 suid/guid 是什麼的請參考鳥哥的網站
    • 有很大的機會你在 container 內是用不到這些 binary 的
    • 怎麼找到它們呢?可以在 container 透過以下指令:
    find / -perm +6000 -type f -exec ls -ld {} \; 2> /dev/null
    • 如果什麼都沒有,那恭禧你,如果有一些檔案是用不到但具有這些權限的話,記得用 chmod a-s 移除。

(To be continued …)

每日小知識 #15 - Container 資安(6)
每日小知識 #13 - Container 資安(4)

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/04, 週六

Captcha 圖像