分类 系统 下的文章

由于家里的电子设备比较多,对设备统一管理和状态监测是一个需要认真对待的问题,之前找了很多方案但是始终不满意,最后选择搭建了一个企业级分布式监控系统Zabbix,用python推送监控信息到企业微信,像下图这样,可以及时知道哪台主机有问题
QQ截图20210901202538.jpg
同时也能从专业角度对家里内网的每个主机资产和web资产性能进行监测,输出周期报表和数据图
QQ截图20210901203118.jpg
简单说下操作步骤:
Zabbix搭建一般分为4个部分:1.后端服务器;2.前端服务器;3.数据库服务器;4.客户端Agent。
因为服务器“性能有限”,所以我们就用Docker来进行部署好了。另外就家里用,也不用部署agent啥的
162d5912-1e06-460b-a938-870ac16b5070.jpg
第一步,安装Docker……这部分就略了
第二步,为Docker配置一个Bridge网络,这里我对Docker命令不熟悉,所以直接装了个Portainer,用图形界面管理Docker

docker run -d  -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker:/data  --name webui portainer/portainer

创建好了portainer后,登录跳到Networks > Add network创建一个网络,模式选桥接,剩下参数随便写
QQ截图20210901203728.jpg
然后我们找个地方大的地方放数据库,就放在home目录下好了
创建个数据库,扔到刚才创建的docker网络里,自定义一个IP,注意格式要定义成utf8

docker run --name mysql --network zabbix --ip 172.20.0.124 -e MYSQL_ROOT_PASSWORD=你的数据库root密码 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -d mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_bin

然后docker exec命令进到数据库,新建一个用户带一个库,用于给zabbix用

mysql -u root -p
create database zabbix;
CREATE USER zabbixuser IDENTIFIED BY '数据库用户密码';
grant all on zabbix.* to 'zabbixuser'@'%';
ALTER USER zabbixuser IDENTIFIED WITH mysql_native_password BY '数据库用户密码';
FLUSH PRIVILEGES;

退了数据库,我们开始部署zabbix后端,一行命令就搞定
注意要自定义一个IP,映射10051端口,用link参数把这个容器和数据库容器连起来,然后在命令后面填好数据库地址、用户名、密码。

docker run --name zabbix-server --network zabbix --ip 172.20.0.122 -p 10051:10051 --link mysql:mysql -e DB_SERVER_HOST="mysql" -e MYSQL_USER="zabbixuser" -e MYSQL_PASSWORD="数据库密码" -d zabbix/zabbix-server-mysql

后端部署好了之后我们部署前端,注意不要忘了自定义IP,映射8080端口,link参数连接数据库和后端,serverhost直接填刚才后端的docker名字就可以了

docker run --name zabbix-web --network zabbix --ip 172.20.0.123 -p 18080:8080 --link mysql:mysql --link zabbix-server:zabbix-server -e DB_SERVER_HOST="mysql" -e MYSQL_USER="zabbixuser" -e MYSQL_PASSWORD="数据库密码" -e ZBX_SERVER_HOST="zabbix-server" -e PHP_TZ="Asia/Shanghai" -d zabbix/zabbix-web-nginx-mysql

然后别忘了把这四个Restart policies都改成Always或者Unless Stoped,不然重启服务器之后容器自己起不来
然后输入zabbix-web的8080端口映射出来的地址,默认用户名admin密码zabbix就可以登录了
QQ截图20210901204931.jpg
然后到设置里把界面调成中文的
QQ截图20210901205134.jpg
然后修改下用户名和密码,不要用默认的密码,也不要用默认的用户名
QQ截图20210901205216.jpg
界面那个字体有时候对中文支持不太好,需要在后台替换一下,在宿主机上敲下面这个命令可以直接找到服务器的字体文件夹映射

find / -name DejaVuSans.ttf

找到这个文件夹,把windows系统里面的楷体simkai.ttf替换进去,这个文件直接随便找个电脑用everything一搜就有了
QQ截图20210901205446.jpg
用同样的方法找到defines.inc.php,把前端默认字体文件改成simkai
QQ截图20210901205752.jpg
这就部署好了。

我们添加一个站点的监测,配置-主机-创建主机-web监测-创建web场景
QQ截图20210901210034.jpg
步骤-添加
QQ截图20210901210042.jpg
名称-url-添加
QQ截图20210901210136.jpg
然后配置个触发器,配置-主机-触发器-创建触发器
QQ截图20210901210258.jpg
添加一个表达式,比如说我们要在站点访问超过2秒时告警,添加-Response time
QQ截图20210901210420.jpg
结果写2s
QQ截图20210901210507.jpg
触发器创建完成后,我们加个Action,也就是触发告警后要做什么,就是邮件和微信通知了
加Action之前,先添加下企业微信和邮箱的登录方式,管理-报警媒介类型
先配置告警邮箱,具体怎么搭建企业邮箱申请域名备案解析MX,比较简单百度都有,此处略
QQ截图20210901210728.jpg
然后配置企业微信通知,首先企业微信找个群右键添加机器人,复制webhook地址
QQ截图20210901211019.jpg
在宿主机用find命令找到alertscripts文件夹,放个脚本,脚本内容修改为你自己的

find / -name alertscripts

脚本内容:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
 
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "这里改成你创建的机器人的Webhook"   
 
def msg(text):
    json_text= {
     "msgtype": "text",
        "text": {
            "content": text,
            "mentioned_mobile_list":["这里写你企微手机号,机器人发告警时会艾特你"]     
        },
    }
    print requests.post(api_url,json.dumps(json_text),headers=headers).content
 
if __name__ == '__main__':
    text = sys.argv[1]
    msg(text)

然后回到zabbix,报警媒介类型-创建媒体类型-企业微信告警,填写脚本名称
QQ截图20210901211210.jpg
然后添加Action,配置-动作-创建动作,把刚才触发器选上
QQ截图20210901211358.jpg
然后翻到页签2操作,配置操作细节,告警时候发送给谁,怎么发,消息格式是啥,都要填好
QQ截图20210901211426.jpg
我简单写了个告警邮件模板供参考

告警邮件主题:【栗子云】栗子网盘访问异常!
消息:告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警信息: {TRIGGER.NAME}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
告警恢复邮件主题:【栗子云】栗子网盘恢复访问
消息:告警信息: {TRIGGER.NAME}
当前状态:{TRIGGER.STATUS},感觉好像已经恢复了
恢复时间:{EVENT.DATE} {EVENT.TIME}

配置好了Action之后,理论上就等着告警就行了,但是有个问题
docker版的前后端,是alpine linux,不带python,刚才传的python脚本运行会报错
所以我们需要docker exec到docker里面,手动安装python环境
然后这个docker默认的/bin/bash还不是root的,需要从宿主机提下权限,23f是docker编号,用docker ps命令可以查看

docker exec -it -u root 23f sh

更新下软件源

apk update

安装python3,pip3,request,运行脚本报错,于是这里改为安装python2和对应pip

apk add python2

安装pip

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py

安装requests模块

pip install requests

然后再回到zabbix测试脚本,发现报了个错/usr/bin/python^M: 解释器错误
^M很好判断,就是刚才直接把windows下写的文档复制到linux了,zabbix后端在执行时会用./命令执行,而不是python命令执行,./命令会概率出现兼容性问题,一行命令修改下异常隐藏字符,解决

sed -i 's/^M//g' wechat.py

然后再测试就可以正常收到告警了。

QQ截图20210901212716.jpg
发现告警时间好像不大对,还需要重新登录前后端的后台,调下时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

这样,zabbix就基本部署完成了,里面还有好多好玩的功能可以折腾的,比如可以在家里停电时候给你发短信提醒你交话费啥的,或者有人在非工作时间动了你公司的电脑,立刻微信通知你啥的,用这个程序都可以简单地实现。
周末再继续鼓捣。有问题随时留言。

这次用的是Aliyun_ECS_2U8G5M_Ubuntu20_04环境
第一步,配置基础环境

首先安装JRE和JDK基础环境
apt install openjdk-8-jre-headless
apt install openjdk-8-jdk-headless

第二步,安装Confluence软件

cd /home
下载confluence安装包
wget https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-7.12.3-x64.bin
给个执行权限
chmod +x atlassian-confluence-7.12.3-x64.bin
运行
./atlassian-confluence-7.12.3-x64.bin
在阿里云ECS上的安全组放行http端口即可访问
浏览器访问http端口,点击安装,记录机器码
结束进程
/etc/init.d/confluence stop

第三步,配置数据库

进到mysql
mysql -u root -p
搞个数据库
create database confluence character set UTF8;
搞个新用户
CREATE USER confluenceuser IDENTIFIED BY '密码';
ALTER USER confluenceuser IDENTIFIED WITH mysql_native_password BY '密码';
使用 utf8 作为默认字符集
alter database confluence  default character set = utf8;
使用utf8_bin数据库排序规则
alter database confluence default collate utf8_bin;
配置允许创建存储函数
set global log_bin_trust_function_creators = 1;
生效数据库
FLUSH PRIVILEGES;
退出mysql
exit
结束mysql
service mysql stop
exit
编辑数据库配置
vim /etc/my.cnf
改[mysqld]下
修改接受数据包的大小
max_allowed_packet = 34M
修改InnoDB存储引擎日志文件大小
innodb_log_file_size = 256M
加一行设置默认隔离级别
transaction-isolation = READ-COMMITTED
保存:wq
启动mysql
service mysql start
Confluence不带mysql驱动,打个mysql驱动扔到webinf目录
网上找个mysql-connector-java-8.0.25.jar
https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.25.zip
扔到Confluence安装目录/atlassian/confluence/confluence/WEB-INF/lib/

