From f63f8d085d9e494d740e62c265a878a935c6d87f Mon Sep 17 00:00:00 2001 From: xinwen Date: Thu, 21 Jan 2021 15:18:54 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20Web=E9=A1=B5=E9=9D=A2->=20=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E6=89=A7=E8=A1=8C=20=E9=AB=98=E5=8D=B1=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E6=B2=A1=E6=9C=89=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 63458 -> 64146 bytes apps/locale/zh/LC_MESSAGES/django.po | 90 ++++++++++++++++++++------- apps/ops/models/command.py | 8 +++ apps/terminal/utils.py | 31 +++++++++ 4 files changed, 108 insertions(+), 21 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 56fb9b8d2e6f512af02cfe9f707f82144b086678..e00cb3d92aa8ae1771b51e17d0a4c3a74d6838e3 100644 GIT binary patch delta 19880 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\n" "Language-Team: JumpServer team\n" @@ -292,7 +292,7 @@ msgstr "激活" #: assets/models/asset.py:203 assets/models/cluster.py:19 #: assets/models/user.py:66 templates/_nav.html:44 -#: xpack/plugins/cloud/models.py:143 xpack/plugins/cloud/serializers.py:137 +#: xpack/plugins/cloud/models.py:143 xpack/plugins/cloud/serializers.py:113 msgid "Admin user" msgstr "管理用户" @@ -381,7 +381,7 @@ msgstr "创建者" #: assets/models/cluster.py:26 assets/models/domain.py:24 #: assets/models/gathered_user.py:19 assets/models/group.py:22 #: assets/models/label.py:25 common/db/models.py:69 common/mixins/models.py:50 -#: ops/models/adhoc.py:38 ops/models/command.py:27 orgs/models.py:25 +#: ops/models/adhoc.py:38 ops/models/command.py:29 orgs/models.py:25 #: orgs/models.py:425 perms/models/base.py:55 users/models/group.py:18 #: users/templates/users/user_group_detail.html:58 #: xpack/plugins/cloud/models.py:61 xpack/plugins/cloud/models.py:159 @@ -472,7 +472,7 @@ msgstr "命令过滤器" msgid "Regex" msgstr "正则表达式" -#: assets/models/cmd_filter.py:41 ops/models/command.py:23 +#: assets/models/cmd_filter.py:41 ops/models/command.py:25 #: terminal/backends/command/serializers.py:15 terminal/models/session.py:48 msgid "Command" msgstr "命令" @@ -602,7 +602,7 @@ msgstr "ssh私钥" #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:158 -#: xpack/plugins/cloud/models.py:139 xpack/plugins/cloud/serializers.py:138 +#: xpack/plugins/cloud/models.py:139 xpack/plugins/cloud/serializers.py:114 msgid "Node" msgstr "节点" @@ -992,7 +992,7 @@ msgstr "文件名" msgid "Success" msgstr "成功" -#: audits/models.py:43 ops/models/command.py:28 perms/models/base.py:52 +#: audits/models.py:43 ops/models/command.py:30 perms/models/base.py:52 #: terminal/models/session.py:51 #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:43 #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:74 @@ -1124,7 +1124,7 @@ msgstr "多因子认证状态(显示名称)" msgid "Is success" msgstr "是否成功" -#: audits/serializers.py:77 ops/models/command.py:24 +#: audits/serializers.py:77 ops/models/command.py:26 #: xpack/plugins/cloud/models.py:222 msgid "Result" msgstr "结果" @@ -1734,7 +1734,7 @@ msgstr "完成时间" msgid "Time" msgstr "时间" -#: ops/models/adhoc.py:246 ops/models/command.py:26 +#: ops/models/adhoc.py:246 ops/models/command.py:28 #: terminal/serializers/session.py:38 msgid "Is finished" msgstr "是否完成" @@ -1755,19 +1755,19 @@ msgstr "{} 任务开始: {}" msgid "{} Task finish" msgstr "{} 任务结束" -#: ops/models/command.py:29 +#: ops/models/command.py:31 msgid "Date finished" msgstr "结束日期" -#: ops/models/command.py:72 +#: ops/models/command.py:74 msgid "Task start" msgstr "任务开始" -#: ops/models/command.py:94 +#: ops/models/command.py:96 msgid "Command `{}` is forbidden ........" msgstr "命令 `{}` 不允许被执行 ......." -#: ops/models/command.py:101 +#: ops/models/command.py:109 msgid "Task end" msgstr "任务结束" @@ -2815,6 +2815,54 @@ msgstr "" "
\n" " " +#: terminal/utils.py:114 +#, python-format +msgid "Insecure Web Command Execution Alert: [%(name)s]" +msgstr "Web页面-> 命令执行 告警: [%(name)s]" + +#: terminal/utils.py:122 +#| msgid "" +#| "\n" +#| " Command: %(command)s\n" +#| "
\n" +#| " Asset: %(host_name)s (%(host_ip)s)\n" +#| "
\n" +#| " User: %(user)s\n" +#| "
\n" +#| " Level: %(risk_level)s\n" +#| "
\n" +#| " Session: session detail\n" +#| "
\n" +#| " " +msgid "" +"\n" +"
\n" +" Assets: %(assets)s\n" +"
\n" +" User: %(user)s\n" +"
\n" +" Level: %(risk_level)s\n" +"
\n" +"\n" +" ----------------- Commands ----------------
\n" +" %(command)s
\n" +" ----------------- Commands ----------------
\n" +" " +msgstr "" +"\n" +"
\n" +" 资产: %(assets)s\n" +"
\n" +" 用户: %(user)s\n" +"
\n" +" 等级: %(risk_level)s\n" +"
\n" +"\n" +" ----------------- 命令 ----------------
\n" +" %(command)s
\n" +" ----------------- 命令 ----------------
\n" +" " + #: tickets/const.py:8 msgid "General" msgstr "一般" @@ -3368,7 +3416,7 @@ msgstr "安全令牌验证" #: users/templates/users/_base_otp.html:14 users/templates/users/_user.html:13 #: users/templates/users/user_profile_update.html:55 -#: xpack/plugins/cloud/models.py:125 xpack/plugins/cloud/serializers.py:136 +#: xpack/plugins/cloud/models.py:125 xpack/plugins/cloud/serializers.py:112 msgid "Account" msgstr "账户" @@ -4332,7 +4380,7 @@ msgstr "实例名称" msgid "Instance name and Partial IP" msgstr "实例名称和部分IP" -#: xpack/plugins/cloud/models.py:128 xpack/plugins/cloud/serializers.py:112 +#: xpack/plugins/cloud/models.py:128 xpack/plugins/cloud/serializers.py:88 msgid "Regions" msgstr "地域" @@ -4344,7 +4392,7 @@ msgstr "实例" msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:147 xpack/plugins/cloud/serializers.py:140 +#: xpack/plugins/cloud/models.py:147 xpack/plugins/cloud/serializers.py:116 msgid "Always update" msgstr "总是更新" @@ -4404,7 +4452,7 @@ msgstr "AWS (国际)" msgid "AWS (China)" msgstr "AWS (中国)" -#: xpack/plugins/cloud/providers/azure_.py:16 +#: xpack/plugins/cloud/providers/azure_.py:18 msgid "Azure (China)" msgstr "Azure (中国)" @@ -4468,23 +4516,23 @@ msgstr "拉美-圣地亚哥" msgid "Tencent Cloud" msgstr "腾讯云" -#: xpack/plugins/cloud/serializers.py:22 +#: xpack/plugins/cloud/serializers.py:25 msgid "Tenant ID" msgstr "租户ID" -#: xpack/plugins/cloud/serializers.py:26 +#: xpack/plugins/cloud/serializers.py:29 msgid "Subscription ID" msgstr "订阅ID" -#: xpack/plugins/cloud/serializers.py:110 +#: xpack/plugins/cloud/serializers.py:86 msgid "History count" msgstr "执行次数" -#: xpack/plugins/cloud/serializers.py:111 +#: xpack/plugins/cloud/serializers.py:87 msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers.py:139 +#: xpack/plugins/cloud/serializers.py:115 #: xpack/plugins/gathered_user/serializers.py:20 msgid "Periodic display" msgstr "定时执行" diff --git a/apps/ops/models/command.py b/apps/ops/models/command.py index 5bf808dce..80a26be70 100644 --- a/apps/ops/models/command.py +++ b/apps/ops/models/command.py @@ -9,6 +9,8 @@ from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext from django.db import models +from terminal.models import Command +from terminal.utils import send_command_execution_alert_mail from common.utils import lazyproperty from orgs.models import Organization from orgs.mixins.models import OrgModelMixin @@ -93,6 +95,12 @@ class CommandExecution(OrgModelMixin): else: msg = _("Command `{}` is forbidden ........").format(self.command) print('\033[31m' + msg + '\033[0m') + send_command_execution_alert_mail({ + 'input': self.command, + 'assets': self.hosts.all(), + 'user': str(self.user), + 'risk_level': 5, + }) self.result = {"error": msg} self.org_id = self.run_as.org_id self.is_finished = True diff --git a/apps/terminal/utils.py b/apps/terminal/utils.py index 918266b56..8ceff0166 100644 --- a/apps/terminal/utils.py +++ b/apps/terminal/utils.py @@ -110,6 +110,37 @@ def send_command_alert_mail(command): send_mail_async.delay(subject, message, recipient_list, html_message=message) +def send_command_execution_alert_mail(command): + subject = _("Insecure Web Command Execution Alert: [%(name)s]") % { + 'name': command['user'], + } + input = command['input'] + input = input.replace('\n', '
') + recipient_list = settings.SECURITY_INSECURE_COMMAND_EMAIL_RECEIVER.split(',') + + assets = ', '.join([str(asset) for asset in command['assets']]) + message = _(""" +
+ Assets: %(assets)s +
+ User: %(user)s +
+ Level: %(risk_level)s +
+ + ----------------- Commands ----------------
+ %(command)s
+ ----------------- Commands ----------------
+ """) % { + 'command': input, + 'assets': assets, + 'user': command['user'], + 'risk_level': Command.get_risk_level_str(command['risk_level']), + } + + send_mail_async.delay(subject, message, recipient_list, html_message=message) + + class ComponentsMetricsUtil(object): @staticmethod From 992708abe850fd0b6b97bf286bf03320ac360dc8 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 21 Jan 2021 11:56:20 +0800 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0ping=E7=AD=89?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements/deb_buster_requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements/deb_buster_requirements.txt b/requirements/deb_buster_requirements.txt index 50bde94aa..8177173b2 100644 --- a/requirements/deb_buster_requirements.txt +++ b/requirements/deb_buster_requirements.txt @@ -5,8 +5,10 @@ curl wget vim locales +iputils-ping # mysql-client +default-mysql-client default-libmysqlclient-dev # Pillow From c949589564759d87bd9b311257ea3d08c1c8d20e Mon Sep 17 00:00:00 2001 From: Bai Date: Thu, 21 Jan 2021 15:52:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E4=BF=A1=E6=81=AF;=20=E6=B7=BB=E5=8A=A0Domain?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0065_auto_20210121_1549.py | 17 ++++++++ apps/locale/zh/LC_MESSAGES/django.po | 41 ++++++------------- 2 files changed, 30 insertions(+), 28 deletions(-) create mode 100644 apps/assets/migrations/0065_auto_20210121_1549.py diff --git a/apps/assets/migrations/0065_auto_20210121_1549.py b/apps/assets/migrations/0065_auto_20210121_1549.py new file mode 100644 index 000000000..1182de1fa --- /dev/null +++ b/apps/assets/migrations/0065_auto_20210121_1549.py @@ -0,0 +1,17 @@ +# Generated by Django 3.1 on 2021-01-21 07:49 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0064_auto_20201203_1100'), + ] + + operations = [ + migrations.AlterModelOptions( + name='domain', + options={'ordering': ('name',), 'verbose_name': 'Domain'}, + ), + ] diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 93d16d4bc..2392990ca 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-21 15:23+0800\n" +"POT-Creation-Date: 2021-01-21 15:49+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -292,7 +292,7 @@ msgstr "激活" #: assets/models/asset.py:203 assets/models/cluster.py:19 #: assets/models/user.py:66 templates/_nav.html:44 -#: xpack/plugins/cloud/models.py:143 xpack/plugins/cloud/serializers.py:113 +#: xpack/plugins/cloud/models.py:143 xpack/plugins/cloud/serializers.py:137 msgid "Admin user" msgstr "管理用户" @@ -602,7 +602,7 @@ msgstr "ssh私钥" #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:158 -#: xpack/plugins/cloud/models.py:139 xpack/plugins/cloud/serializers.py:114 +#: xpack/plugins/cloud/models.py:139 xpack/plugins/cloud/serializers.py:138 msgid "Node" msgstr "节点" @@ -2821,19 +2821,7 @@ msgid "Insecure Web Command Execution Alert: [%(name)s]" msgstr "Web页面-> 命令执行 告警: [%(name)s]" #: terminal/utils.py:122 -#| msgid "" -#| "\n" -#| " Command: %(command)s\n" -#| "
\n" -#| " Asset: %(host_name)s (%(host_ip)s)\n" -#| "
\n" -#| " User: %(user)s\n" -#| "
\n" -#| " Level: %(risk_level)s\n" -#| "
\n" -#| " Session: session detail\n" -#| "
\n" -#| " " +#, python-format msgid "" "\n" "
\n" @@ -3416,7 +3404,7 @@ msgstr "安全令牌验证" #: users/templates/users/_base_otp.html:14 users/templates/users/_user.html:13 #: users/templates/users/user_profile_update.html:55 -#: xpack/plugins/cloud/models.py:125 xpack/plugins/cloud/serializers.py:112 +#: xpack/plugins/cloud/models.py:125 xpack/plugins/cloud/serializers.py:136 msgid "Account" msgstr "账户" @@ -4380,7 +4368,7 @@ msgstr "实例名称" msgid "Instance name and Partial IP" msgstr "实例名称和部分IP" -#: xpack/plugins/cloud/models.py:128 xpack/plugins/cloud/serializers.py:88 +#: xpack/plugins/cloud/models.py:128 xpack/plugins/cloud/serializers.py:112 msgid "Regions" msgstr "地域" @@ -4392,7 +4380,7 @@ msgstr "实例" msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:147 xpack/plugins/cloud/serializers.py:116 +#: xpack/plugins/cloud/models.py:147 xpack/plugins/cloud/serializers.py:140 msgid "Always update" msgstr "总是更新" @@ -4452,7 +4440,7 @@ msgstr "AWS (国际)" msgid "AWS (China)" msgstr "AWS (中国)" -#: xpack/plugins/cloud/providers/azure_.py:18 +#: xpack/plugins/cloud/providers/azure_.py:16 msgid "Azure (China)" msgstr "Azure (中国)" @@ -4516,23 +4504,23 @@ msgstr "拉美-圣地亚哥" msgid "Tencent Cloud" msgstr "腾讯云" -#: xpack/plugins/cloud/serializers.py:25 +#: xpack/plugins/cloud/serializers.py:22 msgid "Tenant ID" msgstr "租户ID" -#: xpack/plugins/cloud/serializers.py:29 +#: xpack/plugins/cloud/serializers.py:26 msgid "Subscription ID" msgstr "订阅ID" -#: xpack/plugins/cloud/serializers.py:86 +#: xpack/plugins/cloud/serializers.py:110 msgid "History count" msgstr "执行次数" -#: xpack/plugins/cloud/serializers.py:87 +#: xpack/plugins/cloud/serializers.py:111 msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers.py:115 +#: xpack/plugins/cloud/serializers.py:139 #: xpack/plugins/gathered_user/serializers.py:20 msgid "Periodic display" msgstr "定时执行" @@ -4624,6 +4612,3 @@ msgstr "旗舰版" #: xpack/plugins/license/models.py:77 msgid "Community edition" msgstr "社区版" - -#~ msgid "No" -#~ msgstr "无"