ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

简单的身份切换和执行工具su-exec —— 筑梦之路

简单的身份切换和执行工具su-exec —— 筑梦之路 简介su-exec是一个理想的用于身份切换和权限控制的工具尤其适合对性能和空间有要求的环境。无论是开发人员还是系统管理员都值得将它纳入工具箱以提高工作效率和系统的安全性官方网站GitHub - ncopa/su-exec: switch user and group id and exec背景说明通常我们启动镜像前需要使用 shell 调整下启动状态做准备。比如生成配置文件检查路径挂载等等然后再拉起服务但会遇到两个问题普通用户权限不够必须启动 root 但使用 root 启动服务又不安全。使用 shell 启动进程会导致 shell 进程本身 PID 为 1。而我们所启动服务 PID 不是 1这就会导致服务本身接收不到 SIGTERM 信号而正常关闭。解决方案1. 使用su-exec指定特定权限。这需要使用 apk等包管理命令安装或者编译安装需要提前创建好相应账号2. 使用exec命令将启动的服务进程替换当前进程从而将 PID1 传递给服务进程说明: 这里使用 su-exec 而不使用 sudo 的原因是传统 sudo 会新创建出一个进程运行服务导致 PID 不能为 1进而导致无法接收到 signal 信号而正常关闭服务编译安装和使用示例# centos 7 编译 yum install gcc make libtool # 拉取源码 git clone https://github.com/ncopa/su-exec.git cd su-exec make # 拷贝可执行文件 cp su-exec /usr/bin/ # 使用示例 su-exec apache:1000 /usr/sbin/httpd -f /opt/www/httpd.conf 将httpd服务以apache用户和组id 1000的身份启动并且直接执行提供的配置文件应用场景在Docker容器中以特定用户运行应用提升安全性。系统服务管理中根据服务需求以非root用户身份执行减少潜在风险。控制资源访问权限的场景如限制某个程序对特定目录的读写权限。在自动化脚本中灵活切换执行者的权限。项目特点简洁高效su-exec体积小巧只有大约10KB对比同类工具gosu约1.8MB大大减少了依赖和存储占用。直接执行避免了su和sudo创建子进程的问题提高了程序执行效率解决了TTY和信号传递的问题。易用性强支持用户名、用户ID和组ID的数字表示以及用户名:组名的形式使得使用更灵活。安全可靠仅能由root用户执行确保了权限变更的安全性。ES容器启动脚本示例#!/bin/bash set -e # Add elasticsearch as command if needed if [ ${1:0:1} - ]; then set -- elasticsearch $ fi # Drop root privileges if we are running elasticsearch # allow the container to be started with --user if [ $1 elasticsearch -a $(id -u) 0 ]; then # Change the ownership of user-mutable directories to elasticsearch for path in \ /usr/share/elasticsearch/data \ /usr/share/elasticsearch/logs \ ; do chown -R elasticsearch:elasticsearch $path done set -- su-exec elasticsearch $ #exec su-exec elasticsearch $BASH_SOURCE $ fi # As argument is not related to elasticsearch, # then assume that user wants to run his own process, # for example a bash shell to explore this image exec $其他示例# Dockerfile 内容如下 FROM alpine:3.16 # 创建用户 RUN addgroup -S -g 1000 redis adduser -S -G redis -u 999 redis # 安装 su-exec 命令 RUN apk add --no-cache su-exec0.2 ############################################################ # # 其它部署 内容 # ############################################################ ENTRYPOINT [/usr/bin/entrypoint.sh] # /usr/bin/entrypoint.sh 内容如下 #!/bin/sh set -e ############################################################ # # 启动准备脚本内容 # ############################################################ # 最终启动命令 exec su-exec redis redis-server $参考资料https://zhuanlan.zhihu.com/p/558116410
返回列表