基于SQLAlchemy实现的堡垒机

堡垒机

堡垒机是一种运维安全审计系统。主要的功能是对运维人员的运维操作进行审计和权限控制。同时堡垒机还有账号集中管理,单点登陆的功能。

堡垒机的实现我们主要采用paramiko和SQLalchemy,可以参考前面的paramiko博客。

堡垒机实现的流程

  1. 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码),堡垒机服务器创建jumpserver.py的主程序文件,修改用户家目录 ./bashrc: /usr/bin/python   jumperserverPATH/jumpserver.py;logout
  2. 用户登陆堡垒机,输入堡垒机用户名密码,首先会执行jumpserver.py这个主程序。这个程序会直接打印出:ip列表,用户列表,主机列表。代表用户可以选择以什么什么登录哪台主机
  3. 当用户选择机器之后,系统自动输入用户名和密码,进行登录和相关操作。jumperserver会记录用户所有的操作。

表结构

jumperserver中在用户登录上来之后,会直接显示出来用户的可以一什么身份,登录哪台服务器的一个列表,这里面一系列对应关系。我们用SQLALchemy的ORM框架来解决。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import paramiko
import sys
import os
import socket
import getpass
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index, Table, DateTime, Boolean, Enum
from sqlalchemy import or_, and_
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
from sqlalchemy.sql import func
# from sqlalchemy_utils import ChoiceType  # 需要安装sqlalchemy_utils这个组件
from paramiko.py3compat import u

# 首先建库,并且让mysql给权限登录
engine = create_engine("mysql+pymysql://root:[email protected]:3306/s14?charset=utf8", max_overflow=5, )
Base = declarative_base()  # 创建orm的基类

class Group(Base):  # 主机组
    __tablename__ = ‘group‘
    group_id = Column(Integer, primary_key=True, autoincrement=True)
    group_name = Column(String(32), nullable=False, unique=True)

class Host(Base):  # 主机和主机组,是一对多关系:即一个主机必须属于一个组
    __tablename__ = ‘host‘
    host_id = Column(Integer, primary_key=True, autoincrement=True)
    host_ip = Column(String(32), nullable=False, unique=True)
    hostname = Column(String(255), nullable=False, unique=True)
    port = Column(String(32), nullable=False)
    group_id = Column(Integer, ForeignKey(‘group.group_id‘), nullable=False)
    re_group_id = relationship(‘Group‘, backref=‘a‘)

class UserFile(Base):  # 用户表
    __tablename__ = ‘user_file‘
    user_id = Column(Integer, primary_key=True, autoincrement=True)
    user_name = Column(String(32), nullable=False, unique=True)
    gender = Column(Enum(‘male‘, ‘female‘), server_default=‘male‘)  # 让用户选择只能输入其中一个
    password = Column(String(32), nullable=False)

class UserToGroup(Base):  # 用户和主机组的关系表,多对多:一个用户可以属于多个主机组,一个主机组可以有多个用户
    __tablename__ = ‘user_to_group‘
    HU_id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey(‘user_file.user_id‘), nullable=False)
    group_id = Column(Integer, ForeignKey(‘group.group_id‘), nullable=False)
    __table_args__ = (
        UniqueConstraint(‘user_id‘, ‘group_id‘),
    )  # 为了减少错误,我们这里使用联合唯一索引
    re_group_id = relationship(‘Group‘, backref=‘b‘)
    re_user_id = relationship(‘UserFile‘, backref=‘c‘)

class RemoteUserFile(Base):  # 主机用户
    __tablename__ = ‘remote_user_file‘
    user_id = Column(Integer, primary_key=True, autoincrement=True)
    user_name = Column(String(32), nullable=False, unique=True)
    password = Column(String(32), nullable=False)
    # AuthTypes = [
    #     (‘p‘, ‘SSH/Password‘),
    #     (‘r‘, ‘SSH/KEY‘)
    # ]
    # auth_type = Column(ChoiceType(AuthTypes))
    auth_type = Column(Enum(‘SSH/Password‘, ‘SSH/KEY‘), default=‘SSH/Password‘)

class RemoteUserToHost(Base):  # 主机用户和主机的关系表,多对多的关系:一个主机可以有多个主机用户,一个用户有多个主机
    __tablename__ = ‘remote_user_to_host‘
    RH_id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey(‘remote_user_file.user_id‘), nullable=False)
    host_id = Column(Integer, ForeignKey(‘host.host_id‘), nullable=False)
    __table_args__ = (
        UniqueConstraint(‘user_id‘, ‘host_id‘),
    )
    re_user_id = relationship(‘RemoteUserFile‘, backref=‘d‘)
    re_host_id = relationship(‘Host‘, backref=‘e‘)

