如何设置SELinux策略规则

[SELinuxPolicy]如何设置SELinux策略规则?【说明】AndroidKK4.4版本之后,Google默认启用SELinux,并将SELinux修订异常打印到kernellog或androidlog(L版本)中,对应的关键字为:"avc:denied"或"avc:denied",如日志行:<5>[17.285600].(0)[503:idmap]type=1400audit(1356999072.320:202):avc:denied{create}forpid=503comm="idmap"name="overlays.list"scontext=u:r:zygote:s0tcontext=ubject_r:resource_cache_data_file:s0tclass=file表示idmap进程使用zygote源上下文,当访问/data/resource_cache目录时创建文件时,访问被SELinux拒绝。
[关键字]android,SELinux,avc:denied,audit[解决方案]版本KK,Google只启用SELinux有限制,即只有apply模式用于netd、installd、zygote、vold及其直接复制的子进程,但不适用于zygotefork常规app.L版本,Google完全开放SELinux并且几乎所有进程都使用应用程序模式,这个这有重大影响。
目前,所有SELinuxcheck失败在kernellog或androidlog(版本L之后)中都有相应的“avc:denied”。
”或者“avc:denied”的LOG与之匹配。
另一方面,如果有这个LOG,并不意味着会直接失败。
你还需要确认当时SELinux的模式,是否是强制模式或者宽容模式对应的进程正常访问系统资源是否有必要?如果确认访问是必要且正常的,则应在相应的进程/域中添加新的策略1).简化方法1.1提取所有avcLOG例如adbshel​​l"cat/proc/kmsg|grepavc.txt"">avc_log.txt1.2使用audit2allowtool直接生成Policy。
audit2allow-iavc_log.txt可以自动生成生成的policy1.3.在selinuxpolicy规则中添加对应的policy,对应MTKSolution。
可以在KK:mediatek添加/custom/common/sepolicy,如下L:device/mediatek/common/sepolicyallowzygoteresource_cache_data_file:dirrw_dir_perms;allowzygoteresource_cache_data_file:filecreate_file_perms;===>mediatek/custom/common/sepolicy/zygote.te(KK)===>device/mediatek/common/sepolicy/zygote.te(L)请注意,audit2allow会自动转换LOG作为一种策略,在你不知道真实意图的情况下你的操作可能存在权限放大问题,经常会出现策略无法编译通过的情况。
2)按需确认法这种方法需要工程师了解SELinux和SELinuxPolicyLanguage的原理。
2.1确认哪个进程访问哪个资源以及需要哪些特定的访问权限,阅读?写作?执行?搜索?2.2当前进程策略文件是否已创建?这通常是process.te可执行文件。
如果不存在,且其父进程sourcecontext不需要访问相应的资源,则创建一个新的te文件。
在版本L上,Google要求保持唯一性。
关键安全上下文,如zygote,严禁netd,install。
d、vold和ueventd等关键进程与其他进程共享相同的安全上下文。
2.3创建文件后,在file_contexts中关联其执行文件,关联关联的执行文件。
例如,/system/bin/idmap是/system。
/bin/idmapuject_r:idmap_exec:s02.4填写对应te文件中的策略,如果使用原父进程的te文件,则直接添加。
如果这是一个新文件,则首先:#===。
==============================================#TypeDeclaration#=====================================================typeidmap,domain;typeidmap_exec,exec_type,file_type;#====================================================#AndroidPolicyRule#==================================================#permissiveidmap;domain_auto_trans(zygote,idmap_exec,idmap);然后添加新策略#newpolicyallowidmapresource_cache_data_file:dirrw_dir_perms;allowidmapresource_cache_data_file:filecreate_file_perms;3).处理权限放大情况如果直接根据avc:denied的LOG转换SELinuxPolicy,经常会出现权限放大的问题,比如要访问某个设备。
当这个设备没有细化SELinuxLabel时,可能会出现:<7>[11281.586780]avc:拒绝{readwrite}forpid=1217comm="mediaserver"name="tfa9897"dev="tmpfs"ino=4385scontext=u:r:mediaserver:s0tcontext=subject_r:device:s0tclass=chr_filepermissive=0如果直接转换SELinuxPolicy:allowmediaserverdevice:chr_file{读写};服务器拥有对所有设备的读写权限。
为了避免这种情况,Google使用neverallow语句来限制它,这样当你编译策略时,它就不会编译。
为了避免这种权限放大,我们需要。
为了细化访问目标(Object),可以按需应用SELinuxLabel。
一般包括三个步骤:3.1定义相关的SELinux类型。
例如,在上面的例子中,在devi中。
ce/mediatek/common/sepolicy/device.te添加类型tfa9897_device、dev_type;3.2绑定文件和SELinuxtype例如上述情况,在device/mediatek/common/sepolicy中添加/dev/tfa9897(/.*)?object_r。
/file_contexts:tfa9897_device:s03.3添加进程/域对应的访问权限。
例如,在上述情况下,添加allowmediaservertfa9897_device:chr_file{openreadwrite};访问类型?(以L版本为例)*device--类型定义:external/sepolicy/device.te;device/mediatek/common/sepolicy/device.te--类型绑定:external/sepolicy/file_contexts;device/mediatek/common/sepolicy/file_contexts*文件类型:--定义type:external/sepolicy/file.te;device/mediatek/common/sepolicy/file.te--绑定类型:external/sepolicy/file_contexts;device/mediatek/common/sepolicy/file_contexts*虚拟文件类型:--类型定义:external/sepolicy/file.te;device/mediatek/common/sepolicy/file.te--类型绑定:external/sepolicy/genfs_contexts;device/mediatek/common/sepolicy/genfs_contexts*服务类型:--类型定义:external/sepolicy/service.te;device/mediatek/common/sepolicy/service.te--绑定类型:external/sepolicyservice_contexts;device/mediatek/common/sepolicy/service_contexts*类型property:--类型定义:external/sepolicy/property.te;device/mediatek/common/sepolicy/property.te--绑定类型:external/sepolicy/property_contexts;device/mediatek/common/sepolicy/property_contexts;通常我们强烈要求如果您反对更新googledefault政策,您可以将更新mediatek下面相应的政策。

