CentOS 7配置开源堡垒机jumpserver(1) jumpservr+openldap
一、架构与场景说明
1.1 jumpserver结合openldap配置架构图
说明:
- OpenLDAP用来管理产线服务器账号与密码,主机登录权限以及sudo权限
- 在企业中CAS一般由信息化部门(而非运维技术部门)单独构建,管理组织人员以及内部信息化服务权限认证等,这里作为测试就不单独部署CAS了而是统一使用产线的OpenLDAP服务器
1.2 组件服务器信息
主机名称 | 地址 | 版本 | 角色 | 备注 |
---|---|---|---|---|
sysldap-shylf-1 | 10.116.72.11 | CentOS7.6 min | openLdap, httpd, phpldapadmin | |
sysldap-shylf-2 | 10.116.72.12 | CentOS7.6 min | openLdap, httpd, phpldapadmin | |
systerm-shylf-1 | 10.116.72.13 | CentOS7.6 min | jumpserver | |
systerm-shylf-1 | 10.116.72.15 | CentOS7.6 min | linux跳板机 | terminal |
syswterm-shylf-1 | 10.116.72.16 | windows 2012 | windows跳板机 | terminal |
1.3 前置配置
-
OpenLDAP服务配置
OpenLDAP使用的镜像模式的主主架构,具体配置参考之前的文档:
CentOS7 配置OpenLDAP(一) 单节点配置OpenLDAP服务并实现服务器登录管理常见场景
CentOS7 配置OpenLDAP(二)配置OpenLDAP主从架构(Replication模式)
CentOS7 配置OpenLDAP(三)配置OpenLDAP多主模式(镜像模式) -
Linux跳板机配置
Linux跳板机就是一个最小化安装的CentOS 7.6服务器,并依据CentOS7 配置OpenLDAP(一) 单节点配置OpenLDAP服务并实现服务器登录管理常见场景 配置了使用OpenLDAP认证。 -
Windows跳板机配置
Windows跳板机简单安装了一个windows2012服务器,并没有配置AD认证,而是创建本地账户进行认证,之后有需要额外配置。
二、Jumpserver配置
这里jumpserver配置使用官方配置步骤进行配置(我们当前使用的是二次开发的版本),官方配置文档
安装文档 » 一站式、分布式安装文档 » CentOS 7 安装文档
本文档主要是记录我的配置过程,官方文档已经很详细了,我这里也几乎没有改动,照着命令执行。
2.1 组件说明
- Jumpserver 为管理后台, 管理员可以通过 Web 页面进行资产管理、用户管理、资产授权等操作, 用户可以通过 Web 页面进行资产登录, 文件管理等操作
- coco 为 SSH Server 和 Web Terminal Server 。用户可以使用自己的账户通过 SSH 或者 Web Terminal 访问 SSH 协议和 Telnet 协议资产
- Luna 为 Web Terminal Server 前端页面, 用户使用 Web Terminal 方式登录所需要的组件
- Guacamole 为 RDP 协议和 VNC 协议资产组件, 用户可以通过 Web Terminal 来连接 RDP 协议和 VNC 协议资产 (暂时只能通过 Web Terminal 来访问)
各个组件默认使用的端口信息,默认端口可以在相应的配置文件更改
Protocol | Server name | Port |
---|---|---|
TCP | Jumpserver | 8080 |
TCP | coco | 2222, 5000 |
TCP | Guacamole | 8081 |
TCP | Db | 3306 |
TCP | Redis | 6379 |
TCP | Nginx | 80 |
备注:jumpserver当前最新版本是1.5.1
2.2 组件jumpserver配置
我这里关闭了firewalld,禁用了selinux,如果需要启用的情况下配置,可以参考官方文档。我是在root账户下配置的。
$ yum -y install epel-release
$ yum -y update
$ yum -y install wget gcc
# 安装 Redis, Jumpserver 使用 Redis 做 cache 和 celery broke
$ yum -y install redis
$ systemctl enable redis
$ systemctl start redis
# 安装 MySQL, 如果不使用 Mysql 可以跳过相关 Mysql 安装和配置, 支持sqlite3, mysql, postgres等
$ yum -y install mariadb mariadb-devel mariadb-server
$ systemctl enable mariadb
$ systemctl start mariadb
# 创建数据库 Jumpserver 并授权
$ DB_PASSWORD=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 24` # 生成随机数据库密码
$ echo -e "\033[31m 你的数据库密码是 $DB_PASSWORD \033[0m"
$ mysql -uroot -e "create database jumpserver default charset 'utf8'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '$DB_PASSWORD'; flush privileges;"
# 安装 Nginx, 用作代理服务器整合 Jumpserver 与各个组件
$ vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
$ yum -y install nginx
$ systemctl enable nginx
# 安装 Python3.6
$ yum -y install python36 python36-devel
# 配置并载入 Python3 虚拟环境
$ cd /opt
$ python3.6 -m venv py3 # py3 为虚拟环境名称, 可自定义
$ source /opt/py3/bin/activate # 退出虚拟环境可以使用 deactivate 命令
# 看到下面的提示符代表成功, 以后运行 Jumpserver 都要先运行以上 source 命令, 载入环境后默认以下所有命令均在该虚拟环境中运行
(py3) [root@localhost py3]
# 下载 Jumpserver,官方文档是直接github下载最新版本,我这里从github下固定版本1.5.1
$ cd /opt/
$ wget https://github.com/jumpserver/jumpserver/archive/1.5.1.zip
$ unzip 1.5.1.zip
$ mv jumpserver-1.5.1 jumpserver
# 安装依赖 RPM 包
$ yum -y install $(cat /opt/jumpserver/requirements/rpm_requirements.txt)
# 安装 Python 库依赖,指定国内源速度快(可以直接写在配置文件里 ~/.pip/pip.conf)
$ pip install --upgrade pip setuptools -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
$ pip install -r /opt/jumpserver/requirements/requirements.txt -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
# 修改 Jumpserver 配置文件
$ cd /opt/jumpserver
$ cp config_example.yml config.yml
$ SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50` # 生成随机SECRET_KEY
$ echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc
$ BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16` # 生成随机BOOTSTRAP_TOKEN
$ echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc
$ sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /opt/jumpserver/config.yml
$ sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /opt/jumpserver/config.yml
$ sed -i "s/# DEBUG: true/DEBUG: false/g" /opt/jumpserver/config.yml
$ sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /opt/jumpserver/config.yml
$ sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: false/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /opt/jumpserver/config.yml
$ sed -i "s/DB_PASSWORD: /DB_PASSWORD: $DB_PASSWORD/g" /opt/jumpserver/config.yml
$ vi config.yml # 确认内容有没有错误
省略
- 运行jumpserver
# 运行 Jumpserver
$ cd /opt/jumpserver
$ ./jms start -d # 后台运行使用 -d 参数./jms start -d
# 新版本更新了运行脚本, 使用方式./jms start|stop|status all 后台运行请添加 -d 参数
2.3 组件coco与guacamole安装,采用docker模式
在docker容器里还没有找到怎么处理ssh-agent (这个功能使用用来无密码访问使用的) ,coco可以从docker里面拿出来,配置ssh-agent代理私钥
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum makecache fast
$ rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
$ yum -y install docker-ce
$ systemctl enable docker
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
$ systemctl restart docker
# 允许 容器ip 访问宿主 8080 端口, (容器的 ip 可以进入容器查看)
$ firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.17.0.0/16" port protocol="tcp" port="8080" accept"
$ firewall-cmd --reload
# 172.17.0.x 是docker容器默认的IP池, 这里偷懒直接授权ip段了, 可以根据实际情况单独授权IP
# 获取当前服务器 IP
$ Server_IP=`ip addr | grep inet | egrep -v '(127.0.0.1|inet6|docker)' | awk '{print $2}' | tr -d "addr:" | head -n 1 | cut -d / -f1`
$ echo -e "\033[31m 你的服务器IP是 $Server_IP \033[0m"
# http://<Jumpserver_url> 指向 jumpserver 的服务端口, 如 http://192.168.244.144:8080
# BOOTSTRAP_TOKEN 为 Jumpserver/config.yml 里面的 BOOTSTRAP_TOKEN
$ docker run --name jms_coco -d -p 2222:2222 -p 5000:5000 -e CORE_HOST=http://$Server_IP:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN jumpserver/jms_coco:1.5.1
$ docker run --name jms_guacamole -d -p 8081:8081 -e JUMPSERVER_SERVER=http://$Server_IP:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN jumpserver/jms_guacamole:1.5.1
2.4 组件Luna(web终端)配置
# 安装 Web Terminal 前端: Luna 需要 Nginx 来运行访问 访问(https://github.com/jumpserver/luna/releases)下载对应版本的 release 包, 直接解压, 不需要编译
$ cd /opt
$ wget https://github.com/jumpserver/luna/releases/download/1.5.1/luna.tar.gz
# 如果网络有问题导致下载无法完成可以使用下面地址
$ wget https://demo.jumpserver.org/download/luna/1.5.1/luna.tar.gz
$ tar xf luna.tar.gz
$ chown -R root:root luna
2.5 配置nginx
$ rm -rf /etc/nginx/conf.d/default.conf
$ vi /etc/nginx/conf.d/jumpserver.conf
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
$ nginx -t # 确保配置没有问题, 有问题请先解决
$ systemctl start nginx
# 访问 http://192.168.244.144 (注意 没有 :8080 通过 nginx 代理端口进行访问)
# 默认账号: admin 密码: admin 到会话管理-终端管理 接受 coco Guacamole 等应用的注册
# 测试连接
$ ssh -p2222 admin@10.116.72.13
$ sftp -P2222 admin@10.116.72.13 #注意这里是大写字母P
密码: admin
# sftp默认上传的位置在资产的 /tmp 目录下
# windows拖拽上传的位置在资产的 Guacamole RDP上的 G 目录下
2.6 coco和guacamole支持多组件负载
coco /guacamole服务默认运行在单核心下面, 当负载过高时会导致用户访问变慢, 这时可运行多个 docker 容器缓解. 我这里测试没有配置这个,可以参考官方文档配置 http://docs.jumpserver.org/zh/master/setup_by_centos7.html 官方文档处理的已经相当简单。
三、Jumpserver的使用
上面已经配置好了Jumpserver套件,openldap服务,也准备好了跳板机。现在可以配置使用了。jumpserver初始登录账户为admin/admin。进去后将密码修改掉
配置流程,
- 配置CAS/openLDAP认证登录
- 创建管理用户 --> 创建系统用户 --> 创建相应的节点 --> 指定节点创建资产 --> 资产授权 --> 查询用户授权的资产
- 普通用户登录,使用Web终端
3.1 配置OpenLDAP登录认证
openldap有2台服务器镜像模式,不知道这里配置多台的语法结构是什么,先配置了1台。
用户过滤器,根据实际情况配置,我这里将cn修改为了uid(这是我的Ldap目录结构属性)
然后测试连接,提交,并可以一键导入ldap里面的账户。
可以看到除了可以配置CAS/LDAP之外,还可以配置邮件,终端,安全等。根据实际情况配置。
3.2 配置资产
创建管理用户 --> 创建系统用户 --> 创建相应资产的节点 --> 指定节点创建资产 --> 资产授权 --> 查询用户授权的资产
-
管理用户:
linux管理用户使用拥有 NOPASSWD: ALL sudo权限的用户,我这里直接配置root,,可以配置账户密码格式,或者秘钥方式。这里配置密码模式
windows随便配置一个就可以,反正不起作用。
-
系统用户,
这个是用来登录跳板机的账户。可以登录授权的资产。我这里实际情况是使用ldap账户登录,每个人的账户不同需要每个单独都设置,比较麻烦,我们二次开发的版本会自动处理这一步。这里开源版本的配置。登录模式:自动登录,和手动登录。根据需要配置即可
-
配置资产节点,并在相应的节点下创建资产
-
资产授权
授权用户或者用户组具有哪些资产或者节点的权限,才能再用户列表里面查询到相关资产。
-
查询指定用户资产
3.3 普通用户登录
普通用户登录,选择web终端如下,可以登录指定的跳板机,然后可以通过跳板机访问具体的产线服务器。
- windows跳板机同样的操作(也可以全屏)
全屏存在分辨率的问题,可以使用跳板机的<--
重新连接会自动调整分辨率
到这里已经完成了。
四、遇到的问题或者场景
4.1 系统账号录入场景
企业内部LDAP服务很多账号,在运维或者产品开发人员登录服务器一般使用自己的账户,这种情况下需要为每个登录人员单独配置系统用户与资产授权。
在我所处的环境里对Jumpserver进行了二次开发,账户在第一次登陆jumpserver后会自动为该账户添加同名系统账号(工号),并自动加载生成ssh登录的秘钥,私钥导入jumpserver并推送到ssh-agent加载,公钥记录保存(可以API获取)
4.2 windows跳板机复制粘贴问题
这个jumpserver使用是web terminal(Guacamole )解决方案,复制粘贴比较麻烦 CTRL+ Alt + SHIFT 调出剪贴板,将要粘贴到windows跳板机的内容放进去,然后再CTRL+ Alt + SHIFT 隐藏剪贴板,之后可以通过CTRL+v将内容粘贴到windows跳板机。
4.3 windows跳板机不支持windows下的mstsc客户端
由于采用的web terminal(Guacamole )解决方案,windows跳板机不支持windows下的mstsc客户端,只能使用web方式,当然现在可以全屏了,但是分辨率问题也挺曲折。
可以使用跳板机的 <--
重新连接会自动调整分辨率
4.4 从跳板机采用秘钥无密码访问产线服务问题。
登录产线服务器使用的是基于LDAP的账户(各自工号),如果采用ldap保存公钥,那么需要在跳板机上保存一堆的私钥,很危险。员工可能难道别人的私钥。而且我们的秘钥是每天重新生成。这里我们采用的是ssh-agent方案解决的。