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 [email protected]
$ sftp -P2222 [email protected] #注意這裏是大寫字母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方案解決的。