那就用pthon来写个跳板机吧

1、需求

程序一:
1、后台管理
- 堡垒机上创建用户和密码(堡垒机root封装的类,UserProfile表)
- .bashrc
/usr/bin/python3 /data/bastion.py
exit

2、后台管理
- 服务器上创建用户和密码 或 公钥上传
- 服务器账号 -> 人 关联

程序二:
3、用户登录

- ssh 堡垒机用户名@堡垒机IP
- 获取当前用户 os.environ[‘USER‘]
- 获取当前用户的主机列表
- 获取选中的主机下的所有用户
- 选择任何一个用户

2、实现思路

堡垒机执行流程:

  1. 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
  2. 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
  3. 用户选择服务器,并自动登陆
  4. 执行操作并同时将用户操作记录

注:配置.brashrc实现ssh登陆后自动执行脚本,如:/usr/bin/python /home/wupeiqi/menu.py

那么需要用到的点:

  1. 1、使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。
  2. 2、paramiko模块,基于SSH用于连接远程服务器并执行相关操作。

具体实现流程:

  1. 设计表机构
  2. 创建表结构
  3. 利用paramiko模块去实现跳板机底层的ssh连接并执行相关操作
  4. 将底层的连接封装成跳板机用户对指定主机组和用户的操作并记录日志

3、表结构设计

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4 from sqlalchemy import create_engine, and_, or_, func, Table
 5 from sqlalchemy.ext.declarative import declarative_base
 6 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, DateTime
 7 from sqlalchemy.orm import sessionmaker, relationship
 8
 9 Base = declarative_base()  # 生成一个SqlORM 基类
10
11
12 class Host(Base):
13     __tablename__ = ‘host‘
14     id = Column(Integer, primary_key=True, autoincrement=True)
15     hostname = Column(String(64), unique=True, nullable=False)
16     ip_addr = Column(String(128), unique=True, nullable=False)
17     port = Column(Integer, default=22)
18
19
20 class HostUser(Base):
21     __tablename__ = ‘host_user‘
22     id = Column(Integer, primary_key=True, autoincrement=True)
23     username = Column(String(64), unique=True, nullable=False)
24     AuthTypes = [
25         (‘p‘, ‘SSH/Password‘),
26         (‘r‘, ‘SSH/KEY‘),
27     ]
28     auth_type = Column(String(16))
29     cert = Column(String(255))
30
31     host_id = Column(Integer, ForeignKey(‘host.id‘))
32
33     __table_args__ = (
34         UniqueConstraint(‘host_id‘, ‘username‘, name=‘_host_username_uc‘),
35     )
36
37
38 class Group(Base):
39     __tablename__ = ‘group‘
40     id = Column(Integer, primary_key=True, autoincrement=True)
41     name = Column(String(64), unique=True, nullable=False)
42
43
44 class UserProfile(Base):
45     __tablename__ = ‘user_profile‘
46     id = Column(Integer, primary_key=True, autoincrement=True)
47     username = Column(String(64), unique=True, nullable=False)
48     password = Column(String(255), nullable=False)
49
50
51 class Group2UserProfile(Base):
52     __tablename__ = ‘group_2_user_profile‘
53     id = Column(Integer, primary_key=True, autoincrement=True)
54     user_profile_id = Column(Integer, ForeignKey(‘user_profile.id‘))
55     group_id = Column(Integer, ForeignKey(‘group.id‘))
56     __table_args__ = (
57         UniqueConstraint(‘user_profile_id‘, ‘group_id‘, name=‘ux_user_group‘),
58     )
59
60
61 class Group2HostUser(Base):
62     __tablename__ = ‘group_2_host_user‘
63     id = Column(Integer, primary_key=True, autoincrement=True)
64     host_user_id = Column(Integer, ForeignKey(‘host_user.id‘))
65     group_id = Column(Integer, ForeignKey(‘group.id‘))
66     __table_args__ = (
67         UniqueConstraint(‘group_id‘, ‘host_user_id‘, name=‘ux_group_host_user‘),
68     )
69
70
71 class UserProfile2HostUser(Base):
72     __tablename__ = ‘user_profile_2_host_user‘
73     id = Column(Integer, primary_key=True, autoincrement=True)
74     host_user_id = Column(Integer, ForeignKey(‘host_user.id‘))
75     user_profile_id = Column(Integer, ForeignKey(‘user_profile.id‘))
76     __table_args__ = (
77         UniqueConstraint(‘user_profile_id‘, ‘host_user_id‘, name=‘ux_user_host_user‘),
78     )
79
80
81 class AuditLog(Base):
82     __tablename__ = ‘audit_log‘
83     id = Column(Integer, primary_key=True, autoincrement=True)
84
85     action_choices2 = [
86         (u‘cmd‘, u‘CMD‘),
87         (u‘login‘, u‘Login‘),
88         (u‘logout‘, u‘Logout‘),
89     ]
90     action_type = Column(String(16))
91     cmd = Column(String(255))
92     date = Column(DateTime)
93     user_profile_id = Column(Integer, ForeignKey(‘user_profile.id‘))
94     host_user_id = Column(Integer, ForeignKey(‘host_user.id‘))
95
96 表结构示例

表结构设计

时间: 2024-10-21 20:22:00

那就用pthon来写个跳板机吧的相关文章

shell 写登录跳板机

准备3台机器 1.linux-node1  ip:10.89.3.108 (跳板机) 2.weblamp      ip:10.89.3.100 3.weblnmp      ip:10.89.3.101 3台系统环境如下: [[email protected] ~]$ cat /etc/redhat-release  CentOS release 6.8 (Final) 1)首先做好SSH密钥验证 在所有的3台机器上执行下面操作  [[email protected] ~]#useradd j

自己写的简单跳板机

#!/bin/basha="192.168.0.200"b="192.168.0.203" #改变键盘键位,不允许使用ctrl+c/ctrl+v等命令中指脚本trapper(){  trap ":" INT EXIT TSTP TERM HUP} while :dotrapperclearcat <<menu1) web $a 2) web $b 3) exitmenu        read -p "please inpu

Shell实现跳板机,为什么用跳板机

整理自:http://blog.chinaunix.net/uid-22101889-id-3167454.html 注意:请谨慎使用,到现在为止,使用了,我还没找到改回去的方法. 1.     问题 第一.很多大公司的服务器都不允许直接登录,而是通过一个跳板机才能登录过去.在跳板机中,通常只能执行几个少数命令(如SSH),而其他命令是不允许执行的,那么怎样才能实现这个功能呢? 第二.一些小公司,由于服务器比较少,不需要什么跳板机之类的说法,公司的开发运维人员加起来也就那么十几二十人,通常大家都

跳板机定期改密码脚本

很早写的,最近别人问过一次,贴出来吧. #!/bin/bash # source /etc/profile &>/dev/null basedir=$(cd `dirname $0`;pwd) nowmonth=`date +%m` nowday=`date +%d` email="$basedir/email/sendemail.sh" function GaiMiMa() { user="$1" passwd=$(/usr/bin/mkpasswd

常见企业IT支撑【6、跳板机Jumpserver】

Jumpserver是国内一款开源的轻便的跳板机系统,他们的官网:http://www.jumpserver.org/ 使用这款软件意在提高公司内部登录生产环境服务器的便捷性,权限分配细化,以及后台管理的可视化,审计日志的WEB化.本文档参考http://bbs.jumpserver.org/read/285.html的使用说明,以及相关安装文档而修订 环境要求 生产服务器的网络只打到这台跳板机 我使用centos 7.1版本安装 8核8G内存40G硬盘 使用办公内网服务器10.40.150.9

jmeter连接配置带跳板机(SSH)的mysql服务器

jmeter连接配置mysql服务器时,如果数据库服务器没有通过ssh连接,则只需要配置相应的jdbc参数就可以了,即请求域名或ip地址:3306,如果数据库服务器是通过SSH连接的,那需要通过中间远程连接工具来登录,此处使用的远程连接工具为Putty,配置的时候需要将数据库的ssh->tunnel中的请求域名先映射到本地3306的端口(一般mysql的请求端口设置为3306,只是符合大众流~~~),然后通过ssh的服务器ip及端口来访问,具体的配置请参考如下: 1.首先,下载并打开Putty喽

centos7安装jumpserver3.0跳板机

Jumpserver是一款由python编写, Django开发的开源跳板机/堡垒机系统, 助力互联网企业高效 用户.资产.权限.审计 管理.jumpserver实现了跳板机应有的功能,基于ssh协议来管理,客户端无需安装agent.Jumpserver特点:1)完全开源,GPL授权 2)Python编写,容易再次开发 3)实现了跳板机基本功能,身份认证.访问控制.授权.审计 .批量操作等.4)集成了Ansible,批量命令等 5)支持WebTerminal 6)Bootstrap编写,界面美观

跳板机是什么

跳板机是什么?跳板机是运维堡垒主机的另个称呼.作为技术或者运维人员应该不会陌生.企业为了服务器的安全,通常所有的ssh连接都是通过跳板机来完成,以便于对ssh连接进行验证和管理.跳板机有哪些作用? 跳板机的安全作用,之前的"运维堡垒主机是什么?有什么作用?"文中曾有详细介绍.跳板机在攻击者手中还有其他的作用: 1.塞满服务器的硬盘 通常,如果服务器可以没有限制地执行写操作,攻击者可以通过发送垃圾邮件.构造大量的错误信息.向匿名FTP塞垃圾文件等方式塞满服务器的硬盘.跳板机就成为了塞满硬

ssh远程登陆脚本(带跳板机)

mac自带的终端不太好用,被推荐了一个iterm2的终端替代工具,确实比自带的终端好用不少.下面记录下通过脚本一键远程登录的过程: 下载地址:http://m4.pc6.com/xuh3/iTerm2.zip 首先,准备好登陆脚本 #!/usr/bin/expect -f set user xxx set host 127.0.0.1 set port 22 #如果是默认端口可以不指定 set password xxx set timeout -1 spawn ssh -p $port [ema