作业需求:
1. 所有的用户操作日志要保留在数据库中
2. 每个用户登录堡垒机后,只需要选择具体要访问的设置,就连接上了,不需要再输入目标机器的访问密码
3. 允许用户对不同的目标设备有不同的访问权限,例:
对10.0.2.34 有mysql 用户的权限
对192.168.3.22 有root用户的权限
对172.33.24.55 没任何权限
4. 分组管理,即可以对设置进行分组,允许用户访问某组机器,但对组里的不同机器依然有不同的访问权限
思路解析:
1. 用户操作日志要保留在数据库中,通过课堂学习对paramiko源码进行修改,在demons/interactive.py 63行中获取用户操作,并将操作记录到数据库中。
2. 后面的需求使用数据库,建立多对多关联,反向取主机IP,主机密码,对应的堡垒机用户,并划分组内用户权限 ,具体使用sqlalchemy模块对数据库表进行操作。
3. 针对作业需求,程序添加了查看日志功能,并准许默认用户root查看所有用户操作,其他用户只能查自己下面机器的日志。
4. 添加了缓存redis减少了数据库IO操作。
paramiko 用户操作记录源码:
cmd =[]whileTrue:
r, w, e= select.select([chan, sys.stdin], [], []) # 默认阻塞if chan inr: # 连接建立好了,channle过来有数据了,try:
x= u(chan.recv(1024)) # 尝试收数据if len(x) == 0: # 收数据收不到,
sys.stdout.write('\r\n*** EOF\r\n')breaksys.stdout.write(x) # 标准输出
sys.stdout.flush() # flush 怕输出不到,远程发来的数据,远程机器返回
except socket.timeout:
passif sys.stdin inr: # 标准输入 活动就能返回到r
x= sys.stdin.read(1)if len(x) == 0:break
if x == "\r":
cmd_str= "".join(cmd)
print("---->",cmd_str)
cmd=[]else:
cmd.append(x)
chan.send(x)
表结构设计图:
README:
开发环境: python3.6参考博客:
程序介绍1. 所有的用户操作日志要保留在数据库中2. 每个用户登录堡垒机后,只需要选择具体要访问的设置,就连接上了,不需要再输入目标机器的访问密码3. 允许用户对不同的目标设备有不同的访问权限,例:
对10.0.2.34有mysql 用户的权限
对192.168.3.22有root用户的权限
对172.33.24.55没任何权限4. 分组管理,即可以对设置进行分组,允许用户访问某组机器,但对组里的不同机器依然有不同的访问权限
文件目录结构
├── bin
│ ├── __init__.py
│ └── tiny.py # 主程序
├── conf
│ ├── action_registers.py # 程序命令交互
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── action_registers.cpython-36.pyc
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ └── settings.py # 配置文件
├── log
│ └── __init__.py
├── models
│ ├── __init__.py
│ ├── models_backup.py # 备份测试
│ ├── models.py # 数据库表模块
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── models.cpython-36.pyc
│ └── test.py # redis测试
├── modules
│ ├── actions.py # 欢迎页和程序命令交互
│ ├── common_filters.py # 堡垒机用户主机绑定交互
│ ├── db_conn.py # mysql连接交互
│ ├── __init__.py
│ ├── interactive.py # ssh传输命令和命令写入交互
│ ├── __pycache__
│ │ ├── actions.cpython-36.pyc
│ │ ├── common_filters.cpython-36.pyc
│ │ ├── db_conn.cpython-36.pyc
│ │ ├── __init__.cpython-36.pyc
│ │ ├── interactive.cpython-36.pyc
│ │ ├── ssh_login.cpython-36.pyc
│ │ ├── utils.cpython-36.pyc
│ │ └── views.cpython-36.pyc
│ ├── ssh_login.py # ssh连接交互
│ ├── utils.py # yaml配置交互
│ └── views.py # 创建表,表数据创建,查看数据库数据交互
├── Server.zip
└── share
└── examples
├── new_bindhosts.yml # 主机绑定关系配置文件
├── new_groups.yml # 组创建,组关系绑定配置文件
├── new_hosts.yml # 主机配置文件
├── new_remoteusers.yml # 主机用户名密码配置文件
└── new_user.yml # 堡垒机用户配置文件
创建表和使用方法:
先要创建数据库:
create database tinytest charset utf8;1. python3 bin/tiny.py syncdb2. python3 bin/tiny.py create_hosts -f share/examples/new_hosts.yml3. python3 bin/tiny.py create_remoteusers -f share/examples/new_remoteusers.yml4. python3 bin/tiny.py create_users -f share/examples/new_user.yml5. python3 bin/tiny.py create_groups -f share/examples/new_groups.yml6. python3 bin/tiny.py create_bindhosts -f share/examples/new_bindhosts.yml7. python3 bin/tiny.py start_session
程序核心代码:
程序测试样图:
1. 创建表和插入表数据
2. 查看绑定关系
3. 登陆和写入命令
4. 不同用户权限,组权限,登陆权限和查看日志权限
遇到的报错1:
redis.exceptions.DataError: Invalid input of type: 'dict'. Convert to a byte, stringor number first.
对redis降版:
pip3 install-U redis==2.10.6 #将当前版本降级到2.10.6