todo: 系统设置中的各项,应该分类后按json格式存放,方便管理及将来扩展。

pull/105/head
ApexLiu 2017-11-03 01:02:27 +08:00
parent 0247d5603d
commit 71bd6817c2
14 changed files with 103 additions and 67 deletions

View File

@ -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', '<i class="fa fa-circle-o-notch fa-spin"></i> 正在进行身份认证,请稍候...');
// 先判断一下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) {

View File

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

View File

@ -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) {

View File

@ -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;
// ==========================================================================
// 数据库类型
// ==========================================================================

View File

@ -78,7 +78,8 @@
</div>
<div class="tab-pane" style="padding:15px;" id="tab-search">
此功能尚未实现
<div class="alert alert-danger">快速查找功能尚未实现</div>
</div>
</div>
@ -88,7 +89,6 @@
<div class="box">
<p>说明:</p>
<ul class="help-list">
## <li>可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 <i class="fa fa-rotate-left fa-fw"></i> 可以重置过滤器。</li>
<li>上下拖动“顺序”栏中的 <i class="fa fa-reorder fa-fw"></i> 可以调节策略的检查顺序。</li>
<li>可以在“快速查找”中快速定位用户或主机的授权关系。</li>
</ul>

View File

@ -17,15 +17,15 @@
<div class="page-content-inner">
<div class="box box-nav-tabs">
<ul class="nav nav-tabs">
<li><a href="#tab-security" data-toggle="tab">安全</a></li>
<li class="active"><a href="#tab-security" data-toggle="tab">安全</a></li>
<li><a href="#tab-email" data-toggle="tab">邮件系统</a></li>
<li class="active"><a href="#tab-storage" data-toggle="tab">存储</a></li>
<li><a href="#tab-storage" data-toggle="tab">存储</a></li>
<li><a href="#tab-backup" data-toggle="tab">备份</a></li>
</ul>
<div class="tab-content">
<!-- panel for security config -->
<div class="tab-pane" id="tab-security">
<div class="tab-pane active" id="tab-security">
<table class="table table-config-list">
<tr>
<td colspan="2" class="title">密码策略</td>
@ -130,7 +130,7 @@
</div>
<!-- panel for storage config -->
<div class="tab-pane active" id="tab-storage">
<div class="tab-pane" id="tab-storage">
<div class="alert alert-info">当前会话录像存储空间:总 123.35GB,可用空间 85.17GB。</div>
<table class="table table-config-list">
<tr>
@ -163,6 +163,8 @@
<!-- panel for backup config -->
<div class="tab-pane" id="tab-backup">
<div class="alert alert-danger">备份功能尚未实现</div>
<table class="table table-config-list">
<tr>
<td colspan="2" class="title">数据库备份</td>

View File

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

View File

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

View File

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

View File

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

View File

@ -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),

View File

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

View File

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

View File

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