单爆手

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一.堡垒机项目实战-需求 

  如下图中:1.只允许10.0.10.*网段(即汽车之家公司)的人访问其它机器如mysql服务器,其它网段(公司)的人只能访问汽车之家服务器的web80端口网站。---所以需要防火墙(是硬件服务器:流量控制(安全大门)---让所有的请求走到它这,它再检测是否合法,合法则放行)。2.只让10.0.10.*网段的人访问22端口登录公司服务器---防火墙安全策略。3.公司放假,没人上班但开发人员的代码有问题了网站不能访问,此时在家的运维人员不在10.0.10.*网段了,没法连接机房22端口-----用vpn(虚拟专用网络)---它的作用是你可在家直接连接公司服务器,它帮你建立了安全遂道(通过加密技术让运维人员与公司系统服务器的通信,对外不可见---运维人员拿着令牌才能去访问公司服务器)

上图中项目需求明细解析:
1.汽车之家: 广告业务线---500台服务器 电商业务线---150台服务器 论坛业务线---200台服务器 二手车业务线---250台服务器 2.30人运维---管理1000台服务器 老村长运维--->负责维护广告业务线 500台服务器 郑文运维--->负责维护电商业务线300台 老李运维--->负责论坛业务线200台 二手车 200 3.老村长运维--->负责维护广告业务线 500台服务器 每台机器都有root密码,且都不一样--记不住所以存到文件中--但更多时候时要批量操作,这就增加了维护的成本,所以现在很多公司为管理方便多台机器用同一密码,便这就有安全隐患: 如老张有一天在老家了,身边没电脑没网络,刚好你的广告业务线出问题了,宝马投你的广告业务中js加载不出来(弹窗出不来),此时怎么办?--公司为了避免这种局面,让重要的一些业务有专业备份人员小薇及时兼管。 小薇也知道这些服务器密码,只是它运维水平一船。还有问题是因为两人共享同一root帐户,所以我能记录的只是用哪个帐户登录的,出了问题导致互相推脱,怎么解决? root @&@#abdew4345+(&#) 192.168.1.1 root @&@#abdew4345+(&#) 192.168.1.2 log_reader abc33 mysql adfd 4.操作的日志记录 让只要一登录服务器的人我就可记录他的操作日志记录.且日志记录中必须包括操作人员是谁+用的系统帐户+操作的命令+时间 操作人员 系统账号 老村长 root df 2019.... 还有一问题,广告业务线的广告弹窗出不来,两运维人员又不懂开发,此时需要小李开发的协助,小李说我得通过输出的日志来判定是什么样的问题,这样他也需要访问权限,你只能给他授权普通用户看日志的权限--log_reader abc33,小李只有只读的权限,同时此时你数据库也出问题了,你两解决不了,需要dba,又要给他操作权限-- mysql用户 adfd命令,这样一切相安无事,过了段时间,dba离职了,但他有过你500台机密码,还有有来来回回很多人因为各种事你可能需要给它临时权限,而你忘记回收了,有一天他登进来了给你各种删库,你的日志也帮你卖给竞争对手。 5.问题一:权限管理混乱的 ,谁有什么权限,不清晰 6.问题二:操作没有记录

   那上图中我(管理员)如何把其它所有用户登录及操作的记录记下来?--我在服务器上写个脚本能动态监测他人的操作记录,但这个没用,因为你给他人权限他人登录时若发现此脚本会把它先停掉,所以你想通过程序或脚本去监测别人的操作记录是没有用的--因为他也能给你干掉---所以你管理员是没办法在服务端控制的。那客户端我能控制吗?----那更不能。所以就变成了服务端客户端都控制不了。

那怎么办?-----在中间进行控制(服务端与客户端中间),如下图:我要求所有要登远程服务器的人都必须要经过我中间的这个机器。然后由我这个机器帮你进行转发。那这样我就能在我中间这个服务器上进行控制:第一你能访问谁.第二,你访问的操作---这就是堡垒机。如下图

 二.堡垒机的工作模式:

  

   上图中,外边的程序先走防火墙,而堡垒机装在生产系统 里在防火墙后。堡垒机让所有的请求都先经过它,原因:第一.在服务端上装程序你还是控制不了别人---因为别人能把程序停掉干掉,第二.在客户端更不能。

