对指令的审计+认证鉴权 开源堡垒机 云堡垒机 跳板机
20180903 chenxin
Linux系统本地执行指令审计
20190803 chenxin
参考资料
https://my.oschina.net/nikoF/blog/2873307 本地单机历史命令记录
https://www.ibm.com/developerworks/cn/linux/l-lo-use-space-audit-tool/index.html Linux 用户空间审计工具 audit
可以参考各堡垒机,以及云平台提供的堡垒机方案(提供了统一认证+历史指令审计功能).
堡垒机/跳板机推荐方案
就目前情况,没有比较合适的方案.请移步堡垒机相关内容.
堡垒机分类
-
开源堡垒机
CrazyEye、Teleport、Jumpserver、GateOne、麒麟开源堡垒机.
价格: 免费 -
传统硬件堡垒机
传统堡垒机供应商诸如: 齐治、网御神州、绿盟科技、极地安全、方正安全、捷成世纪等。
价格: 十几至一百多万 -
云堡垒机
借助云平台,云堡垒机在资源的交互性、易用性、性价比、维护成本、产品自身安全性等方面又得到了进一步提升,尤其解决了以往的单点故障问题。
云堡垒机提供了一套多维度运维操作管控与审计的解决方案,使得管理人员可以面对多种云资源进行集中管理与细粒度的权限管理和访问审计.
目前安恒云、行云管家、云匣子等等,他们的主要功能基本相似,但优势和侧重点各有不同.
价格:每月几百到几千 -
aws方案
AWS Systems Manager 以前称为“Amazon EC2 Systems Manager”和“Amazon Simple Systems Manager”。
sys system manager新增一项session manager服务,功能类似堡垒机,无需开放22或3389端口可登录到ec2实例,可保存日志供审计之用,免费.
http://docs.amazonaws.cn/en_us/systems-manager/latest/userguide/what-is-session-manager.html
https://amazonaws-china.com/cn/blogs/china/replacing-a-bastion-host-with-amazon-ec2-systems-manager/ -
aliyun阿里云方案
USMShell https://help.aliyun.com/knowledge_detail/91092.html 截止2019/09/02依然只对国内账号开放了该服务.海外账号没有. -
总的来说,选购堡垒机并非越贵的就越好,而是要综合考量实际应用中的真实需求。
如果您所在的团队是金融、政府等对安全性要求极高的组织,建议您考虑传统堡垒机。
对于一些互联网企业、创业企业而言,比较倾向于向大家推荐使用云堡垒机,无论是从价格还是灵活性来说他都具备优势。 -
知识
4A是指:认证Authentication、账号Account、授权Authorization、审计Audit,即统一安全管理平台解决方案。
将身份认证、授权、审计和账号(即不可否认性及数据完整性)定义为网络安全的四大组成部分,从而确立了身份认证在整个网络安全系统中的地位与作用。
jumpserver开源堡垒机
20180906 陈信
参考与说明
北京的1个小团队负责的开源项目,目前还在不断开发和完善中.如有发现问题,可以咨询一下成都群里的老喻(原开发者).
http://docs.jumpserver.org/zh/docs/step_by_step.html centos上安装步骤(基本上按照官方文档按部就班操作,修改下默认的端口就可以)
http://docs.jumpserver.org/zh/docs/faq_install.html 安装过程中常见问题查询
jumpserver组件说明
-
开源项目,由python 3.6 开发,目前主要有以下模块功能
1.jumpserver控制台: 主要组件,由Django实现
2.coco(已被koko取代): 命令执行的代理端.也是SSH的代理端.实现了SSH Server和Web Terminal Server的组件,提供SSH和WebSocket接口,使用Paramiko和Flask开发
3.luna:现在是 Web Terminal前端,计划前端页面都由该项目提供.Jumpserver只提API,不再负责后台渲染html等. -
第三方(数据)
mysql: 存储数据(可以使用5.X或8.X都可以,我是用的最新的8.X)
redis: 存储数据(我用的是4.X版本,也是最新的) -
原理说明
利用jumpserver来管理用户,资产等信息.利用koko来ssh通道并记录历史命令.
需要在后端机器上配置有统一的一个系统账号,比如admin,然后在jumpserver上,配置此用户名和密码(或密钥),通过它来登陆后端机器.
安装与配置
安装与进程配置文件的配置请参考"参考"链接(官方文档).这里不再赘述(安装过程中,一般会遇到各种问题,需要自行解决)
- mysql的安装请参考对应文档.对应的jumpserver配置文件在安装jumpserver的时候,会在/opt/jumpserver/config.yml里.
- redis的安装请参考对应文档.同上.
- python3.6的安装(或参考官方文档 https://docs.python.org/3/using/unix.html#on-linux )
cd /opt/
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
tar xzvf Python-3.6.9.tgz
cd Python-3.6.9/
./configure
make;make install
which python3.6
- jumpserver安装,配置,启动
1.python配置
python虚拟环境创建: python3.6 -m venv /opt/py3
载入虚拟环境: source /opt/py3/bin/activate
2.启动jumpserver时可能会碰到"ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory"问题
$ find / -name libmysqlclient.so.20
/usr/local/mysql/lib/libmysqlclient.so.20
$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf #包含/etc下的此目录下的对应文件
/usr/local/mysql/lib/ #增加
$ ldconfig #刷新
- koko安装
$ cd /opt
$ wget https://github.com/jumpserver/koko/releases/download/1.5.2/koko-master-6d4e69b-linux-amd64.tar.gz
$ tar xf koko-master-6d4e69b-linux-amd64.tar.gz
$ chown -R root:root kokodir
$ cd kokodir
$ cp config_example.yml config.yml
$ vim config.yml
# BOOTSTRAP_TOKEN 需要从 jumpserver/config.yml 里面获取, 保证一致
$ ./koko 或 nohup ./koko > nohup.out 2>&1 &
-
docker 部署 guacamole 组件
docker run --name jms_guacamole -d -p 127.0.0.1:8081:8081 -e JUMPSERVER_SERVER=http://10.0.0.26:8080 -e BOOTSTRAP_TOKEN=KA5CmOxL0vkpYOqCfdoc4BFYslesQ4AEgViOTa8aRrZgEYtcQ jumpserver/jms_guacamole:1.5.2 -
下载 luna 组件
$ cd /opt
$ wget https://github.com/jumpserver/luna/releases/download/1.5.2/luna.tar.gz
$ tar xf luna.tar.gz
$ chown -R root:root luna
- 安装与配置 nginx 整合各组件
# 参考 http://nginx.org/en/linux_packages.html 文档安装最新的稳定版 nginx
这里安装可以参考文档"nginx做TCP转发TCP代理转发(以及应用层反向代理) 四层或七层负载均衡"
wget http://nginx.org/download/nginx-1.16.1.tar.gz
将以下配置加入到配置文件中.
server {
listen 80;
client_max_body_size 100m; # 录像及文件上传大小限制
location /luna/ {
try_files $uri / /index.html;
alias /opt/luna/; # luna 路径
}
location /media/ {
add_header Content-Encoding gzip;
root /opt/jumpserver/data/; # 录像位置
}
location /static/ {
root /opt/jumpserver/data/; # 静态资源
}
location /socket.io/ {
proxy_pass http://localhost:5000/socket.io/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location /coco/ {
proxy_pass http://localhost:5000/coco/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location /guacamole/ {
proxy_pass http://localhost:8081/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
$ nginx -t
$ nginx -s reload
jumpserver安装完成后的验证
- 安装完成,启动完成后,进程说明
这个是jumpserver的主进程(包括3个东西,gunicorn,celery,beat); web端口改为了13080
\_ python3 ./jms start all
\_ /opt/py3/bin/python3 /opt/py3/bin/gunicorn jumpserver.wsgi -b 0.0.0.0:13080 -k eventlet -w 4 --access-logformat %(h)s %(
| \_ /opt/py3/bin/python3 /opt/py3/bin/gunicorn jumpserver.wsgi -b 0.0.0.0:13080 -k eventlet -w 4 --access-logformat %(h)
| \_ /opt/py3/bin/python3 /opt/py3/bin/gunicorn jumpserver.wsgi -b 0.0.0.0:13080 -k eventlet -w 4 --access-logformat %(h)
| \_ /opt/py3/bin/python3 /opt/py3/bin/gunicorn jumpserver.wsgi -b 0.0.0.0:13080 -k eventlet -w 4 --access-logformat %(h)
| \_ /opt/py3/bin/python3 /opt/py3/bin/gunicorn jumpserver.wsgi -b 0.0.0.0:13080 -k eventlet -w 4 --access-logformat %(h)
\_ /opt/py3/bin/python3 /opt/py3/bin/celery worker -A ops -l debug --pidfile /opt/jumpserver/tmp/celery.pid -c 4
| \_ /opt/py3/bin/python3 /opt/py3/bin/celery worker -A ops -l debug --pidfile /opt/jumpserver/tmp/celery.pid -c 4
| \_ /opt/py3/bin/python3 /opt/py3/bin/celery worker -A ops -l debug --pidfile /opt/jumpserver/tmp/celery.pid -c 4
| \_ /opt/py3/bin/python3 /opt/py3/bin/celery worker -A ops -l debug --pidfile /opt/jumpserver/tmp/celery.pid -c 4
| \_ /opt/py3/bin/python3 /opt/py3/bin/celery worker -A ops -l debug --pidfile /opt/jumpserver/tmp/celery.pid -c 4
\_ /opt/py3/bin/python3 /opt/py3/bin/celery beat -A ops --pidfile /opt/jumpserver/tmp/beat.pid -l DEBUG --scheduler django_
这个是mysql,端口3306
/bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data/ --pid-file=/usr/local/mysql/data//ip-10-0-1-198.pid
\_ /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql
这个是redis,端口6379
/usr/local/redis/src/redis-server 127.0.0.1:6379
这个是coco,端口开放5000以及2222(SSH代理端口)
\_ python3 ./cocod start
这个是nginx前端代理(主要作用为: 指定静态资源路径-luna的位置; 代理coco的5000端口的socket; 代理jumpserver的web端口13080;
nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
\_ nginx: worker process
- 开始使用 Jumpserver
# 检查应用是否已经正常运行
# 服务全部启动后, 访问 jumpserver 服务器 nginx 代理的 80 端口, 不要通过8080端口访问
# 默认账号: admin 密码: admin (默认;登陆后修改为 Jumps12386Hgs89 )
- 测试
[root@ip-10-0-1-198 coco]# ssh -p2222 admin@127.0.0.1
admin@127.0.0.1's password: #这里输入的密码是jumpserver上注册的那个用户的密码,而非真实后端服务器ssh用户admin的密码.
Administrator, 欢迎使用Jumpserver开源跳板机系统
1) 输入 ID 直接登录 或 输入部分 IP,主机名,备注 进行搜索登录(如果唯一).
2) 输入 / + IP, 主机名 or 备注 搜索. 如: /ip
3) 输入 p 显示您有权限的主机.
4) 输入 g 显示您有权限的节点.
5) 输入 g + 组ID 显示节点下主机. 如: g1
6) 输入 s 中/英文切换.
7) 输入 h 帮助.
0) Enter q exit.
Opt> #这里输入操作指令
jumpserver自启动脚本
-
redis开机自启动
/usr/local/redis/src/redis-server /usr/local/redis/redis.conf -
mysql开机自启动
/usr/local/mysql/support-files/mysql.server start -
jumpserver自启动脚本
(py3) [root@ip-10-0-1-198 jumpserver]# cat jms-start.sh
#!/bin/bash
source /opt/py3/bin/activate
cd /opt/jumpserver
nohup ./jms start all >./nohup.out 2>&1 &
- koko自启动
source /opt/py3/bin/activate
cd /opt/kokodir
nohup ./koko >./nohup.out 2>&1 &
-
guacamole自启动
docker方式 -
nginx自启动
/usr/local/nginx/sbin/nginx -
综上,统一并入 /etc/rc.local 注意此文件权限(默认已经 systemctl enable rc-local.service)
[root@iZj6c5d11u9erkfcx9hgqeZ ~]# cat /etc/rc.local
#!/bin/bash
...
touch /var/lock/subsys/local
/usr/local/redis/src/redis-server /usr/local/redis/redis.conf
/usr/local/mysql/support-files/mysql.server start
/usr/local/nginx/sbin/nginx
/opt/jumpserver/start.sh # 具体请参考上面内容
/opt/kokodir/start.sh
source /etc/profile && docker container start jms_guacamole # 需要先手动docker run xxx后才有
exit 0 # 不可缺少,否则systemctl无法完成 rc-local.service 的启动
用户申请
请参见官方文档说明. http://docs.jumpserver.org/zh/docs/admin_guide.html 管理文档
然后用户可以通过coco的代理端口登陆后端服务器(所有操作都会记录在coco中).也可以通过jumpserver控制台中的web终端来管理具有权限的服务器.
- jumpserver 登陆
user: admin pw: Jumps12386Hgs89
日常管理操作
-
修改对外端口
修改jumpserver对外开放端口,默认80,修改为10080.修改nginx配置文件 /usr/local/nginx/conf/nginx.conf -
LDAP接入,请参考 Freeipa文档.
略 -
jumpserver账户说明
LDAP和jumpserver系统的本地账户可以共存(不能重名,重名会导致所有用户登陆报错). -
用户管理
是jumpserver系统的账户和LDAP的账户.
LDAP账号可以通过这里进行导入操作. -
资产管理
这里增加机器(增加机器前,需要配置"资产管理"->"管理用户"+"系统用户")
管理用户: 比如root.这里给的是机器之前添加的web用户.并将web用户的私钥录入进去.暂时还没有用到过.
系统用户: 比如admin.这个是每个linux机器都有的admin用户.需要录入admin用户的密码,这样jumpserver的koko才能通过此用户登陆机器(是各个机器上的本地账号).
注意,可以将后端机器ssh的freeipa登陆模式屏蔽掉,使用本地账号认证.
如果不屏蔽的话,因为后端机器默认也加入了freeipa,则也可以使用此ldap账号继续登陆后端机器.(jumpserver和后端ssh都接入了freeipa). -
权限管理
默认各个用户是没有任何机器的权限的.要添加机器的访问权限,需要添加"资产授权".资产授权是根据 哪些资产可以供哪些人 访问. -
会话管理
ssh web终端,根据登陆用户所具有的权限,通过web ssh终端登陆机器(使用的是linux系统事先本地申请好的admin账户).
历史会话查看,包括执行过的历史指令,以及视频回放(用户执行指令的录屏回放). -
jumpserver本地SSH 2222端口,通过用户名认证后连接后端机器
用户先通过SSH登录到跳板机.然后
[root@iZj6c5d11u9erkfcx9hgqeZ ~]# ssh -p2222 test20190902@10.0.0.26 # 跳板机本地IP为10.0.0.26
test20190902@10.0.0.26's password:
test20190902, 欢迎使用Jumpserver开源堡垒机系统
1) 输入 ID 进行直接登陆.
2) 输入 部分IP、主机名、备注 进行进行搜索登录(如果唯一).
3) 输入 / + IP, 主机名 or 备注 进行搜索, 如: /192.168.
4) 输入 p 进行显示您有权限的主机.
5) 输入 g 进行显示您有权限的节点.
6) 输入 r 进行刷新最新的机器和节点信息.
7) 输入 h 进行显示帮助.
8) 输入 q 进行退出.
Opt> 常用的就是 "/ip(或主机名等) p g h",登录机器(ssh admin账号)
- Securecrt相关设置
用户通过securecrt登陆,直接登录到后端某机器(减少手动操作)
先创建一个普通的securecrt的ssh客户端(可以直接复制其他主机的).
然后,在 Connection->Logon Actions->将Automate Logon和Send initial carriage return都打勾.
Expect Send Hide
ogin: ssh -p2222 chenxin@10.0.0.26 No #10.0.0.26是jumpserver机器的内网IP.
password: Freeipaxxx No
Opt> /10.0.0.19 No #10.0.0.19是目的服务器,业务服务器.下面就可以手动选择,如果只有1台匹配,那么直接输入1,就进入该服务器了.
- 通过jumpserver推送安装软件给各主机
没有这个功能,需要在"资产管理"中,创建一个额外的,不同于ssh admin账号的具有足够权限的账号,比如manager用户,然后通过"作业中心"里的"批量命令"来实现.
# "系统用户"创建时, 如果选择了"自动推送" Jumpserver 会使用"Ansible"自动推送系统用户到资产中, "root"用户不支持推送.
# 如果资产不支持"Ansible", 请去掉"自动生成密钥"、"自动推送"勾选。手动填写资产上已有的账号及账号密码, 目前支持 Windows 系统用户推送
# 如果想让用户登录资产时自己输入密码, 可以在创建系统用户时选择"手动登录"
- 操作历史记录审查
系统设置->终端设置->命令存储+录像存储.录像存储,支持S3,OSS以及微软存储桶.
会话管理->历史会话查看,包括执行过的历史指令,以及视频回放(用户执行指令的录屏回放).同时,也有文本文件的会话详情信息(包括命令输出信息).
故障模拟
- 将Freeipa(LDAP)服务器关机,是否还可以登录jumpserver
LDAP用户登陆,则会超时(无法与LDAP建立连接).最终报504.
本地用户超时,nginx报504. 为什么会这样设计呢?是BUG吗?
在LDAP故障后,如何通过本地用户登录方法,如下.
直接修改jumpserver的DB.
连接mysql的jumpserver库,settings_setting表->AUTH_LDAP字段->将value字段的值改为"false".然后重启jumpserver(有缓存,所以需要重启).
重新登录jumpserver.
阿里云堡垒机
USMShell https://help.aliyun.com/knowledge_detail/91092.html
截止2019/08/26 只在国内账号开通了此服务.国际账号还未支持.