作业需求:

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 = []
        while True:
            r, w, e = select.select([chan, sys.stdin], [], [])  # 默认阻塞
            if chan in r:  # 连接建立好了,channle过来有数据了,
                try:
                    x = u(chan.recv(1024))  # 尝试收数据
                    if len(x) == 0:  # 收数据收不到,
                        sys.stdout.write('\r\n*** EOF\r\n')
                        break
                    sys.stdout.write(x)  # 标准输出
                    sys.stdout.flush()  # flush 怕输出不到,远程发来的数据,远程机器返回
                except socket.timeout:
                    pass
            if sys.stdin in r:  # 标准输入 活动就能返回到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)
View Code 

相关文章: