python自动化运维---笔记

时间:2022-12-21 21:49:28

python自动化运维:
工程环境:
https://github.com/iopsgroup/imoocc/blob/master/requirements.txt
>> pip install -r ./requirements.txt
mysql安装:
apt-get install mysql-server
/etc/init.d/mysql start

配置/etc/mysql/my.cnf
[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
重启
>> mysql -uroot -p
>> create database imoocc;
>> update mysql.user set authentication_string=password('root') where user='root' ;
>> grant all on imoocc.* to root(用户名)@'127.0.0.1' identified by 'root';
>> flush privileges;

redis安装:
apt-get install redis-server
vi /etc/redis/redis.conf # 修改配置文件bind的ip为0.0.0.0
mongodb安装:
apt-get install mongodb
/etc/init.d/mongodb start
netstat -luntp|grep mongo # 查看Mongo监听的端口
vi /etc/mongodb.conf # 修改配置文件bind的ip为0.0.0.0
/etc/init.d/redis-server start
工程搭建:
>> django-admin startproject mydevops
>> python manage.py startapp scanhosts

实战:构建一个Devops工程:
功能:记录HTTP访问的IP即用户的UA信息

步骤:
1.settings文件配置
2.models模型建模
3.项目设计
user===>采集信息接口===>model===>mysql===>model===>信息接口===>user
|
v
user<-->url<-->view<--->view<--->model<--->mysql
采集接口:
http://127.0.0.1/sendinfos user_infols
http://127.0.0.1/getinfos user_history
django日志logging模块:
logger ------> handler ----{formatter,filter}--> files, emails
日志记录器,处理器, 格式器, 过滤器
django邮件发送:
发送自定义消息,或者通知告警
短信,微信等
django 有有有有邮件发送配置:
服务端: 开启smtp协议支持
客户端: 配置settings文件
关键在于谷歌邮箱的设置
https://blog.user.today/gmail...

1、将【安全性较低的应用程式取权限】设置为启用
进入网页https://www.google.com/settin...,设置为【启用】。
2、解除人机验证锁定
进入网页https://accounts.google.com/b...,点击【继续】。
验证是否能发送邮件。
资产扫描发现:模型层(model)
自动化任务: 视图层(views,url), 模型层(model)
工程框架设计:
1.settings配置文件
2.app应用的加载,工程所需模块加载
3.models文件
4.项目开发
整体探测流程:
存活探测-------->获取存活的ip列表
1、探测协议
ICMP 无连接 网络探测、网络质量
TCP 有连接 应用服务
2、探测模块和工具
nmap-是一款用于网络发现和安全审计的网络安全工具,他是*软件
apt-get install nmap
pip install python-nmap==0.6.1
3.nmap工具探测使用
nmap -n # 只显示主机ip不进行反向解析
nmap -n -sP 192.168.8.70 # 只会发送一个包目标主机,提升探测效率
nmap -n -PE 192.168.8.70 # 会向主机发送多个tcp的syn包,一探测服务器是否有端口存活
nmap -n -sP -PE 192.168.43.0/24

python python-nmap的使用:
import nmap
nm = nmap.PortScanner()
nm.scan(hosts="192.168.43.0/24", arguments="-n -sP -PE")
nm.all_hosts() # 查看当前局域网内所启用的主机列表
4.SSH端口存活扫描
主机存活探测 ---存活主机IP列表--->ssh端口探测
(依赖于刚开始的约定所有的linux机器必须开通ssh)
telnet命令:
telnet 192.168.43.70 22
telnetlib模块:
import telnetlib
import re
tm = telnetlib.Telnet(host='192.168.43.234',port='22',timeout=4)
result = tm.read_until("\n",timeout=5)
re.search("ssh", result.lower())


主机探测-------->获取系统信息(SN,版本,MAC)
主机存活探测----存活主机ip列表--->ssh端口检测--->非linux主机
|---------可ssh登录主机列表---->ssh登录探测--->ssh key登录列表
|-------->ssh 用户密码登录列表
|-------->主机信息获取--->需要获取的主机信息
什么是主机登录探测:
用一系列验证方式循环进行ssh登录,得到正确的登录方式
哪些一系列登录方式:
ssh登陆-------->认证方式--->ssh密码
| |------------->密钥---->id_rsa
| |-------------->id_dsa
|--------->IP地址
|--------->用户----->超级用户
| |------>普通用户
|-------->端口
ssh公钥私钥登录方式:
1.vim /etc/ssh/sshd_config
开启:
RSAAuthentication yes
PubkeyAuthentication yes
2.ssh-keygen
cd .ssh
mv id_rsa.pub authorized_keys
复制私钥到客户端

ls -l authorized_keys

python中的ssh登录模块:
pexpect 用来通过启动子程序,使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的python模块

run()直接执行命令返回结果和状态:
pexpect.run("ls /tmp",withexitstatus=1) # 返回执行结果,withexitstatus=1以及执行状态

spawn类:启动子程序,有丰富的方法实现对子程序的控制
类的实例化:
chk = pexpect.spawn('ls -l /tmp/')
chk = pexpect.spawn('ls',['-l','/tmp/'])

ssh_k = pexpect.spawn('ssh root@192.168.43.234 -p22')
ssh_k.expect("[p,P]assword:") # 返回0表示匹配成功
ssh_k.expect([pexpect.TIMEOUT,pexpect.EOF,"password"])
缓冲区内容匹配:
正则匹配,pexpect.EOF,pexpect.TIMEOUT
注意:正则表达式$在expect代表就是$符号,不是一个一个正则表达式\r\n代表行结束
向子程序发送指令:
send() # 除了发送指令之外会默认发送一个回车符
sendline()
sendcontrol(char) # 向程序发送控制符
脚本模拟ssh登录:
import pexpect

def login_ssh_passwd(port="",user="",host="",passwd=""):
'''函数:用于实现pexepect实现ssh的自动化用户密码登录'''

# print 'ssh -p %s %s@%s' % (port,user, host)
if port and user and host and passwd:
ssh = pexpect.spawn('ssh -p %s %s@%s' % (port,user, host))
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes\n')
ssh.expect('password: ')
ssh.sendline(passwd)
index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])

