docker容器以非root用戶啟動應用


  docker容器啟動應用默認的是root用戶,可以使用ps命令來查看。很多的目錄及文件權限是777,這些都是不安全的。

       最近的一項工作就是要以非root用戶啟動docker,並且修改777權限為755.

       在Dockefile中創建指定的用戶xxx和用戶組,然后用su-exec xxx  java ... 來啟動應用,使用ps查看,進程的啟動用戶就是xxx了。

       以非root用戶啟動docker應用的一個問題是,需要提前創建好一些文件夾,並把文件夾的owner和group改為xxx。否則,日志,臨時文件,解壓操作等都會提示沒有權限。

      我的做法是,假如當前目錄是/opt/manager,臨時文件或解壓目錄是/opt/manager/tmp/.../...abc.zip,就在dockfile中創建/opt/manager/tmp,並把文件夾的owner和group改為xxx。

 

      su-exec可以在一個進程中完成切換用戶和執行命令,不用su之后再執行命令。

      https://www.jianshu.com/p/6cde4396da97  這也是用非root的業務用戶來運行應用。記錄一下。

  應用容器化之后,在docker容器啟動時,默認使用的是root用戶執行命令,因此容器中的應用默認都是使用root用戶來運行的,存在很高的安全風險,那么如何能夠使用非root的業務用戶來運行應用呢,下面我將舉一個簡單的例子來說明。該例子是在容器中使用自建的用戶來運行一個簡單的shell腳本,並將腳本輸出日志持久到容器外部。接下來讓我們來看從制作鏡像到容器運行的全過程吧。
  1、構建鏡像:
  我將會使用dockerfile的方式來構建鏡像,基礎鏡像使用ubuntu 14.04(需要先拉取該鏡像,docker pull ubuntu:14.04)。dockerfile內容如下
  [root@host09 test]# cat Dockerfile
  FROM docker.io/ubuntu:14.04
  MAINTAINER hepengfei

  RUN groupadd hpf --創建用戶組
  RUN useradd -d /data -g hpf -m hpf --創建用戶
  RUN su - hpf -c "mkdir -p /data/scripts"
  RUN su - hpf -c "mkdir -p /data/logs"
  WORKDIR /data/scripts
  COPY test.sh /data/scripts/
  RUN chown hpf:hpf test.sh
  RUN chmod 755 test.sh

  ENTRYPOINT su - hpf -c "/data/scripts/test.sh" --使用所創建的用戶來運行腳本
  [root@host09 test]#
  腳本內容如下:
  [root@host09 test]# cat test.sh
  while [ 1 = 1 ]
  do
  echo id >>/data/logs/hpf.log --將日志輸出到文件,啟動容器的時候做持久化
  sleep 1
  done
  [root@host09 test]#
  接下來讓我們來構建鏡像:
  [root@host09 test]# docker build -t hpf:v2 .
  Sending build context to Docker daemon 3.072 kB
  Step 1 : FROM docker.io/ubuntu:14.04
  ---> c69811d4e993
  Step 2 : MAINTAINER hepengfei
  ---> Using cache
  ---> b8401d2eb439
  Step 3 : RUN groupadd hpf
  ---> Using cache
  ---> 2e0d20802c41
  Step 4 : RUN useradd -d /data -g hpf -m hpf
  ---> Using cache
  ---> bac36ee97aba
  Step 5 : RUN su - hpf -c "mkdir -p /data/scripts"
  ---> Using cache
  ---> a92c3f5f8e34
  Step 6 : RUN su - hpf -c "mkdir -p /data/logs"
  ---> Using cache
  ---> 2e8665da7092
  Step 7 : WORKDIR /data/scripts
  ---> Using cache
  ---> 7cf84a5a8aca
  Step 8 : COPY test.sh /data/scripts/
  ---> 7e4c24de2096
  Removing intermediate container f96358d91c35
  Step 9 : RUN chown hpf:hpf test.sh
  ---> Running in fc9ab290c56c
  ---> f38afd1ea62c
  Removing intermediate container fc9ab290c56c
  Step 10 : RUN chmod 755 test.sh
  ---> Running in a35b507a1527
  ---> 5b5223249f4c
  Removing intermediate container a35b507a1527
  Step 11 : ENTRYPOINT su - hpf -c "/data/scripts/test.sh"
  ---> Running in 1ee7cc7fbec7
  ---> 26e7d603dbac
  Removing intermediate container 1ee7cc7fbec7
  Successfully built 26e7d603dbac
  [root@host09 test]#
  查看所構建的鏡像:
  [root@host09 test]# docker images
  REPOSITORY TAG IMAGE ID CREATED SIZE
  hpf v2 26e7d603dbac 42 minutes ago 188.3 MB
  docker.io/ubuntu 14.04 c69811d4e993 3 weeks ago 188 MB
  [root@host09 test]#
  2、啟動容器:
  注意,在啟動容器之前,需要將宿主機上/data/hepf/log目錄的權限,否則容器啟動時,腳本中的日志將沒有權限寫該目錄,我直接將該目錄權限修改成777了。
  [root@host09 test]# chmod 777 /data/hepf/log
  [root@host09 test]# docker run -it -v /data/hepf/log:/data/logs hpf:v2
  現在來查看/data/hepf/log目錄中的日志文件:
  [root@host09 log]# pwd
  /data/hepf/log
  [root@host09 log]# ll
  total 12
  -rw-rw-r-- 1 1000 1000 10800 Sep 7 08:02 hpf.log
  [root@host09 log]# tail -2 hpf.log
  uid=1000(hpf) gid=1000(hpf) groups=1000(hpf)
  uid=1000(hpf) gid=1000(hpf) groups=1000(hpf)
  [root@host09 log]#
  可以看到,該文件的屬主跟容器中創建的hpf用戶是一致的:
  hpf@ba688af3f598:~id uid=1000(hpf) gid=1000(hpf) groups=1000(hpf) hpf@ba688af3f598:~
  如果宿主機上已有其他用戶跟容器中創建用戶的id一樣的話,宿主機上的日志文件屬主就會變成該用戶,但是暫時沒有發現什么問題。
  [root@host09 log]# cat /etc/passwd |grep hpf1
  hpf1:x:1000:1000::/data1:/bin/bash[root@host09 log]# ll
  total 12
  -rw-rw-r-- 1 hpf1 hpf1 11250 Sep 7 08:50 hpf.log
  [root@host09 log]#
  簡單的例子到這里就結束了。

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM