首页 > 代码库 > 那就用pthon来写个跳板机吧

那就用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         (ucmd, uCMD),
87         (ulogin, uLogin),
88         (ulogout, uLogout),
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 表结构示例
表结构设计

 

那就用pthon来写个跳板机吧