zabbix密码复杂度有效期安全增强,符合三级等保要求。

一、关于三级等保要求

1.zabbix默认没有设置密码复杂度功能,密码有效期功能。

2.zabbix具备失败处理功能,但是没有页面手动调试,需要修改源代码。

3.zabbix具备超时退出功能。

二、整改

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第1张图片

 

 

1.zabbix 系统不具备登录失败处理功能,运维终端未设置超时退出功能。

 添加失败处理功能,失败3次锁定30分钟,修改include/defines.inc.php

define('ZBX_LOGIN_ATTEMPTS',    3);
define('ZBX_LOGIN_BLOCK',               1800); // sec

截图如下:

使用zhangyifan帐号测试输入5次密码,可以看到状态已锁定,截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第2张图片

添加自动超时退出功能,截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第3张图片

 

 

 

 

 

 

 

 

 

 

2.zabbix 系统和应用系统未实现密码定期更换

整改证据:zabbix数据库users表添加10位时间戳过期字段,截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第4张图片

 

 

程序添加90天过期字段,此处有两个文件需要修改。include/classes/api/services/CUser.php和include/schema.inc.php。

其中CUser.php创建用户时候新增代码$ins_users[0]['passwd_expired'] = time() + 7776000; 代表90天后过期:

    public function create(array $users) {
        $this->validateCreate($users);

        $ins_users = [];

        foreach ($users as $user) {
            unset($user['usrgrps'], $user['user_medias']);
            $ins_users[] = $user;
        }
        //创建用户时候添加过期时间
        $ins_users[0]['passwd_expired'] = time() + 7776000;
        $userids = DB::insert('users', $ins_users);

其中CUser.php创建更新用户设置时候新增代码$upd_user['passwd_expired'] = time() + 7776000;代表90天后过期:

public function update(array $users) {
        $this->validateUpdate($users, $db_users);

        $upd_users = [];

        foreach ($users as $user) {
            $db_user = $db_users[$user['userid']];

            $upd_user = [];


            // strings
            $field_names = ['alias', 'name', 'surname', 'autologout', 'passwd', 'refresh', 'url', 'lang', 'theme'];

            foreach ($field_names as $field_name) {
                if (array_key_exists($field_name, $user) && $user[$field_name] !== $db_user[$field_name]) {
                    $upd_user[$field_name] = $user[$field_name];
                }
            }

            // integers
            foreach (['autologin', 'type', 'rows_per_page'] as $field_name) {
                if (array_key_exists($field_name, $user) && $user[$field_name] != $db_user[$field_name]) {
                    $upd_user[$field_name] = $user[$field_name];
                }
            }

            if ($upd_user) {
                //添加过期时间
                $upd_user['passwd_expired'] = time() + 7776000;
                $upd_users[] = [
                    'values' => $upd_user,
                    'where' => ['userid' => $user['userid']]
                ];
            }
        }

在schema.inc.php种'users'最后加入数据库的过期字段。

    'users' => [
        'key' => 'userid',
        'fields' => [
            'userid' => [
                'null' => false,
                'type' => DB::FIELD_TYPE_ID,
                'length' => 20
            ],
                        ...省略一大坨...
            'rows_per_page' => [
                'null' => false,
                'type' => DB::FIELD_TYPE_INT,
                'length' => 10,
                'default' => 50
            ],
            'passwd_expired' => [
                'null' => false,
                'type' => DB::FIELD_TYPE_INT,
                'length' => 10
            ]
        ]
    ],    

完成以上内容,只是在创建用户和修改用户设置的时候,触发更新数据库中密码过期时间字段修改。

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第5张图片

 

 接下来写一个巡检代码,定期巡检数据库表中zabbix过期的用户。加到crontab里

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/2/22 14:34
# @Author  : GuoYabin
# @Email   : [email protected]
# @File    : mysql.py
# @Software: PyCharm

import pymysql
import time

class Localmysqlopt(object):
    def __init__(self):
        self.db = pymysql.connect(host="localhost",
                                  user="zabbix",
                                  password="zap2dfal43",
                                  port=3306,
                                  database="zabbix",
                                  charset="utf8")
        self.cursor = self.db.cursor()

    def dml_execute(self, sql=None):
        try:
            with self.cursor as cursor:
                cursor.execute(sql)
                self.db.commit()
        except Exception as e:
            self.db.rollback()
            print(e)



    def chaxun(self):
        sql = "select userid,passwd_expired from users where passwd_expired < {0} and attempt_failed < 3 ".format(int(time.time()))
        self.cursor.execute(sql)
        results = self.cursor.fetchall()
        if results:
            for value in results:
                attempt_failed,userid = 5,value[0]  #修改登录失败次数,实现锁定账户
                sql = "update users set attempt_failed = '{0}' where userid = '{1}'".format(attempt_failed,userid)
                self.dml_execute(sql)

if __name__=='__main__':
    db = Localmysqlopt()
    db.chaxun()

ps等保整改截图时候偷个懒,只截一个update方法中的内容。截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第6张图片

 

 

真是难为我了,做为一个运维又改php代码,又写Python的。

 

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第7张图片

 

 

 

3.zabbix 系统远程管理使用 http 协议进行连接。

这段不用写了吧?NGINX配置一个https证书,自己发挥吧。

 

 

4.zabbix 系统未采用密码技术保证重要数据在存储过程中的完整性。

整改证据:添加密码复杂度相关代码,修改文件./app/controllers/CControllerUserUpdateGeneral.php结尾部分

        if ($password1 !== null && $password2 !== null) {
            if ($password1 !== $password2) {
                error(_('Both passwords must be equal.'));
                return false;
            }

            if ($password1 === '' && !$this->allow_empty_password) {
                error(_s('Incorrect value for field "%1$s": %2$s.', _('Password'), _('cannot be empty')));
                return false;
            }
            /**
            * 检查密码复杂度
            */
            if (strlen($password1) <= 8) {    //必须大于8个字符
                error(_('密码必须大于8字符'));
                return false;
            }

            if (preg_match("/^[0-9]+$/", $password1)) { //必须含有特殊字符
                error(_('密码不能全是数字,请包含数字,字母大小写或者特殊字符'));
                return false;
            }

            if (preg_match("/^[a-zA-Z]+$/", $password1)) {
                error(_('密码不能全是字母,请包含数字,字母大小写或者特殊字符'));
                return false;
            }

            if (preg_match("/^[0-9A-Z]+$/", $password1)) {
                error(_('请包含数字,字母大小写或者特殊字符'));
                return false;
            }

            if (preg_match("/^[0-9a-z]+$/", $password1)) {
                error(_('请包含数字,字母大小写或者特殊字符'));
                return false;
            }
        }
        return true;
    }
}

截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第8张图片

 

 测试修改zhangyifan密码为纯数字,提示密码复杂度不符合要求。截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第9张图片

 

 测试修改zhangyifan帐号为3个字符,提示密码长度不符合要求。截图如下:

zabbix密码复杂度有效期安全增强,符合三级等保要求。_第10张图片

 

 

 

 

你可能感兴趣的:(zabbix密码复杂度有效期安全增强,符合三级等保要求。)