if index == 0:
print("logging in as root!")
ssh.interact()
elif index == 1:
print ("logging process exit!")
elif index == 2:
print ("logging timeout exit")
else:
print ("Parameter error!")

def login_ssh_key(keyfile="",user="",host="",port=""):
'''函数:用于实现pexepect实现ssh的自动化密钥登录'''

if port and user and host and keyfile:
ssh = pexpect.spawn('ssh -i %s -p %s %s@%s' % (keyfile,port,user, host))
i = ssh.expect( [pexpect.TIMEOUT,'continue connecting (yes/no)?'], timeout=2)
# print '...................................',0
if i == 1:
ssh.sendline('yes\n')
index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])
else:
index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])
if index == 0:
print("logging in as root!")
ssh.interact()
elif index == 1:
print("logging process exit!")
elif index == 2:
print("logging timeout exit")
else:
print ("Parameter error!")

def main():
'''主函数:实现两种方式分别的登录'''
# login_ssh_passwd(port='22',user='root',host='192.168.1.101',passwd='imooccs')
login_ssh_key(keyfile="/tmp/id_rsa",port='22',user='root',host='192.168.1.101')
pexpect模块的缺陷:
1.依赖终端命令的方式
2.不同的ssh登录环境兼容较差


paramiko基于python实现的ssh远程安全连接,用于ssh远程执行命令,文件传输等功能的ssh的客户端模块
1.安装
pip install paramiko
2.实现ssh登录
import paramiko

jssh = paramiko.SSHClient()
jssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
jssh.connect("192.168.43.234","22","***","***")

3.实现ssh的密钥登陆
前提:将服务端的id_rsa复制到客户端
import paramiko
jssh = paramiko.SSHClient()
jssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
key = paramiko.RSAKey.from_private_key_file("/home/vagrant/.ssh/id_rsa")
jssh.connect("192.168.43.234","22","****",pkey=key)

4.知识点
stdin,stdout,stderr = jssh.exec_command("ls ~")
stdout.read()
5.paramiko的应用和缺陷
登录探测工程:
1.如何通过登录系统,获取信息:
1.1 通过系统获取哪些信息:
[主机名]:通过名称识别资产的作用,位置等信息
[mac地址]:记录网卡的信息,可以作为主机的唯一标识
[SN]:物理服务器,网络设备有的唯一资产标识
[系统版本]:查看服务器系统和具体的版本
[服务器机型]:查看主机或者服务器机型

1.2 为什么要获取这些信息:
1.2.1 有利于识别资产设备
1.2.2 是资产的基本信息,是自动化平台的基石

1.3 获取信息的linux命令介绍:
1.3.1 获取主机名命令:
hostname, uname -a, cat /etc/sysconfig/network等
1.3.2 获取系统版本:
cat /etc/issue, cat /etc/redhat-release,uname,lsb_release
1.3.3 获取mac地址:
[linux系统]: cat /sys/class/net/[^vtlsb]*/address, ifconfig eth0, ip a
[EXSI]: esxcfg-vmknic -l|awk '{print $8}'|grep ':'
通用命令:

