1.Jumpserver簡介
JumpServer 是全球首款完全開源的堡壘機, 使用 GNU GPL v2.0 開源協議, 是符合 4A 的專業運維審計系統。
JumpServer 使用 Python / Django 進行開發, 遵循 Web 2.0 規范, 配備了業界領先的 Web Terminal 解決方案, 交互界面美觀、用戶體驗好。
JumpServer 采納分布式架構, 支持多機房跨區域部署, 中心節點提供 API, 各機房部署登錄節點, 可橫向擴展、無並發訪問限制。
JumpServer 現已支持管理 SSH、 Telnet、 RDP、 VNC 協議資產。
更多詳細信息,請參考官方地址:https://docs.jumpserver.org/zh/master/
1.特色優勢
- 開源: 零門檻,線上快速獲取和安裝;
- 分布式: 輕松支持大規模並發訪問;
- 無插件: 僅需瀏覽器,極致的 Web Terminal 使用體驗;
- 多雲支持: 一套系統,同時管理不同雲上面的資產;
- 雲端存儲: 審計錄像雲端存儲,永不丟失;
- 多租戶: 一套系統,多個子公司和部門同時使用。
2.功能列表
2.JumpServer的部署
我這里按照容器化的方式進行部署演示,其他部署方式可以參考官方文檔https://docs.jumpserver.org/zh/master/install/docker_install/
jumpserver容器化部署,主要分為三個部分,mysql數據庫的容器化部署,redis的容器化部署,jumpserver容器的啟動。為了更好的部署,保證數據的安全和服務的性能,一般建議就是mysql,redis,jumpserver分開部署,不部署在一台機器上。我這里為了演示方便,就把三個服務部署到一台機器上,其實我選擇容器化部署的原因就是,可以在一台服務器進行部署,互不影響,jumpserver鏡像集成了所需要的組件, 支持使用外置 Database 和 Redis。不用像非容器化部署一樣,還需要安裝一堆依賴組件。
1.環境要求
硬件配置: 2個CPU核心, 4G 內存, 50G 硬盤(最低) 操作系統: Linux 發行版 x86_64 Python = 3.6.x Mysql Server ≥ 5.6 Mariadb Server ≥ 5.5.56 Redis
提前在服務器上安裝好docker環境,可以參考我的其他文章,這里就不介紹了。
2.部署mysql容器服務
#從上面的環境要求我們看出,jumpserver依賴的外置數據庫服務有版本要求,我們這里從官方容器倉庫中直接拉取mysql5.7版本的鏡像。
[root@jumpserver-no ~]# docker pull mysql:5.7 #我們在宿主機上准備好mysql的配置文件和數據存放目錄,后面mysql容器啟動的時候直接掛載宿主機目錄,使數據保存在宿主機,實現數據和容器的分離,
可以在容器運行異常時,可以再啟動一個新的容器直接使用宿主機的數據,從而保證業務的正常運行。
[root@jumpserver-no ~]# mkdir /iflytek/mysql/mysql.conf.d -pv [root@jumpserver-no ~]# mkdir /iflytek/mysql/conf.d -p [root@jumpserver-no ~]# mkdir /iflytek/mysql/data [root@jumpserver-no mysql]# cat /iflytek/mysql/mysql.conf.d/mysqld.cnf # Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, # as published by the Free Software Foundation. # # This program is also distributed with certain software (including # but not limited to OpenSSL) that is licensed under separate terms, # as designated in a particular file or component or in included license # documentation. The authors of MySQL hereby grant you an additional # permission to link the program and your derivative works with the # separately licensed software that they have included with MySQL. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License, version 2.0, for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [root@jumpserver-no mysql]# cat /iflytek/mysql/conf.d/mysql.cnf [mysql] default-character-set=utf8 #啟動Mysql容器,掛載上面准備好的配置文件和數據存放目錄。然后通過-e MYSQL_ROOT_PASSWORD指定啟動的mysql的root密碼
[root@jumpserver-no ~]# docker run -it -d -p 3306:3306 -v /iflytek/mysql/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /iflytek/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf -v /iflytek/mysql/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="Liu@2020" mysql:5.7 9c7b2bc71c84137b10430d9f0e41f80ec63997e65390e1a64160dffcef853c64 #安裝mysql客戶端,測試訪問容器數據庫是否正常
[root@jumpserver-no mysql]# yum install mysql-client [root@jumpserver-no mysql]# mysql -uroot -pLiu@2020 -h172.31.242.80 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.31 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) #驗證數據庫的字符編碼是否符合要求,jumpserver要求數據庫字符編碼為utf8,不然后面web顯示可能會有問題 mysql> show global variables where variable_name like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) #創建jumpserver數據庫,並指定字符編碼 mysql> create database jumpserver default charset 'utf8' collate 'utf8_bin'; Query OK, 1 row affected (0.00 sec) #創建jumpserver訪問用戶,並賦權。 mysql> grant all on jumpserver.* to 'jumpserver'@'%' identified by 'Liu@2020'; Query OK, 0 rows affected, 1 warning (0.00 sec)
#驗證jumpserver用戶授權是否成功
[root@jumpserver-no mysql]# mysql -ujumpserver -pLiu@2020 -h172.31.242.80 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.31 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | jumpserver | +--------------------+ 2 rows in set (0.00 sec)
3.部署redis容器服務
#直接從官方倉庫拉取redis鏡像,並啟動
[root@jumpserver-no ~]# docker pull redis:4.0.14 [root@jumpserver-no ~]# docker run -it -d -p 6379:6379 redis:4.0.14 9cb2b24d2008a541635dc5f9fd21b843cb3c6e04517192ab7442e4eea9d66521 #安裝redis,並測試訪問redis容器服務,這里還可以設置一個redis的數據庫密碼,我這里就沒設了,設不設問題不大,不過為了安全建議設
[root@jumpserver-no ~]# yum install redis -y [root@jumpserver-no ~]# redis-cli -h 172.31.242.80 172.31.242.80:6379> info # Server redis_version:4.0.14 redis_git_sha1:00000000 .......
4.生成隨機加密秘鑰和初始化token
#我這里通過腳本直接生成。
[root@jumpserver-no ~]# cat random_encryption.sh #/bin/bash if [ ! "$SECRET_KEY" ]; then SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`; echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc; echo $SECRET_KEY; else echo $SECRET_KEY; fi if [ ! "$BOOTSTRAP_TOKEN" ]; then BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`; echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc; echo $BOOTSTRAP_TOKEN; else echo $BOOTSTRAP_TOKEN; fi [root@jumpserver-no ~]# bash random_encryption.sh Ty79C2b0CUgYHVDI6nog9hx0Mx55skIXP4piiSHtY1KKtD8Vt6 tFG4SfQae8L0Fzwn
5.部署jumpserver容器服務
#從網上直接拉取最新的jumpserver鏡像
[root@jumpserver-no ~]# docker pull jumpserver/jms_all:latest [root@jumpserver-no ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 718a6da099d8 2 days ago 448MB jumpserver/jms_all latest 6e51b94ef54d 2 days ago 1.48GB redis 4.0.14 191c4017dcdd 3 months ago 89.3MB centos/mysql-57-centos7 latest f83a2938370c 10 months ago 452MB
#通過鏡像,啟動jumpserver
[root@jumpserver-no ~]# docker run --name PL_jumpserver -d \
> -v /iflytek/jumpserver:/opt/jumpserver/data/media \
> -p 80:80 \
> -p 2222:2222 \
> -e SECRET_KEY=Ty79C2b0CUgYHVDI6nog9hx0Mx55skIXP4piiSHtY1KKtD8Vt6 \ #這里填的是上面生成的秘鑰
> -e BOOTSTRAP_TOKEN=tFG4SfQae8L0Fzwn \ #這里上面生成的Token
> -e DB_HOST=172.31.242.80 \ #指定mysql服務的地址,因為我這里是本機,所以直接填本機地址就可以了,如果是在別的機器部署的mysql,就填mysql所在地址就可以了
> -e DB_PORT=3306 \ #mysql開發的端口號
> -e DB_USER=jumpserver \ #對數據庫上的jumpserver數據庫有權限的用戶
> -e DB_PASSWORD=Liu@2020 \ #上面用戶的密碼
> -e DB_NAME=jumpserver \ #指定在mysql上的數據庫名。
> -e REDIS_HOST=172.31.242.80 \ #redis服務的地址
> -e REDIS_PORT=6379 \ #redis開放的端口號
> -e REDIS_PASSWORD= \ #redis數據庫密碼,因為我上面沒有設密碼,所以我這里直接為空就可以了,如果設了密碼,就輸入密碼就行了
> jumpserver/jms_all:latest
afbd6023d8c0c4bd8a269cd4bbd998d409f76f71608ad5d112f26f9460841eed
啟動完之后。我們進入數據庫,驗證數據庫內容,看jumpserver數據是否寫入到數據庫中的。
[root@jumpserver-no ~]# mysql -uroot -pLiu@2020 -h 172.31.242.80 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 65 Server version: 5.7.31 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use jumpserver; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------------------------------------+ | Tables_in_jumpserver | +----------------------------------------------+ | applications_databaseapp | | applications_remoteapp | | assets_adminuser | | assets_asset | | assets_asset_labels | | assets_asset_nodes | | assets_assetgroup | | assets_authbook | | assets_cluster | | assets_commandfilter | | assets_commandfilterrule | | assets_domain | | assets_favoriteasset |
至此,服務部署完成,如果想看容器日志信息的話可以執行下面的命令
[root@jumpserver-no ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afbd6023d8c0 jumpserver/jms_all:latest "./entrypoint.sh" 33 seconds ago Up 32 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:2222->2222/tcp PL_jumpserver 9cb2b24d2008 redis:4.0.14 "docker-entrypoint.s…" 52 minutes ago Up 52 minutes 0.0.0.0:6379->6379/tcp suspicious_fermi 9c7b2bc71c84 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp lucid_hypatia [root@jumpserver-no ~]# docker logs -f afbd6023d8c0
。。。。。
2020-08-07 13:52:56 Collect static files
2020-08-07 13:53:00 Collect static files done
guacd[136]: INFO: Guacamole proxy daemon (guacd) version 1.2.0 started
Starting guacd: SUCCESS
Tomcat started.
Jumpserver ALL v2.1.1
官網 http://www.jumpserver.org
文檔 http://docs.jumpserver.org
有問題請參考 http://docs.jumpserver.org/zh/docs/faq.html
進入容器命令 docker exec -it jms_all /bin/bash
下面我們可以訪問web界面進行使用了
3.Jumpserver管理員的使用
1.Jumpserver的登錄
2.在使用Jumpserver過程中的一些名詞解釋
用戶:用戶是授權和登陸jumpserver的主體,將來為每個員工建立一個賬戶,用來登錄跳板機, 將資產授權給該用戶,查看用戶登陸記錄命令歷史等。
用戶組:多個用戶可以組合成用戶組,為了方便進行授權,可以將一個部門或幾個用戶 組建成用戶組,在進行授權中使用組授權,該組中的用戶擁有所有授權的主機權限。
資產:資產通常是我們的服務器、網絡設備等,將資產授權給用戶,用戶則會有權限登 錄資產,執行命令等。
管理賬戶:添加資產時需要添加一個管理賬戶,該賬戶是該資產上已有的有管理權限的用戶, 如root,或者有 NOPASSWD: ALL sudo權限的用戶,該管理賬戶用來向資產推送系統用戶, 為系統用戶添加sudo,獲取資產的一些硬件信息。(簡單的講就這用戶就是服務器上的管理員用戶,列如root)
資產組:同用戶組,是資產組成的集合,為了方便授權。
Sudo:這里的sudo其實是Linux中的sudo命令別名,一個sudo別名包含多個命令, 系統用戶關聯sudo就代表該系統用戶有權限sudo執行這些命令。
系統用戶:系統用戶是服務器上建立的一些真實存在的可以ssh登陸的用戶,如 dev, sa, dba等,系統用戶可使用jumpserver推送到服務器上,也可以利用自己公司 的工具進行推送,授權時將用戶、資產、系統用戶關聯起來則表明用戶有權限登陸該資產的這個系統用戶,比如用戶小明 以 dev系統用戶登錄 172.16.1.1資產, 簡單理解就是 將某個資產在進行授權給某個用戶(這里的用戶是上面的第一個用戶的概念)后,該資產上一個非root的用戶的賬號(也就是系統用戶)和這個jumpserver登錄用戶關聯了,jumpserver用戶登錄進資產后不是通過jumpserver用戶名進行登錄的,而是這個所謂系統用戶進行登錄的。
推送系統用戶:添加完系統用戶,需要推送,推送操作是使用ansible,把添加的系統用戶和系統用戶管理的sudo,推送到資產上,具體體現是在資產上useradd該系統用戶,設置它的key,然后設置它的sudo,為了讓用戶可以登錄它。
授權規則:授權規則是將資產系統用戶和用戶關聯起來,用來完成授權。 這樣用戶就可以以某個系統用戶賬號登陸資產。大家對這好像不是很理解,其實也是對系統用戶, 用戶這里沒有搞清楚。我們可以把用戶當做虛擬的用戶,而系統用戶是真實再服務器上存在的用戶, 系統用戶可以使用jumpserver推送,也可以自己手動建立,但是推送的過程一定要有,哪怕是模擬 推送(不選擇秘鑰和密碼推送,如網絡設備),因為添加授權規則會檢查推送記錄。為了簡化理解, 我們暫時 以 用戶 資產 系統用戶 來理解,暫時不考慮組,添加這樣的規則意思是 授權 用戶 在這個資產上 以這個系統用戶來登陸, 系統用戶是一組具有通用性,具有sudo的用戶, 不同的用戶授權不同的 系統用戶,比如 dba可能有用數據庫的sudo權限。
日志審計:分為以下5個方式:1)在線:查看當前在線的用戶(非web在線),可以監控用戶的命令執行,強制結束用戶 登錄;2)實時監控:實時監控用戶的操作;3)登錄歷史:查看以往用戶的登錄歷史,可以查看用戶登陸操作的命令,可以回放用戶 執行命令的錄像;4)命令記錄:查看用戶批量執行命令的歷史,包含執行命令的主機,執行的命令,執行的結果;5)上傳下載:查看用戶上傳下載文件的記錄。
3.創建相關用戶,資產並進行相關授權操作
創建jumpserver登錄用戶
創建管理員用戶
創建系統用戶
創建資產
資產授權
4.普通用戶的相關登錄使用
1.web界面的相關使用
上面的一系列步驟做完之后,我們就可以通過jumpserver用戶進行登錄了。我們這里拿剛剛創建的ceshi2用戶進行示范。登錄之后我們看到下面的界面
一般用戶通過web界面登錄進服務器后,因為登錄進的系統用戶只是一般用戶,所以有時候很多命令不能執行,操作起來也不方便,所以一般我們會通過sudo su的命令臨時切換到root用戶進行操作。不過sudo su一般需要你輸入當前用戶的密碼,也就是現在系統用戶的密碼,但是一般不建議把系統用戶密碼外泄。所以我們在把服務器納入jumpserver管理的之前,一般會在服務器上已root執行一下如下腳本。
#/bin/bash chmod u+w /etc/sudoers sed -i '/^root/a\ZF-USER ALL=(ALL) NOPASSWD: ALL' /etc/sudoers chmod u-w /etc/sudoers
這樣我們就可以通過sudo su免秘鑰切換到root用戶(這里可能會有用戶會問,root用戶操作不是不安全嗎?對,可能是不安全,但是這個不安全是相對的,以前的話,如果別人已root用戶操作,造成系統故障,可能都找不到操作人,但現在不一樣,你如果想切換到root用戶操作,你只能通過jumpserver登錄后進到資產中進行切換,這樣做到任何操作有跡可循,不泄漏系統用戶密碼的原因是,防止用戶繞過jumpserver直接登錄服務器進行root用戶切換)
這里還有用戶可能會問,我們通過瀏覽器web界面的方式登錄資產服務器是沒問題啊,但是我經常要傳輸文件到服務器上,web界面的方式怎么傳輸文件到服務器。我們看下面的步驟,解決了我們的問題
2.xshell的相關使用
有人習慣用xshell黑窗口看日志,還有當傳大文件到服務器上的時候,就不建議通過web的方式傳文件。而是推薦xshell的方式,jumpserver提供這樣的方式,確保堡壘機已經安裝coco組件(容器部署的默認安裝了此組件),具體如下: