ops-itop / itop-extensions

my extensions of itop
30 stars 12 forks source link

通过profile.d脚本控制登录用户 #56

Closed annProg closed 6 years ago

annProg commented 6 years ago

cmdbApi logininfo.php可以限制服务器业务信息,通过在profile.d下的脚本中调用此接口在服务器显示业务信息。 可以将pam_account.sh改为此种方式,pam_account生成允许登录用户列表的方式不变,在profile.d脚本中判断当前登录用户是否在列表里,如果不在,这执行exit

这种方式的好处是:

  1. 用户可以看到服务器业务信息,明白自己不能登录的原因
  2. 可以添加提示引导用户提交账号申请工单、

注意事项: 如果直接在profile.d脚本中调用cmdb接口,存在cmdb挂掉时无法获取列表的情况。因此,列表文件应通过计划任务生成2~5分钟比较好,当cmdb接口挂掉时,保持列表文件不变,这样登录行为就不会强依赖cmdb

annProg commented 6 years ago

pam_account.sh核心代码

CONF="/etc/scloud_sshduser"
SUDO="/etc/sudoers.d/cmdb"
SCRIPT="/etc/profile.d/z_scloud_cmdb_login_control.sh"
IPADDR=`ip add |grep -E "10\." |grep -v "/32" |head -n 1 |awk '{print $2}' |awk -F'/' '{print $1}'`

function pam_on()
{
    cat >$SCRIPT <<EOF
#!/bin/bash
# 这里用who am i,su到其他用户时,who am i显示的用户不变,whoami会变,切换到一些系统用户,比如nginx, zabbix时会受限
u=\`who am i|awk '{print \$1}'\`
# 当使用scp或ssh ip 'command' 时,who am i 和who及 w命令均不显示用户,此时需要使用whoami来判断用户
[ "\$u"x == ""x ] && u=\`whoami\`
# 获取不到用户名时放弃
[ "\$u"x == ""x ] && u="root"
/bin/grep -w "^\$u$" $CONF &>/dev/null && r=1 || r=0
if [ \$r -eq 0 ];then
    echo -e "\033[47;5;31m\n     用户 \$u 没有权限登录当前机器\033[0m"
    # Signal 2 is Ctrl+C,禁用ctrl+c,否则sleep时用户可以通过ctrl+c进入系统
    trap '' 2
    # 等5秒 否则通过堡垒机登录服务器的用户看不到提示信息
    sleep 5
    exit
fi
EOF
}