docker安装nginx并使用自定义配置文件

1.拉取Nginx镜像

如果您有nginx镜像版本要求,请先在DockerHub上搜索镜像列表。

dockersearchnginx

可以看到列表中有很多nginx镜像,你可以自定义想要拉取的镜像。

在这里,你可以直接获取nginx的官方镜像。

使用命令:

dockerpullnginx

拉取速度与网速有关。
即使等待一段时间也不会出现该错误。
通常不会报告任何错误。

1.列出下载的图像。

显示拉取后当前机器上的镜像文件。

dockerimages

2.列出正在运行的容器。

使用dockerps命令列出正在运行的容器

dockerps

使用dockerps-a命令这个命令,可以列出所有容器(包括停止的容器)的)。

dockerps-a

如果启动容器时看到确认端口被占用的消息,或者启动历史记录中有错误,则镜像运行时报告,因为占用端口。
此时,您可以使用

dockerstopCONTAINERID

停止执行,并使用delete命令删除启动跟踪,然后运行。
还。

dockerrmCONTAINERID

重启容器:

dockerrestartCONTAINERID2.启动容器,部署nginx,更改配置文件

因为我们要自定义nginx配置文件,所以我手动创建了映射的文件夹预先/usr/soft/nginx、/usr/soft/nginx/conf.d。
并启动该文件。
/usr/soft/nginx/nginx.conf,

/usr/soft/nginxnginx映像的总文件夹

/usr/soft/nginx/conf.dnginx中的子文件夹配置文件

/usr/soft/nginx/nginx.conf该文件是nginx的通用配置文件。
该文件在启动时被标记为只读:

nginx.conf文件内容:

usernginx;worker_processes1;error_log/var/log/nginx/error.logwarn;pid/var/run/nginx.pid;事件{worker_connections1024;}http{include/etc/nginx/mime.types;default_typeapplication/octet-stream;log_formatmain'$remote_addr-$remote_user[$time_local]"$request""$status$body_bytes_sent"$http_referer"""$http_user_agent""$http_x_forwarded_for"';access_log/var/log/nginx/access.logmain;sendfileon;#tcp_nopushon;keepalive_timeout65;#gzipon;include/etc/nginx/conf.d/*.conf;}

default.conf文件内容:

server{listen80;server_namelocalhost;charsetutf-8;#charsetkoi8-r;#access_log/var/log/nginx/host.access.logmain;location/{root/usr/share/nginx/html;indexindex.htmlindex.htm;try_files$uri$uri//index.html;#页面更新404防止出现问题}location/api{proxy_passhttp://192.168.1.1:9999/api;#access_log"logs/test.log";}}

这里监控的包括两个端口:80端口。
转发规则之一是根路径“/”,另一个是“/api”。
这意味着如果您访问服务器上的端口80,将使用此路由设置。
如果前缀是“/api”,则使用以下proxy_pass:

这是charsetutf-8;。
必需的如果不添加,如果HTML标题是中文,在浏览器中打开页面时可能会出现乱码。
或者,nginx映射的静态资源文件夹下的文件名包含汉字,也会导致乱码。

由于我们上面将容器目录映射到本地计算机,因此我们还需要创建一个新的欢迎页面。
默认的欢迎页面不是由nginx自动映射的,这非常令人沮丧。

在nginx文件夹中,新建一个最简单的HTML文件index.html,内容如下:

dockerpullnginx0

准备好后,就可以启动nginx了。

启动nginx镜像的命令:

dockerpullnginx1

第一个“-v”是项目位置。
只需将您的项目放在安装的目录中即可。

第二个“-v”是挂载的主配置文件“nginx.conf”。
请注意,“nginx.conf”文件包含“include/etc/nginx/conf.d/*.conf;”行。
请注意,这包括指向以下路径:不要包含错误

第三个“-v”,docker中子配置文件的路径也会被挂载。
请注意,它必须与“2”的包含点路径匹配。

nginx.conf是挂载的文件(不是docker,推荐使用),conf.d挂载的是目录。

将目录映射到此处后,可以直接使用主机上的文件夹。
这意味着修改Docker容器内的文件。
如果您的更改没有生效,您可以重试。
这非常方便,因为您所要做的就是启动容器。

如果没有报错,则启动成功。
当您访问本地计算机上的端口80时,您应该会看到自定义的欢迎页面。

今天我遇到了一个小陷阱。
我们已经知道定制的配置文件对应的是:我有一个nginx的镜像,但是这个知识点不在我的脑海里。

今天我们将部署另一台服务器并将项目部署到端口8080。
这并不容易。
只需运行上面的docker命令并将前80个端口更改为8080,然后更改为默认端口。
在配置文件中,我将监听端口改为8080,重新启动Docker容器,一切一下子就搞定了,稳定了。
但是当我打开浏览器访问时却无法访问。
我以为这可能是防火墙问题,但是防火墙被关闭了。

周末过后,我又想了想,可能是8080端口不行,于是我把服务器改成使用80端口,看看是否可以。

结果如下。
80端口没问题。
好的,改成8080。
!!!

这次我们直接修改启动命令,重命名,将映射的服务器端口改为8080。
我改成了,直接在浏览器中访问,发现结果正常。
我确认我可以更改端口。
无需更改default.conf配置文件中的监听端口。










毕竟,它对应于图像中的nginx。









我真是个傻子。




3.异常问题1.启动nginx时出错:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointnginx

重启Docker

2.容器名称Name被占用:Errorresponsefromdaemon:Conflict.Thecontainername"/nginx"isalreadyinusebycontainer

此名称被最后一个失败的容器占用,因为它之前启动失败过一次。
有两种解决方案。
一种是更改启动命令中--name后面的值,定义一个新名称。
2.删除之前启动失败的镜像容器。

dockerps-a

检查并删除之前的容器ID。

删除然后重新启动:

返回指示成功启动的ID字符串。
否则,将显示异常消息。
我被提示了。

3.nginx启动成功后,访问欢迎页面时,会看到403Forbidden提示。

搜索到这个结果发现这个问题很奇怪。
网上有人说启动容器挂载的目录没有特权,但是启动命令的名称后面附加了“--privileged=true”。

最后,我发现我需要添加一个selinux规则并将我想要挂载的目录列入白名单。

dockerpullnginx3

这里我们将直接添加主机范围的nginx文件夹。
白名单:

如果此时重新启动容器,仍然会遇到403问题。
运行之前需要先删除本次启动的容器。
再次启动容器命令。

另一个原因是当前文件的权限问题。
如果文件夹权限出现问题,nginx也会出现问题。
403问题。
正常文件夹权限应为“drwxr-xr-x.6”。

4.如何自定义根目录映射欢迎页面的位置?

上面我们直接在nginx文件夹下新建了一个index.html文件,但是在打包实际项目的时候,却出现了这样的情况:项目名称可能作为其上方的文件夹存在,也可能打包后Vue项目存在于dist中。
该文件如下。

修改default.conf文件中根目录索引映射规则。

这里的“safety-project”是我的项目名称。
项目下面的索引是该项目的主页。

参考文章:

CentOS7上的Docker文件挂载权限

https://www.cnblogs.com/hailun1987/p/9671801.html

作者:linmengmeng</​​​​p>

Linux网络异常排查思路与方法

处理问题时,不能随意攻击。
在这个生产环境中,解决出现的问题是重中之重。
当然,前提是出现了会影响用户使用或者影响的问题。
处理每一个问题必须根据具体问题进行区分,并根据每一类实施相应的解决思路。
但当涉及到网络问题时,范围从防火墙系统的配置到硬件的故障。
如果按照一定的流程来处理问题,效率必然会太低。
以下是处理网络故障的一般流程。
1.检查网络硬件问题。
(概率较低)2、检查网卡是否可以正常工作。
(多数,主要是人为配置错误造成的)3、检查局域网之间的连接是否正常。
4.检查DNS设置是否正确。
(低低)5.服务是否定期开通。
6.检查访问权限是否开启。
如果1到6是处理网络问题的标准流程,则禁用该流程模式。
整体流程可以针对问题进行处理,但在实际操作中,第一步是看事件概率较高,或者用2点法来缩小问题范围,不一定适用于所有情况问题,但对于大多数网络问题,处理效率得到了显着提高。
个人对此事的总结如下。
1.lsmod|grepip检查对应网卡模块是否加载2.ifconfig-a如果能使用该命令找到相应网卡的配置,则说明网卡驱动正常3.使用ping命令ping你,ping局域网内主机,ping端口,ping本身异常,问题:服务错误,网卡配置不生效,ping局域网主机异常,问题:配置文件不正确,网卡配置不生效、网线损坏、端口ping不正常;问题:配置文件不正确,网卡配置不生效4、如果运行3步后仍然无法正常上网。
所有的方式都可以看到默认的表。
处理方法:删除不需要的激活信息,并使用默认方式从对应的邮箱地址退出。
5.暂时停止iptables服务、SELinux服务和NetworkManager服务。
6、如果可以访问互联网,但是访问域名会出现异常,则需要解析/etc/host和/etc/这两个配置会议。
可能性如下。
7.1.主机的MAC地址禁止被Internet路由器7.2访问。
广泛的系统欠费、埋纤等物理攻击

linuxssh登入输入完密码,还是提示输入密。确认密码正确,系统防火墙关闭,ssh服务开启。求大神帮忙

如果该异常可能是selinux限制造成的,请参考以下解决方案:

如果可以root登录,请禁用selinux。

如果不能登录。
以root身份登录,首先进入单用户模式,然后关闭selinux。

禁用selinux的方法如下(按照下面的步骤1、2)。

方法一:

1)#getenforceselinux查看状态;如果没有禁用的话,转到步骤2)

2)#setenforce0您可以使用getenforce命令验证selinux状态。

方法一只能暂时改变selinux状态,重启机器后无效。

方法二:

#编辑vi/etc/selinux/configselinux配置

配置SELINUX禁用:SELINUX=disabled;保存退出

方法二:重启生效