diff --git a/server/www/teleport/static/js/auth/login.js b/server/www/teleport/static/js/auth/login.js index 90eeb43..958ee68 100644 --- a/server/www/teleport/static/js/auth/login.js +++ b/server/www/teleport/static/js/auth/login.js @@ -23,7 +23,7 @@ var SLOGAN = [ // $app.on_init = function (cb_stack, cb_args) { $app.on_init = function (cb_stack) { - $app.login_type = LOGIN_TYPE_PASSWORD_CAPTCHA; + $app.login_type = TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA; $app.dom = { slogan: $('#msg-slogan'), btn_login_type_password: $('#login-type-password'), @@ -58,14 +58,14 @@ $app.on_init = function (cb_stack) { $app.init_slogan(); $app.dom.btn_login_type_password.click(function () { - $app.login_type = LOGIN_TYPE_PASSWORD_CAPTCHA; + $app.login_type = TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA; $app.dom.btn_login_type_oath.removeClass('selected'); $(this).addClass('selected'); $app.dom.area_oath.slideUp(100); $app.dom.area_captcha.slideDown(100); }); $app.dom.btn_login_type_oath.click(function () { - $app.login_type = LOGIN_TYPE_PASSWORD_OATH; + $app.login_type = TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH; $app.dom.btn_login_type_password.removeClass('selected'); $(this).addClass('selected'); $app.dom.area_oath.slideDown(100); @@ -88,9 +88,9 @@ $app.on_init = function (cb_stack) { $app.dom.input_password.keydown(function (event) { $('[data-toggle="popover"]').popover('hide'); if (event.which === 13) { - if ($app.login_type === LOGIN_TYPE_PASSWORD_CAPTCHA) + if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA) $app.dom.input_captcha.focus(); - else if ($app.login_type === LOGIN_TYPE_PASSWORD_OATH) + else if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH) $app.dom.input_oath.focus(); } }); @@ -141,7 +141,7 @@ $app.login_account = function () { return; } - if ($app.login_type === LOGIN_TYPE_PASSWORD_CAPTCHA) { + if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA) { if (str_captcha.length !== 4) { $app.show_op_box('error', '验证码错误!'); setTimeout(function () { @@ -149,7 +149,7 @@ $app.login_account = function () { }, 150); return; } - } else if ($app.login_type === LOGIN_TYPE_PASSWORD_OATH) { + } else if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH) { if (str_oath.length !== 6 || ('' + parseInt(str_oath)) !== str_oath) { $app.show_op_box('error', '身份验证器动态验证码错误!'); setTimeout(function () { @@ -163,7 +163,7 @@ $app.login_account = function () { $app.show_op_box('wait', ' 正在进行身份认证,请稍候...'); // 先判断一下captcha是否正确,如果不正确,拒绝登录 - if ($app.login_type === LOGIN_TYPE_PASSWORD_CAPTCHA) { + if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA) { $tp.ajax_post_json('/auth/verify-captcha', {captcha: str_captcha}, function (ret) { if (ret.code === TPE_OK) { diff --git a/server/www/teleport/static/js/system/config.js b/server/www/teleport/static/js/system/config.js index 01ac1b8..8715218 100644 --- a/server/www/teleport/static/js/system/config.js +++ b/server/www/teleport/static/js/system/config.js @@ -2,23 +2,6 @@ $app.on_init = function () { $app.dom = { - // btn_reset_oath_code: $('#btn-reset-oath-code'), - // btn_verify_oath_code: $('#btn-verify-oath-code'), - // btn_verify_oath_code_and_save: $('#btn-verify-oath-and-save'), - // btn_modify_password: $('#btn-modify-password'), - // btn_toggle_oath_download: $('#toggle-oath-download'), - // - // oath_app_download_box: $('#oath-app-download-box'), - // - // input_current_password: $('#current-password'), - // input_new_password: $('#new-password-1'), - // input_new_password_confirm: $('#new-password-2'), - // input_oath_code: $('#oath-code'), - // input_oath_code_verify: $('#oath-code-verify'), - // - // dlg_reset_oath_code: $('#dialog-reset-oath-code'), - // oath_secret_image: $('#oath-secret-qrcode'), - // tmp_oath_secret: $('#tmp-oath-secret'), // 邮件系统设置 mail: { @@ -183,7 +166,7 @@ $app._on_btn_save_mail_config = function () { return; $app.dom.mail.btn_save_mail_config.attr('disabled', 'disabled'); - $tp.ajax_post_json('/system/save-mail-config', + $tp.ajax_post_json('/system/save-smtp-config', { smtp_server: _server, smtp_port: _port, diff --git a/server/www/teleport/static/js/system/role.js b/server/www/teleport/static/js/system/role.js index 6d6f2be..85c475e 100644 --- a/server/www/teleport/static/js/system/role.js +++ b/server/www/teleport/static/js/system/role.js @@ -79,15 +79,15 @@ $app.create_controls = function () { }, { t: '审计', i: [ - {n: '审计(查看历史会话)', p: TP_PRIVILEGE_AUDIT_OPS_HISTORY}, + {n: '审计(回放操作录像)', p: TP_PRIVILEGE_AUDIT_OPS_HISTORY}, {n: '审计授权管理', p: TP_PRIVILEGE_AUDIT_AUZ}] }, { t: '系统', i: [ {n: '角色管理', p: TP_PRIVILEGE_SYS_ROLE}, {n: '系统配置与维护', p: TP_PRIVILEGE_SYS_CONFIG}, - {n: '历史会话管理', p: TP_PRIVILEGE_SYS_OPS_HISTORY}, - {n: '系统日志管理', p: TP_PRIVILEGE_SYS_LOG}] + // {n: '历史会话管理', p: TP_PRIVILEGE_SYS_OPS_HISTORY}, + {n: '查看系统日志', p: TP_PRIVILEGE_SYS_LOG}] } ]; nodes = []; @@ -160,7 +160,7 @@ $app.show_role = function (role_id, edit_mode) { } if (role_id === 0) { - role = {id: 0, name: '', privilege: 0}; + role = {id: 0, name: '', privilege: TP_PRIVILEGE_LOGIN_WEB}; edit = true; } else { for (var i = 0; i < $app.role_list.length; ++i) { diff --git a/server/www/teleport/static/js/tp-const.js b/server/www/teleport/static/js/tp-const.js index fcec8d7..1ea1f0e 100644 --- a/server/www/teleport/static/js/tp-const.js +++ b/server/www/teleport/static/js/tp-const.js @@ -1,5 +1,12 @@ "use strict"; + +var TP_LOGIN_AUTH_SYS_DEFAULT = 0; // 系统默认 +var TP_LOGIN_AUTH_USERNAME_PASSWORD = 0x0001; // 用户名+密码 +var TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA = 0x0002; // 用户名+密码+验证码 +var TP_LOGIN_AUTH_USERNAME_OATH = 0x0004; // 用户名+OATH +var TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH = 0x0008; // 用户名+密码+OATH + //======================================================= // 远程连接认证方式 //======================================================= @@ -135,8 +142,8 @@ var TP_PRIVILEGE_AUDIT_AUZ = 0x00010000;// # 审计策略授权管理 var TP_PRIVILEGE_SYS_ROLE = 0x00040000;// # 角色管理 var TP_PRIVILEGE_SYS_CONFIG = 0x00080000;// # 系统配置维护 -var TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000;// # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等) -var TP_PRIVILEGE_SYS_LOG = 0x00200000;// # 系统日志管理(例如日志备份、删除等) +//var TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000;// # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等) +var TP_PRIVILEGE_SYS_LOG = 0x00200000;// # 查看系统日志 var TP_PRIVILEGES = [ TP_PRIVILEGE_LOGIN_WEB, @@ -159,7 +166,7 @@ var TP_PRIVILEGES = [ //TP_PRIVILEGE_AUDIT_SYSLOG, TP_PRIVILEGE_SYS_ROLE, TP_PRIVILEGE_SYS_CONFIG, - TP_PRIVILEGE_SYS_OPS_HISTORY, + //TP_PRIVILEGE_SYS_OPS_HISTORY, TP_PRIVILEGE_SYS_LOG ]; @@ -222,11 +229,6 @@ var TPE_START_CLIENT = 100002; // 无法启动客户端程序(无法创建进 var TPE_NO_CORE_SERVER = 200000; // 未能检测到核心服务 -// 使用用户名密码登录(额外需要验证码) -var LOGIN_TYPE_PASSWORD_CAPTCHA = 1; -// 使用用户名密码登录(额外需要身份验证器的动态验证码) -var LOGIN_TYPE_PASSWORD_OATH = 2; - // ========================================================================== // 数据库类型 // ========================================================================== diff --git a/server/www/teleport/view/ops/auz-list.mako b/server/www/teleport/view/ops/auz-list.mako index 5f5536f..6129e05 100644 --- a/server/www/teleport/view/ops/auz-list.mako +++ b/server/www/teleport/view/ops/auz-list.mako @@ -78,7 +78,8 @@ @@ -88,7 +89,6 @@

说明:

diff --git a/server/www/teleport/view/system/config.mako b/server/www/teleport/view/system/config.mako index 67ec938..19c9661 100644 --- a/server/www/teleport/view/system/config.mako +++ b/server/www/teleport/view/system/config.mako @@ -17,15 +17,15 @@
-
+
@@ -130,7 +130,7 @@ -
+
当前会话录像存储空间:总 123.35GB,可用空间 85.17GB。
密码策略
@@ -163,6 +163,8 @@
+
备份功能尚未实现
+
diff --git a/server/www/teleport/view/system/role.mako b/server/www/teleport/view/system/role.mako index 4cff0a1..788ce92 100644 --- a/server/www/teleport/view/system/role.mako +++ b/server/www/teleport/view/system/role.mako @@ -63,28 +63,28 @@

权限说明:

    -
  • 主机信息创建/编辑 允许创建和编辑主机资产信息,如IP地址、端口与协议、名称、备注等。
  • -
  • 删除主机信息 允许删除主机资产。
  • +
  • 主机创建/编辑 允许创建和编辑主机资产信息,如IP地址、端口与协议、名称、备注等。
  • +
  • 删除主机 允许删除主机资产。
  • 主机禁用/解禁 允许设置禁止访问某主机,或者解禁。
  • 主机分组管理 将主机进行分组,便于快速查找或者授权管理。
  • -
  • 主机账号管理 管理能够远程登录主机的账号,包括账号名称和密码、SSH密钥等。
  • -
  • 主机账号分组管理 管理大量主机时,可能会为这些主机设置相同的主机账号和密码,使用主机账号分组可便于批量授权
  • +
  • 账号管理 管理能够远程登录主机的账号,包括账号名称和密码、SSH密钥等。
  • +
  • 账号分组管理 将远程账号进行分组管理,便于批量授权。
  • 登录WEB系统 允许用户登录本WEB系统,除特殊情况外,用户应该具有本权限。
  • 用户创建/编辑 允许创建或编辑登录teleport系统的用户账号。
  • -
  • 删除用户 允许删除登录teleport系统的用户账号。
  • +
  • 删除用户 允许删除登录teleport系统的用户。
  • 用户禁用/解禁 允许设置禁止用户访问teleport系统,或者解禁。当用户因连续认证失败而被临时锁定时,也可由此权限进行解锁。
  • 用户分组管理 将用户进行分组,便于快速查找或者授权管理。
  • 远程主机运维 允许用户访问远程主机。
  • 运维授权管理 授权用户/用户组使用特定的远程主机账号访问指定远程主机。具有本权限的用户自动具有远程主机运维的权限。
  • 查看在线会话 允许查看在线运维会话,并进行实时同步显示。【此功能尚未实现】
  • 阻断在线会话 强行终止在线运维会话。【此功能尚未实现】
  • -
  • 审计(查看历史会话) 允许重放历史会话。
  • +
  • 审计(回放操作录像) 允许重放会话的操作录像。注意:运维人员总是可以回放自己的操作录像。
  • 审计授权管理 授权用户/用户组重放指定远程主机的历史会话。具有本权限的用户自动具有审计权限。
  • 角色管理 允许创建、编辑、删除角色。
  • -
  • 系统配置与维护
  • -
  • 历史会话管理
  • -
  • 系统日志管理
  • +
  • 系统配置与维护 允许对teleport系统进行配置和维护操作。
  • +##
  • 历史会话管理 允许查看用户在teleport系统上的操作记录。
  • +
  • 查看系统日志 允许查看用户在teleport系统上的操作记录。
-##

特别注意:teleport系统使用最小权限判定规则,也即,在检查权限时,会按用户所具有的最小权限进行判断。例如:如用户无远程主机运维权限,那么即使其所在用户组被授权访问某远程主机,此用户也无法连接到该远程主机。

+

特别注意:teleport系统使用最小权限判定规则,也即,在检查权限时,会按用户所具有的最小权限进行判断。例如:如用户无远程主机运维权限,那么即使其所在用户组被授权访问某远程主机,此用户也无法连接到该远程主机。

diff --git a/server/www/teleport/webroot/app/base/configs.py b/server/www/teleport/webroot/app/base/configs.py index a876a0b..e0b343d 100644 --- a/server/www/teleport/webroot/app/base/configs.py +++ b/server/www/teleport/webroot/app/base/configs.py @@ -3,6 +3,7 @@ import configparser import os +from app.const import * from .logger import log from .utils import AttrDict, tp_make_dir @@ -457,6 +458,40 @@ class AppConfig(BaseAppConfig): return True try: + # ===================================== + # 密码策略相关 + # ===================================== + self.sys.password = AttrDict() + self.sys.password.find = True + self.sys.password.strong = True + self.sys.password.timeout = 30 # 30 days + if 'password_find' in conf_data: + self.sys.password.find = conf_data['password_find'] + if 'password_strong' in conf_data: + self.sys.password.strong = conf_data['password_strong'] + if 'password_timeout' in conf_data: + self.sys.password.timeout = int(conf_data['password_timeout']) + + # ===================================== + # 登录相关 + # ===================================== + self.sys.login = AttrDict() + self.sys.login.session_timeout = 30 + self.sys.login.retry = 0 + self.sys.login.lock_timeout = 30 # 30 min + self.sys.login.auth = TP_LOGIN_AUTH_USERNAME_PASSWORD | TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA | TP_LOGIN_AUTH_USERNAME_OATH + if 'login_session_timeout' in conf_data: + self.sys.login.session_timeout = int(conf_data['login_session_timeout']) + if 'login_retry' in conf_data: + self.sys.login.retry = int(conf_data['login_retry']) + if 'login_lock_timeout' in conf_data: + self.sys.login.lock_timeout = int(conf_data['login_lock_timeout']) + if 'login_auth' in conf_data: + self.sys.login.auth = int(conf_data['login_auth']) + + # ===================================== + # SMTP相关 + # ===================================== self.sys.smtp = AttrDict() self.sys.smtp.server = "" self.sys.smtp.port = 25 @@ -473,6 +508,17 @@ class AppConfig(BaseAppConfig): if 'smtp_password' in conf_data: self.sys_smtp_password = conf_data['smtp_password'] + # ===================================== + # 存储相关 + # ===================================== + self.sys.storage = AttrDict() + self.sys.storage.log = 0 + self.sys.storage.record = 0 + if 'storage_log' in conf_data: + self.sys.storage.log = int(conf_data['storage_log']) + if 'storage_record' in conf_data: + self.sys.storage.record = int(conf_data['storage_record']) + self.sys.loaded = True except IndexError: diff --git a/server/www/teleport/webroot/app/base/database/create.py b/server/www/teleport/webroot/app/base/database/create.py index 292265b..af44f4c 100644 --- a/server/www/teleport/webroot/app/base/database/create.py +++ b/server/www/teleport/webroot/app/base/database/create.py @@ -741,8 +741,9 @@ class DatabaseInit: self._db_exec( '创建系统管理员账号', 'INSERT INTO `{}user` (`type`, `auth_type`, `username`, `surname`, `password`, `role_id`, `state`, `email`, `creator_id`, `create_time`, `last_login`, `last_chpass`) VALUES ' - '(1, 1, "{username}", "{surname}", "{password}", 1, {state}, "{email}", 0, {create_time}, {last_login}, {last_chpass});' + '(1, {auth_type}, "{username}", "{surname}", "{password}", 1, {state}, "{email}", 0, {create_time}, {last_login}, {last_chpass});' ''.format(self.db.table_prefix, + auth_type=TP_LOGIN_AUTH_SYS_DEFAULT, username=sysadmin, surname=sysadmin, password=tp_password_generate_secret(password), state=TP_STATE_NORMAL, email=email, create_time=_time_now, last_login=_time_now, last_chpass=_time_now) ) diff --git a/server/www/teleport/webroot/app/const.py b/server/www/teleport/webroot/app/const.py index e81d8d1..2ed30d9 100644 --- a/server/www/teleport/webroot/app/const.py +++ b/server/www/teleport/webroot/app/const.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- -LOGIN_TYPE_PASSWORD_CAPTCHA = 1 -LOGIN_TYPE_PASSWORD_OATH = 2 +TP_LOGIN_AUTH_SYS_DEFAULT = 0 # 系统默认(根据系统配置进行) +TP_LOGIN_AUTH_USERNAME_PASSWORD = 0x0001 # 用户名+密码 +TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA = 0x0002 # 用户名+密码+验证码 +TP_LOGIN_AUTH_USERNAME_OATH = 0x0004 # 用户名+OATH +TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH = 0x0008 # 用户名+密码+OATH APP_MODE_NORMAL = 1 APP_MODE_MAINTENANCE = 2 @@ -156,8 +159,8 @@ TP_PRIVILEGE_AUDIT_AUZ = 0x00010000 # 审计策略授权管理 TP_PRIVILEGE_SYS_ROLE = 0x00040000 # 角色管理 TP_PRIVILEGE_SYS_CONFIG = 0x00080000 # 系统配置维护 -TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000 # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等) -TP_PRIVILEGE_SYS_LOG = 0x00200000 # 系统日志管理(例如日志备份、删除等) +# TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000 # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等) +TP_PRIVILEGE_SYS_LOG = 0x00200000 # 查看系统日志 # =================================================================== # error code diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py index b1b6945..bebad2e 100644 --- a/server/www/teleport/webroot/app/controller/__init__.py +++ b/server/www/teleport/webroot/app/controller/__init__.py @@ -220,7 +220,7 @@ controllers = [ # - [json] 系统配置-发送测试邮件 (r'/system/send-test-mail', system.DoSendTestMailHandler), # - [json] 系统配置-保存邮件系统配置 - (r'/system/save-mail-config', system.DoSaveMailConfigHandler), + (r'/system/save-smtp-config', system.DoSaveSmtpConfigHandler), # - [json] 获取服务器时间 (r'/system/get-time', system.DoGetTimeHandler), diff --git a/server/www/teleport/webroot/app/controller/auth.py b/server/www/teleport/webroot/app/controller/auth.py index 0e6d1d9..f095da7 100644 --- a/server/www/teleport/webroot/app/controller/auth.py +++ b/server/www/teleport/webroot/app/controller/auth.py @@ -74,7 +74,7 @@ class DoLoginHandler(TPBaseJsonHandler): _tmp = {'username': username, 'surname': username} - if login_type == LOGIN_TYPE_PASSWORD_CAPTCHA: + if login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA: oath = None code = self.get_session('captcha') if code is None: @@ -82,7 +82,7 @@ class DoLoginHandler(TPBaseJsonHandler): self.del_session('captcha') if code.lower() != captcha.lower(): return self.write_json(TPE_CAPTCHA_MISMATCH, '验证码错误') - elif login_type == LOGIN_TYPE_PASSWORD_OATH: + elif login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH: if len(oath) == 0: return self.write_json(TPE_OATH_MISMATCH, '未提供身份验证器动态验证码') else: @@ -108,11 +108,11 @@ class DoLoginHandler(TPBaseJsonHandler): syslog.sys_log(_tmp, self.request.remote_ip, TPE_FAILED, '登录失败,系统内部错误') return self.write_json(TPE_FAILED) - if login_type == LOGIN_TYPE_PASSWORD_CAPTCHA: + if login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA: if not tp_password_verify(password, user_info['password']): syslog.sys_log(_tmp, self.request.remote_ip, TPE_USER_AUTH, '登录失败,密码错误!') return self.write_json(TPE_USER_AUTH) - elif login_type == LOGIN_TYPE_PASSWORD_OATH: + elif login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH: if not tp_oath_verify_code(user_info['oath_secret'], oath): syslog.sys_log(_tmp, self.request.remote_ip, TPE_OATH_MISMATCH, "登录失败,身份验证器动态验证码错误!") return self.write_json(TPE_OATH_MISMATCH) diff --git a/server/www/teleport/webroot/app/controller/system.py b/server/www/teleport/webroot/app/controller/system.py index 3143fc5..e27a865 100644 --- a/server/www/teleport/webroot/app/controller/system.py +++ b/server/www/teleport/webroot/app/controller/system.py @@ -14,7 +14,6 @@ from app.const import * from app.model import syslog -# time_now = int(time.time()) class DoGetTimeHandler(TPBaseJsonHandler): def post(self): time_now = int(datetime.datetime.utcnow().timestamp()) @@ -223,7 +222,7 @@ class DoSendTestMailHandler(TPBaseJsonHandler): self.write_json(code, message=msg) -class DoSaveMailConfigHandler(TPBaseJsonHandler): +class DoSaveSmtpConfigHandler(TPBaseJsonHandler): def post(self): ret = self.check_privilege(TP_PRIVILEGE_SYS_CONFIG) if ret != TPE_OK: diff --git a/server/www/teleport/webroot/app/model/system.py b/server/www/teleport/webroot/app/model/system.py index 87f9fd7..8443a98 100644 --- a/server/www/teleport/webroot/app/model/system.py +++ b/server/www/teleport/webroot/app/model/system.py @@ -101,7 +101,7 @@ def remove_role(handler, role_id): if not db.transaction(sql_list): return TPE_DATABASE - syslog.sys_log(handler.get_current_user(), handler.request.remote_ip, TPE_OK, "删除角色:{}".format(','.join(role_name))) + syslog.sys_log(handler.get_current_user(), handler.request.remote_ip, TPE_OK, "删除角色:{}".format(role_name)) return TPE_OK
数据库备份