TencentBlueKing / bk-nodeman

蓝鲸节点管理,可以对蓝鲸体系中的GSE Agent进行管理,包括状态查询、版本更新、配置管理、健康检查、进程管理等。
MIT License
50 stars 54 forks source link

[FEATURE]无免密sudo权限账号安装agent #1675

Open neko12583 opened 1 year ago

neko12583 commented 1 year ago

你想要什么功能 目前节点管理非 root/Administrator 账号安装 agent 需要免密 sudo 权限 想要功能:无免密 sudo 权限的账号也能安装 agent

为什么需要 在一些企业中,并不想放开权限给到安装 agent 的账户,目前对于企业这方面的需求,一般是先临时开通权限,然后安装 agent,安装完后,再把权限取消

但一方面需要提单走流程,申请开通所有需要安装 agent 的机器的权限,填写相关信息,如果是分批的形式对机器进行纳管,操作比较繁琐 另一方面,后面如果有重装 agent 的需求时,又得重新走一遍申请流程

建议如何实现 普通用户,没有免密 sudo 权限,可以考虑新建接入点,把 agent 安装目录转为 /home/{user_name}/gse 下 账号对该路径下的目录具有权限,那么只需要考虑一些命令的权限以及 rc.local 这些特殊文件的处理 还有需要评估这个安装会不会造成 agent 的功能是否受限制或者监控和日志的功能是否受限制

chalice-1831 commented 4 months ago

非Root账户且无免密sudo权限账号安装agent修改适配方案

修改逻辑

  1. 接入点新增项 is_use_sudo, 默认为True
  2. 在全局配置中添加新接入点,修改agent相关工作路径,以解决用户在相关目录的权限问题
  3. 通过agent所使用的接入点的is_use_sudo项来判断是否在cmd前增加sudo的指令
  4. 传递安装脚本的参数中增加GSE_AGENT_RUN_DIR、GSE_AGENT_DATA_DIR、GSE_AGENT_LOG_DIR参数,通过-v传递
  5. setup_agent脚本中增加执行账户是否拥有非root免密的权限判断,针对crontab及chattr等依赖sudo权限的动作进行判断是否执行,放开原安装agent脚本中对 /home 目录的限制
  6. 通过host的identity对应记录的username获取安装执行所用的账号,使用该账号而非固定的root账号执行安装动作

所需修改文件

apps/backend/agent/solution_maker.py
apps/backend/components/collections/job.py
apps/backend/components/collections/plugin.py
apps/node_man/models.py
script_tools/setup_agent.sh
script_tools/setup_proxy.sh
script_tools/setup_agent.zsh
script_tools/setup_agent.ksh
script_tools/agent_tools/agent2/setup_proxy.sh
script_tools/agent_tools/agent2/setup_agent.sh
script_tools/agent_tools/agent2/setup_agent.zsh
chalice-1831 commented 1 month ago

功能自测

容器化部署

image

二进制部署

image

chalice-1831 commented 1 month ago

使用无免密sudo账户安装agent注意事项

请确保使用无免密sudo权限账户安装agent的机器未曾使用过非该账户安装过agent

或在使用无免密sudo权限账户安装agent前将原agent卸载并清理痕迹

# 基于默认接入点包括但不限于
/tmp/nm*
/tmp/xuoasefasd.err
/tmp/bkjob
/usr/local/gse
/var/run/ipc.stat
/var/log/gse
/var/run/gse
/var/run/ipc.state.report
/var/lib/gse

请在配置接入点时确认agent的安装账户拥有hostid文件路径的读写操作权限

hostid文件的路径默认为Linux: /var/lib/gse/host Windows: c:/gse/data/host

二进制部署版本中默认位于cmdb的/data/bkee/cmdb/server/conf/common.yaml文件eventServer-hostIdentifier中配置

容器化版本中默认位于cmdb的/data/bkhelmfile/blueking/environments/default/bkcmdb-values.yaml.gotmpl文件中的common-eventServer-hostIdentifier中配置

请确保所用账户拥有一下系统程序操作权限

/usr/bin/curl,
/usr/bin/mkdir,
/usr/bin/ls,
/usr/bin/cat,
/usr/bin/which,
/usr/bin/ping,
/usr/bin/echo,
/usr/bin/chmod,
/usr/bin/nohup,
/usr/bin/tail,
/usr/bin/ps,
/usr/bin/date,
/usr/bin/tee,
/usr/bin/uname,
/usr/bin/rm,
/usr/bin/awk,
/usr/bin/lsof,
/usr/bin/stat,
/usr/bin/readlink,
/usr/bin/grep,
/usr/bin/read,
/usr/bin/hash,
/usr/bin/timeout,
/usr/bin/bash,
/usr/bin/sed,
/usr/bin/chattr,
/usr/bin/cd,
/usr/bin/cp,
/usr/bin/wait,
/usr/bin/tr,
/usr/bin/wc,
/usr/bin/mktemp,
/usr/bin/seq,
/usr/bin/sleep,
/usr/bin/df,
/usr/bin/pidof,
/usr/bin/tar,
/usr/bin/gzip,
/usr/bin/pgrep,
/usr/bin/xargs,

接入点配置

接入点配置中 hostid路径 必须与上述 cmdb 的配置文件中指定的路径一致

创建接入点后根据接入点页面中显示的接入点id到节点管理数据库中执行下述语句

use bk_nodeman;
update node_man_accesspoint set is_use_sudo=0 where id={接入点页面中显示的id};