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