zoukankan      html  css  js  c++  java
  • 运维堡垒机开发

    一、权限管理

    当你公司的服务器变的越来越多后,需要操作这些服务器的人就肯定不只是一个运维人员,同时也可能包括多个开发人员,那么这么多的人操作业务系统,如果权限分配不当就会存在很大的安全风险,举几个场景例子:

    1. 设想你们公司有300台Linux服务器,A开发人员需要登录其中5台WEB服务器查看日志或进行问题追踪等事务,同时对另外10台hadoop服务器有root权限,在有300台服务器规模的网络中,按常理来讲你是已经使用了ldap权限统一认证的,你如何使这个开发人员只能以普通用户的身份登录5台web服务器,并且同时允许他以管理员的身份登录另外10台hadoop服务器呢?并且同时他对其它剩下的200多台服务器没有访问权限

    2. 目前据我了解,很多公司的运维团队为了方面,整个运维团队的运维人员还是共享同一套root密码,这样内部信任机制虽然使大家的工作方便了,但同时存在着极大的安全隐患,很多情况下,一个运维人员只需要管理固定数量的服务器,毕竟公司分为不同的业务线,不同的运维人员管理的业务线也不同,但如果共享一套root密码,其实就等于无限放大了每个运维人员的权限,也就是说,如果某个运维人员想干坏事的话,他可以在几分钟内把整个公司的业务停转,甚至数据都给删除掉。为了降低风险,于是有人想到,把不同业务线的root密码改掉就ok了么,也就是每个业务线的运维人员只知道自己的密码,这当然是最简单有效的方式,但问题是如果你同时用了ldap,这样做又比较麻烦,即使你设置了root不通过ldap认证,那新问题就是,每次有运维人员离职,他所在的业务线的密码都需要重新改一次。

      其实上面的问题,我觉得可以很简单的通过堡垒机来实现,收回所有人员的直接登录服务器的权限,所有的登录动作都通过堡垒机授权,运维人员或开发人员不知道远程服务器的密码,这些远程机器的用户信息都绑定在了堡垒机上,堡垒机用户只能看到他能用什么权限访问哪些远程服务器。

      在回收了运维或开发人员直接登录远程服务器的权限后,其实就等于你们公司生产系统的所有认证过程都通过堡垒机来完成了,堡垒机等于成了你们生产系统的SSO(single sign on)模块了。你只需要在堡垒机上添加几条规则就能实现以下权限控制了:

    1. 允许A开发人员通过普通用户登录5台web服务器,通过root权限登录10台hadoop服务器,但对其余的服务器无任务访问权限

    2. 多个运维人员可以共享一个root账户,但是依然能分辨出分别是谁在哪些服务器上操作了哪些命令,因为堡垒机账户是每个人独有的,也就是说虽然所有运维人员共享了一同一个远程root账户,但由于他们用的堡垒账户都是自己独有的,因此依然可以通过堡垒机控制每个运维人员访问不同的机器。

    二、审计管理

    审计管理其实很简单,就是把用户的所有操作都纪录下来,以备日后的审计或者事故后的追责。在纪录用户操作的过程中有一个问题要注意,就是这个纪录对于操作用户来讲是不可见的,什么意思?就是指,无论用户愿不愿意,他的操作都会被纪录下来,并且,他自己如果不想操作被纪录下来,或想删除已纪录的内容,这些都是他做不到的,这就要求操作日志对用户来讲是不可见和不可访问的,通过堡垒机就可以很好的实现。

    补充,跳板机和堡垒机得区别:

      跳板机,只有跳转登录得功能。

      如果跳板机提供了以下两条,叫做审计系统或堡垒机

    1.   记录用户操作
    2.   实现了权限管理

    三、堡垒机架构

    堡垒机的主要作用权限控制和用户行为审计,堡垒机就像一个城堡的大门,城堡里的所有建筑就是你不同的业务系统 , 每个想进入城堡的人都必须经过城堡大门并经过大门守卫的授权,每个进入城堡的人必须且只能严格按守卫的分配进入指定的建筑,且每个建筑物还有自己的权限访问控制,不同级别的人可以到建筑物里不同楼层的访问级别也是不一样的。还有就是,每个进入城堡的人的所有行为和足迹都会被严格的监控和纪录下来,一旦发生犯罪事件,城堡管理人员就可以通过这些监控纪录来追踪责任人。 

                        

      堡垒要想成功完全记到他的作用,只靠堡垒机本身是不够的, 还需要一系列安全上对用户进行限制的配合,堡垒机部署上后,同时要确保你的网络达到以下条件:

    • 所有人包括运维、开发等任何需要访问业务系统的人员,只能通过堡垒机访问业务系统
      • 回收所有对业务系统的访问权限,做到除了堡垒机管理人员,没有人知道业务系统任何机器的登录密码
      • 网络上限制所有人员只能通过堡垒机的跳转才能访问业务系统 
    • 确保除了堡垒机管理员之外,所有其它人对堡垒机本身无任何操作权限,只有一个登录跳转功能
    • 确保用户的操作纪录不能被用户自己以任何方式获取到并篡改

    四、堡垒机功能实现需求

    业务需求:

    1. 兼顾业务安全目标与用户体验,堡垒机部署后,不应使用户访问业务系统的访问变的复杂,否则工作将很难推进,因为没人喜欢改变现状,尤其是改变后生活变得更艰难
    2. 保证堡垒机稳定安全运行, 没有100%的把握,不要上线任何新系统,即使有100%把握,也要做好最坏的打算,想好故障预案

    功能需求:

    1. 所有的用户操作日志要保留在数据库中
    2. 每个用户登录堡垒机后,只需要选择具体要访问的设置,就连接上了,不需要再输入目标机器的访问密码
    3. 允许用户对不同的目标设备有不同的访问权限,例:
      1. 对10.0.2.34 有mysql 用户的权限
      2. 对192.168.3.22 有root用户的权限
      3. 对172.33.24.55 没任何权限
    4. 分组管理,即可以对设置进行分组,允许用户访问某组机器,但对组里的不同机器依然有不同的访问权限  

    五、设计表结构

                    

    复制代码
    from django.db import models
    from django.contrib.auth.models import User
    
    
    class IDC(models.Model):
        name = models.CharField(max_length=64, unique=True)
    
        def __str__(self):
            return self.name
    
    
    class Host(models.Model):
        """存储所有主机信息"""
        hostname = models.CharField(max_length=64,unique=True)
        ip_addr = models.GenericIPAddressField(unique=True)
        port = models.IntegerField(default=22)
        idc = models.ForeignKey("IDC")
        enabled = models.BooleanField(default=True)
    
        def __str__(self):
            return "%s-%s" % (self.hostname, self.ip_addr)
    
    
    class HostGroup(models.Model):
        """主机组"""
        name = models.CharField(max_length=64, unique=True)
        host_user_binds = models.ManyToManyField("HostUserBind")
    
        def __str__(self):
            return self.name
    
    
    class HostUser(models.Model):
        """存储远程主机的用户信息"""
        auth_type_choices = ((0, 'ssh-password'), (1, 'ssh-key'))
        auth_type = models.SmallIntegerField(choices=auth_type_choices)
        username = models.CharField(max_length=32)
        password = models.CharField(blank=True, null=True, max_length=128)
    
        def __str__(self):
            return "%s-%s-%s" % (self.get_auth_type_display(), self.username, self.password)
    
        class Meta:
            unique_together = ('username', 'password')
    
    
    class HostUserBind(models.Model):
        """绑定主机和用户"""
        host = models.ForeignKey("Host")
        host_user = models.ForeignKey("HostUser")
    
        def __str__(self):
            return "%s-%s" % (self.host, self.host_user)
    
    
    class AuditLog(models.Model):
        """审计日志"""
    
    
    class Account(models.Model):
        """
        堡垒机账户
        1. 扩展
        2. 继承
        user.account.host_user_bind
        """
    
        user = models.OneToOneField(User)
        name = models.CharField(max_length=64)
    
        host_user_binds = models.ManyToManyField("HostUser", blank=True)
        host_groups = models.ManyToManyField("HostGroup", blank=True)
    复制代码

     六、环境配置

    1、直接通过linux用户和密码登录

    2、通过ssh公钥登录

    复制代码
    秘钥生成命令
    1.ssh-keygen
        .ssh/.id_rsa 私钥
        .ssh/.id_rsa.pub 公钥
    2. 把公钥copy到要登录的目标机器上
        scp -rp id_rsa alex@192.168.10.35:/home/alex/ #把本地文件copy到远程
        scp -rp alex@192.168.10.35:/home/alex/id_rsa /tmp/ #把远程文件copy到本地
    
        查看当前用户id, whoami
        su - alex 切换用户
        cat id_rsa.pub >authorized_keys 读出id_rsa.pub的内容并写入到>后的文件,(覆盖)
        cat id_rsa.pub >>authorized_keys 读出id_rsa.pub的内容并写入到>后的文件,(追加)
    
    3. 在目标机器上,把id_rsa.pub里的key取出写入.ssh/authorized_keys
    复制代码

    ubuntu系统:

    复制代码
    #安装paramiko
    
    sudo pip3 install -i http://pypi.douban.com/simple/ paramiko --trusted-host pypi.douban.com
    
    #搜索所有可用的安装包
    sudo apt-cache search openssl
    
    #安装 libssl-dev
    sudo apt-get install libssl-dev
    复制代码

    开机自动加载保垒机程序方法:

    在普通用户家目录下面:

    vim home/audit/.bashrc 
    
    把这段代码加到文件结尾:
    
    python3 s3CrazyEye/crazyeye_manager.py run
    logout

    安装shellinabox-master

    插件介绍:通过web页面管理linux主机(电脑版)

    软件安装: https://github.com/shellinabox/shellinabox

    复制代码
    #安装依赖包
    
    yum install git openssl-devel pam-devel zlib-devel autoconf automake libtool -y
    
    mkdir -p /home/nulige/tools
    
    cd /home/nulige/tools
    
    #下载软件包
    git clone https://github.com/shellinabox/shellinabox.git && cd shellinabox
    
    
    #安装软件需要的组件
    autoreconf -i
    
    
    #编译安装软件
     ./configure --prefix=/usr/local/shellinabox
    
    make && makeinstall
    
    #进入软件目录
    cd /usr/local/shellinabox/bin
    
    #启动软件
    ./shellinaboxd -t -b
    复制代码

    #检查4200端口是否启动

    复制代码
    [root@paramiko-server ~]# netstat -lnt
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State      
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
    tcp        0      0 0.0.0.0:4200                0.0.0.0:*                   LISTEN      
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      
    tcp        0      0 :::22                       :::*                        LISTEN    
    复制代码

    #访问网站

    #查看本机ip地址,然后ip+4200端口,就可以访问啦!
    
    http://192.168.30.130:4200/

    #在linux保垒机上面新建一个普通用户

    #创建普通用户
    useradd lulu
    #设置密码
    passwd lulu
    输入两遍密码:123456

    #登录shellinabox

    名称:WebShell

    插件介绍:通过web页面管理linux主机(手机版)

    1
    2
    3
    4
    5
    yum install openssl python pyOpenSSL
      
    ./make_certificate.sh
      
    ./webshell.py

    运行效果:

    wusir:http://www.cnblogs.com/wupeiqi/articles/5095821.html

     阅读原文

  • 相关阅读:
    Lotto--poj2245
    Avoid The Lakes--poj3620
    Fire Net--hdu1045
    变形课--hdu1181
    Apache Mina入门实例
    谈谈项目
    设计模式之装饰者模式
    linux下的权限控制
    centos 6.5 搭建JSP运行环境
    centos 6.5 搭建ftp服务器
  • 原文地址:https://www.cnblogs.com/276815076/p/7694121.html
Copyright © 2011-2022 走看看