那别人不想走你堡垒机,想经过防火墙后直接进入到服务器(可以的,因为所有的网络是通的),这时你怎么限制?---法一:所有服务器自带的iptables防火墙上配置只有堡垒机的ip才能连接生产机---这样太麻烦。法二:只有堡垒机才知道所有生产机器的密码,那别人不经过堡垒机就无法连接生产机。但是堡垒机不能把密码给这些人,否则他们又会跳过我堡垒机连上生产机,所以就变成了我堡垒机上我开发了一个给他们分配权限的系统:此系统中有很多列表(哪台机,哪台机...),某人登上来就勾选某个他想登录的列表机器,这样中间就不涉及让他们输密码了,他们只需选择,背后输密码这操作是堡垒机帮他们完成的。这样,对于用户来讲,生产机密码就是不可见了。

  (2)即需求就两个:权限管理和记录操作。而权限管理:我想要实现的效果是你登到我堡垒机上,我就能让你看到你能管理哪些机器,然后你选择一台就能登上去。如:服务器192.168.1.1 用户(权限)root,mysql,web  

 三.表结构设计

参考https://github.com/triaquae/CrazyEye 堡垒机如效果如下:

CrazyEye系统项目介绍:
CrazyEye是基于Python开发的一款简单易用的IT审计堡垒机,通过对原生ssh代码进行了部分修改,从而实现用户在登录堡垒机后,他所有的命令操作都将被实时抓取并写入审计日志,以供后期审计,目前CrazyEye主要实现了以下功能: 用户行为审计 底层使用原生ssh,不牺牲ssh使用体验,对用户操作无任何影响 支持对主机进行分组管理 可为运维人员分配指定服务器、指定账号的操作权限,即一个用户可以登录多少生产服务器,以及登录后有什么权限,都可以自如的控制 用户登录堡垒后的所有操作均可被记录下来以供日后审计. 主机批量操作 可对指定数量的机器进行批量命令、文件分发操作,可实时查看操作进度和结果 注意:: 目前暂时不支持对Windows系统的操作审计和批量任务

###用户登录: (1)管理用户登录通过浏览器打开http://your_ip_addr:9000/ 用户名:alex@126.com 密码: alex3714 (2)普通只需要通过命令行登录即可 Alexs-MacBook-Pro:~ alex$ ssh crazy_audit@10.211.55.5 用户在自己本机上连接堡垒机 crazy_audit@10.211.55.5's password: *此处填写你之前创建的crazy_audit的密码 press ENTER if you don't have token, [input your token]: #敲回车就行 Username:alex@126.com #此处方是真正的你为用户创建的审订账号 Password: |-------[Welcome login CrazyEye Auditing System]-----| | Version : 1.0 | | Author : Alex Li | | QQ Group: 29215534 | |----------------------------------------------------| (3)z. Ungrouped [3] #你授权这个用户可以访问的主机列表以组形式显示 >>:z---选中z列表就出来如下可以访问的所有主机 0. ubuntu(10.211.55.5) alex 1. oldboy web server 错的(202.106.23.22) Alex 2. oldboy web server(101.200.195.98) Alex ['b'(back)]>>>:0 #选中一台机器登录 -----connecting [10.211.55.5] with user [alex]-----它提示以alex用户登录上了 session_tag: hrqdan3soljbux6t Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-53-generic x86_64) * Documentation: https://help.ubuntu.com/ 313 packages can be updated. 26 updates are security updates. Last login: Sat Dec 31 15:39:59 2016 from 10.211.55.5 alex@alex-ubuntu:~$ ifconfig #登录上了远程机器了 enp0s5 Link encap:Ethernet HWaddr 00:1c:42:2d:c0:18 inet addr:10.211.55.5 Bcast:10.211.55.255 Mask:255.255.255.0 alex@alex-ubuntu:~$ alex@alex-ubuntu:~$ ls a.py Desktop Downloads Music Pictures ssh_log Templates test.zip CrazyEye Documents examples.desktop openssh-7.3p1 Public ssh_log2 test.py Videos alex@alex-ubuntu:~$ pwd /home/alex alex@alex-ubuntu:~$ exit #退出这台机器 logout Connection to 10.211.55.5 closed. #又回到审计交互界面 0. ubuntu(10.211.55.5) alex 1. oldboy web server 错的(202.106.23.22) Alex 2. oldboy web server(101.200.195.98) Alex ['b'(back)]>>>:b z. Ungrouped [3] >>:exit #即出审计系统 Bye! Connection to 10.211.55.5 closed.