class AuditLog(Base):
    __tablename__ = ‘audit_log‘
    audit_id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey(‘user_file.user_id‘), nullable=False)
    remote_user_id = Column(Integer, ForeignKey(‘remote_user_file.user_id‘), nullable=False)
    host_id = Column(Integer, ForeignKey(‘host.host_id‘), nullable=False)
    cmd = Column(String(65535))
    handle_time = Column(DateTime, server_default=func.now())
    # server_default表示交给数据库处理,default表示交给程序处理

    re_user_id = relationship(‘UserFile‘, backref=‘f‘)
    re_remote_user_id = relationship(‘RemoteUserFile‘, backref=‘g‘)
    re_host_id = relationship(‘Host‘, backref=‘h‘)

Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

  

表结构设计需要注意的几个点:

1, 多对多和一对多关系的设计

2, 联合唯一索引的使用

3, ENUM让用户选择输入其中一个

4, nullable=False之后用户依然可以输入空值,但是不能输入NULL,注意区别

记录用户操作

时间: 2024-08-25 20:17:39

基于SQLAlchemy实现的堡垒机的相关文章

基于Docker搭建Jumpserver堡垒机操作实践

一.背景 笔者最近想起此前公司使用过的堡垒机系统,觉得用的很方便,而现在的公司并没有搭建此类系统,想着以后说不定可以用上:而且最近也有点时间,因此来了搭建堡垒机系统的兴趣,在搭建过程中参考了比较多的文档,其中最详细的还是官方文档,地址如下所示: Jumpserver 文档 二.操作概要 1. 系统运行 2. 配置入门 3. 测试验证 三.系统运行 在官方文档中安装堡垒机有很多种方法,这让笔者有些纠结,另外而且在不同系统中安装方法也不一致,不过正在徘徊不定时,发现一种通用的安装方法,便是采用doc

哗啦啦Python之路 - sqlalchemy/paramiko/堡垒机

I. SQLalchemy联表操作 1. 一对多 class Group(Base): # 一对多的表,组中可能包含多个用户 __tablename__ = 'group' nid = Column(Integer, primary_key=True, autoincrement=True) caption = Column(String(32)) class User(Base): __tablename__ = 'user' uid = Column(Integer, primary_key

python SQLAlchemy 堡垒机

SQLALchemy ORM db first 数据库操作类 code first 类操作数据库 1.自定义生成表 class 类(base): 列1  列2 根据类去创建表 2.使用类操作表 以后通过类和对象操作数据库 pramiko 堡垒机 ORM 连表 一对多 1.创建表,主动指定外键约束 2.操作 类:repr 单表 连表 session.query(表1).join(表2).all() 多对多 1.创建表,额外的关系表 2.filter() == int_( 都可以是另外一个查询) 3

基于python的堡垒机

一.堡垒机的概念 堡垒机,也称为跳板机,多用于系统运维环境中.指的是在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络活动,以便集中报警.及时处理及审计定责. 从功能上分析,它综合了核心系统运维和安全审计管控两大主要功能:从技术实现上分析,它通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的访问.形象地说,终端计算机对目标的访问,均需要

python之实现基于paramiko和mysql数据库的堡垒机

一.堡垒机结构 堡垒机执行流程: 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码) 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表 用户选择服务器,并自动登陆 执行操作并同时将用户操作记录 注:配置.brashrc实现ssh登陆后自动执行脚本,如:/usr/bin/python /home/wupeiqi/menu.py 二.实现过程 步骤一,实现用户登陆 import getpass user = raw_input('username:') pwd

运维堡垒机---基于paramiko模块

话不多说,有图为证,主要是表达能力问题,呵呵.... 简单描述: 堡垒机一般都独立出来,单独部署,通俗点说就是跳板机,中控机. 须通过堡垒机才能连接到远程目的ip. 堡垒机将某用户的所有操作都记录在案----堡垒机的意义 一,流程图描述的功能已经非常清楚了 用户须先登陆堡垒机,然后能完成下面3个功能 1,单台机器登陆--->所有操作入库 2,批量机器执行命令--->所有操作入库 3,查看操作记录 二,堡垒机的意义(自己理解): 1,操作简单化,运维人员再也不用记服务器的username/pas

文成小盆友python-num13 整个堡垒机

本节主要内容: 1.pymsql的使用 2.SQLAchemy使用 3.Paramiko 4.通过ORM功能使用和Paramiko的使用实现一个简单的堡垒机模型. 一.pymsql的使用 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装: pip3 install pymysql 使用 1.执行SQL # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(host='

堡垒机的简单应用

堡垒机的定义: 即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络活动,以便集中报警.及时处理及审计定责. 堡垒机的功能: 账号管理 设备支持统一账户管理策略,能够实现对所有服务器.网络设备.安全设备等账号进行集中管理 完成对账号整个生命周期的监控 对设备进行特殊角色设置如:审计巡检员.运维操作员.设备管理员等自定义设置,以满足审计需求 账号登陆 支持对X11.linux.unix.数

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123') ssh