运维堡垒机文章汇总
本文2015年写的关于堡垒机文章的汇总。 |
堡垒机方案选型
原始需求
用户通过跳板机,访问目标服务器; |
选型思路
用户入口
WebShell或传统SSH客户端?
WebShell解决方案——gateone。
在服务器上安装WebShell,用户登录后,访问相应账户。
优点
安装方便; |
缺点
浏览器访问WebShell体验不好,快捷键失灵,容易误操作,效率低下; |
总结
实现基本功能,要进一步使用,需要做二次开发。
综合体验不佳,排除WebShell方案,还是采用传统ssh客户端方式。
用户权限
用户权限如何限制?
用户访问跳板机,使用普通账户,仅具备只读权限?存在严重的安全问题。
用户可绕过跳板机; |
用户访问跳板机,使用普通账户,用户被封闭在jail环境中?符合要求。
仅具备基础的bash环境; |
跳板机访问目标服务器,使用普通账户,仅具备只读权限?符合要求。
目标服务器不宜做大规模配置变更; |
综合:用户访问跳板机,权限高度受限,通过跳板机访问目标服务器,使用普通账户权限。
登录目标服务器
跳板机登录目标服务器方案?
采用密码鉴权的方式?不符合要求。
密码需要配置在登录脚本中,拥有脚本执行权限的用户,可获得密码,绕过跳板机; |
这两种方式,均依赖于pty(虚拟终端),在jail环境中,无法支持pty。
不使用密码鉴权的方式?符合要求。
没有透明密码,采用密钥鉴权方式,仅在跳板机上生效; |
综合:不使用密码鉴权,采用密钥方式鉴权
用户行为记录
用户行为记录:tee或script?
tee可将标准输出写入到文件中,没有时间轴,直接读取文本回放。
script类似于录屏软件,记录时间轴和用户信息,采用scriptreplay命令回放。
考虑到记录回溯,采用纯文本的方式回溯,方便工具二次处理,选择tee。
还有其他选择?
解析history文件,没有时间轴,只有输入,没有输出,放弃。
《python自动化运维》中提到一种方案,在所有目标服务器上部署客户端,监控用户行为,主动向服务端上报,
此方案实现较为复杂,同时对现网架构改动较大,放弃。
底层逻辑
底层逻辑实现方式:shell或python?
Linux原生支持shell和python两种语言,其中shell更为基础。
采用shell语言?不符合要求。
代码实现效率低下; |
采用python语言?符合要求。
编程效率更好; |
综合:底层部分功能若Linux已经实现,直接调用,大部分的业务逻辑代码,使用python。
使用jailkit搭建权限受限账户
操作系统版本:CentOS 6.5
jailkit版本:2.17
设计需求
搭建账户受限账户,用户访问目录受限,可执行命令受限
安装过程
安装jailkit
从官网 http://olivier.sessink.nl/jailkit/ 下载安装包 |
配置jail
使用root账户,新建目录/opt/jail
初始化jial目录,安装lsh环境
jk_init -v -j / /jail/ jk_lsh |
安装ssh环境
jk_init -v -j / /jail/ ssh |
安装python
jk_init -v -j /opt/jail/ python |
默认配置中没有python的初始化配置,检查系统中python目录,增加配置
vim /etc/jailkit/jk_init.ini |
新建用户
useradd ktvworker |
配置bash环境
为实现跳板机用户远程访问 |
配置完成
现已经得到一个仅支持基础bash命令,同时支持python环境的jail环境。
特别说明
jk_init用于读取配置文件,初始化jail运行环境。
jk_cp用户复制当个文件,会自动关联系统库文件。
为避免跳板机被占用,设置空闲10分钟自动退出
vim /etc/profile |
使用jailkit搭建运维跳板机
设计需求
用户通过访问权限受限跳板机,采用免鉴权的方式,访问目标服务器,操作日志可追踪。
设置
前提是jail环境已经配置完成。
跳板机相关配置
使用tee跟踪操作日志,复制tee文件至jail环境。
jk_cp -v -j /opt/jail/ /usr/bin/tee |
在ktv家目录新建serverlist文件,维护服务器名称和IP地址对应关系。
新建init文件,向用户提示使用方法,修改ktv的.bashrc文件,增加.init。
里面saltstack批量删除服务器上密钥。
salt -N 'ktv' cmd.run "rm -rf /home/ktvworker/.ssh/authorized_keys" |
利用python脚本调用ssh-copy-id命令,向目标服务器分发key文件。
ssh命令替换
将系统的ssh命令更名,将更名后的ssh文件配置在python脚本中。
在使用新建名为ssh的shell脚本,放在环境变量指定的目录。
实现用户仅能访问指定的ssh命令,同时行为受到约束。
参考官网资料