(1)创建项目 

  

 (2)需要的表有:

  存储主机列表信息表:存主机名,ip,端口

  存储主机组表:因为有好几百台机器,所以分组管理--让某用户直接授权一组机器,能访问此组--这样省得一台台授权。

  绑定主机和远程用户的对应关系表:

  存储远程要管理的主机的账号信息表:登录远程主机需要帐号

  堡垒机账号表:登堡垒机需要帐号,所以存下

  机房信息表:机器有可能在多个机房

  存储审计日志表:

  帐户表:

(3)表结构解析:

  1.存储主机列表信息表:存主机名,ip,端口

  2.存储主机组表:组名,

    关联的主机(和主机表是多对多关系)--改成与绑定主机和远程用户的对应关系表关联

  3.绑定主机和远程用户的对应关系表:一手连着主机,一手连着远程用户

    且它两联合唯一(即如10.10.0.10此机上只能有一个root),  

  4.存储远程要管理的主机的账号信息表:(主机和帐户是多对多)

    用户名,密码(明文--因为远程机ssh接收要明文/或也可用公钥私钥方式登录),

    存认证类型字段--0是ssh密码登录1是ssh-key密钥登录

    且认证类型,用户名,密码三个字段必须联合唯一--因为帐号不能有重的

  5.堡垒机账号表:用自定义用户 

    让帐号直接多对多关联主机,还有主机组。

 如下图中中1.10主机跟三个账户都关联了(即此机器上就有这三个账户),而我又把此机器授权给了老村长,意味着老村长可用任意三帐户中一个登录此机器。但是现在史正文用户我只想给它web帐户登录此机器(这就有问题了:我把此机器授权给史正文时他是可以用三个帐号登录的,因为此机与三帐号绑定了),所以手动做第三张表来存放(如下图中紫色部分,这样就实现帐户和主机绑定了--那这样的话就可取消之前的关联方式(没什么意义))。

 

 

 最终的表结构就如下图:

from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser,PermissionsMixin)
自定义用户
class UserProfile(AbstractBaseUser,PermissionsMixin):
    """堡垒机账号"""
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    name = models.CharField(max_length=64, verbose_name="姓名")
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=True)
    objects = UserProfileManager()
    host_to_remote_users = models.ManyToManyField("HostToRemoteUser",blank=True,null=True)
    host_groups = models.ManyToManyField("HostGroup",blank=True,null=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    def get_full_name(self):
        # The user is identified by their email address
        return self.email
    def get_short_name(self):
        # The user is identified by their email address
        return self.email
    def __str__(self):              # __unicode__ on Python 2
        return self.email

  6.机房信息表:

    一台机器只能属于一个idc,

  7.存储审计日志表:

  8.用户表:

     与绑定主机和远程用户的对应关系表关联起来。

 (4)如何实现免密登录某台机:

   

ssh免密登录的方法:
  查看当前用户id, whoami
  su - lizhihua切换用户
1.ssh-keygen    ---创建密钥对
  .ssh/.id_rsa 私钥
  .ssh/.id_rsa.pub 公钥
2. 把公钥copy到要登录的目标机器上centos机--->ubuntu机
  scp -rp id_rsa lizhihua@192.168.10.35:/home/lizhihua/ #把本地文件copy到远程
  scp -rp lizhihua@192.168.10.35:/home/lizhihua/id_rsa /tmp/ #把远程文件copy到本地
  lizhihua@ubuntu:~$ ssh root@localhost    ---这是在ubuntu机上自己登录其它用户生成lizhihua用户下的.ssh文件夹
  lizhihua@ubuntu:~$ mv id_rsa.pub .ssh/
3.1 在目标机器上,把id_rsa.pub重命名为authorized_keys---必须叫此名(或也可用3.2方法)
  lizhihua@ubuntu:~/.ssh$ mv id_rsa.pub authorized_keys   ---重命名为authorized_keys
3. 2在目标机器ubuntu上,把id_rsa.pub里的key取出写入.ssh/authorized_keys
  cat id_rsa.pub >authorized_keys 读出id_rsa.pub的内容并写入到>后的文件,(覆盖)
  cat id_rsa.pub >>authorized_keys 读出id_rsa.pub的内容并写入到>后的文件,(追加)
 4.这样就可直接在centos机上登录ubuntu机了
[root@centos7 .ssh]# ssh lizhihua@192.168.1.132   ---此时直接连接就可免密登录

 四.启动项目准备

(1)web/models.py中:

from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser,PermissionsMixin
)
class Host(models.Model):
"""存储主机列表"""
name = models.CharField(max_length=64,unique=True)
ip_addr = models.GenericIPAddressField(unique=True)
port = models.SmallIntegerField(default=22)
idc = models.ForeignKey("IDC",on_delete=models.CASCADE)
#remote_users = models.ManyToManyField("RemoteUser")

