什么是堡垒机 堡垒机也是一台服务器,在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集、监控网络环境中每一个组成部分(服务器)的系统状态、安全事件、网络活动,以便集中报警、及时处理以及审计定责 可以把堡垒机看作一个升级版的跳板机,跳板机有的功能堡垒机都有并且还多了许多功能,如实时收集、监控网络环境、集中报警等功能 堡垒机的优点:
1 2 堡垒机可以给其他服务器推送sudo用户,并且为其设置权限 堡垒机多了一个用户行为监控的功能,并且是录像
JumpServer概述 JumpServer是全球首款完全开源的堡垒机,使用GNU GPL v2.0开源协议,是符合4A的专业运维审计系统 JumpServer使用Python\Django开发,遵循Web 2.0规范,配备了业界领先的web Terminal(web终端,即网页终端)解决方案,交互界面美观,用户体验良好 JumpServer采用分布式结构,支持多机房跨区域部署,中心节点提供API(接口),各机房部署登录节点,可以横向扩展,并且没有并发限制 JumpServer为互联网企业提供了认证、授权、审计、自动化运维等功能 JumpServer通过调用各种应用程序的模块来实现各种功能
JumpServer实现的功能
身份验证Authentication 登录认证:资源统一登录和认证、LDAP认证、支持OpenID,实现单点登录 多因子认证:MFA(Google Authenticator)
账号管理 Account 集中账号管理:管理用户管理、系统用户管理 统一密码管理:资产密码托管、自动生成密码、密码自动推送、密码过期设置 批量密码变更:定期批量修改密码、生成随机密码 多云环境的资产纳管:对私有云、公有云资产统一管理
授权控制Authorization 资产授权管理:资产树、资产或资产组灵活授权、节点内资产自动继承授权 RemoteApp:实现更细粒度的应用级授权 组织管理:实现多租户管理,权限隔离 多维度授权:可以对用户、用户组或者系统角色授权 指令限制:限制特权指令使用、支持黑白名单 统一文件传输:SFTP文件的上传\下载 文件管理:Web SFTP文件管理
安全审计Audit 会话管理:在线会话管理、历史会话管理 录像管理:linux录像支持、windows录像支持 指令审计:指令记录 文件传输审计:上传\下载记录审计
部署JumpServer堡垒机
(1)实验环境 JumpServer对硬件和软件是有要求的 硬件要求:2个CPU核心,4G内存,50G硬盘,这是最低配置 操作系统:Linux发行版 X86_64位的系统 Python:只可以使用Python3.6.X版本 Mysql:大于等于5.6版本 mariadb:大于等于5.5.56版本 redis 系统 ip地址 Python版本 主机名 Centos7.4 192.168.100.202 桥接网卡 (两块网卡) python3.6.8 jumpserver
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 ******(1)先做基础配置 [root@Centos7 ~]# hostnamectl set-hostname jumpserver [root@Centos7 ~]# su [root@jumpserver ~]# systemctl stop firewalld [root@jumpserver ~]# setenforce 0 setenforce: SELinux is disabled [root@jumpserver ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 mount: /dev/sr0 已经挂载或 /mnt 忙 /dev/sr0 已经挂载到 /mnt 上 [root@jumpserver ~]# vim /etc/yum.repos.d/centos.repo #修改yum源,修改为本地yum源,也可以使用网络yum源进行下载,依赖包很多 [aaa] name=aaa baseurl=file:///mnt enabled=1 gpgcheck=0 [jumpserver] name=jumpserver baseurl=file:///root/jumpserver-packs enabled=1 gpgcheck=0 [root@jumpserver ~]# ll #上传yum库 总用量 92708 -rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg -rw-r--r-- 1 root root 94928169 5月 31 18:48 jumpserver-packs.tar.gz [root@jumpserver ~]# tar xf jumpserver-packs.tar.gz [root@jumpserver ~]# ll 总用量 92720 -rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg drwxr-xr-x 3 root root 8192 12月 10 2019 jumpserver-packs -rw-r--r-- 1 root root 94928169 5月 31 18:48 jumpserver-packs.tar.gz ******(2)上传安装包,进行安装 [root@jumpserver ~]# ll 总用量 181496 -rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg -rw-r--r-- 1 root root 7664345 5月 31 18:51 jumpserver-master.zip drwxr-xr-x 3 root root 8192 12月 10 2019 jumpserver-packs -rw-r--r-- 1 root root 94928169 5月 31 18:48 jumpserver-packs.tar.gz -rw-r--r-- 1 root root 60226671 5月 31 18:51 pip-packs.tar.gz -rw-r--r-- 1 root root 23010188 5月 31 18:52 Python-3.6.8.tgz [root@jumpserver ~]# tar xf pip-packs.tar.gz [root@jumpserver ~]# tar xf Python-3.6.8.tgz -C /usr/local/src/ [root@jumpserver ~]# yum install -y gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel #安装依赖包 。。。。。。 完毕! [root@jumpserver ~]# cd /usr/local/src/Python-3.6.8/ [root@jumpserver Python-3.6.8]# ./configure --prefix=/usr/local/python && make -j 2 && make install #make -j 2表示使用两个cpu进行编译 [root@jumpserver Python-3.6.8]# echo $? 0 [root@jumpserver Python-3.6.8]# ln -s /usr/local/python/bin/* /usr/local/bin/ #优化python命令执行路径 [root@jumpserver Python-3.6.8]# python3 -V #查看python版本 Python 3.6.8 [root@jumpserver Python-3.6.8]# pip3 -V #查看pip版本 pip 18.1 from /usr/local/python/lib/python3.6/site-packages/pip (python 3.6) [root@jumpserver Python-3.6.8]# cd ******(3)配置python3虚拟环境,因为centos6、7自带的python版本是python2,而yum等工具依赖的是python2,所以不能直接把python2换成python3,为了不扰乱原来的环境,可以配置python3的虚拟环境,进入虚拟环境后所有的操作都会在虚拟环境中执行 [root@jumpserver ~]# python3.6 -m venv /opt/py3 #创建虚拟环境 [root@jumpserver ~]# source /opt/py3/bin/activate #进入虚拟环境 (py3) [root@jumpserver ~]# #前面多了(py3)就是进入了虚拟环境 ******(4)安装jumpserver (py3) [root@jumpserver ~]# yum -y install unzip 。。。。。。 完毕! (py3) [root@jumpserver ~]# unzip jumpserver-master.zip -d /opt/ #解压 (py3) [root@jumpserver ~]# cd /opt/ (py3) [root@jumpserver opt]# mv jumpserver-master/ jumpserver #重命名 (py3) [root@jumpserver opt]# cd /opt/jumpserver/requirements/ (py3) [root@jumpserver requirements]# ll 总用量 24 -rw-r--r-- 1 root root 251 7月 26 2019 alpine_requirements.txt -rw-r--r-- 1 root root 212 7月 26 2019 deb_requirements.txt -rw-r--r-- 1 root root 359 7月 26 2019 issues.txt -rw-r--r-- 1 root root 54 7月 26 2019 mac_requirements.txt -rw-r--r-- 1 root root 1551 7月 26 2019 requirements.txt -rw-r--r-- 1 root root 204 7月 26 2019 rpm_requirements.txt (py3) [root@jumpserver requirements]# yum -y install $(cat rpm_requirements.txt) #rpm_requirements.txt里面就是jumpserver所需要的所有rpm包,$(cat rpm_requirements.txt)可以直接全部安装 。。。。。。 完毕! ******(5)安装python库依赖 #安装python库依赖有两种方法,一种是没有网络的环境下安装,一种是有网络的环境下安装 #没有网络的环境下安装:(需要有现成的pip包,一开始已经上传了) (py3) [root@jumpserver requirements]# pip install --no-index --find-links=/root/pip-packs/ pyasn1 six cffi pytest-runner #需要先安装这几个依赖包,--no-index是忽略包索引,不加这个的话会上网络上寻找,--find-links=为指定依赖包的路径,表示直接从这个路径下寻找 。。。。。。 完毕! (py3) [root@jumpserver requirements]# echo $? 0 (py3) [root@jumpserver requirements]# pip install --no-index --find-links=/root/pip-packs/ -r requirements.txt #-r的意思和刚才的$(cat rpm_requirements.txt)相同 。。。。。。 完毕! (py3) [root@jumpserver requirements]# echo $? 0 #在有网络的环境下安装:(修改yum源文件) 默认下载pip指的是国外的源,下载特别慢,但是可以给pip指定国内的源来提升下载速度 (py3) [root@jumpserver ~]# mkdir /root/.pip (py3) [root@jumpserver ~]# vim /root/.pip/pip.conf [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple #这个是清华源 [install] trusted-host=mirrors.aliyun.com (py3) [root@jumpserver ~]# pip install --upgrade pip #安装之前先更新pip版本,不然会报错 (py3) [root@jumpserver ~]# pip install -r requirements.txt ******(6)安装redis,如果有预先部署好的redis可以不用安装,可以使用yum或者源码包来安装 (py3) [root@jumpserver requirements]# yum -y install redis 。。。。。。 完毕! (py3) [root@jumpserver requirements]# systemctl start redis (py3) [root@jumpserver requirements]# systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service. (py3) [root@jumpserver requirements]# echo $? 0 ******(7)安装mysql,如果有预先部署好的mysql可以不用安装,可以使用yum安装mariadb或者源码安装mysql (py3) [root@jumpserver requirements]# yum -y install mariadb mariadb-devel mariadb-server 。。。。。。 完毕! (py3) [root@jumpserver requirements]# systemctl start mariadb (py3) [root@jumpserver requirements]# systemctl enable mariadb Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service. (py3) [root@jumpserver requirements]# echo $? 0 ******(8)创建jumpserver数据库并且授权用户 (py3) [root@jumpserver requirements]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.64-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database jumpserver default charset 'utf8'; #创建jumpserver库默认字体为utf8 Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by 'jumpserver'; #授权用户 Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; #更新权限 Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> exit Bye ******(9)生成密钥,生成的两串随机数待会会用到 (py3) [root@jumpserver requirements]# cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo #/dev/urandom是一个数据流,也就是随机数,默认里面是乱码,所以需要筛选,tr -dc A-Za-z0-9就是筛选字母大小写和数字的,head -c 49;echo也就是输出49个随机数 Njkc2G6ZTbkmv6SKchQIHnR0ubk29yWyhG0annnef6IHi3xYE (py3) [root@jumpserver requirements]# cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 ; echo #和上面同理 TDYY6C1tY24iZv6j ******(10)修改jumpserver配置文件,配置文件是python格式的,不能使用tab要使用空格隔开 (py3) [root@jumpserver requirements]# cd /opt/jumpserver/ (py3) [root@jumpserver jumpserver]# cp config_example.yml config.yml (py3) [root@jumpserver jumpserver]# vim config.yml 。。。。。。 3 # $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo 4 SECRET_KEY: Njkc2G6ZTbkmv6SKchQIHnR0ubk29yWyhG0annnef6IHi3xYE #中间都有空格 5 6 # SECURITY WARNING: keep the bootstrap token used in production secret! 7 # 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制 8 BOOTSTRAP_TOKEN: pehtn3wIVSIuSK1v 9 。。。。。。 35 DB_ENGINE: mysql 36 DB_HOST: 127.0.0.1 37 DB_PORT: 3306 38 DB_USER: jumpserver 39 DB_PASSWORD: jumpserver #注意密码、用户、数据库名称要和刚才数据库中的操作相同 40 DB_NAME: jumpserver 41 。。。。。。 #下面还可以修改redis配置,这里直接使用默认配置了 49 # Redis配置 50 REDIS_HOST: 127.0.0.1 51 REDIS_PORT: 6379 52 # REDIS_PASSWORD: #保存退出 ******(11)生成数据表结构和初始化数据 (py3) [root@jumpserver jumpserver]# cd /opt/jumpserver/utils/ (py3) [root@jumpserver utils]# sh make_migrations.sh (py3) [root@jumpserver utils]# echo $? 0 ******(12)运行jumpserver并且配置系统启动脚本 (py3) [root@jumpserver utils]# cd /opt/jumpserver/ (py3) [root@jumpserver jumpserver]# ./jms start all #可以加-d放到后台运行,但是需要确保已经载入python3的虚拟环境CTRL+C退出,直接编写启动脚本就可以,jumpserver默认监听端口为8080 (py3) [root@jumpserver jumpserver]# vim /usr/lib/systemd/system/jms.service [Unit] Description=jms After=network.target mariadb.service redis.service docker.service Wants=mariadb.service redis.service docker.service [Service] Type=forking Environment="PATH=/opt/py3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" ExecStart=/opt/jumpserver/jms start all -d ExecRestart=/opt/jumpserver/jms restart all -d ExecStop=/opt/jumpserver/jms stop [Install] WantedBy=multi-user.target (py3) [root@jumpserver jumpserver]# systemctl daemon-reload (py3) [root@jumpserver jumpserver]# systemctl start jms #开启jumpserver服务 #启动有点慢 (py3) [root@jumpserver jumpserver]# netstat -anpt | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1389/python3.6 (py3) [root@jumpserver jumpserver]# systemctl enable jms Created symlink from /etc/systemd/system/multi-user.target.wants/jms.service to /usr/lib/systemd/system/jms.service.