第四步,那啥

把Confluence安装目录/atlassian/confluence/confluence/WEB-INF/lib/下的atlassian-extras-decoder-v2-3.4.1.jar拷贝出来,做一些小修改再拷贝回去(此处很简单不赘述)

第五步,初始化Confluence

输入命令启动confluence,登录web界面输入激活码并连接数据库进行初始化,按照配置向导进行配置
/etc/init.d/confluence start

第六步,配置https

首先阿里云申请个域名,配置域名解析,申请https证书,下载tomcat证书,上传到云主机上
(不要上传到confluence安装路径,否则升级时候会被删掉)
然后编辑tomcat配置文件,取消https配置的注释
vim/opt/atlassian/confluence/conf/server.xml
keystorePass填写证书密码,keystoreFile填写证书路径
(不要编辑server.xml中除配置外其他注释内容,系统检查会被认为是配置文件错误)
保存文件
:wq
重启confluence服务
/etc/init.d/confluence stop
/etc/init.d/confluence start
在阿里云ECS上的安全组放行https端口即可通过https访问

最后打开confluence登录,进行健康检查,完美。
QQ截图20210716125006.png
非常简单。

最近在研究系统加固,发现个非常方便的双因素验证应用google-authenticator

双因素验证是啥东西?

双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。因每次认证时的随机参数不同,所以每次产生的动态密码也不同。由于每次计算时参数的随机性保证了每次密码的不可预测性,从而在最基本的密码认证这一环节保证了系统的安全性。解决因口令欺诈而导致的重大损失,防止恶意入侵者或人为破坏,解决由口令泄密导致的入侵问题。

首先更新下时间

date -s 21:03:00
hwclock -w

加个源

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

然后安装google-authenticator

yum install google-authenticator -y

开启配置向导

google-authenticator

手机扫一扫
QQ截图20210712211722.jpg
修改ssh配置

sed -i "/auth[ ]*substack[ ]*pass*/a\auth required pam_google_authenticator.so" /etc/pam.d/sshd
sed -i -r 's#(ChallengeResponseAuthentication) no#\1 yes#g' /etc/ssh/sshd_config

重启ssh服务

service sshd restart

不要关ssh,另开一个窗口测试
输入密码和动态口令登录
QQ截图20210712211802.jpg
手机google-authenticator开启Face ID
IMG_6856.PNG

另:为了避免服务器时间出错导致无法通过google-authenticator登录,可以在服务器上再装个cockpit备份(做限源),ssh无法访问时可通过网页恢复。

有时候机器不支持iptables,只支持firewalld,需要限源ssh端口
先将firewalld设置开机自启

systemctl enable firewalld

启动服务

systemctl start firewalld

检查运行状态

systemctl status firewalld

设置默认拒绝ssh连接

firewall-cmd --permanent --remove-service=ssh

配置限源

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的IP/32" port protocol="tcp" port="22" accept'

生效命令

firewall-cmd --reload

查看生效的命令

firewall-cmd --zone=public --list-rich-rules

附录 常用命令:
删除之前的复杂规则

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'

手动开放指定端口

firewall-cmd --permanent --add-port=3306/tcp

删除开放的端口

firewall-cmd --permanent --remove-port=3306/tcp

开放指定服务(系统内置的)

firewall-cmd --permanent --add-service=http

删除服务

firewall-cmd --permanent --remove-service=http

添加白名单地址(单IP)

firewall-cmd --permanent --add-source=192.168.1.100

注: 白名单中的IP可以任意访问所有服务器可用的端口 这个白名单的作用不是这样的,有待继续研究
添加白名单地址(指定网络段CIDR格式)

firewall-cmd --permanent --add-source=192.168.1.0/24

删除白名单地址

firewall-cmd --permanent --remove-source=192.168.1.100

屏蔽指定IP地址

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject"

屏蔽IP地址段

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"

新版的windows10无法用netplwiz命令配置自动登录
需要打开注册表编辑器,将
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device 里面的DevicePasswordLessBuildVersion,值修改为0之后保存,再运行netplwiz即可自动登录。