使用如下系统(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启用了SUSE的安全功能,目录权限除了一般的DAC访问控制外,还启动了MAC访问控制。DAC即一般的ugo+rwx,可以使用chmod,chown,chgrp来改变其文件/目录权限。MAC为在DAC之上的访问控制,即如果访问权限没有通过DAC检查,则直接访问失败;否则继续MAC访问权限检查

查看原始容器内挂载的目录/home的MAC如下,/home的type与容器不匹配,导致MAC检查失败,查看本地文件策略如下:

[root@localhost overlay2]# ls -Z /home/
drwxr-xr-x. root root unconfined_u:object_r:user_home_dir_t:s0 centosDir
drwx------. charlie charlie unconfined_u:object_r:user_home_dir_t:s0 charlie

使用docker inspect centos查看容器的文件策略,如下,可以看到容器需要的挂载类型为svirt_sandbox_file_t,进程运行域为svirt_lxc_net_t,因此解决方法为将挂载文件修改为与容器需要的类型一样即可

"MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c161,c568",
"ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c161,c568",

使用chcon -Rt svirt_sandbox_file_t /home/centosDir修改后,MAC变为如下(主要是type字段),这样就可以正常访问了:

[root@cfd98c17be4b /]# 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:container_file_t:s0 home

MAC了解

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

[root@localhost 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

只要SELinux的工作模式是Enforcing,根据SELinux所选择的策略结果集,给所有文件和进程都打上安全标签,即:安全上下文(security context)。这一行为是在将SELinux的模式由disabled模式更改为enforcing模式后的第一次启动时完成的.

不同的进程只在自己所属的域内运行,运行在域中的进程只对授权的类型具有读写权限,强制访问控制的标准是基于程序的域类型而不是基于用户的域类型

默认情况下,Linux用户是非限制的,对于非限制的进程(非限制的用户运行在 unconfined_t 域中), SELinux 的策略规则仍然适用,然而有关允许进程运行在非限制域的规则几乎允许所有的访问。此时,相当于 SELinux 不起作用

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

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,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0

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

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

参考:

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

http://jiayu0x.com/2014/12/24/Linux-authority-and-access-control-2/

http://www.cse.psu.edu/~trj1/cse543-f07/slides/03-PolicyConcepts.pdf

http://www.informit.com/articles/article.aspx?p=606586&seqNum=2

容器挂载volume出现“Permission denied”的问题定位解决的更多相关文章

  1. permission denied (publickey)问题的解决 和 向github添加ssh key

    使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...

  2. permission denied (publickey)问题的解决和向github添加ssh key

    使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...

  3. 【评测机】评测时报错cc1plus: fatal error: /xx/xx/main.cpp: Permission denied compilation terminated.的解决方法

    事情是这亚子发生的,原本建立评测机的时候就出现过这个问题,但莫名其妙就解决了. 报错的文件路径是位于docker内的,所以本质上这个错误是docker内的没有权限执行相关文件. 原因是centos7中 ...

  4. /tmp目录下执行脚本失败提示Permission denied

    Linux上执行Shell脚本运行失败提示Permission denied一个问题,挺好的问题,切中了知识盲点. 问题现象 Shell脚本在/tmp目录下,执行./test.sh运行失败,提示Per ...

  5. 【docker】python: can't open file 'helloworld.py': [Errno 13] Permission denied

    运行容器提示权限问题 docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld. ...

  6. [转帖]Linux /tmp目录下执行脚本失败提示Permission denied

    Linux /tmp目录下执行脚本失败提示Permission denied https://www.cnblogs.com/linyfeng/p/11087655.html 国产化的环境上 就有一个 ...

  7. CREATE DATABASE permission denied in database 'master'.

    EF Code first 建立数据库时报这个错误 CREATE DATABASE permission denied in database 'master'. 解决方法: 打开 Sql Serve ...

  8. Ubuntu 14.04.4 下 scp 远程拷贝提示:Permission denied, please try again. 的解决办法

    我在 s0 主机上远程拷贝 /etc/hosts 文件到 s1 主机上,出现下面的错误提示: qiao@s0:~$ scp /etc/hosts root@s2:/etc/root@s2's pass ...

  9. Ubuntu SSH root 登录 Permission denied 错误

    问题: $ ssh root@40.125.21.75 root@40.125.21.75's password: Permission denied, please try again. 解决方式, ...

随机推荐

  1. (线段树模板)A Simple Problem with Integers --POJ--3468

    链接: http://poj.org/problem?id=3468 代码: #include<stdio.h> #include<algorithm> #include< ...

  2. Codeforces807 A. Is it rated? 2017-05-08 23:03 177人阅读 评论(0) 收藏

    A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. KMP回顾学习

    记住这张图,getnext就是对一个已知的待匹配的串进行分析,nex[i]表示当a[i]匹配失败后我能跳到哪里,继续尝试匹配,而不是每一次失败都从头再来,先来看看代码 const int maxn = ...

  4. A SQL to insert continuous values

    I need a table to store all the working days. I dont like loop, so I tried sql. The following is the ...

  5. NLayerAppV3-Infrastructure(基础结构层)的Data部分和Application(应用层)

    回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目. NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的:它包含了 ...

  6. MS SQL 分页存储过程

    最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...

  7. 【BZOJ3238】[AHOI2013]差异

    [BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...

  8. SFML从入门到放弃(3) 视角和碰撞检测

    SFML从入门到放弃(3) 视角和碰撞检测 视角 window.draw();所画出的对象是在世界坐标的绝对位置. 视角可以选定在窗口中显示世界坐标下的的哪一个区域. sf::View init_vi ...

  9. umeng推送, 生产环境deviceToken失效可能原因

    1 在系统升级之后会造成app的deviceToken重置(一定). 2 在app卸载之后可能会造成app的deviceToken重置. 3 deviceToken重置使用umeng推送时会因为dev ...

  10. UIVisualEffectView(高斯模糊效果)

    ///高斯模糊. UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; tempView. ...