Docker用户权限说明

时间:2015-12-16 15:00:55

标签: wordpress docker docker-compose

我有一个由这个docker-compose命令创建的LEMP堆栈:

cadvisor:
  image: google/cadvisor:latest
  container_name: lemp_cadvisor
  ports:
    - "8082:8080"
  volumes:
    - "/:/rootfs:ro"
    - "/var/run:/var/run:rw"
    - "/sys:/sys:ro"
    - "/var/lib/docker/:/var/lib/docker:ro"
ssh:
  build: ./ssh
  container_name: lemp_ssh
  ports:
    - "2222:22"
  volumes:
    - /home/core/www/:/var/www/:rw
    - /home/core/.ssh/:/root/.ssh/:ro
phpmyadmin:
  build: ./phpmyadmin
  container_name: lemp_phpmyadmin
  links:
    - ssh
  volumes:
    - /var/www/phpmyadmin
    - ./phpmyadmin/var/www/phpmyadmin/config.inc.php:/var/www/phpmyadmin/config.inc.php:ro
mariadb:
  build: ./mariadb
  container_name: lemp_mariadb
  env_file: ./mariadb/mariadb.env
  links:
    - ssh
  volumes:
    - /var/run/mysqld
    - /home/core/mysql/:/var/lib/mysql/:rw
    - ./mariadb/etc/mysql/my.cnf:/etc/mysql/my.cnf:ro
php:
  build: ./php
  container_name: lemp_php
  links:
    - ssh
  volumes:
    - /var/run/php-fpm
    - ./php/usr/local/php7/etc/php-fpm.conf:/usr/local/php7/etc/php-fpm.conf:ro
    - ./php/usr/local/php7/etc/php.ini:/usr/local/php7/etc/php.ini:ro
    - ./php/usr/local/php7/etc/php-fpm.d/www.conf:/usr/local/php7/etc/php-fpm.d/www.conf:ro
  volumes_from:
    - ssh
    - mariadb
    - phpmyadmin
nginx:
  build: ./nginx
  container_name: lemp_nginx
  links:
    - ssh
  ports:
    - "8080:80"
    - "8081:443"
  volumes:
    - ./nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    - ./nginx/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf:ro
    - ./nginx/etc/nginx/conf.d/php.conf:/etc/nginx/conf.d/php.conf:ro
    - ./nginx/etc/nginx/conf.d/cert/:/etc/nginx/conf.d/cert/:ro
  volumes_from:
    - php

我将Wordpress文件存储在/home/core/www/my-wordpress-install-dir文件夹中的主机上。

从CoreOS主机SSH会话中查看文件,文件夹的权限如下:

core@core-01 ~/www/my-wordpress-install-dir $ ls -al
total 272
drwxrwxrwx  5 core core  4096 Dec 16 14:36 .
drwxr-xr-x  4 core core  4096 Dec 13 23:54 ..
-rw-r--r--  1 core core   418 Dec 13 23:09 index.php
-rw-r--r--  1 core core 19930 Dec 13 23:09 license.txt
-rw-r--r--  1 core core  7358 Dec 13 23:09 readme.html
-rw-r--r--  1 core core  5035 Dec 13 23:09 wp-activate.php
drwxr-xr-x  9 core core  4096 Dec 13 23:09 wp-admin
-rw-r--r--  1 core core   271 Dec 13 23:09 wp-blog-header.php
-rw-r--r--  1 core core  1369 Dec 13 23:09 wp-comments-post.php
-rw-r--r--  1 core core  2764 Dec 13 23:09 wp-config-sample.php
-rw-rw-rw-  1   33   33  3216 Dec 16 14:36 wp-config.php
drwxr-xr-x  4 core core  4096 Dec 13 23:09 wp-content
-rw-r--r--  1 core core  3286 Dec 13 23:09 wp-cron.php
drwxr-xr-x 16 core core  4096 Dec 13 23:09 wp-includes
-rw-r--r--  1 core core  2380 Dec 13 23:09 wp-links-opml.php
-rw-r--r--  1 core core  3316 Dec 13 23:09 wp-load.php
-rw-r--r--  1 core core 33710 Dec 13 23:09 wp-login.php
-rw-r--r--  1 core core  7887 Dec 13 23:09 wp-mail.php
-rw-r--r--  1 core core 13021 Dec 13 23:09 wp-settings.php
-rw-r--r--  1 core core 28594 Dec 13 23:09 wp-signup.php
-rw-r--r--  1 core core  4035 Dec 13 23:09 wp-trackback.php
-rw-r--r--  1 core core  3061 Dec 13 23:09 xmlrpc.php

但是,如果我将docker exec放入lemp_ssh容器,则权限为:

root@15a6b53835e4:/var/www/my-wordpress-install-dir# ls -al
total 272
drwxrwxrwx.  5      500      500  4096 Dec 16 14:36 .
drwxr-xr-x.  4      500      500  4096 Dec 13 23:54 ..
-rw-r--r--.  1      500      500   418 Dec 13 23:09 index.php
-rw-r--r--.  1      500      500 19930 Dec 13 23:09 license.txt
-rw-r--r--.  1      500      500  7358 Dec 13 23:09 readme.html
-rw-r--r--.  1      500      500  5035 Dec 13 23:09 wp-activate.php
drwxr-xr-x.  9      500      500  4096 Dec 13 23:09 wp-admin
-rw-r--r--.  1      500      500   271 Dec 13 23:09 wp-blog-header.php
-rw-r--r--.  1      500      500  1369 Dec 13 23:09 wp-comments-post.php
-rw-r--r--.  1      500      500  2764 Dec 13 23:09 wp-config-sample.php
-rw-rw-rw-.  1 www-data www-data  3216 Dec 16 14:36 wp-config.php
drwxr-xr-x.  4      500      500  4096 Dec 13 23:09 wp-content
-rw-r--r--.  1      500      500  3286 Dec 13 23:09 wp-cron.php
drwxr-xr-x. 16      500      500  4096 Dec 13 23:09 wp-includes
-rw-r--r--.  1      500      500  2380 Dec 13 23:09 wp-links-opml.php
-rw-r--r--.  1      500      500  3316 Dec 13 23:09 wp-load.php
-rw-r--r--.  1      500      500 33710 Dec 13 23:09 wp-login.php
-rw-r--r--.  1      500      500  7887 Dec 13 23:09 wp-mail.php
-rw-r--r--.  1      500      500 13021 Dec 13 23:09 wp-settings.php
-rw-r--r--.  1      500      500 28594 Dec 13 23:09 wp-signup.php
-rw-r--r--.  1      500      500  4035 Dec 13 23:09 wp-trackback.php
-rw-r--r--.  1      500      500  3061 Dec 13 23:09 xmlrpc.php

经过一些更改后,我在主机上复制了wp-config.php。我的这个权限问题,这可能是我的SSH2会话无法在Wordpress管理员中上传文件的原因。

我将此添加到我的wp-config.php

define('FTP_PUBKEY','/root/.ssh/wp_rsa.pub');
define('FTP_PRIKEY','/root/.ssh/wp_rsa');
define('FTP_USER','www-data');
define('FTP_PASS','');
define('FTP_HOST','10.0.2.2:22');

如果我在主机和容器中查看文件权限,请解释为什么文件权限如下。谢谢!

2 个答案:

答案 0 :(得分:2)

我想我解决了。谢谢@dnephin的解释!

当您将整个Wordpress从主机共享到具有卷的容器时,我对此类Wordpress安装存在权限问题。

在我的堆栈中,我有一个基本图像,这是我的基本修改的debian,其他所有图像都是从这个图像构建的。

在基本图像中,我有这个部分:

### Start of Nginx WEBSERVER setup
RUN mkdir -p /var/www
# Modify www-data user and set UID, GID to 500
# https://muffinresearch.co.uk/linux-changing-uids-and-gids-for-user/
RUN groupmod -g 500 www-data \
    && usermod -u 500 www-data \
    #&& `find / -user 33 -exec chown -h 500 {} \;` \
    #&& `find / -group 33 -exec chgrp -h 500 {} \;` \
    && usermod -g 500 www-data \
    && chown -R www-data:www-data /var/www \
    && chmod g+s /var/www
### End of Nginx WEBSERVER setup

www-data不是由php或nginx安装创建的。它是Debian中默认定义的用户/组,也许是其他发行版。一些PHP,Nginx安装建议在配置文件中使用此用户。

如果您的主机用户的UID / GID是500,那么此脚本会将www-data用户的UID / GID从33更改为500.这样,如果您从主机共享任何内容,Docker会认为这些文件和文件夹属于www-data用户。

在PHP-FPM设置文件中,还将用户和组设置为www-data

在你的nginx Dockerfile中,你还必须设置:

# Allow Nginx to access /var/run/php-fpm/php-fpm.sock
RUN usermod -aG www-data nginx

这种方式nginx用户可以访问www-data拥有的文件(您可以在nginx配置文件中定义nginx的用户名)。

在这次黑客攻击之后,我的Wordpress安装没有任何权限问题。所有文件都驻留在主机上+更新Wordpress完美无瑕。

我的LEMP筹码:https://github.com/DJviolin/LEMP

答案 1 :(得分:0)

权限(第一列)对我来说看起来是一样的(除了最后的额外点,这很可能只是主机和容器之间的ls二进制文件的差异)。

区别在于文件的所有者和组。所有者和组存储为ID,并在/etc/group/etc/passwd中查找名称。如果系统无法在这些文件中找到id的名称,则使用该编号。

在您的情况下,主机具有UID / GID 500的名称(core),但它没有UID / GID 33的名称。在容器中它具有相反的名称。这是因为我提到的文件不在主机和容器之间共享。