Systemd服务无目录访问权限问题

记录一下,在系统安装 Systemd 服务无法访问某些目录的问题。

问题出现

CentOS7已经采用Systemd机制了,比如使用 Caddy 服务器,使用YUM即可安装。

Caddy 是一个优秀的Web服务器,支持 HTTP2.0 以及 QUIC 协议,另外也支持代理功能。同时这个服务器还支持自动申请开源免费的 SSL 证书,使得我们的服务支持 HTTPS,特别的方便。

一般的Web服务器,静态文件目录都在 var 下,不过有时候也会配置到某些用户目录下,使得特定用户操作方便,不需要切换管理员权限。比如,配置到普通用户账号目录下,只需要这个用户操作更新文件即可

xilixili.net www.xilixili.net {
tls rangerlee@foxmail.com
root /home/user/webroot/
redir 301 {
if {>X-Forwarded-Proto} is http
/ https://{host}{uri}
}
}

当然了,访问权限也简单,Caddy默认使用caddy用户和caddy组来运行进程,因此把caddy用户加入到了那个用户的用户组里面,如将当前用户

usermod -a -G user caddy

然后保证那个目录有读和执行权限,即r+x权限,

chmod 750 -R webroot

改完之后,极大的概率启动服务会失败了,提示的是类似下面的语句

Error during parsing: Unable to access root path '...': stat ...: permission deny

问题分析

其实上面的配置是没用错误的,即使把各种权限单独验证一遍都是可以,除了在这个服务里面是失败的外,其他的测试都是正常的。打开 /usr/lib/systemd/system/caddy.service ,仔细看里面有好几个类似 ProtectHome=true 的不常见的配置项,大概概括如下:

ProtectHome 可以设置为 true/false/read-only。 设置为 true 的时候,/home、 /root、 /run/user 对应用不可见。设置为 read-only, 上述三个目录对应用只读。设置为 false, 则应用可以正常访问这三个目录。 默认值是 false。为了保证应用不能访问用户私有数据, 建议所有长时间运行的服务开启该选项。

ProtectSystem 可以设置为 true/false/full。 设置为 true、/usr、/boot 被设置为只读。 设置为 full、 /usr、 /boot、 /etc 被设置为只读。 设置为 false,则应用可以正常访问上述目录。这个选项可以保护系统目录不会被应用修改, 建议所有长时间运行的服务开启该选项。

问题修复

如上,当前的需求是 /home 目录访问权限,则只需要修改 ProtectHome 参数为 read-only 即可。至此重启服务,一切功能正常。

systemctl daemon-reload
systemctl restart caddy

必须首先重新加载systemd的配置,否则不生效

最近的文章

Nginx监听多端口并根据端口代理

一般使用nginx做代理的时候,基本都是使用的是域名的方式,但是在某些情况下,无法使用域名和路径进行负载代理,使用的是端口进行区分,也是有办法的。 多端口监听监听多端口不是什么问题,但是很多人其实不知道怎么简化配置,特别是像上面的情况下,一个一个server节点配置难道要复制很多份吗,这样其实也太复 …

技术 继续阅读
更早的文章

Tornado静态文件跨域设置

最近用 Python 做了 Tensorflow 的服务,搭建web服务框架,就使用了比较熟悉的 Tornado 框架,框架用起来非常简单快捷,一般最终使用的时候是个单独的服务,因此顺手给简单的加了跨域的头。 自以为的设置直接找个DEMO看一下,就开始实现代码,由于是图像识别,因此分了两步,第一步是 …

技术 继续阅读