mirror of https://github.com/jumpserver/jumpserver
perf: check account engine
parent
01ac001f84
commit
ef0df85a15
|
@ -138,47 +138,16 @@ class CheckAccountEngineViewSet(JMSModelViewSet):
|
|||
search_fields = ("name",)
|
||||
serializer_class = serializers.CheckAccountEngineSerializer
|
||||
|
||||
@staticmethod
|
||||
def get_default_engines():
|
||||
data = [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000001",
|
||||
"slug": "check_gathered_account",
|
||||
"name": "检查发现的账号",
|
||||
"comment": "基于自动发现的账号结果进行检查分析,检查 用户组、公钥、sudoers 等信息",
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000002",
|
||||
"slug": "check_account_secret",
|
||||
"name": "检查账号密码强弱",
|
||||
"comment": "基于账号密码的安全性进行检查分析, 检查密码强度、泄露等信息",
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000003",
|
||||
"slug": "check_account_repeat",
|
||||
"name": "检查账号密码是否重复",
|
||||
"comment": "检查账号是否与其它账号相同"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000004",
|
||||
"slug": "check_account_leak",
|
||||
"name": "检查账号密码是否是常见密码",
|
||||
"comment": "检查账号密码是否是常见泄露的密码"
|
||||
},
|
||||
]
|
||||
return data
|
||||
|
||||
def init_if_need(self):
|
||||
data = self.get_default_engines()
|
||||
model_cls = CheckAccountEngine
|
||||
|
||||
if model_cls.objects.count() == 4:
|
||||
return
|
||||
|
||||
for item in data:
|
||||
model_cls.objects.update_or_create(defaults=item, id=item["id"])
|
||||
perm_model = CheckAccountEngine
|
||||
|
||||
def get_queryset(self):
|
||||
# return self.get_default_engines()
|
||||
self.init_if_need()
|
||||
return CheckAccountEngine.objects.all()
|
||||
return CheckAccountEngine.get_default_engines()
|
||||
|
||||
def filter_queryset(self, queryset: list):
|
||||
search = self.request.GET.get('search')
|
||||
if search is not None:
|
||||
queryset = [
|
||||
item for item in queryset
|
||||
if search in item['name']
|
||||
]
|
||||
return queryset
|
||||
|
|
|
@ -6,28 +6,7 @@ import django.db.models.deletion
|
|||
from django.db import migrations, models
|
||||
|
||||
|
||||
def init_account_check_engine(apps, schema_editor):
|
||||
data = [
|
||||
{
|
||||
'id': '00000000-0000-0000-0000-000000000001',
|
||||
'slug': 'check_gathered_account',
|
||||
'name': '检查发现的账号',
|
||||
'comment': '基于自动发现的账号结果进行检查分析,检查 用户组、公钥、sudoers 等信息'
|
||||
},
|
||||
{
|
||||
'id': '00000000-0000-0000-0000-000000000002',
|
||||
'slug': 'check_account_secret',
|
||||
'name': '检查账号密码强弱',
|
||||
'comment': '基于账号密码的安全性进行检查分析, 检查密码强度、泄露等信息'
|
||||
}
|
||||
]
|
||||
model_cls = apps.get_model('accounts', 'CheckAccountEngine')
|
||||
for item in data:
|
||||
model_cls.objects.create(**item)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("assets", "0007_baseautomation_date_last_run_and_more"),
|
||||
(
|
||||
|
@ -139,5 +118,4 @@ class Migration(migrations.Migration):
|
|||
verbose_name="Engines",
|
||||
),
|
||||
),
|
||||
migrations.RunPython(init_account_check_engine),
|
||||
]
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
# Generated by Django 4.1.13 on 2025-01-21 08:41
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('accounts', '0027_accountrisk_gathered_account'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='checkaccountengine',
|
||||
name='is_active',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='checkaccountautomation',
|
||||
name='engines',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='checkaccountautomation',
|
||||
name='engines',
|
||||
field=models.JSONField(default=list, verbose_name='Engines'),
|
||||
),
|
||||
]
|
|
@ -15,13 +15,13 @@ __all__ = ['CheckAccountAutomation', 'AccountRisk', 'RiskChoice', 'CheckAccountE
|
|||
|
||||
|
||||
class CheckAccountAutomation(AccountBaseAutomation):
|
||||
engines = models.ManyToManyField('CheckAccountEngine', related_name='check_automations', verbose_name=_('Engines'))
|
||||
engines = models.JSONField(default=list, verbose_name=_('Engines'))
|
||||
recipients = models.ManyToManyField('users.User', verbose_name=_("Recipient"), blank=True)
|
||||
|
||||
def to_attr_json(self):
|
||||
attr_json = super().to_attr_json()
|
||||
attr_json.update({
|
||||
'engines': [engine.slug for engine in self.engines.all()],
|
||||
'engines': self.engines,
|
||||
'recipients': [str(user.id) for user in self.recipients.all()]
|
||||
})
|
||||
return attr_json
|
||||
|
@ -117,14 +117,43 @@ class AccountRisk(JMSOrgBaseModel):
|
|||
|
||||
class CheckAccountEngine(JMSBaseModel):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'), unique=True)
|
||||
slug = models.SlugField(max_length=128, verbose_name=_('Slug'), unique=True) #
|
||||
is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
|
||||
slug = models.SlugField(max_length=128, verbose_name=_('Slug'), unique=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def internals(self):
|
||||
return [
|
||||
'check_gathered_account',
|
||||
'check_account_secret'
|
||||
@staticmethod
|
||||
def get_default_engines():
|
||||
data = [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000001",
|
||||
"slug": "check_gathered_account",
|
||||
"name": _("Check the discovered accounts"),
|
||||
"comment": _(
|
||||
"Perform checks and analyses based on automatically discovered account results, "
|
||||
"including user groups, public keys, sudoers, and other information"
|
||||
)
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000002",
|
||||
"slug": "check_account_secret",
|
||||
"name": _("Check the strength of your account and password"),
|
||||
"comment": _(
|
||||
"Perform checks and analyses based on the security of account passwords, "
|
||||
"including password strength, leakage, etc."
|
||||
)
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000003",
|
||||
"slug": "check_account_repeat",
|
||||
"name": _("Check if the account and password are repeated"),
|
||||
"comment": _("Check if the account is the same as other accounts")
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000004",
|
||||
"slug": "check_account_leak",
|
||||
"name": _("Check whether the account password is a common password"),
|
||||
"comment": _("Check whether the account password is a commonly leaked password")
|
||||
},
|
||||
]
|
||||
return data
|
||||
|
|
|
@ -10,12 +10,12 @@ from accounts.models import (
|
|||
RiskChoice,
|
||||
CheckAccountEngine,
|
||||
)
|
||||
from accounts.risk_handlers import TYPE_CHOICES
|
||||
from assets.models import Asset
|
||||
from common.const import ConfirmOrIgnore
|
||||
from common.serializers.fields import ObjectRelatedField, LabeledChoiceField
|
||||
from common.utils import get_logger
|
||||
from .base import BaseAutomationSerializer
|
||||
from accounts.risk_handlers import TYPE_CHOICES
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
@ -88,9 +88,9 @@ class CheckAccountAutomationSerializer(BaseAutomationSerializer):
|
|||
model = CheckAccountAutomation
|
||||
read_only_fields = BaseAutomationSerializer.Meta.read_only_fields
|
||||
fields = (
|
||||
BaseAutomationSerializer.Meta.fields
|
||||
+ ["engines", "recipients"]
|
||||
+ read_only_fields
|
||||
BaseAutomationSerializer.Meta.fields
|
||||
+ ["engines", "recipients"]
|
||||
+ read_only_fields
|
||||
)
|
||||
extra_kwargs = BaseAutomationSerializer.Meta.extra_kwargs
|
||||
|
||||
|
@ -98,12 +98,18 @@ class CheckAccountAutomationSerializer(BaseAutomationSerializer):
|
|||
def model_type(self):
|
||||
return AutomationTypes.check_account
|
||||
|
||||
@staticmethod
|
||||
def validate_engines(engines):
|
||||
valid_slugs = {i['slug'] for i in CheckAccountEngine.get_default_engines()}
|
||||
|
||||
if not all(engine in valid_slugs for engine in engines):
|
||||
raise serializers.ValidationError(_("Invalid engine id"))
|
||||
|
||||
return engines
|
||||
|
||||
|
||||
class CheckAccountEngineSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = CheckAccountEngine
|
||||
fields = ["id", "name", "slug", "is_active", "comment"]
|
||||
fields = ["id", "name", "slug", "comment"]
|
||||
read_only_fields = ["slug"]
|
||||
extra_kwargs = {
|
||||
"is_active": {"required": False},
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue