1、什么是堡垒机
堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态、安全事件、网络活动,以便集中报警、及时处理及审计定责。
堡垒机综合了核心系统运维和安全审计管控两大主干功能。从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的访问;安全审计作为企业信息安全建设不可缺少的组成部分,是企业安全体系中的重要环节,同时安全审计是事前预防、事中预警的有效风险控制手段,也是事后追溯的可靠证据来源。
2、堡垒机重要功能介绍
堡垒机有以下两大至关重要的功能:
权限管理
通过堡垒机,收回所有人员的直接登录服务器的权限,所有的登录动作都通过堡垒机授权,运维人员或开发人员不知道远程服务器的密码,这些远程机器的用户信息都绑定在了堡垒机上,堡垒机用户只能看到他能用什么权限访问哪些远程服务器。
审计管理
将用户的所有操作都纪录下来,以备日后的审计或者事故后的追责。该纪录对于操作用户来讲是不可见的,无论用户愿不愿意,他的操作都会被纪录下来,并且,他自己如果不想操作被纪录下来,或想删除已纪录的内容,这些都是他做不到的,这就要求操作日志对用户来讲是不可见和不可访问的,通过堡垒机就可以很好的实现。
3、堡垒机架构
堡垒机部署后,同时需确保网络达到以下条件:
- 所有人包括运维、开发等任何需要访问业务系统的人员,只能通过堡垒机访问业务系统
- 回收所有对业务系统的访问权限,做到除了堡垒机管理人员,没有人知道业务系统任何机器的登录密码
- 网络上限制所有人员只能通过堡垒机的跳转才能访问业务系统
- 确保除了堡垒机管理员之外,所有其它人对堡垒机本身无任何操作权限,只有一个登录跳转功能
- 确保用户的操作纪录不能被用户自己以任何方式获取到并篡改
4、简单堡垒机表结构设计
表结构Python实现
# fort_user表与host_group表间的多对多关系 fortuser_to_hostgroup = Table("fortuser_to_hostgroup", Base.metadata, Column("fortuser_id", Integer, ForeignKey("fort_user.id")), Column("hostgroup_id", Integer, ForeignKey("host_group.id"))) # fort_user表与bind_hosts表间的多对多关系 fortuser_to_bindhosts = Table("fortuser_to_bindhosts", Base.metadata, Column("fortuser_id", Integer, ForeignKey("fort_user.id")), Column("bindhosts_id", Integer, ForeignKey("bind_hosts.id"))) # host_group表与bind_hosts表间的多对多关系 hostgroup_to_bindhosts = Table("hostgroup_to_bindhosts", Base.metadata, Column("hostgroup_id", Integer, ForeignKey("host_group.id")), Column("bindhosts_id", Integer, ForeignKey("bind_hosts.id"))) class FortUser(Base): """堡垒机用户表""" __tablename__ = "fort_user" id = Column(Integer, primary_key=True) username = Column(String(32), nullable=False) password = Column(String(256), nullable=False) groups = relationship("HostGroup", secondary=fortuser_to_hostgroup) host = relationship("BindHosts", secondary=fortuser_to_bindhosts) def __repr__(self): return self.id, self.name, self.password class HostUser(Base): """堡垒机连接服务器时使用的用户名密码""" __tablename__ = "host_user" id = Column(Integer, primary_key=True) username = Column(String(32), nullable=False) password = Column(String(128), nullable=False) __table_args__ = (UniqueConstraint("username", "password", name="user_pw_uc"),) def __repr__(self): return self.id, self.username, self.password class Hosts(Base): """主机表""" __tablename__ = "hosts" id = Column(Integer, primary_key=True) ip = Column(String(128), unique=True, nullable=False) port = Column(Integer, nullable=False) def __repr__(self): return self.id, self.ip, self.port class HostGroup(Base): """主机组表""" __tablename__ = "host_group" id = Column(Integer, primary_key=True) name = Column(String(64), nullable=False) hosts = relationship("BindHosts", secondary=hostgroup_to_bindhosts) def __repr__(self): return self.id, self.name class BindHosts(Base): """ 主机用户名密码与主机对应关系 例如:root 123 --> 192.168.0.3 mysql 123 --> 192.168.0.3 """ __tablename__ = "bind_hosts" id = Column(Integer, primary_key=True) hostuser_id = Column(Integer, ForeignKey("host_user.id"), nullable=False) hosts_id = Column(Integer, ForeignKey("hosts.id"), nullable=False) host_user = relationship("HostUser") hosts = relationship("Hosts", backref="host_users") __table_args__ = (UniqueConstraint("hostuser_id", "hosts_id", name="user_host_uc"),) def __repr__(self): return self.id, self.hostuser_id, self.hosts_id class ActionsLog(Base): """用户在堡垒机上的操作记录表""" __tablename__ = "actions_log" id = Column(Integer, primary_key=True) time = Column(DATETIME, nullable=False) user = Column(String(32), nullable=False) host = Column(String(128), nullable=False) host_user = Column(String(32), nullable=False) action = Column(String(64), nullable=False) def __repr__(self): return self.id, self.time, self.user, self.action SessionClass = sessionmaker(bind=engine) Session = SessionClass()