容器挂载volume出现“Permission denied”

 

使用如下系统(centos)运行容器后,在容器内的挂载目录内执行ls命令出现了“Permission denied”的错误

Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

容器运行命令如下,将/home/centosDir挂载到容器容器的/home目录

docker run -v /home/centosDir/:/home -it -d --name=centos 49f7960eb7e4 /bin/bash

出现“Permission denied”的问题,首先怀疑是/home/centosDir的读写权限不够,直接修改为777之后仍然出现“Permission denied”的错误。经过查找解决方法如下,即修改host挂载目录的MAC权限:

chcon -Rt svirt_sandbox_file_t /home/centosDir

centos目录权限除了一般的DAC访问控制外,还启动了MAC访问控制。DAC即一般的rwx,可以使用chmod,chown,chgrp来改变其文件/目录权限。MAC为在DAC之上的访问控制,即如果访问权限没有通过DAC检查,则直接访问失败;否则继续MAC访问权限检查

查看原始容器内挂载的目录/home的MAC如下,/home的type与其他不一致,导致MAC防卫失败:

[[email protected] /]# ls -Z /     
lrwxrwxrwx. root root system_u:object_r:container_file_t:s0:c268,c731 bin -> usr/bin
drwxr-xr-x. root root system_u:object_r:container_file_t:s0:c268,c731 dev
drwxr-xr-x. root root system_u:object_r:container_file_t:s0:c268,c731 etc
drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 home

使用chcon -Rt svirt_sandbox_file_t /home/centosDir修改后,MAC变为如下,这样就可以正常访问了:

[[email protected] /]# ls -Z /
lrwxrwxrwx. root root system_u:object_r:container_file_t:s0:c268,c731 etc
drwxr-xr-x. root root unconfined_u:object_r:container_file_t:s0 home

启用MAC的配置文件在/etc/selinux/config下,可以看到一条配置:SELINUX=enforcing,也可以使用sestatus查看当前状态

[[email protected] selinux]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

使用chcon修改安全上下文,使用restorecon恢复目录或文件默认的安全上下文,使用semanage可以为端口添加访问控制

 

安全上下文有五个元素组成,以冒号分隔

user:role:type:sensitivity:category

?User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程

? Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r

? Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t

? Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0

? Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret,一个对象可以有多个categroy, c0-c1023共1024个分类, Target 策略不使用category

 

参考:

http://blog.51cto.com/zhaotianyu/1817939

https://yq.aliyun.com/articles/486704?spm=5176.10695662.1996646101.searchclickresult.312d10b5HpsmDH

http://cn.linux.vbird.org/linux_basic/0440processcontrol_5.php#mac

相关文章

linux下开机自启: 在/etc/init.d目录下新建文件elasticsear...
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以...
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用...
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一...
设置时区(CentOS 7) 先执行命令timedatectl status|grep &...
vim /etc/sysconfig/network-scripts/ifcfg-eth0 B...