站点图标 星露谷值班站长

jumpserver登陆日志127.0.0.1问题

Jumpserver 版本: 1.5.0-2

最近发现 jumpserver 跳板机登陆日志中出现了很多 127.0.0.1 的登陆,而且 UA 还是 python-requests/2,首先看到这个日志总感觉服务器中毒了,但是经过查看和检查发现服务器并没有被黑的痕迹,在网上搜索也是一无所获。

可以看到登陆是通过 web 请求过来的,但是通过检查 nginx 日志并没有发现有异常请求登陆接口的,通过调试 django debug 日志发现请求都是通过 api/users/v1/auth 接口过来的。

调用这个接口的正是 coco 组件,coco 组件会开放一个 2222 端口,通过 2222 端口可以使用 ssh 的方式登陆跳板机,如果用户名和密码是错误的那么就会出现如下报错:

Password and public key auth <%s> failed, reject it
coco 认证是通过调用 jumpserver api 的方式实现的,可以在 coco interface.py源码中看到具体的实现方式。
可以通过添加客户端 Ip 打印的方式记录访问者 ip,然后可以对异常 ip 进行封禁
   def check_auth_password(self, username, password):

        user = self.validate_auth(username, password=password)

        if not user:

            logger.warning('连接 IP:%s' % self.connection.addr[0])
            logger.warning("Password and public key auth <%s> failed, reject it" % username)

            return paramiko.AUTH_FAILED

        else:

            logger.info("Password auth <%s> success" % username)

            if self.otp_auth:

                return paramiko.AUTH_PARTIALLY_SUCCESSFUL

            return paramiko.AUTH_SUCCESSFUL

在函数 check_auth_password 中加入日志打印

logger.warning('连接 IP:%s' % self.connection.addr[0])

这样就可以记录异常连接的 IP

可以通过配置 coco 黑名单阻止日常的黑产扫描

更改文件 coco/config.yml 配置 BLOCK_SSH_USER 变量

# SSH 黑名单, 如果用户同时在白名单和黑名单,黑名单优先生效
BLOCK_SSH_USER: ['root','nagios','admin','postgres','ubuntu','test','test','support','Administrator','zabbix']

通过观察日志可以看到异常请求登陆的 IP 地址

通过 jumpserver 管理界面可以看到记录到的 IP 是 127.0.0.1

可以把日志记录增加到前面,这样就可以记录每一个 ssh 登陆者的 ip 地址,上面的更改只能记录失败情况下的 ip 地址,记录所有 ssh 登陆的 ip 地址更利于后期的安全排查。

coco/interface.py

def check_auth_password(self, username, password):
        logger.info('SSH 连接 IP:%s' % self.connection.addr[0])
        user = self.validate_auth(username, password=password)

        if not user:
            logger.warning("Password and public key auth <%s> failed, reject it" % username)
            return paramiko.AUTH_FAILED
        else:
            logger.info("Password auth <%s> success" % username)
            if self.otp_auth:
                return paramiko.AUTH_PARTIALLY_SUCCESSFUL
            return paramiko.AUTH_SUCCESSFUL

异常 IP

也可以更改请求的 user-agent 来进行标识,区分哪些请求是通过 coco 组件过来的

更改代码:coco/interface.py 125 行左右

更改如下:

 

def validate_auth(self, username, password="", public_key=""):
        if self.check_block_ssh_user(username) or \
                not self.check_allow_ssh_user(username):
            logger.warn("User in black list or not allowed: {}".format(username))
            return None
        app_service.http.default_headers = {"user-agent": 'coco-ssh'}
        info = app_service.authenticate(
            username, password=password, public_key=public_key,
            remote_addr=self.connection.addr[0]
        )
        user = info.get('user', None)
        if user:
            self.connection.user = user
            self.info = info

        seed = info.get('seed', None)
        token = info.get('token', None)
        if seed and not token:
            self.connection.otp_auth = True
            self.otp_auth = True
        return user

查看 jumpserver 登陆日志,可以看到 ssh 登陆的 UA 都变为 coco-ssh

退出移动版