前些天发现了一个巨牛的人工智能学习网站,内容通俗易懂、风趣幽默,忍不住想分享一下。对人工智能感兴趣的同学可以去看看哦
一、JumpServer堡垒机概述
(1)什么是跳板机
- 跳板机就是一台服务器,开发和运维人员在维护过程中首先要先登录到跳板机上,在通过跳板机登录到目标设备进行运维和操作
- 跳板机的缺点:
跳板机没有实现对开发或运维人员操作行为的控制和审计,使用跳板机的过程中如果出现误操作、违规操作而导致的事故的话,是无法快速定位到原因和责任人的
(2)什么是堡垒机
堡垒机也是一台服务器,在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集、监控网络环境中每一个组成部分(服务器)的系统状态、安全事件、网络活动,以便集中报警、及时处理以及审计定责
可以把堡垒机看作一个升级版的跳板机,跳板机有的功能堡垒机都有并且还多了许多功能,如实时收集、监控网络环境、集中报警等功能
堡垒机的优点:
- 堡垒机可以给其他服务器推送sudo用户,并且为其设置权限
- 堡垒机多了一个用户行为监控的功能,并且是录像!
(3)JumpServer概述
JumpServer是全球首款完全开源的堡垒机,使用GNU GPL v2.0开源协议,是符合4A的专业运维审计系统
JumpServer使用Python\Django开发,遵循Web 2.0规范,配备了业界领先的web Terminal(web终端,即网页终端)解决方案,交互界面美观,用户体验良好
JumpServer采用分布式结构,支持多机房跨区域部署,中心节点提供API(接口),各机房部署登录节点,可以横向扩展,并且没有并发限制
JumpServer为互联网企业提供了认证、授权、审计、自动化运维等功能
JumpServer通过调用各种应用程序的模块来实现各种功能
(4)JumpServer实现的功能
名词 | 含义 |
用户组、用户 | 添加组方便进行授权,用户是授权和登录的主体,用户可以加入用户组,进行批量管理 |
资产组、资产、IDC | 资产就是管理的机器(主机),主机信息简洁完整,用户自定义备注登录,支持自动获取主机的硬件信息,资产同样可以加入资产组,进行批量管理 |
sudo、系统用户、授权规则 | 支持sudo用户授权,系统用户用于登录客户端,授权规则是将用户、资产和系统用户关联起来 |
在线历史、登录历史、命令记录、上传下载记录 | 在线实时监控用户操作,统计用户命令记录,录像回放用户操作内容,阻断控制,详细记录用户上传和下载 |
上传、下载 | 支持文件的上传和下载,实现方式是使用rz(上传)和sz(下载)命令 |
默认设置 | 默认管理用户,设置包括用户密码密钥,默认信息为了方便添加资产而设计 |
- 身份验证Authentication
- 登录认证:资源统一登录和认证、LDAP认证、支持OpenID,实现单点登录
- 多因子认证:MFA(Google Authenticator)
- 账号管理 Account
- 集中账号管理:管理用户管理、系统用户管理
- 统一密码管理:资产密码托管、自动生成密码、密码自动推送、密码过期设置
- 批量密码变更:定期批量修改密码、生成随机密码
- 多云环境的资产纳管:对私有云、公有云资产统一管理
- 授权控制Authorization
资产授权管理:资产树、资产或资产组灵活授权、节点内资产自动继承授权
RemoteApp:实现更细粒度的应用级授权
组织管理:实现多租户管理,权限隔离
多维度授权:可以对用户、用户组或者系统角色授权
指令限制:限制特权指令使用、支持黑白名单
统一文件传输:SFTP文件的上传\下载
文件管理:Web SFTP文件管理
- 安全审计Audit
- 会话管理:在线会话管理、历史会话管理
- 录像管理:linux录像支持、windows录像支持
- 指令审计:指令记录
- 文件传输审计:上传\下载记录审计
(5)JumpServer组件
- JumpServer的主要组件有四个,分别为:jumpserver、Coco、Luna、Guacamole
jumpserver:jumpserver为管理后台,管理人员可以通过Web页面进行资产管理、用户管理、资产授权等操作
Coco:Coco是SSH server和Web Terminal Server(即网页linux客户端),有了Coco用户可以通过使用自己的账号登录SSH或者Web Terminal直接访问被授权的资产,这里登录的是jumpserver的账户,用户登录jumpserver的账户就可以不用密码直接管理账户中授权的资产,新版本的Coco被Koko代替
Luna:Luna是web前端页面,用户使用Web Terminal方式登录所需要的组件
Guacamole:Guacamole是Windows的组件,用户可以通过Web Terminal来连接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 |
(2)部署jumpserver
******(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.
登录jumpserver
右下角可以看到jumpserver的版本号
至此,jumpServer安装完成!!!
(3)部署Web终端(koko和Luna)
******(1)上传软件包进行安装,Luna和Koko,先安装Koko #Luna组件下载地址:https://github.com/jumpserver/luna/releases/download/1.5.2/luna.tar.gz #Koko组件下载地址: https://github.com/jumpserver/koko/releases/download/1.5.2/koko-master-9ab4ea6-linux-amd64.tar.gz (py3) [root@jumpserver ~]# ll 总用量 199368 -rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg -rw-r--r-- 1 root root 7664345 5月 31 2021 jumpserver-master.zip drwxr-xr-x 3 root root 8192 12月 10 2019 jumpserver-packs -rw-r--r-- 1 root root 94928169 5月 31 2021 jumpserver-packs.tar.gz -rw-r--r-- 1 root root 12869702 5月 31 11:57 koko-master-6d4e69b-linux-amd64.tar.gz -rw-r--r-- 1 root root 5414831 5月 31 11:58 luna.tar.gz drwxr-xr-x 2 root root 8192 8月 2 2019 pip-packs -rw-r--r-- 1 root root 60226671 5月 31 2021 pip-packs.tar.gz -rw-r--r-- 1 root root 23010188 5月 31 2021 Python-3.6.8.tgz (py3) [root@jumpserver ~]# tar xf koko-master-6d4e69b-linux-amd64.tar.gz -C /opt/ (py3) [root@jumpserver ~]# chown -R root:root /opt/kokodir/ (py3) [root@jumpserver ~]# cd /opt/kokodir/ (py3) [root@jumpserver kokodir]# cp config_example.yml config.yml (py3) [root@jumpserver kokodir]# vim config.yml #修改密钥要和jumpserver主配置文件中的相同 。。。。。。 8 # 请和jumpserver 配置文件中保持一致,注册完成后可以删除 9 BOOTSTRAP_TOKEN: TDYY6C1tY24iZv6j 10 。。。。。。 27 # 加密密钥 28 SECRET_KEY: Njkc2G6ZTbkmv6SKchQIHnR0ubk29yWyhG0annnef6IHi3xYE 29 。。。。。。 #完毕! (py3) [root@jumpserver kokodir]# ./koko & #把koko放到后台进行 (py3) [root@jumpserver kokodir]# netstat -anpt | grep 2222 #koko监听的端口是2222 tcp6 0 0 :::2222 :::* LISTEN 1624/./koko (py3) [root@jumpserver kokodir]# echo " cd /opt/kokodir && ./koko & " >> /etc/rc.local #加入系统启动脚本 (py3) [root@jumpserver kokodir]# chmod +x /etc/rc.local #添加可执行权限
使用浏览器访问jumpserver,点击终端管理,确认安装成功
******(2)安装Luna,需要安装nginx,做反向代理,并且配置缓存,加速用户访问web终端的速度 (py3) [root@jumpserver kokodir]# cd (py3) [root@jumpserver ~]# tar xf luna.tar.gz -C /opt/ (py3) [root@jumpserver ~]# chown -R root:root /opt/luna/ (py3) [root@jumpserver ~]# yum -y install nginx #也可以使用源码包安装 。。。。。。 完毕! (py3) [root@jumpserver ~]# sed -i "/#/d" /etc/nginx/nginx.conf (py3) [root@jumpserver ~]# sed -i "/^$/d" /etc/nginx/nginx.conf (py3) [root@jumpserver ~]# vim /etc/nginx/nginx.conf #修改nginx的配置文件,直接修改为jumpserver user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; client_max_body_size 100m; #限制录像以及文件上传大小 server_name _; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; 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; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } } (py3) [root@jumpserver ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful (py3) [root@jumpserver ~]# systemctl start nginx (py3) [root@jumpserver ~]# systemctl enable nginx Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
这里没有安装windows的组件guacamole,因为安装后只能通过jumpserver的web客户端来连接windows服务器,不实用。