本文2015年写的关于堡垒机文章的汇总。

堡垒机方案选型

原始需求

用户通过跳板机,访问目标服务器;
用户在跳板机上的行为和权限受限;
用户在目标服务器上的行为和权限受限;
用户在目标服务器上的操作被记录,方便后续回溯;

选型思路

用户入口

WebShell或传统SSH客户端?

WebShell解决方案——gateone

在服务器上安装WebShell,用户登录后,访问相应账户。

优点

安装方便;
HTML5实现,无需安装插件,支持主流浏览器;
支持日志回放;

缺点

浏览器访问WebShell体验不好,快捷键失灵,容易误操作,效率低下;
日志回放采用录屏的方式,不方便做二次处理;

总结

实现基本功能,要进一步使用,需要做二次开发。

综合体验不佳,排除WebShell方案,还是采用传统ssh客户端方式。

用户权限

用户权限如何限制?

用户访问跳板机,使用普通账户,仅具备只读权限?存在严重的安全问题。

用户可绕过跳板机;
系统的实现代码,可能会泄露;
用户操作日志,可能会人为删除;

用户访问跳板机,使用普通账户,用户被封闭在jail环境中?符合要求。

仅具备基础的bash环境;
仅能执行管理员许可的命令;
运行环境可支持灵活配置;

跳板机访问目标服务器,使用普通账户,仅具备只读权限?符合要求。

目标服务器不宜做大规模配置变更;
用户需要具备大部分文件的只读权限;

综合:用户访问跳板机,权限高度受限,通过跳板机访问目标服务器,使用普通账户权限。

登录目标服务器

跳板机登录目标服务器方案?

采用密码鉴权的方式?不符合要求。

密码需要配置在登录脚本中,拥有脚本执行权限的用户,可获得密码,绕过跳板机;
密码鉴权采用自动化脚本登录,有两种方式,expect、sshpas;

这两种方式,均依赖于pty(虚拟终端),在jail环境中,无法支持pty。

不使用密码鉴权的方式?符合要求。

没有透明密码,采用密钥鉴权方式,仅在跳板机上生效;
不依赖pty,支持jail环境;

综合:不使用密码鉴权,采用密钥方式鉴权

用户行为记录

用户行为记录: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/ 下载安装包
tar -zxvf jailkit-2.17.tar.gz
cd jailkit-2.17
./configure
make
make install

配置jail

使用root账户,新建目录/opt/jail

初始化jial目录,安装lsh环境

jk_init -v -j /opt/jail/ jk_lsh

安装ssh环境

jk_init -v -j /opt/jail/ ssh

安装python

jk_init -v -j /opt/jail/ python

默认配置中没有python的初始化配置,检查系统中python目录,增加配置

vim /etc/jailkit/jk_init.ini

comment = the python interpreter and libraries
paths = /usr/bin/python, /usr/bin/python2.6, /usr/lib/python2.6, /usr/lib64/python2.6, /usr/include/python2.6

新建用户

useradd ktvworker
修改密码
passwd ktvworker
切换用户,生成密钥对
su ktvworker
ssh-keygen -t rsa
将用户迁移至jail环境
jk_jailuser -m -v -j /opt/jail/ ktvworker

配置bash环境

为实现跳板机用户远程访问
jk_cp -v -j /opt/jail/ /bin/bash
修改jail环境中passwd配置
vim /opt/jail/etc/passwd
将用户的shell程序由/usr/sbin/jk_lsh修改为/bin/bash

配置完成

现已经得到一个仅支持基础bash命令,同时支持python环境的jail环境。

特别说明

jk_init用于读取配置文件,初始化jail运行环境。

jk_cp用户复制当个文件,会自动关联系统库文件。

为避免跳板机被占用,设置空闲10分钟自动退出

vim /etc/profile
TMOUT=600
source /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命令,同时行为受到约束。

参考官网资料