predixy 安装配置
环境信息
- Centos 7
- predixy-1.0.5
安装
下载地址, clone或下载最新的版本或指定版本下载后解压
yum install libstdc++-static -y |
需要依赖
libstdc++-static
, 否则make会报错:
/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status
make[1]: *** [predixy] Error 1
make[1]: Leaving directory `/root/predixy-1.0.5/src’
make: *** [default] Error 2
配置文件说明
predixy.conf,整体配置文件,会引用下面的配置文件
cluster.conf,用于Redis Cluster时,配置后端redis信息
sentinel.conf,用于Redis Sentinel时,配置后端redis信息
auth.conf,访问权限控制配置,可以定义多个验证密码,可每个密码指定读、写、管理权限,以及定义可访问的健空间
dc.conf,多数据中心支持,可以定义读写分离规则,读流量权重分配
latency.conf, 延迟监控规则定义,可以指定需要监控的命令以及延时时间间隔
启动
predixy /predixy/conf/predixy.conf |
使用默认的配置文件predixy.conf, predixy将监听地址0.0.0.0:7617,后端的redis是Redis Cluster 127.0.0.1:6379
Mysql 从库提升为主库,原来的其他从库成为新的主库的从库
Mysql 多主一从即多源复制
环境信息
- Mysql 5.7 之后版本支持多主一从
配置步骤
分别在Master_1和Master_2上导出需要同步的数据库
分别在Master_1和Master_2上执行以下命令,导出需要同步的数据库备份
mysqldump -uroot -p123456 --master-data=2 --single-transaction --databases --add-drop-database db1 > db1.sql |
mysqldump -uroot -p123456 --master-data=2 --single-transaction --databases --add-drop-database db2 > db2.sql |
备份完成后,将备份数据拷贝到从库服务器上面
Mysql 主从复制相关原理简述
Mysql 主从同步基本原理
复制的基本过程如下:
Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程,根据请求信息,读取指定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容,获得在Master端真实执行的那些可执行的内容,并在自身执行。
双主情况下,禁止同时写入,建议还是按照主从的方式工作,防止数据冲突。双主场景下,主要是切换主备方便。
Django 模板中循环嵌套
模板中需要循环中循环,{% for i in alist %}
,假如i是个元组或列表,需要继续循环:
{% for i in alist %} |
或使用如下方式,data = [[1,2],[3,4]]:
{% for l in data%} |
Django model 外键的反向引用
class Question(models.Model): |
上例中,Choice引用了Question作为外键,在模板中通过Question对象获取所有引用了Question对象的Choice对象,可以使用以下方法:
{% for choice in question.choice_set.all %} |
使用question.choice_set.all的方式获取所有引用question对象的Choice对象实例
AppScan v10.0.7.28135 安装破解
HCL AppScan(原名IBM Security AppScan)是原IBM的Rational软件部门的一组网络安全测试和监控工具,2019年被HCL技术公司收购。AppScan旨在在开发过程中对Web应用程序的安全漏洞进行测试。
Awvs 破解版14.6.211213163 安装破解
Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。
logstash 使用详解
环境信息
- Centos 7
- logstash 8.8
一个 Logstash 管道(pipeline) 至少要包含 2 个组件: input
及 output
,可以包含可选组件 filter
[2]
input
- 负责从数据源获取数据filter
- 负责按照配置修改数据output
- 负责将数据写入目标存储,如 Elasticsearch
安装
yum 安装
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch |
运行 Logstash 后,可以使用最基本的 Logstash Pipeline 测试 Logstash 运行是否正常
/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }' |
-e
- 选项用来在 command line 中指定配置
运行之后在 shell 中输入内容,Logstash 会为数据添加元数据后输出到 stdout
,表明 Logstash 运行正常
hello world |
logstash
服务默认端口 5044
elasticsearch 配置
环境信息
- elasticsearch 8.8.2
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene [1] 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库 — 无论是开源还是私有。
但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。 [1]
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。
Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且 索引 每个文档的内容,使之可以被检索。在 Elasticsearch 中,我们对文档进行索引、检索、排序和过滤—而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。 [2]
Elasticsearch 使用 JSON 作为文档的序列化格式 [2]
端口说明
elasticsearch 主要使用以下端口
9200
- elasticsearch 服务的监听端口,客户端访问 9200 和 Elasticsearch 进行通信。9300
- 集群中的节点通过 9300 端口彼此通信,如果这个端口没有开,节点将无法形成一个集群
Elasticsearch 配置文件说明
Elasticsearch 的主要配置文件为,配置文件路径可以用环境变量 ES_PATH_CONF
指定。 [8]
elasticsearch.yml
jvm.options
log4j2.properties
Elasticsearch 已经有了
很好
的默认值,特别是涉及到性能相关的配置或者选项。 如果你有疑问,最好就不要动它。我们已经目睹了数十个因为错误的设置而导致毁灭的集群, 因为它的管理者总认为改动一个配置或者选项就可以带来 100 倍的提升。 [8]
配置文件格式支持 YAML 和 扁平 格式 [8]
YAML 格式示例
path: |
扁平 格式示例
path.data: /var/lib/elasticsearch |
集群及节点名称
Elasticsearch 默认启动的集群名字叫 elasticsearch
。生产环境中建议修改集群名称,防止其他使用默认集群名称的节点意外加入集群 [8]
同样,最好也修改你的节点名字。就像你现在可能发现的那样, Elasticsearch 会在节点启动的时候随机给它指定一个名字。你可能会觉得这很有趣,但是当凌晨 3 点钟的时候, 你还在尝试回忆哪台物理机是 Tagak the Leopard Lord 的时候,你就不觉得有趣了。
更重要的是,这些名字是在启动的时候产生的,每次启动节点, 它都会得到一个新的名字。这会使日志变得很混乱,因为所有节点的名称都是不断变化的。 [8]
cluster.name: elasticsearch |
网络配置
监听接口相关配置
# 多网卡情况下,建议指定 IP 地址,以防止集群使用网络不通的 IP。# |
Vault Policy
策略使用 HCL 或是 JSON 语法编写,描述了一个人类用户或是应用程序允许访问 Vault 中哪些路径。[1]
策略管理
创建策略
命令格式
$ vault policy write policy-name policy-file.hcl |
以下示例创建一个只读策略
$ cat readonly_policy.hcl |
更新策略使用和创建策略一样的命令,使用的是已有的策略名
查看策略
$ vault policy list |
读取策略内容
$ vault policy read readonly_policy |
关联策略
创建 token 时关联策略
使用以下命令在创建 token 时附加策略,否则创建的 token 默认关联当前身份(如 token)的策略
$ vault token create -policy=readonly_policy -policy=logs |
关联策略时,如果关联的策略不存在,创建 token 只会给出相关策略不存在的 warnning,创建 token 不会失败
使用新建的 token 登陆并尝试更新相关键
$ vault login |
读取键,可以看到只能读取键值,无法写入
$ vault kv list |
参考链接
脚注
redis 配置
环境信息
- Centos 7
- Redis 6
redis Cluster 部署
下载已经编译好的 redis6-cluster 安装文件
wget https://s.csms.tech/redis6-cluster.tar |
本示例安装 3 master 3 slave 的 redis cluster,假设使用端口为 7380-7385。数据存放路径为 /data/redis/7380
,日志路径为 /data/logs/redis-cluster/7380/
,其他端口的 redis 服务配置以此类推,主要是修改对应端口。
创建服务启动需要的数据目录及日志目录
for i in 1 2 3 4 5 0 ; do mkdir -p /data/redis/738${i} ; done |
7380 服务使用如下配置文件
bind 0.0.0.0 |
若要根据以上 7380 端口的服务配置文件复制出其他服务端口的配置文件,可以参考以下命令
cp 7380.conf 7381.conf |
分别启动服务(7380-7385)
/usr/local/redis6-cluster/src/redis-server /usr/local/redis6-cluster/7380.conf |
Vault Secrets Engine
环境信息
- Kubernetes 1.24
- Vault 1.14.0
kv
Key/Value
机密引擎是一个通用的键值存储,用于在 Vault 使用的物理存储中存储任意秘密。该后端可以以两种模式之一运行 [1]
kv v1
- 可以将其配置为存储密钥的单个值,只有最近写入的值会被保存下来kv v2
- 开启版本控制并存储每个键的一定数量版本的值。默认保留 10 个版本的值。
kv Version 1
Version 1 的 KV Secret Engine 相比 v2 版本,有以下限制:
- 不能使用
vault kv
的metadata
、patch
命令 - 使用
vault kv put
写入的值会覆盖之前的内容,即只保存了最后一次写入的值。
启用 version 1 的 kv 存储,没有 -version
选项时默认开启 version 1 版本的 kv:
$ vault secrets enable -version=1 kv |
与其他 Secret Engine 不同,kv 机密引擎不会强制执行 TTL 过期。即使设置了
ttl
,kv Secret Engine 也不会自行删除数据。 [1]
写入数据
$ vault kv put kv/mycorp/mydepartment/myproject/myapp/myapp-api/config db_type=mysql |
列出键
$ vault secrets list |
读取键值
$ vault kv get kv/mycorp/mydepartment/myproject/myapp/myapp-api/config |
以上输出中,键 kv/mycorp/mydepartment/myproject/myapp/myapp-api/config
的内容为 db_port=3306
,之前写入的其他数据被覆盖,只保留有最后一个写入
删除键
$ vault kv delete kv/mycorp/mydepartment/myproject/myapp/myapp-api/config |
Vault 概念
helm 安装及使用
环境信息
- centos7 5.4.212-1.el7
- kubernetes Server Version: v1.25.0
- Helm 3.10.0
安装
下载 需要的版本
wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz
解压
tar -xf helm-v3.10.0-linux-amd64.tar.gz
在解压目中找到
helm
程序,移动到需要的目录中cp linux-amd64/helm /usr/local/bin/
验证
$ helm version
version.BuildInfo{Version:"v3.10.0", GitCommit:"ce66412a723e4d89555dc67217607c6579ffcb21", GitTreeState:"clean", GoVersion:"go1.18.6"}
常见用法
查看已安装的 release
helm ls |
卸载
$ helm ls -A |
查看导入的 repo
$ helm repo ls |
搜索/查看可用的 repo
$ helm search repo hashicorp/vault |
查看可用的 releases
$ helm search repo hashicorp/vault -l |
安装
$ helm install vault hashicorp/vault --version 0.25.0 |
Vault 介绍及安装配置
环境信息
- Kubernetes 1.24
- Vault 1.14.0
Vault 简介
Vault 架构及基础概念
Vault 的架构图如下 [1]
从以上架构图可以看到,几乎所有的 Vault 组件都被统称为 Barrier
(屏障)
Vault 架构可以大体分为三个部分: [7]
Sotrage Backend
- 存储后端Barrier
- 屏障层HTTPS API
- API 接口
常用概念
Storage Backend
- Vault 自身不存储数据,因此需要一个存储后端(Storage Backend
),存储后端对 Vault 来说是不受信任的,只用来存储加密数据。 [8]
Initialization
- Vault 在首次启动时需要初始化(Initialization
),这一步会生成一个 Master Key
(加密密钥)用于加密数据,只有加密完成的数据才能保存到 Storage Backend
Unseal
- Vault 启动后,因为不知道 Master Key
(加密密钥)所以无法解密数据(可以访问 Storage Backend
上的数据),这种状态被称为 Sealed
(已封印),在能解封(Unseal
)数据之前,Vault 无法进行任何操作。Unseal
是获取 Master Key
明文的过程,通过 Master Key
可以解密 Encryption Key
从而可以解密存储的数据 [6]
Master Key
- Encryption Key
(用来加密存储的数据,加密密钥和加密数据被一同存储) 是被 Master Key
(主密钥) 保护(加密),必须提供 Master Key
,Vault 才能解密出 Encryption Key
,从而完成数据解密操作。Master Key
与其他 Vault 数据被存放在一起,但使用另一种机制进行加密:解封密钥 ,解封密钥默认使用 沙米尔密钥分割算法 生成 Key Shares
[9]
Key Shares
- 默认情况下,Vault 使用 沙米尔密钥分割算法 将 Master Key
的解封密钥分割成五个 Key Shares
(分割密钥),必须要提供其中任意的三个 Key Shares
才能重建 Master Key
,以完成 Unseal
(解封)操作
Key Shares
(分割密钥)的总数,以及重建Master Key
(主密钥)最少需要的分割密钥数量,都是可以调整的。 沙米尔密钥分割算法 也可以关闭,这样主密钥将被直接提供给管理员,管理员可直接使用它进行解封操作。
认证系统及权限系统处理流程
在解密出 Encryption Key
后,Vault 就可以处理客户端请求了。 HTTPS API 请求进入后的整个流程都由 Vault Core
管理,Core
会强制进行 ACL 检查,并确保 Audit logging
(审计日志)完成记录。
客户端首次连接 Vault 时,需要首先完成身份认证,Vault 的 Auth Method
模块有很多的身份认证方法可选
- 用户友好的认证方法,适合管理员使用,包括:
user/password
、云服务商
、ldap
等,在创建用户的时候,需要为用户绑定Policy
,给予适合的权限 - 应用友好的方法,适合应用程序使用,包括:
public/private keys
、token
、kubernetes
、jwt
等
身份验证请求经 Core
转发给 Auth Method
进行认证,Auth Method
判定请求身份是否有效并返回关联的策略(ACL Policies
)的列表。
ACL Policies
由 Policy Store
负责管理与存储,Core
负责进行 ACL 检查,ACl 的默认行为是 Deny
,意味着除非明确配置 ACL Policy
允许某项操作,否则该操作将被拒绝。
在通过 Auth Method
进行认证,并返回了没有问题的 ACL Policies
后,Token Store
会生成并管理一个新的 Token
,这个 凭证 会返回给客户端,用于客户端后续请求的身份信息。Token
都存在一个 lease
(租期)。Token
关联了相关的 ACL Policies
,这些策略将被用于验证请求的权限。
请求经过验证后,将被路由到 Secret Engine
,如果 Secret Engine
返回了一个 secret
,Core
将其注册到 Expiration Manager
,并给它附件一个 Lease ID
,Lease ID
被客户端用于更新(renew
)或者吊销(revoke
)它得到的 secret
。如果客户端允许租约(lease
) 到期,Expiration Manager
将自动吊销(revoke
) 这个 secret
Secret Engine
Secret Engine
是保存、生成或者加密数据的组件,非常灵活。有的 Secret Engin
只是单纯的存储与读取数据,比如 kv
(键值存储)就可以看作一个加密的 Redis。而其他的 Secret Engine
则可能连接到其他的服务并按需生成动态凭证等。
yum
环境信息
- CentOS Linux release 7.9.2009 (Core)
- yum-3.4.3
yum 命令示例
查询指定命令来自哪个安装包
$ yum whatprovides ip |
rpm
查询已安装文件来自哪个安装包
$ rpm -qf /sbin/ip |
仅下载安装包而不进行安装操作
如果只下载安装包而不进行安装,可以使用 yumdownloader
命令,此命令来自安装包 yum-utils
,如果不存在可以安装 yum-utils
。
yumdownloader <package-name> |
以上下载指定的安装包而不安装,安装包会下载到当前目录
常见错误
The GPG keys listed for the “MySQL 5.7 Community Server” repository are already installed but they are not correct for this package
解决方法
修改对应 yum
源的配置文件,将其中的配置 gpgcheck=1
改为 gpgcheck=0
,以此跳过 key 验证
Prometheus 抓取 Nginx 指标
Prometheus 抓取 Nginx 运行时指标,主要有以下方法:
- Nginx 通过自己的
stub_status
页面 (需要with-http_stub_status_module
模块支持) 暴露出了一些 Nginx 运行时的指标,较为简单,在 Prometheus 中对应的 Metrics 也少。nginx_exporter
主要就是获取stub_status
中内建的指标。 - 可以通过
nginx-vts-exporter
监控 Nginx 更多的指标,但nginx-vts-exporter
依赖于 Nginx 编译安装是添加的第三方模块nginx-module-vts
来实现,指标更为丰富。建议使用此种监控方式。
环境信息
- Centos 7
- Nginx stable 1.24.0
- nginx-vts-exporter v0.10.3
- nginx-module-vts v0.2.2
安装配置 nginx-vts-exporter 和 nginx-module-vts 来监控 Nginx Metrics
Nginx 编译安装 nginx-module-vts 模块
Nginx 编译安装 `nginx-module-vts` 模块Nginx 安装了 nginx-module-vts
后,可以通过以下配置暴露运行时的指标
vhost_traffic_status_zone; |
重启 Nginx 后,访问 http://localhost:8081/status
即可查看到 Nginx 运行时的指标
安装 nginx-vts-exporter
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz |
创建 systemd
管理配置文件 /usr/lib/systemd/system/nginx-vts-exporter.service
|
启动服务,默认监听端口为 9913
systemctl enable --now nginx-vts-exporter |
浏览器访问 localhost:9913/metrics
即可看到 nginx-vts-exporter
暴露出来的 Metrics
之后 Prometheus 可通过 9913
端口抓取监控数据。