cat /sys/class/net/[^vtlsb]*/address||esxcfg-vmknic -l|awk '{print $8}'|grep ':'
1.3.4 获取服务器硬件机型:
dmidecode -s system-manufacturer,
dmidecode -s system-product-name
>>dmidecode -s
>>dmidecode -s system-manufacturer
>>dmidecode -s ystem-product-name
1.3.5 获取序列号信息:
dmidecode -s system-serial-number
2.工程代码介绍
2.1 配置文件读取yaml:
2.1.1 什么是yaml?
是一种直观的能被电脑识别的数据序列化格式,类似于xml
2.1.2 安装:
pip install PyYAML
2.1.3 使用:
import yaml

myconf = yaml.load(file("/home/vagrant/scanhosts.yaml"))
type(myconf)

myconf.get("hostsinfo").get("nets")
2.2 敏感数据的加密解密:
2.2.1 什么是AES:
对称加密算法是最常用的加密算法
计算量小,加密效率高
$ sudo apt-get install build-essential python-dev
$ pip install pycryptodomex
$ python -m Cryptodome.SelfTest
使用:
https://pycryptodome.readthedocs.io/en/latest/src/examples.html?highlight=AES#encrypt-data-with-aes

 

 

资产进阶扫描:
服务器资产信息:硬件服务器,kvm服务器,esx服务器
未知设备ip列表:网络设备,其他设备

(一)snmp网络设备扫描
概念:简单网络管理协议,该协议能支持网络管理系统,并获取相关信息
服务端安装配置:
网络设备只需要开启配置:
snmp-server enable traps
服务器则需要安装和配置:
apt-get install snmpd snmp snmp-mibs-downloader
配置修改:agentAddress
客户端:
apt-get install snmp

centos安装:
yum install -y net-snmp net-snmp-utils
可以理解为net-snmp是服务端,net-snmp-utils是客户端工具集;如果机器上只需要搭建服务那可以只安装net-snmp。
由于依赖关系,其实最终会安装net-snmp net-snmp-utils net-snmp-agent net-snmp-libs perl-Data-Dumper等几个包。

service snmpd start

snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.1

>> vim /etc/snmp/snmpd.conf # 修改服务端配置文件
agentAddress udp:0.0.0.0:161
>> service snmpd restart
>> snmpwalk -v 2c -c public localhost
注:要确认系统防火墙关闭

python 模块:
pip install pysnmp

from pysnmp.entity.rfc3413.oneliner import cmdgen

cg = cmdgen.CommandGenerator()

cg.getCmd(cmdgen.CommunityData('wgw','public',0),\
cmdgen.UdpTransportTarget(('192.168.50.5',161)),\
'.1.3.6.1.2.1.1')
宿主机归类:
方式:通过linux上是否存在进程(qemu-kvm,docker,vmx)来判断
命令: ps -ef | grep ***

(二)docker容器扫描
1.以宿主机为中心扫描
2.找到主机和容器的关联方式
3.登录获取容器信息
docker容器的宿主机确认:
关键:
通过宿主机器获取唯一标识和ssh端口映射关系
命令:
docker ps
docker ps | awk -F '->' '{print $1}' | grep -v 'CONTAINER' | awk 'BEGIN{FS~/s+/;}{print $NF" "$1" "$2;}' | sed s/0.0.0.0://
说明:
awk -F '->' '{print $1}' ===> 表示按照什么切割
grep -v 'CONTAINER' ===> 反选,是指不显示包含xxx的行或文件,-v表示取反的意思。
awk 'BEGIN{FS~/s+/;}{print $NF" "$1" "$2;}' ===>以空格分隔, $NF ,表示的最后一个Field(列),$1,$2
sed s/0.0.0.0:// ===> s/表示替换

(三)KVM虚拟机扫描
快速搭建:
https://www.imooc.com/article/22293
方式一:
通过宿主机上查看启动进程(ps命令)

问题一:命令参数多,通过过滤筛选很麻烦
问题二:建立这种约束非常难实现

方式二:
宿主机获取虚拟机MAc地址:
cat /sys/class/net/vnet*/address
优点:
1. mac地址的唯一性
2. 不容易修改

(四)其他扫描(exsi)
1.EXSI虚拟机宿主机关系扫描难点:
1.1 和kvm虚拟机类型扫描不同,EXSI的无法通过命令来获取虚拟机mac
1.2 EXSI商用性,无法通过更多有效的方式了解
2.采用UUID实现EXSI和主机的关联
虚拟机获取UUID:dmidecode -s system-serial-number
sn_key = UUID
宿主机可以通过SDK和API获取所拥有的虚拟机的UUID
3.ESXI的SDK和API调用:
客户端(SDK)==>认证接口,用户信息接口,资产信息接口==>服务端(api)
4.EXSI的资产SDK调用:
官方地址:https://www.vwware.com/support/pubs/sdk_pubs.html
python模块:pyvmomi==6.5.0.2017.5.post1