def __str__(self):
return self.name
class HostGroup(models.Model):
"""存储主机组"""
name = models.CharField(max_length=64,unique=True)
#hosts = models.ManyToManyField("Host")
host_to_remote_users = models.ManyToManyField("HostToRemoteUser")

def __str__(self):
return self.name

class HostToRemoteUser(models.Model):
"""绑定主机和远程用户的对应关系"""
host = models.ForeignKey("Host",on_delete=models.CASCADE)
remote_user = models.ForeignKey("RemoteUser",on_delete=models.CASCADE)

class Meta:
unique_together = ("host","remote_user")
def __str__(self):
return "%s %s"%(self.host,self.remote_user)
class RemoteUser(models.Model):
"""存储远程要管理的主机的账号信息"""
auth_type_choices = ((0,'ssh-password'),(1,'ssh-key'))
auth_type = models.SmallIntegerField(choices=auth_type_choices,default=0)
username = models.CharField(max_length=32)
password = models.CharField(max_length=64,blank=True,null=True)
class Meta:
unique_together = ('auth_type','username','password')

def __str__(self):
return "%s:%s" %(self.username,self.password)

class UserProfileManager(BaseUserManager):
def create_user(self, email, name, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address')

user = self.model(
email=self.normalize_email(email),
name=name,
)
user.set_password(password)
user.save(using=self._db)
return user

def create_superuser(self, email, name, password):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
user = self.create_user(
email,
password=password,
name=name,
)
user.is_superuser = True
user.save(using=self._db)
return user

class UserProfile(AbstractBaseUser,PermissionsMixin):
"""堡垒机账号"""
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,

)
name = models.CharField(max_length=64, verbose_name="姓名")
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=True)
objects = UserProfileManager()

host_to_remote_users = models.ManyToManyField("HostToRemoteUser",blank=True,null=True)
host_groups = models.ManyToManyField("HostGroup",blank=True,null=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']

def get_full_name(self):
# The user is identified by their email address
return self.email

def get_short_name(self):
# The user is identified by their email address
return self.email

def __str__(self): # __unicode__ on Python 2
return self.email

class IDC(models.Model):
"""机房信息"""
name = models.CharField(max_length=64,unique=True)

class AuditLog(models.Model):
"""存储审计日志"""

python manage.py makemigrations 

  ERRORS:#会报如下错--原因是我用的是自带的认证所以要改settings---加-->AUTH_USER_MODEL = 'web.UserProfile'

  auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'UserProfile.groups'......

python manage.py migrate

(2)web/admin.py ---注册

from django.contrib import admin
from web import models

admin.site.register(models.Host)
admin.site.register(models.HostGroup)
admin.site.register(models.IDC)
admin.site.register(models.UserProfile)
admin.site.register(models.HostGroupUser)
admin.site.register(models.RemoteUser)

python manage.py createsuperuser

  lizhihua@126.com   lizhihua   lzh181818

登录并访问http://127.0.0.1:8000/admin/login/?next=/admin/

(3)创建几条数据

 下图--两台主机:

        

 

 三个帐号:

         

 

 帐号绑定主机:

       

 

 把主机授权给用户:

 

posted on 2020-05-05 12:57  单爆手  阅读(657)  评论(0编辑  收藏  举报