Block requests not come from trusted_downstream and public non-https requests

This commit is contained in:
Sheng
2018-10-15 20:13:11 +08:00
parent db3ee2b784
commit 77b6fbfd85
5 changed files with 82 additions and 6 deletions
+23 -1
View File
@@ -13,7 +13,7 @@ from tornado.ioloop import IOLoop
from webssh.settings import swallow_http_errors
from webssh.utils import (
is_valid_ip_address, is_valid_port, is_valid_hostname,
to_bytes, to_str, to_int, UnicodeType
to_bytes, to_str, to_int, to_ip_address, UnicodeType
)
from webssh.worker import Worker, recycle_worker, workers
@@ -39,6 +39,28 @@ class InvalidValueError(Exception):
class MixinHandler(object):
def prepare(self):
if self.is_forbidden():
raise tornado.web.HTTPError(403)
def is_forbidden(self):
"""
Following requests are forbidden:
* requests not come from trusted_downstream (if set).
* non-https requests from a public network.
"""
context = self.request.connection.context
ip = context.address[0]
lst = context.trusted_downstream
if lst and ip not in lst:
return True
if context._orig_protocol == 'http':
ipaddr = to_ip_address(ip)
if ipaddr.is_global:
return True
def set_default_headers(self):
self.set_header('Server', 'TornadoServer')
+5 -5
View File
@@ -6,7 +6,7 @@ from tornado.options import options
from webssh.handler import IndexHandler, WsockHandler
from webssh.settings import (
get_app_settings, get_host_keys_settings, get_policy_setting,
get_ssl_context, max_body_size, xheaders
get_ssl_context, get_server_settings
)
@@ -31,12 +31,12 @@ def main():
loop = tornado.ioloop.IOLoop.current()
app = make_app(make_handlers(loop, options), get_app_settings(options))
ssl_ctx = get_ssl_context(options)
kwargs = dict(xheaders=xheaders, max_body_size=max_body_size)
app.listen(options.port, options.address, **kwargs)
server_settings = get_server_settings(options)
app.listen(options.port, options.address, **server_settings)
logging.info('Listening on {}:{}'.format(options.address, options.port))
if ssl_ctx:
kwargs.update(ssl_options=ssl_ctx)
app.listen(options.sslPort, options.sslAddress, **kwargs)
server_settings.update(ssl_options=ssl_ctx)
app.listen(options.sslPort, options.sslAddress, **server_settings)
logging.info('Listening on ssl {}:{}'.format(options.sslAddress,
options.sslPort))
loop.start()
+9
View File
@@ -51,6 +51,15 @@ def get_app_settings(options):
return settings
def get_server_settings(options):
settings = dict(
xheaders=xheaders,
max_body_size=max_body_size,
trusted_downstream=get_trusted_downstream(options)
)
return settings
def get_host_keys_settings(options):
if not options.hostFile:
host_keys_filename = os.path.join(base_dir, 'known_hosts')