? ? ? ? 信息安全是運維的根本,直接關系到企業的安危,稍有不慎會造成災難性的后果。比如經年發生的多個知名網站會員數據庫外泄事件,信息安全體系建設已經被提到了前所未有的高度。如何提升企業的安全防范水準是目前普遍面臨的問題,主要有,安全設備防護、提高人員安全意識、實施系統平臺安全加固、安全規范融合到ITIL體系、關注安全設備防護、提高人員安全意識、實施系統平臺安全加固、安全規范融合到ITIL體系、關注最新安全發展動向,通過上述幾個方面可以在很大程度上避免出現安全事故。
? ? ? ? 通過Python來實現系統級的安全防范策略,包括構建集中式的病毒掃描機制、端口安全掃描、安全密碼生成等
1.構建集中式的病毒掃描機制
????????Clam AntiVirus(ClamAV)是免費而且開放源代碼的防毒軟件,軟件與病毒碼的更新皆由社群免費發布。目前ClamAV主要是使用在由Linux、FreeBSD等Unix-like系統架設的郵件服務器上,提供電子郵件的病毒掃描服務。ClamAV本身是在文字接口下運作,但也有許多圖形接口的前端工具可用,另外由于其開放源代碼的特性,在Windows與Mac OS X平臺都有其移植版。
官網地址:http://www.clamav.net/lang/en/
? ? ? ? pyClamad是一個Python第三方模塊,可讓Python直接使用ClamAV病毒掃描守護進程clamd,來實現一個高效的病毒檢測功能
pyClamad模塊安裝方法如下
1、客戶端(病毒掃描源)安裝步驟
# yum -y install clamav clamd clamav-update? ? ? #安裝clamavp相關程序包
# chkconfig --levels 235 clamd on? ?# 添加掃描守護進程clamd系統服務
#? /usr/bin/freshclam? ? ? # 更新病毒庫,建議配置到crontab中定時更新
#? setenforce 0? # 關閉SELinux,避免遠程掃描時提示無權限的問替
# 更新守護進程監聽IP配置文件,根據不同環境自行修改監聽的IP,“0.0.0.0”為監聽所有主機IP
# sed -i -e '/^TCPADDr/{ s/127.0.0.1/0.0.0.0/;}'? ?/etc/clamd.conf
# /etc/init.d/clamd start? # 啟動掃描守護進程
# 2、主控端部署pyClamad 環境步驟
# wget http://xael.org/norman/python/pyclamd/pyClamd-0.3.4.tar.gz
# tar -xzvf?pyClamd-0.3.4.tar.gz
# python setup.py install
?
2.模塊常用方法說明
pyClamad提供了兩個關鍵嘞,一個為ClamdNetworkSocket()類,實現使用網絡套接字操作clamd;另一個為ClamdUnixSocket()類,實現使用Unix套接字操作clamd。兩個類定義的方法完全一樣。
ClamdNetworkSocket()類:
- __init__(self,host='127.0.0.1',port=3310,timeout=None)方法,是ClamdNetworkSocket類的初始方法,參數host為連接主機IP;參數port為連接的端口,默認為3310,與/etc/clamd.conf配置文件中的TCPSocket參數要保持一致;timeout為連接的超時時間。
- contcan_file(self,file)方法,實現掃描指定的文件或目錄,在掃描時發生錯誤或發現病毒將不終止,參數file(string類型)為指定的文件或目錄的絕對路徑
- multiscan_file(self,,file)方法,實現多線程掃描指定的文件或目錄,多核環境速度更快,在掃描時發生錯誤或發現病毒將不終止,參數file(string類型)為指定的文件或目錄的絕對路徑
- scan_file(self,file)方法,實現掃描指定的文件或目錄,在掃描時發生錯誤或發現病毒將終止,參數file(string類型)為指定的文件或目錄的絕對路徑
- shutdown(self)方法,實現強制關閉clamd進程并退出
- stats(self)方法,獲取Clamscan的當前狀態
- reload(self)方法,強制重載clamd病毒特征庫,掃描前建議做reload操作
- EICAR(self)方法,返回EICAR測試字符串,即生成具有病毒特征的字符串,便于測試
?
3.實踐
實現一個集中式的病毒掃描管理,針對不同環境定制掃描策略,比如掃描對象、描述模式、掃描路徑、調度評率等
1.首先對apt-get進行更新,執行下面的代碼:
sudo apt-get update
sudo apt-get upgrade -y
2.之后安裝clamav:這一步可能會出錯,ubuntu會提示你重新執行一下上面的update方法,我試了一下,重新執行update之后再重新執行下面的命令就能成功執行了。
sudo apt-get install clamav clamav-daemon -y
3.更新病毒庫:這一部分可能會報錯,
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
sudo freshclam
如果要停止守護程序并手動運行它:
sudo systemctl stop clamav-freshclam.service
手動運行它:
sudo freshclam
4.clamav安裝成功之后,可以對它進行測試,執行下面的代碼對home文件夾下的文件進行病毒查殺,不出錯表示正常執行啦:
sudo clamscan -r /home
5.如果需要自動執行病毒查殺功能,需要執行下面的命令。第一行是啟動clamav服務,這一個命令是你如果按章pyclamd調用clamav時必須要提前執行的方法。第二行命令是自動更新病毒庫的。到這里,clamav的安裝就結束了,撒花撒花~
sudo /etc/init.d/clamav-daemon start
sudo /etc/init.d/clamav-freshclam start
6.安裝pyclamd,直接用pip install pyclamd就行,如果是用python3的話就換成pip3執行。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import pyclamd
from threading import Threadclass Scan(Thread):def __init__(self,IP,scan_type,file):"""構造方法,參數初始化"""Thread.__init__(self)self.IP = IPself.scan_type = scan_typeself.connstr=""self.scanresult=""def run(self):"""多進程run方法"""try:cd = pyclamd.ClamdNetworkSocket(self.IP,22)if cd.ping():self.connstr = self.IP+" connection [ok]"cd.reload() # 重載clamd病毒特征庫,建議更新病毒庫后做reload()操作if self.scan_type == "contscan_file": #選擇不同的掃描模式self.scanresult = "{0}\n".format(cd.comtscan_file(self.file))elif self.scan_type == "multiscan_file":self.scanresult = "{0}\n".format(cd.contscan_file(self.file))elif self.scan_type=="scan_file":self.scanresult="{0}\n".format(cd.scan_file(self.file))time.sleep(1) #線程掛起1秒else:self.connstr=self.IP+"ping error,exit"returnexcept Exception as e:self.connstr=self.IP+""+str(e)
IPs = ['192.168.88.223'] #掃描主機列表
scantype = "multiscan_file" # 指定掃描模式,支持multiscan_file、contscan_file\scan_file
scanfile = "/tmp" # 指定掃描路徑
i = 1threadnum = 4 # 指定啟動的線程數
scanlist = [] # 存儲掃描Scan類線程對象列表for ip in IPs:currp = Scan(ip,scantype,scanfile) # 創建掃描Scan類對象,參數(IP,掃描模式,掃描路徑)scanlist.append(currp) # 追加對象到列表if i%threadnum == 0 or i == len(IPs): # 當達到指定的線程數或IP列表數后啟動、退出線程for task in scanlist:task.join() # 等待所有子線程退出,并輸出掃描結果print(task.connstr) # 打印服務器連接信息print(task.scanresult) # 打印掃描結果scanlist = []i+=1