容器挂载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启用了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”的问题定位解决的更多相关文章
- permission denied (publickey)问题的解决 和 向github添加ssh key
使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...
- permission denied (publickey)问题的解决和向github添加ssh key
使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...
- 【评测机】评测时报错cc1plus: fatal error: /xx/xx/main.cpp: Permission denied compilation terminated.的解决方法
事情是这亚子发生的,原本建立评测机的时候就出现过这个问题,但莫名其妙就解决了. 报错的文件路径是位于docker内的,所以本质上这个错误是docker内的没有权限执行相关文件. 原因是centos7中 ...
- /tmp目录下执行脚本失败提示Permission denied
Linux上执行Shell脚本运行失败提示Permission denied一个问题,挺好的问题,切中了知识盲点. 问题现象 Shell脚本在/tmp目录下,执行./test.sh运行失败,提示Per ...
- 【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. ...
- [转帖]Linux /tmp目录下执行脚本失败提示Permission denied
Linux /tmp目录下执行脚本失败提示Permission denied https://www.cnblogs.com/linyfeng/p/11087655.html 国产化的环境上 就有一个 ...
- CREATE DATABASE permission denied in database 'master'.
EF Code first 建立数据库时报这个错误 CREATE DATABASE permission denied in database 'master'. 解决方法: 打开 Sql Serve ...
- 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 ...
- Ubuntu SSH root 登录 Permission denied 错误
问题: $ ssh root@40.125.21.75 root@40.125.21.75's password: Permission denied, please try again. 解决方式, ...
随机推荐
- 3D indoor map positioning with a smartphone image
menu 1. 基于Tango的三维建模技术(SLAM)(视觉SLAM,RGBD单目深度摄像机+罗盘仪)导出或不导出->Android 三维游戏开发技术(普通Android手机) 2. 基于An ...
- sublime text 插件 -- 获取文件名到剪贴板
日常开发使用 sublime text 有好长一段时间了,有时候想拷贝当前正在编辑的文件名时发现没有很快捷的方法,一般都是先点击右键菜单栏中的 Reveal in Side Bar 对文件进行定位(在 ...
- git archive命令详解
git archive可以将加了tag的某个版本打包提取出来,例如: git archive -v --format= > v0..zip --format表示打包的格式,如zip,-v表示对应 ...
- Microsoft Sql Server 2016安装在CentOS7下
安装过程 如何安装直接参考这个文章:安装sql server 整个安装过程非常简单. 上面的文档里是通过 sudo 命令,用root身份来执行,不过这里为了简单,就用root账号来安装的. (1)下载 ...
- CSS3 & 页面布局
相关链接 视频链接: CSS3 & 页面布局 CSS3与页面布局学习总结(一) CSS3与页面布局学习总结(二) CSS3与页面布局学习总结(三) CSS3与页面布局学习总结(四) CSS3与 ...
- ASP.NET中数据绑定表达式
今天谈下.NET中的数据绑定表达式.数据绑定表达式必须包含在<%#和%>字符之间.格式如下: <tagprefix:tagname property='<%# data-bin ...
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...
- Lucene.net 全文检索文件
using Lucene.Net.Analysis; using Lucene.Net.Analysis.Tokenattributes; using Lucene.Net.Documents; us ...
- Algorithm 用各种语言写出n!的算法
写出n!的算法 C# 递归方式: class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数!&q ...
- Python 将字典的元素按照键或者值的大小进行排序
在开发的过程中有时遇到这样的需求,一个字典里保存了一份完整的数据,其中键是一个id,值是时间,需要获取最新的5条数据,处理方式如下: 假设字典数据的变量名为my_dict data_list = so ...