Bläddra i källkod

增加异常事件告警

xusl 1 år sedan
förälder
incheckning
3dc809f869

+ 2 - 2
backend/src/main/java/com/jiayue/ssi/filter/InterfaceLimitFilter.java

@@ -64,7 +64,7 @@ public class InterfaceLimitFilter extends OncePerRequestFilter {
                 // 当前时间
                 Date currentDate = new Date();
                 if (currentDate.after(startDate) && currentDate.before(endDate)){
-                    log.info(remoteIp+"进入黑名单进行拦截!");
+                    log.info("发送邮箱通知系统管理员后台输出======> "+"IP【"+remoteIp+"】异常访问");
                     response.setHeader("Access-Control-Allow-Origin", "*");
                     response.setStatus(410);
                     response.setContentType("text/html;charset=utf-8");
@@ -73,7 +73,7 @@ public class InterfaceLimitFilter extends OncePerRequestFilter {
                 }
             }
             else{
-                log.info(remoteIp+"进入黑名单进行拦截!");
+                log.info("发送邮箱通知系统管理员后台输出======> "+"IP【"+remoteIp+"】异常访问");
                 response.setHeader("Access-Control-Allow-Origin", "*");
                 response.setStatus(410);
                 response.setContentType("text/html;charset=utf-8");

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.java

@@ -232,7 +232,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
                     String ip = CacheConstants.IP_USER_MAP.get(currentIp);
                     if (ip != null && !"".equals(ip)) {
                         // 判断当前访问的ip是否已经存在,如果存在则不让任何用户访问
-                        ResponseInfo.doResponse(response, "您的客户端IP有用户正在使用,不能登录系统!", 405);
+                        ResponseInfo.doResponse(response, "您的客户端用户正在使用,请等待一小会登录系统!", 405);
                         return;
                     }
 

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/filter/VerifySmFilter.java

@@ -43,7 +43,7 @@ public class VerifySmFilter extends OncePerRequestFilter {
                 String ip = CacheConstants.IP_USER_MAP.get(currentIp);
                 if (ip!=null && !"".equals(ip)){
                     // 判断当前访问的ip是否已经存在,如果存在则不让任何用户访问
-                    ResponseInfo.doResponse(response, "您的客户端IP有用户正在使用,不能登录系统!", 405);
+                    ResponseInfo.doResponse(response, "您的客户端用户正在使用,请等待一小会登录系统!", 405);
                     return;
                 }
             }

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.java

@@ -118,7 +118,7 @@ public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthent
 
             // 通知系统管理员
             if ("0".equals(noticeWay)){
-                log.info("多点登录发送邮箱通知系统管理员后台输出======> "+"账号【"+sysUser.getUsername()+"】多点登录","本次登录时间:"+DateUtils.getTime()+",登录IP:"+IPUtils.getIpAddr(request));
+                log.info("发送邮箱通知系统管理员后台输出======> "+"账号【"+sysUser.getUsername()+"】多点登录","本次登录时间:"+DateUtils.getTime()+",登录IP:"+IPUtils.getIpAddr(request));
 //                List<SysUser> sysUserList = sysUserService.selectUserByRole("1");
 //                if (sysUserList.size()>0){
 ////                    String[] mailArray = new String[sysUserList.size()];

+ 40 - 0
backend/src/main/java/com/jiayue/ssi/handler/RestAccessDeniedHandler.java

@@ -3,17 +3,23 @@ package com.jiayue.ssi.handler;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.jiayue.ssi.annotation.OperateLog;
 import com.jiayue.ssi.backenum.AuditType;
 import com.jiayue.ssi.backenum.BusinessStatus;
 import com.jiayue.ssi.backenum.BusinessType;
+import com.jiayue.ssi.entity.SysAlarm;
 import com.jiayue.ssi.entity.SysOperLog;
+import com.jiayue.ssi.entity.SysPolicy;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.factory.OperateLogFactory;
+import com.jiayue.ssi.service.SysPolicyService;
 import com.jiayue.ssi.util.IPUtils;
 import com.jiayue.ssi.util.JwtTokenUtil;
 import com.jiayue.ssi.util.ServletUtils;
 import io.jsonwebtoken.Claims;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.web.access.AccessDeniedHandler;
 import org.springframework.stereotype.Service;
@@ -28,7 +34,11 @@ import java.io.IOException;
  * @since 2018/8/23 14:45
  */
 @Service
+@Slf4j
 public class RestAccessDeniedHandler implements AccessDeniedHandler {
+    @Autowired
+    SysPolicyService sysPolicyService;
+
     @Override
     public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException {
         String token = request.getHeader("Authorization");
@@ -61,6 +71,36 @@ public class RestAccessDeniedHandler implements AccessDeniedHandler {
         operLog.setAuditType(AuditType.SYS.ordinal());
         // 保存数据库
         OperateLogFactory.recordOper(operLog);
+        SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
+        String noticeWay = "";
+        if ("0".equals(sysPolicy.getExcLevelLogin())){
+            noticeWay = sysPolicy.getExcNoticeWayA();
+        } else if ("1".equals(sysPolicy.getExcLevelLogin())){
+            noticeWay = sysPolicy.getExcNoticeWayB();
+        }
+
+        // 通知系统管理员
+        if ("0".equals(noticeWay)){
+            log.info("发送邮箱通知系统管理员后台输出======> "+"账号【"+username+"】越权访问"+org.apache.commons.lang3.StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
+//                        List<SysUser> sysUserList = sysUserService.selectUserByRole("1");
+//                        if (sysUserList.size()>0){
+//                            String[] mailArray = new String[sysUserList.size()];
+//                            for (int i=0;i<sysUserList.size();i++){
+//                                mailArray[i] = AesUtils.decryptStr(sysUserList.get(i).getMailbox());
+//                            }
+//                            try {
+//                                // 发送邮件
+//                                sendMailUtil.executeSendMail(mailArray,"账号【"+user.getUsername()+"】登录失败","账号【"+user.getUsername()+"】登录失败"+errCount+"次,锁定账号!");
+//                            } catch (Exception ex) {
+//                                System.out.println("邮箱验证码发送失败!");
+//                            }
+//                        }
+        }
+        else if ("1".equals(noticeWay)){
+            // 告警先不用了,系统里只用一种邮箱告警
+        }
+
+
 
         response.setHeader("Access-Control-Allow-Origin", "*");
         response.setStatus(402);

+ 4 - 4
backend/src/main/java/com/jiayue/ssi/job/AuditBakPathCapCheck.java

@@ -36,14 +36,14 @@ public class AuditBakPathCapCheck {
         DecimalFormat df = new DecimalFormat("#.00");//设置保留两位小数
         SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
         float logSpaceWarnCap = sysPolicy.getAuditLogBakCapAlarm() *  Convert.toFloat(txfloat(sysPolicy.getLogSpaceWarn(),100));
-        log.debug("日志容量阈值:{} GB参数设置:磁盘上限:{} GB,预警阈值百分比:{}%",df.format(logSpaceWarnCap),sysPolicy.getAuditLogBakCapAlarm(),sysPolicy.getLogSpaceWarn());
+//        log.debug("日志容量阈值:{} GB参数设置:磁盘上限:{} GB,预警阈值百分比:{}%",df.format(logSpaceWarnCap),sysPolicy.getAuditLogBakCapAlarm(),sysPolicy.getLogSpaceWarn());
         long size = FileUtils.sizeOfDirectory(new File(FileUtil.getAuditBackUpPath()));
-        log.debug("审查日志备份路径大小:{} ,转换后大小:{} GB",size,getSizeToGb(size));
+//        log.debug("审查日志备份路径大小:{} ,转换后大小:{} GB",size,getSizeToGb(size));
 
         if(Convert.toFloat(getSizeToGb(size))>logSpaceWarnCap){
-            log.warn("审计日志备份目录存量大小已超过设定阈值");
+            log.info("发送邮箱通知系统管理员后台输出======> 审计日志备份目录存量大小已超过设定阈值"+sysPolicy.getLogSpaceWarn()+"%");
         }else{
-            log.info("检测审计日志备份目录大小正常。");
+//            log.info("检测审计日志备份目录大小正常。");
         }
     }
 

+ 26 - 24
backend/src/main/java/com/jiayue/ssi/job/AutoScanMemory.java

@@ -7,6 +7,7 @@ import com.jiayue.ssi.entity.server.Jvm;
 import com.jiayue.ssi.service.SysAlarmService;
 import com.jiayue.ssi.service.SysPolicyService;
 import com.jiayue.ssi.util.FileUtil;
+import com.jiayue.ssi.util.ServletUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -43,34 +44,35 @@ public class AutoScanMemory {
             jvm.setMax(Runtime.getRuntime().maxMemory());
             jvm.setFree(Runtime.getRuntime().freeMemory());
             if ((100 - jvm.getUsage()) < memoryWarn) {
-                SysAlarm sysAlarm = new SysAlarm();
-                sysAlarm.setAlarmContent("当前JVM使用率:" + jvm.getUsage() + "%,低于阈值" + memoryWarn + "%");
-                sysAlarm.setReadSign("0");
-                // 低于策略设定值则告警
-                sysAlarmService.save(sysAlarm);
+//                SysAlarm sysAlarm = new SysAlarm();
+//                sysAlarm.setAlarmContent("当前JVM使用率:" + jvm.getUsage() + "%,低于阈值" + memoryWarn + "%");
+//                sysAlarm.setReadSign("0");
+//                // 低于策略设定值则告警
+//                sysAlarmService.save(sysAlarm);
+                log.info("发送邮箱通知系统管理员后台输出======> "+"系统内存邮箱告警:低于设定阈值"+memoryWarn + "%");
             }
         }
         catch (Exception e){
             log.error("检测内存阈值出错",e);
         }
-        try {
-            // 检测日志存储低于阈值告警
-            File file = new File(FileUtil.getLogsPath());
-            // 最低阈值数值
-            double percentValue = Double.parseDouble(sysPolicy.getLogSpaceWarn().toString()) / (double) 100;
-            double lowValue = (file.getTotalSpace() / 1024 / 1024 / 1024) * percentValue;
-            // 可用剩余空间
-            double ableSpaceValue = Double.parseDouble((file.getUsableSpace() / 1024 / 1024 / 1024) + "");
-            if (ableSpaceValue < lowValue) {
-                SysAlarm sysAlarm = new SysAlarm();
-                sysAlarm.setAlarmContent("当前剩余空间:" + ableSpaceValue + "G,低于阈值" + sysPolicy.getLogSpaceWarn() + "%");
-                sysAlarm.setReadSign("0");
-                // 低于策略设定值则告警
-                sysAlarmService.save(sysAlarm);
-            }
-        }
-        catch (Exception e){
-            log.error("检测日志空间阈值出错",e);
-        }
+//        try {
+//            // 检测日志存储低于阈值告警
+//            File file = new File(FileUtil.getLogsPath());
+//            // 最低阈值数值
+//            double percentValue = Double.parseDouble(sysPolicy.getLogSpaceWarn().toString()) / (double) 100;
+//            double lowValue = (file.getTotalSpace() / 1024 / 1024 / 1024) * percentValue;
+//            // 可用剩余空间
+//            double ableSpaceValue = Double.parseDouble((file.getUsableSpace() / 1024 / 1024 / 1024) + "");
+//            if (ableSpaceValue < lowValue) {
+//                SysAlarm sysAlarm = new SysAlarm();
+//                sysAlarm.setAlarmContent("当前剩余空间:" + ableSpaceValue + "G,低于阈值" + sysPolicy.getLogSpaceWarn() + "%");
+//                sysAlarm.setReadSign("0");
+//                // 低于策略设定值则告警
+//                sysAlarmService.save(sysAlarm);
+//            }
+//        }
+//        catch (Exception e){
+//            log.error("检测日志空间阈值出错",e);
+//        }
     }
 }

+ 118 - 102
ui/src/views/sysManager/sysPolicy/index.vue

@@ -1,110 +1,126 @@
 <template>
   <div class="app-container">
     <el-form ref="form" :model="form" :rules="rules" label-width="250px" size="small">
-      <el-form-item label="登录失败次数限制" prop="loginFails">
-        <el-input v-model="form.loginFails" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="登录失败锁定时长(至少20分钟)" prop="loginLock">
-        <el-input v-model="form.loginLock" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="密码规则设置">
-        <el-checkbox-group v-model="form.passwordRule">
-          <el-checkbox v-for="(item,index) in passwordRuleList" :key="index" :label="item.value">{{ item.label }}
-          </el-checkbox>
-        </el-checkbox-group>
-      </el-form-item>
-      <el-form-item label="账号未使用的月数设置" prop="scanAccount">
-        <el-input v-model="form.scanAccount" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="非活动状态登出系统(设定分钟数)" prop="inactiveLogout">
-        <el-input v-model="form.inactiveLogout" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="并发会话数(1-10个)" prop="bfhhs">
-        <el-input v-model="form.bfhhs" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="审计日志保留月数" prop="auditLog">
-        <el-input v-model="form.auditLog" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="审计日志存储容量告警上限(GB)" prop="auditLogBakCapAlarm" type="number">
-        <el-input v-model="form.auditLogBakCapAlarm" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="内存低于阈值告警(%)" prop="memoryWarn">
-        <el-input v-model="form.memoryWarn" style="width: 240px"></el-input>
-      </el-form-item>
-
-      <el-form-item label="日志存储低于阈值告警(%)" prop="logSpaceWarn">
-        <el-input v-model="form.logSpaceWarn" style="width: 240px"></el-input>
-      </el-form-item>
-      <el-form-item label="A级别异常通知方式" prop="excNoticeWayA">
-        <el-select v-model="form.excNoticeWayA" placeholder="请选择通知方式" style="width: 240px">
-          <el-option
-            v-for="item in excNoticeOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="B级别异常通知方式" prop="excNoticeWayB">
-        <el-select v-model="form.excNoticeWayB" placeholder="请选择通知方式" style="width: 240px">
-          <el-option
-            v-for="item in excNoticeOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="连续登录失败异常级别" prop="excLevelLogin">
-        <el-select v-model="form.excLevelLogin" placeholder="请选择异常级别" style="width: 240px">
-          <el-option
-            v-for="item in excLevelOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="同一用户多点登录异常级别" prop="excLevelSameUser">
-        <el-select v-model="form.excLevelSameUser" placeholder="请选择异常级别" style="width: 240px">
-          <el-option
-            v-for="item in excLevelOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
+      <fieldset>
+        <legend>登录策略配置</legend>
+        <el-form-item label="登录失败次数限制" prop="loginFails">
+          <el-input v-model="form.loginFails" style="width: 240px"></el-input>
+        </el-form-item>
+        <el-form-item label="登录失败锁定时长(至少20分钟)" prop="loginLock">
+          <el-input v-model="form.loginLock" style="width: 240px"></el-input>
+        </el-form-item>
+        <el-form-item label="非活动状态登出系统(设定分钟数)" prop="inactiveLogout">
+          <el-input v-model="form.inactiveLogout" style="width: 240px"></el-input>
+        </el-form-item>
+        <el-form-item label="并发会话数(1-10个)" prop="bfhhs">
+          <el-input v-model="form.bfhhs" style="width: 240px"></el-input>
+        </el-form-item>
+      </fieldset>
+      <fieldset>
+        <legend>账号、密码策略配置</legend>
+        <el-form-item label="密码规则设置">
+          <el-checkbox-group v-model="form.passwordRule">
+            <el-checkbox v-for="(item,index) in passwordRuleList" :key="index" :label="item.value">{{ item.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="账号在月数内未使用锁定" prop="scanAccount">
+          <el-input v-model="form.scanAccount" style="width: 240px"></el-input>
+        </el-form-item>
+      </fieldset>
+      <fieldset>
+        <legend>审计策略配置</legend>
+        <el-form-item label="审计日志保留月数" prop="auditLog">
+          <el-input v-model="form.auditLog" style="width: 240px"></el-input>
+        </el-form-item>
+        <el-form-item label="审计策略配置" prop="auditableEvent">
+          <el-checkbox-group v-model="form.auditableEvent">
+            <el-checkbox v-for="(item,index) in auditableEventList" :key="index" :label="item.value">{{ item.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="审计日志存储容量告警上限(GB)" prop="auditLogBakCapAlarm" type="number">
+          <el-input v-model="form.auditLogBakCapAlarm" style="width: 240px"></el-input>
+        </el-form-item>
+        <el-form-item label="审计日志存储低于阈值邮箱告警(%)" prop="logSpaceWarn">
+          <el-input v-model="form.logSpaceWarn" style="width: 240px"></el-input>
+        </el-form-item>
+      </fieldset>
+      <fieldset>
+        <legend>系统策略配置</legend>
+        <el-form-item label="内存低于阈值邮箱告警(%)" prop="memoryWarn">
+          <el-input v-model="form.memoryWarn" style="width: 240px"></el-input>
+        </el-form-item>
+        <el-divider></el-divider>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="A级别异常通知方式" prop="excNoticeWayA">
+              <el-select v-model="form.excNoticeWayA" placeholder="请选择通知方式" style="width: 240px">
+                <el-option
+                  v-for="item in excNoticeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="B级别异常通知方式" prop="excNoticeWayB">
+              <el-select v-model="form.excNoticeWayB" placeholder="请选择通知方式" style="width: 240px">
+                <el-option
+                  v-for="item in excNoticeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="连续登录失败异常级别" prop="excLevelLogin">
+              <el-select v-model="form.excLevelLogin" placeholder="请选择异常级别" style="width: 240px">
+                <el-option
+                  v-for="item in excLevelOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="同一用户多点登录异常级别" prop="excLevelSameUser">
+              <el-select v-model="form.excLevelSameUser" placeholder="请选择异常级别" style="width: 240px">
+                <el-option
+                  v-for="item in excLevelOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="越权访问异常级别" prop="excLevelLogin">
+              <el-select v-model="form.unauthorizedAccessExceptionLevel" placeholder="请选择异常级别" style="width: 240px">
+                <el-option
+                  v-for="item in excLevelOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="IP地址异常级别" prop="excLevelSameUser">
+              <el-select v-model="form.ipAddressExceptionLevel" placeholder="请选择异常级别" style="width: 240px">
+                <el-option
+                  v-for="item in excLevelOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
 
-      <el-form-item label="越权访问异常级别" prop="excLevelLogin">
-        <el-select v-model="form.unauthorizedAccessExceptionLevel" placeholder="请选择异常级别" style="width: 240px">
-          <el-option
-            v-for="item in excLevelOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="IP地址异常级别" prop="excLevelSameUser">
-        <el-select v-model="form.ipAddressExceptionLevel" placeholder="请选择异常级别" style="width: 240px">
-          <el-option
-            v-for="item in excLevelOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-
-      <el-form-item label="审计策略配置" prop="auditableEvent">
-        <el-checkbox-group v-model="form.auditableEvent">
-          <el-checkbox v-for="(item,index) in auditableEventList" :key="index" :label="item.value">{{ item.label }}
-          </el-checkbox>
-        </el-checkbox-group>
-
-      </el-form-item>
+        </el-row>
 
+      </fieldset>
       <el-form-item>
         <el-button type="primary" @click="onSubmit">保存</el-button>
       </el-form-item>