28.1 堡垒机介绍

什么是堡垒机

堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态、安全事件、网络活动,以便集中报警、及时处理及审计定责。

其从功能上讲,它综合了核心系统运维和安全审计管控两大主干功能,从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的访问。形象地说,终端计算机对目标的访问,均需要经过运维安全审计的翻译。打一个比方,运维安全审计扮演着看门者的工作,所有对网络设备和服务器的请求都要从这扇大门经过。因此运维安全审计能够拦截非法访问,和恶意攻击,对不合法命令进行命令阻断,过滤掉所有对目标设备的非法访问行为,并对内部人员误操作和非法操作进行审计监控,以便事后责任追踪。

我们也把堡垒机称为跳板机,简易的跳板机功能简单,核心功能是远程登录服务器和日志审计,但堡垒机还有资产管理(CMDB)、监控及用户权限等功能。目前比较优秀的开源软件有Jumpserver、Teleport、GateOne、CrazyEye等;商业的堡垒机功能更为强大,有齐治、Citrix XenApp等。

搭建简易的堡垒机

接下来我们尝试搭建一个简易的堡垒机,主要功能是登录内网的服务器和日志审计。

搭建堡垒机的条件是,该机器有公网ip和内网ip,其中内网和其他机器互通。

设计堡垒机的思路:

  1. 对该机器做安全限制:端口限制、登录限制(SSH)、用户和命令限制;
  2. 客户机日志审计。
  • 下载安装jailkit实现chroot:
[root@lzx ~]# cd /usr/local/src/
[root@lzx src]# wget https://olivier.sessink.nl/jailkit/jailkit-2.19.tar.bz2
[root@lzx src]# tar jxvf jailkit-2.19.tar.bz2
[root@lzx src]# cd jailkit-2.19
[root@lzx jailkit-2.19]# ./configure
[root@lzx jailkit-2.19]# echo $?
0
[root@lzx jailkit-2.19]# make && make install
[root@lzx jailkit-2.19]# echo $?
0
  • 创建虚拟系统根目录:
[root@lzx jailkit-2.19]# mkdir /home/jail         //作为虚拟系统根目录
[root@lzx jailkit-2.19]# jk_init -v -j /home/jail/ basicshell       //shell相关命令、库文件
[root@lzx jailkit-2.19]# jk_init -v -j /home/jail/ editors        //vi及vim等编辑器
[root@lzx jailkit-2.19]# jk_init -v -j /home/jail/ netutils        //网络相关
[root@lzx jailkit-2.19]# jk_init -v -j /home/jail/ ssh          //SSH登录相关,这几步是将常用命令复制到 /home/jail 中
  • 添加测试用户:
[root@lzx jailkit-2.19]# useradd zhangsan
[root@lzx jailkit-2.19]# passwd zhangsan
Changing password for user zhangsan.
New password:             //设置密码123456,后面需要登录
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@lzx jailkit-2.19]# mkdir /home/jail/usr/sbin
[root@lzx jailkit-2.19]# cp /usr/sbin/jk_lsh /home/jail/usr/sbin/jk_lsh       //拷贝虚拟系统shell
[root@lzx jailkit-2.19]# jk_jailuser -m -j /home/jail/ zhangsan       //创建虚拟系统中用户
[root@lzx jailkit-2.19]# cd /home/jail/
[root@lzx jail]# ll
total 0
lrwxrwxrwx 1 root root   7 Oct  3 23:03 bin -> usr/bin
drwxr-xr-x 2 root root  44 Oct  3 23:04 dev
drwxr-xr-x 2 root root 240 Oct  3 23:04 etc
drwxr-xr-x 3 root root  22 Oct  3 23:12 home
lrwxrwxrwx 1 root root   9 Oct  3 23:03 lib64 -> usr/lib64
drwxr-xr-x 7 root root  70 Oct  3 23:09 usr
[root@lzx jail]# cat etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/usr/sbin/jk_lsh        //上面创建的虚拟系统用户
[root@lzx jail]# vim !$        //修改为下面内容
vim etc/passwd

