網站首頁 編程語言 正文
本系列之前的文章中使用root用戶安裝docker,并在root用戶下啟動docker守護進程,容器也是在root用戶下啟動運行的。那么問題就出現了:我們的容器服務進程都是root用戶權限,使用數據卷的方式想掛載哪個目錄就掛載那個目錄;想修改掛載目錄下的哪個文件,就修改哪個文件。 那么我們本文帶大家使用非root用戶來啟動docker容器,是否就安全了呢? 我們先不說答案,讓我們一起來通過實驗,來解答我們的疑問。
一、使用非root用戶啟動docker容器
為了提升安全性,我們考慮一種方案:使用非root用戶啟動docker容器。為此我們做一個實驗,首先我們創建一個普通用戶zimug,執行命令 useradd zimug;。并且將這個用戶加入docker用戶組,因為docker用戶組的用戶才能啟動docker容器。
#zimug加入docker用戶組
usermod -G docker zimug;
#在zimug用戶下啟動容器
docker run -d --name nginx-zimug -p 80:80 nginx;
以上的操作證明使用非root用戶啟動docker容器是可行的,但是安全性有沒有得到提升,我們還需要驗證。
二、驗證非root用戶啟動容器的安全性
回到docker服務所在的宿主機服務器上,使用 root 賬號將"zimug test"這樣一個字符串寫入測試文件 test.txt
mkdir -p /root/test;
echo "zimug test" > /root/test/test.txt;
然后使用su命令切換到zimug這個用戶,使用cat命令查看文件提示權限不夠無法查看文件,到此一切正常。
[root]# su - zimug;
[zimug]$ cat /root/test/test.txt;
cat: /root/test/test.txt: 權限不夠
然后我們在zimug用戶下啟動一個容器nginx-zimug1,需要記住非常重要的一點是:這個容器我們是在非root用戶zimug下啟動的。
[zimug]$ docker run -d --name nginx-zimug1 \
-p 81:80 \
-v /root/test/test.txt:/root/test/test.txt nginx;
然后我們進入容器內部修改/root/test/test.txt這個文件,向文件內echo寫入一個字符串:“zimug test update file in container”,表示這個文件我們在容器內部進行修改。
# 進入容器內部
[zimug]$ docker exec -it nginx-zimug1 /bin/bash
# 進入容器后使用下面的命令修改文件,然后exit退出
echo "zimug test update file in container" > /root/test/test.txt;
回到宿主機上使用 root 賬號確認 /root/test/test.txt 文件內容。發生了我們不愿見到的結果:普通用戶zimug啟動一個容器,可以隨意映射root用戶文件,并且在容器內修改這個文件,root用戶的文件內容也隨之更改。
# cat /root/test/test.txt
zimug test update file in container
之所以出現這個問題,有兩個原因:一是docker容器本質是宿主機服務器上的一個進程,不做特殊處理的情況下,容器里的root用戶和宿主機上的root用戶實際上是同一個用戶;二是docker存在一個守護進程,即使用systemctl start docker啟動的那個服務進程。因為我們安裝docker是root用戶安裝的,該守護進程也是用root用戶啟動的,即使容器是非root用戶運行的也存在較大的安全問題,是docker安全性問題的重要風險點。
解決這個問題有兩個通用方法:就是容器用戶與宿主機用戶的id段映射;二是使用非root用戶搭建docker并啟動守護進程。
原文鏈接:https://blog.csdn.net/hanxiaotongtong/article/details/124289077
相關推薦
- 2022-05-01 C語言main()函數的參數問題詳解_C 語言
- 2023-01-28 GoLang分布式鎖與snowflake雪花算法_Golang
- 2022-07-25 C/C++實現線性單鏈表的示例代碼_C 語言
- 2022-06-02 Python利用zhdate模塊實現農歷日期處理_python
- 2022-09-08 pytorch實現加載保存查看checkpoint文件_python
- 2022-12-15 C++?Boost?Thread線程使用示例詳解_C 語言
- 2022-10-21 IDEA集成Docker實現一鍵部署的詳細過程_docker
- 2023-06-13 Python的加密模塊之hashlib?與?base64詳解及常用加密方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支