­

zabbix密碼複雜度有效期安全增強,符合三級等保要求。

一、關於三級等保要求

1.zabbix默認沒有設置密碼複雜度功能,密碼有效期功能。

2.zabbix具備失敗處理功能,但是沒有頁面手動調試,需要修改源代碼。

3.zabbix具備超時退出功能。

二、整改

 

 

1.zabbix 系統不具備登錄失敗處理功能,運維終端未設置超時退出功能。

 添加失敗處理功能,失敗3次鎖定30分鐘,修改include/defines.inc.php

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

截圖如下:

使用zhangyifan帳號測試輸入5次密碼,可以看到狀態已鎖定,截圖如下:

添加自動超時退出功能,截圖如下:

 

 

 

 

 

 

 

 

 

 

2.zabbix 系統和應用系統未實現密碼定期更換

整改證據:zabbix數據庫users表添加10位時間戳過期字段,截圖如下:

程序添加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過期的用戶。加到crontab里

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/2/22 14:34
# @Author  : GuoYabin
# @Email   : hbbdgyb@163.com
# @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方法中的內容。截圖如下:

 

 

真是難為我了,做為一個運維又改php代碼,又寫Python的。

 

 

 

 

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;
    }
}

截圖如下:

 

 測試修改zhangyifan密碼為純數字,提示密碼複雜度不符合要求。截圖如下:

 

 測試修改zhangyifan帳號為3個字符,提示密碼長度不符合要求。截圖如下: