Logstash 不读取日志,除非世界可读

Logstash 不读取日志,除非世界可读

我最近使用 Kibana 和 Elasticsearch 设置了 Logstash,但遇到一个问题,即除非目录权限是全局读取/执行(并且文件至少是全局读取),否则它无法读取日志。

我已经从 RPM 安装了版本 1.4.2,并以 logstash 用户身份运行。我已确保 logstash 用户是与它需要读取的日志相关的组的成员,例如“apache”。

[root@rhel-00081 conf]# id logstash
uid=497(logstash) gid=497(logstash) groups=48(apache),10081(nexus),27666(spark),497(logstash)

/var/log/http 上的默认权限是drwxr-x--- root apache,但 Logstash 不会处理日志,直到我将其更改为drwxr-xr-x

知道这是为什么吗?

答案1

好的,我发现了问题。RPM 中提供的 init 脚本启动 logstash 如下:

nice -n ${LS_NICE} chroot --userspec $LS_USER:$LS_GROUP / sh -c "
cd $LS_HOME
ulimit -n ${LS_OPEN_FILES}
exec \"$program\" $args
" > "${LS_LOG_DIR}/$name.stdout" 2> "${LS_LOG_DIR}/$name.err" &

但是在 chroot 命令下运行时,除非您提供 --groups 选项,否则所有次要组成员身份都将被删除。您可以运行以下命令看到此信息:

[root@rhel-00081 ~]# chroot --userspec logstash:logstash / bash -c "id"
uid=497(logstash) gid=497(logstash) groups=497(logstash),0(root)

因此 apache 日志无法读取......

[root@rhel00081 httpd]# chroot --userspec logstash:logstash / bash -c "cat /var/log/httpd/access_log"
cat: /var/log/httpd/access_log: Permission denied

初始化脚本中的 chroot 行前面需要添加类似以下内容:

SUPP_GROUPS=$(groups $LS_USER | cut -d " " -f 4- | tr " " ",")
SUPP_GROUP_STR=""
if [ ! -z ${SUPP_GROUPS} ]
then
  SUPP_GROUP_STR="--groups=${SUPP_GROUPS}"
fi

然后修改 chroot 行的开头:

nice -n ${LS_NICE} chroot ${SUPP_GROUP_STR} --userspec=$LS_USER:$LS_GROUP / sh -c "
... etc ...

答案2

这是 logstash 1.4.2 初始化脚本中的一个已知问题。 https://github.com/elastic/logstash/pull/1398

相关内容