root:x:0:0:root:/root:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash         //修改为/bin/bash才能登录该虚拟系统用户
  • 使用xshell登录该虚拟用户:

堡垒机介绍-LMLPHP

堡垒机介绍-LMLPHP

堡垒机介绍-LMLPHP

成功登录后,我们查看一下

[zhangsan@lzx ~]$ ls
[zhangsan@lzx ~]$ ll /
bash: ll: command not found
[zhangsan@lzx ~]$ ls -l /
total 0
lrwxrwxrwx 1 root root   7 Oct  4 03:03 bin -> usr/bin
drwxr-xr-x 2 root root  44 Oct  4 03:04 dev
drwxr-xr-x 2 root root 240 Oct  4 03:25 etc
drwxr-xr-x 3 root root  22 Oct  4 03:12 home
lrwxrwxrwx 1 root root   9 Oct  4 03:03 lib64 -> usr/lib64
drwxr-xr-x 7 root root  70 Oct  4 03:09 usr
[zhangsan@lzx ~]$           //这里按两下Tab键
Display all 116 possibilities? (y or n)
!          command    elif       gunzip     more       sh         typeset
./         compgen    else       gzip       mv         shift      ulimit
:          complete   enable     hash       popd       shopt      umask
[          compopt    esac       help       printf     sleep      unalias
[[         continue   eval       history    pushd      source     unset
]]         coproc     exec       if         pwd        ssh        until
alias      cp         exit       in         read       suspend    vi
bash       cpio       export     jobs       readarray  sync       vim
bg         date       false      kill       readonly   tar        wait
bind       dd         fc         let        return     test       wget
break      declare    fg         ln         rm         then       while
builtin    dirs       fgrep      local      rmdir      time       zcat
caller     disown     fi         logout     rsync      times      {
case       do         for        ls         scp        touch      }
cat        done       function   mapfile    sed        trap
cd         echo       getopts    mkdir      select     true
chmod      egrep      grep       mktemp     set        type           //这些就是该虚拟用户所能执行的命令
  • 限定SSH登录:
[root@lzx jail]# vim /etc/ssh/sshd_config       //做下面修改
PasswordAuthentication yes         改为       PasswordAuthentication no       //不允许密码登录
  • 添加防火墙规则:
[root@lzx jail]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT        //打开22端口
  • 限定登录ip:
[root@lzx jail]# vim /etc/hosts.allow
sshd: 192.168.100.0/24 1.1.1.1 2.2.2.2          //类似这样限制登录的ip
[root@lzx jail]# vim /etc/hosts.deny
sshd: ALL           //除了上面允许的可以登录,其他所有均不允许登录

接下来还要做日志审计功能,这一步需要我们在所有被登陆的机器上操作。

这里我让lzx作为跳板机,lzx1作为客户机,在lzx1上操作。

[root@lzx1 ~]# vim /etc/hosts.allow
sshd:192.168.100.150
[root@lzx1 ~]# vim /etc/hosts.deny
sshd:ALL
[root@lzx1 ~]# mkdir /usr/local/records
[root@lzx1 ~]# chmod 777 !$
chmod 777 /usr/local/records
[root@lzx1 ~]# chmod +t !$          //增加防删除权限,类似/tmp目录
chmod +t /usr/local/records

[root@lzx1 ~]# vim /etc/profile       //添加下面内容
 if [ ! -d  /usr/local/records/${LOGNAME} ]
then
mkdir -p /usr/local/records/${LOGNAME}         //根据登录名创建同名子文件夹
chmod 300 /usr/local/records/${LOGNAME}        //赋予300权限
fi
export HISTORY_FILE="/usr/local/records/${LOGNAME}/bash_history"         //指定记录命令历史的文件
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'       //具体记录命令历史的格式

再用xshell连接一下这台机器

[root@lzx1 ~]# ls /usr/local/records/
root        //已经有root用户的登录记录
[root@lzx1 ~]# ls /usr/local/records/root/
bash_history
[root@lzx1 ~]# cat /usr/local/records/root/bash_history
2018-10-04 00:34:30 ##### root pts/1 (192.168.100.1) #### reboot

[root@lzx1 ~]# w
 00:36:53 up 33 min,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.100.1    00:16   13.00s  0.02s  0.02s -bash
root     pts/1    192.168.100.1    00:34    5.00s  0.00s  0.00s w
[root@lzx1 ~]# ls
anaconda-ks.cfg
[root@lzx1 ~]# cat /usr/local/records/root/bash_history
2018-10-04 00:34:30 ##### root pts/1 (192.168.100.1) #### reboot
2018-10-04 00:36:53 ##### root pts/1 (192.168.100.1) #### w
2018-10-04 00:36:57 ##### root pts/1 (192.168.100.1) #### ls       //这边马上就有记录
  • 在lzx1上创建新用户,然后通过lzx登录该用户:

lzx1上创建用户

[root@lzx1 ~]# useradd lisi
[root@lzx1 ~]# passwd lisi
Changing password for user lisi.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

lzxSSH登录lzx1上该用户

[root@lzx jail]# ssh lisi@192.168.100.160
The authenticity of host '192.168.100.160 (192.168.100.160)' can't be established.
ECDSA key fingerprint is SHA256:teKu3atU+OByPeXXD2xXhyb30vg6nW8ETqqCr785Dbc.
ECDSA key fingerprint is MD5:13:a4:f1:c0:1f:62:65:d4:f4:4e:42:ab:40:f1:36:60.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.160' (ECDSA) to the list of known hosts.
lisi@192.168.100.160's password:
[lisi@lzx1 ~]$ ls
[lisi@lzx1 ~]$ w
 00:40:50 up 37 min,  3 users,  load average: 0.02, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.100.1    00:16    2.00s  0.03s  0.01s ssh lisi@192.168.100.
root     pts/1    192.168.100.1    00:34    3:54   0.00s  0.00s -bash
lisi     pts/2    192.168.100.150  00:40    2.00s  0.00s  0.00s w
[lisi@lzx1 ~]$ ls /usr/local/records/
lisi  root
[lisi@lzx1 ~]$ cd /usr/local/records/lisi/
[lisi@lzx1 lisi]$ ls
ls: cannot open directory .: Permission denied         //这里是无法读取内容的,只有300权限

lzx1上查看命令历史记录

[root@lzx1 ~]# cat /usr/local/records/lisi/bash_history
2018-10-04 00:40:46 ##### lisi pts/2 (192.168.100.160) ####
2018-10-04 00:40:49 ##### lisi pts/2 (192.168.100.160) #### ls
2018-10-04 00:40:50 ##### lisi pts/2 (192.168.100.160) #### w
2018-10-04 00:41:16 ##### lisi pts/2 (192.168.100.160) #### ls /usr/local/records/
2018-10-04 00:41:30 ##### lisi pts/2 (192.168.100.160) #### cd /usr/local/records/lisi/
2018-10-04 00:41:31 ##### lisi pts/2 (192.168.100.160) #### ls

这里就简单是实现了堡垒机的功能,但是这种方法是不完美的,也是可以破解的。我们想要实现比较完善的堡垒机功能,还是需要借助一些专门的工具或软件。


28.2 Jumpserver

Jumpserver介绍

官网:http://www.jumpserver.org/ ,安装文档:http://docs.jumpserver.org/zh/docs/step_by_step.html

jumpserver是一款使用Python、Django开发的开源跳板机系统,可以实现认证、授权、审计及自动化运维功能,助力企业高效用户、资产、权限、审计管理。它是完全开源的,我们可以针对它来进行二次开发,实现更多的功能。

jumpserver采纳分布式架构,支持多机房跨区域部署,中心节点提供 API,各机房部署登录节点,可横向扩展、无并发限制。

功能:

Auth统一认证
CMDB资产管理
日志审计
自动化运维(ansible)

安装Jumpserver

  • 下载安装脚本:
[root@lzx ~]# wget https://raw.githubusercontent.com/jumpserver/Dockerfile/mysql/get.sh         //下载安装脚本
[root@lzx ~]# ls
anaconda-ks.cfg  get.sh
[root@lzx ~]# cat get.sh         //脚本内容其实和安装文档基本一致,这个脚本是在docker容器中运行jumpserver,同时可对Windows机器进行资产管理
#!/bin/bash
# coding: utf-8
# Copyright (c) 2018
# Gmail: liuzheng712
#

set -e

echo "0. 系统的一些配置"
setenforce 0 || true
systemctl stop iptables.service || true
systemctl stop firewalld.service || true

localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
echo 'LANG=zh_CN.UTF-8' > /etc/locale.conf

echo "1. 安装基本依赖"
{
yum update -y && yum install epel-release -y && yum update -y && yum install wget zip unzip epel-release nginx sqlite-devel xz gcc automake zlib-devel openssl-devel redis mariadb mariadb-devel mariadb-server supervisor -y
} || {
echo "yum出错,请更换源重新运行"
exit 1
}
cd /opt/

echo "2. 准备python"
{
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz -O /opt/Python-3.6.1.tar.xz
} || {
echo "pyhton 依赖包下载出错,请尝试使用特殊工具进行手工下载https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz ,并且放至于/opt/Python-3.6.1.tar.xz,如您是手工下载,请注释上面wget命令再运行本脚本"
exit 1
}

{
tar xf Python-3.6.1.tar.xz  && cd Python-3.6.1 && ./configure && make && make install
} || {
echo "解压或编译python出错,请尝试使用上面的命令手工解压或编译,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}
{
python3 -m venv /opt/py3
} || {
echo "建立python虚拟环境出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}
cd /opt/

echo "3. 下载包并解压"
{
wget https://github.com/jumpserver/jumpserver/archive/1.0.0.zip -O /opt/jumpserver.zip
} || {
echo "下载jumpserver包出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}
{
wget https://github.com/jumpserver/coco/archive/1.0.0.zip -O /opt/coco.zip
} || {
echo "下载coco包出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}
{
wget https://github.com/jumpserver/luna/releases/download/v1.0.0/luna.tar.gz -O /opt/luna.tar.gz
} || {
echo "下载luna包出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}
cd /opt
{
unzip coco.zip && mv coco-1.0.0 coco && unzip jumpserver.zip && mv jumpserver-1.0.0 jumpserver && tar xzf luna.tar.gz
} || {
echo "解压出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}

echo "4. 安装yum依赖"
{
yum -y install $(cat /opt/jumpserver/requirements/rpm_requirements.txt) && yum -y install $(cat /opt/coco/requirements/rpm_requirements.txt)
} || {
echo "安装jumpserver的依赖出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}

echo "5. 安装pip依赖"
{
source /opt/py3/bin/activate && pip install --upgrade pip && pip install -r /opt/jumpserver/requirements/requirements.txt &&  pip install -r /opt/coco/requirements/requirements.txt
} || {
echo "安装jumpserver的依赖出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}
echo "6. 创建数据库"
mkdir -p /opt/mysql/share/mysql/
{
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/mysql_security.sql?raw=true -O /opt/mysql/mysql_security.sql
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/mysql.cnf?raw=true -O /etc/my.cnf
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/errmsg.sys?raw=true -O /opt/mysql/share/mysql/errmsg.sys
} || {
echo "下载数据库依赖文件出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}

echo "7. 准备文件"
{
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/nginx.conf?raw=true -O /etc/nginx/nginx.conf
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/supervisord.conf?raw=true -O /etc/supervisord.conf
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/jumpserver_conf.py?raw=true -O /opt/jumpserver/config.py
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/coco_conf.py?raw=true -O /opt/coco/conf.py
wget https://github.com/jumpserver/Dockerfile/blob/mysql/alpine/start_jms.sh?raw=true -O /opt/start_jms.sh
} || {
echo "下载配置文件出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}

echo "8. 配置nginx"
cat << EOF > /etc/nginx/conf.d/jumpserver.conf
server {
    listen 80;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location /luna/ {
        try_files $uri / /index.html;
        alias /opt/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/;  # 如果coco安装在别的服务器,请填写它的ip
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /guacamole/ {
        proxy_pass       http://localhost:8081/;  # 如果guacamole安装在别的服务器,请填写它的ip
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        access_log off;
    }

    location / {
        proxy_pass http://localhost:8080;  # 如果jumpserver安装在别的服务器,请填写它的ip
    }
}

EOF

mkdir -p /opt/nginx/log && chmod -R 777 /opt/nginx
{
systemctl restart nginx
systemctl enable nginx
} || {
service restart nginx
} || {
nginx -s reload
} || {
echo "请检查nginx的启动命令"
exit 1
}

echo "jumpserver安装完成,请运行/opt/start_jms.sh启动jumpserver"

echo "下面开始安装windows组件guacamole,如果不需要管理windows资产,可以取消继续安装"

echo "9. 安装docker"
yum check-update
{
curl -fsSL https://get.docker.com/ | sh
} || {
echo "安装docker 出错,请尝试手工执行,如手工操作成功,请注释上述代码再运行本脚本"
exit 1
}

systemctl start docker
systemctl enable docker

echo "10. 安装guacamole"
host_ip=`python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"`

docker run --name jms_guacamole -d \
  --restart always \
  -p 8081:8080 -v /opt/guacamole/key:/config/guacamole/key \
  -e JUMPSERVER_KEY_DIR=/config/guacamole/key \
  -e JUMPSERVER_SERVER=http://$host_ip:8080 \
  registry.jumpserver.org/public/guacamole:1.0.0
[root@lzx ~]# sh get.sh         //执行安装脚本,这个过程时间比较长
[root@lzx ~]# echo $?
0
  • 启动jumpserver:
[root@lzx ~]# cd /opt/
[root@lzx opt]# sh start_jms.sh          //启动jumpserver,建议放到后台执行

登录jumpserver

  • 登录:

输入堡垒机IP进入jumpserver,输入账号(admin)、密码(admin)登录

堡垒机介绍-LMLPHP

进来之后,显示为这样

堡垒机介绍-LMLPHP

  • 修改密码:

点击Administrator–>个人信息–>重置密码

堡垒机介绍-LMLPHP

重置完密码之后需要重新登录

  • 基本设置:

点击系统设置,直接在基本设置这里,填入堡垒机IP,点击提交

堡垒机介绍-LMLPHP

  • 邮箱设置:

点击邮件设置,填入对应邮箱的SMTP主机、端口、账号和密码(授权码)

堡垒机介绍-LMLPHP

点击测试,会发送一封邮件到邮箱账号,如果能接收到,说明邮箱设置没问题

堡垒机介绍-LMLPHP

这些设置需要手动重启一下jms服务才能生效。

创建管理用户

管理用户是服务器的root,或拥有 NOPASSWD: ALL sudo权限的用户,Jumpserver使用该用户来 推送系统用户获取资产硬件信息等。

点击资产管理–>管理用户–>创建管理用户

堡垒机介绍-LMLPHP

指定用户名为jump,生成密钥对

[root@lzx ~]# cd .ssh/
[root@lzx .ssh]# ssh-keygen -f jump        //-f 指定密钥对名字
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):         //直接回车
Enter same passphrase again:           //直接回车
Your identification has been saved in jump.
Your public key has been saved in jump.pub.
The key fingerprint is:
SHA256:RKNvYt4C6LS3D9BRUOUy4GZZWiMtS1xe0tPlotbVR0M root@lzx
The key's randomart image is:
+---[RSA 2048]----+
|   .+=Oo=. .. .E.|
|   .+X.Bo... . ..|
|   .Bo= o.. o . .|
|   =.. = o o   . |
|  + o o S .      |
| o o + =         |
|  o o o .        |
|   . o .         |
|    ...          |
+----[SHA256]-----+
[root@lzx .ssh]# ls
authorized_keys  jump  jump.pub

我们要的是私钥,将私钥复制粘贴到一个文本文档,导入

[root@lzx .ssh]# cat jump
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsT/iVUC2flWb2nDCb2EIb09f6qd9fvS9XcszH5nnKfgKeoJj
Er1AnPa8phRmWXUmWIujK+88FMa6AmFxPIJTkhI8TVbO0yMiAum692KcHy8oSnMd
3Sml/ZFTN/x4/6qCQo/GeTq2uD/peahSOvnKUSnapmsT2rQA2d7A11y/AfPd+mh0
eVygm3k1drABdvgPigX2Gmv+P8fA7v20Oww4Kc2egk/33YVg4DlXcT56fzzlxNpP
t3qd3z7/0+QJEInm++phRdYlzDkEsw81/HuAMmF2dCRfCLaOwryxxoczaxcqToX7
3z6spq1u/SsSFHS9hBcKBv1yzjbihqUOKPMIBQIDAQABAoIBABSiGCnOb7ADLTJf
f/LRO9chSUwalTxLJyQc/GWIV+WFz0p1lSzgRP5AprM6mrN9NKqIDsWVgsv0WkDe
sPzXOv09DDIAkfD4HQRzyuTzYLMsnScVgXt2VrFO0n4o8LjqU2GGNRd1o0GNhxM3
aeMdotSR57cJrfT+kT7LdG1diYqjdA4kYFL3KHb427oUths2k0sV15LzucTbMrtv
2/HQYfYZNwacMP7UTXP44TLzPlby/4/gmDmR/eel634Q5EWDkLBUejc5xbyN9z6Y
0nmmEssa7ZHyyF0BljawIXWB+qAuaq3dn1+A5vmSDH+2Wjh4YiZsEKl7AMM9EBjo
3OtNxcECgYEA5ca0poPIrgF/fP30+5iu7oPISR1NmSbPXMOZDLz7fvRMQr13fgkE
KwhJ2GoM5siaAY+/UqcO8HGcvI58HUdHO5TZknEpbWlo338ZuGyXBns7Tuy2FE+U
FrXPVDiC0OqcbhGpKBM7KkGtsmp7vy5X9QayakpqxGCFK5RY8cG3mHECgYEAxXqG
YywOlL2RVmOTUdeNMo1VYLj0wtV9a/d+2Uz+x0lUwhZp0iY0ORbXmTUmmCuARyKc
WBizo7WEXAk6Em3keHfFY4/IxkRr0bJDGn0Mj2uXA8MmIrs3gFRj6hmhMDIf1hme
VnXdpFZmt9l+TO6MXsLHrc/Yb7zKvHvyL6itUtUCgYEA2ioFggikNNrFQlcaEPyS
M3K6avlAoUZhInGw0pBotcycz813NBq5c2ZGPw3KPCGBYDQs8vwdShyFNd6PZ3ky
4BZfUhTRwcmQwou6TwoDhyrgT/qeksBQGhP7y7pwMo5fgn6QPrWrul5r3ngOEKKe
7s2x/wuzPctrBcqvfLNyb3ECgYEAg9aV65WZMnIQmpUl4EjAqlQzALzaI0z2S+NS
m25M1e0+Gclu4m7BBLAcRdt3JbY9EMCpkiMDozLm5679Rxp4oniLnjl69+rr9HZH
WGLNxN42VrutNRi6KAGvJrXvp8Z+/KfjzqMn0rQgJXOdX20O56CwQHj3bTmkPAuf
l3PMKvUCgYA09+rycOzqDF/eawtByzkRD6OaEliIiqXhdBntK6n6NxJB1++uL9F2
5WPW7KAFWdz/pNjYJ7LDLJeN8WWBJSvMS/v1a9PSRp7xal8i/853mqIbGZMLMwQC
Trdyy1Vq37zZjqiCy5LXoyUJ+4zCRGaSbxU0RHA7srIh/iJlm+i0iw==
-----END RSA PRIVATE KEY-----

堡垒机介绍-LMLPHP

堡垒机介绍-LMLPHP

点击提交后提示 jump 创建成功。

堡垒机介绍-LMLPHP

之后需要到客户机上创建用户jump,并复制堡垒机上的公钥到authorized_keys文件中

[root@lzx .ssh]# cat jump.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxP+JVQLZ+VZvacMJvYQhvT1/qp31+9L1dyzMfmecp+Ap6gmMSvUCc9rymFGZZdSZYi6Mr7zwUxroCYXE8glOSEjxNVs7TIyIC6br3YpwfLyhKcx3dKaX9kVM3/Hj/qoJCj8Z5Ora4P+l5qFI6+cpRKdqmaxPatADZ3sDXXL8B8936aHR5XKCbeTV2sAF2+A+KBfYaa/4/x8Du/bQ7DDgpzZ6CT/fdhWDgOVdxPnp/POXE2k+3ep3fPv/T5AkQieb76mFF1iXMOQSzDzX8e4AyYXZ0JF8Ito7CvLHGhzNrFypOhfvfPqymrW79KxIUdL2EFwoG/XLONuKGpQ4o8wgF root@lzx

lzx1(客户机)上操作

[root@lzx1 ~]# useradd jump
[root@lzx1 ~]# su - jump
[jump@lzx1 ~]$ mkdir .ssh
[jump@lzx1 ~]$ vim .ssh/authorized_keys        //添加下面内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxP+JVQLZ+VZvacMJvYQhvT1/qp31+9L1dyzMfmecp+Ap6gmMSvUCc9rymFGZZdSZYi6Mr7zwUxroCYXE8glOSEjxNVs7TIyIC6br3YpwfLyhKcx3dKaX9kVM3/Hj/qoJCj8Z5Ora4P+l5qFI6+cpRKdqmaxPatADZ3sDXXL8B8936aHR5XKCbeTV2sAF2+A+KBfYaa/4/x8Du/bQ7DDgpzZ6CT/fdhWDgOVdxPnp/POXE2k+3ep3fPv/T5AkQieb76mFF1iXMOQSzDzX8e4AyYXZ0JF8Ito7CvLHGhzNrFypOhfvfPqymrW79KxIUdL2EFwoG/XLONuKGpQ4o8wgF root@lzx
[jump@lzx1 ~]$ chmod 700 .ssh/
[jump@lzx1 ~]$ chmod 400 .ssh/authorized_keys

测试堡垒机是否可以通过私钥登录lzx1(客户机)

[root@lzx .ssh]# ssh -i jump jump@192.168.100.160        //登录lzx1
The authenticity of host '192.168.100.160 (192.168.100.160)' can't be established.
ECDSA key fingerprint is SHA256:teKu3atU+OByPeXXD2xXhyb30vg6nW8ETqqCr785Dbc.
ECDSA key fingerprint is MD5:13:a4:f1:c0:1f:62:65:d4:f4:4e:42:ab:40:f1:36:60.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.160' (ECDSA) to the list of known hosts.
Last login: Fri Oct  5 04:24:14 2018
[jump@lzx1 ~]$           //说明没问题。上面如果提示输入密码登录则说明不成功

这样,我们jumpserver的管理用户jump就创建成功了。以后,每增加一台新机器,都需要在新机器增加用户jump,同时将公钥复制到authorized_keys文件中。

创建普通用户

普通用户就是用来登录jumpserver浏览器界面的用户,或者用命令行方式登录堡垒机的用户。

首先需要创建一个用户组 运维 ,用户管理–>用户组–>创建用户组

堡垒机介绍-LMLPHP

用户管理–>用户列表–>创建用户,创建一个普通用户 zhangsan

堡垒机介绍-LMLPHP

点击提交,会发送一封邮件到刚指定的邮箱,是重置密码的链接

这里我没有收到邮件,不知道是因为我用的同一个邮箱地址的关系,还是因为没有在jumpserver的配置文件中配置好。不过不要紧,我们可以直接在用户列表中选择 zhangsan,点击更新,重新自定义输入密码

堡垒机介绍-LMLPHP
堡垒机介绍-LMLPHP

假如邮箱配置没问题,可以直接在用户列表下点击zhangsan,进入用户详情,重新发送重置密码邮件或者密钥邮件

堡垒机介绍-LMLPHP

这样,不管用户是忘记密码、忘记密钥或忘记密钥密码都是可以解决的。

添加机器

资产管理不仅仅是linux服务器,还包括了Windows服务器,以及路由器和交换机。

资产管理–>资产列表,左侧是资产树,右击可以新建、删除、更改树节点,授权资产也是以节点方式组织的,右侧是属于该节点下的资产。

右键点击ROOT(0),新建树节点Linux、Windows

堡垒机介绍-LMLPHP

选中Linux节点,点击创建资产,关联刚创建的管理用户jump

堡垒机介绍-LMLPHP

点击提交

堡垒机介绍-LMLPHP

因为关联了管理用户jump,所以lzx1上也必须有这个用户,在之前我们已经创建了该用户,我们还需要给这个用户sudo的权限。

[jump@lzx1 ~]$ logout
[root@lzx1 .ssh]# visudo           //添加下面一行
jump    ALL=(ALL)     NOPASSWD: ALL

然后点击lzx1,进入资产详情,右侧点击刷新可以更新硬件信息,这就是通过jump用户来抓取的。

堡垒机介绍-LMLPHP

除了这样创建以外,我们还可以按照模板批量地导入资产,而不必这样一个一个去创建。

添加系统用户并授权

添加完机器后,还需要添加系统用户,系统用户是 Jumpserver跳转登录资产时使用的用户,可以理解为登录资产用户。

系统用户创建时,如果选择了自动推送 Jumpserver会使用ansible自动推送系统用户到资产中,如果资产(交换机、windows)不支持ansible, 请手动填写账号密码。 目前还不支持Windows的自动推送。

资产管理–>系统用户–>创建系统用户
堡垒机介绍-LMLPHP

自动推送会在资产中自动生成该用户,创建之后点击zhangsan进入系统用户详情,这里也可以手动去推送及测试连通性

堡垒机介绍-LMLPHP

添加授权规则

权限管理–>资产授权,选中Linux节点,点击创建权限规则

堡垒机介绍-LMLPHP

点击提交,到这里我们相当于完成了设置的步骤。

接下来就是测试能否使用系统用户直接登录到lzx1上,先切换到用户界面

堡垒机介绍-LMLPHP

堡垒机介绍-LMLPHP

点击Web终端,会打开一个新页面

堡垒机介绍-LMLPHP

正常情况下,这里会显示登陆后的命令行,可以看到,我没有登陆上lzx1这个资产,说明实验过程中还是有问题。另外登录这一步还可以通过xshell来登录查看。

可能的原因有三个:

  1. 第一这是jumpserver的最新版本,可能有些bug,之前的0.3.2的版本我也用过,一些设置发生了改变,之前版本有的在新版本中没有位置进行设置,也是我了解不够,后续仍需要花时间了解一下新版本。
  2. 第二就是安装脚本可能存在一些问题,实验过程中,浏览器界面老是崩掉,提示nginx错误,需要我不断地刷新才可能正常,这说明jumpserver的启动脚本可能存在问题。
  3. 第三是我实验过程的配置存在问题,导致最终结果没有出来。后面有机会的话,我会按照安装文档来进行安装实验,再来一次。

更多资料参考:
v0.5.0 应用图解
Centos6.9 安装最新版本jumpserver
Jumpserver的搭建

10-06 10:26