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個字符,提示密碼長度不符合要求。截圖如下: