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
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