简介

  • prometheus:负责收集和存储时间序列数据
  • alertmanager: 警告信息通知
  • node-exporter:负责暴露主机 metrics 数据给 prometheus
  • cadvisor: 收集docker容器信息
  • grafana:负责展示数据

Docker-Compose安装Prometheus

docker-compose.yml 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3.7'

networks:
default:
external:
name: docker_compose_net

services:
prometheus:
image: prom/prometheus
container_name: prometheus
hostname: prometheus
restart: unless-stopped
volumes:
- /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- /opt/prometheus/node_down.yml:/etc/prometheus/node_down.yml
ports:
- "9990:9090"
environment:
- TZ=Asia/Shanghai # 时区配置亚洲上海

alertmanager:
image: prom/alertmanager
container_name: alertmanager
hostname: alertmanager
restart: unless-stopped
volumes:
- /opt/prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml
- /opt/prometheus/alert-template/:/alertmanager/template/
ports:
- "9993:9093"
environment:
- TZ=Asia/Shanghai # 时区配置亚洲上海
阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 新建用户
useradd lims

# 给用户设置密码
passwd lims

# 设置相应的文件夹的用户名和用户组
chown -R lims:lims /opt/nginx/www

# 给文件夹赋权
chmod -R 775 /opt/nginx/www

# 查看目录的所属者和操作权限
ls -la /opt/nginx/www

# 到 sudoers 文件中增加新的用户,否则无法使用 sudo 命令
vim /etc/sudoers ====> 增加一行与 ROOT 相同的配置,然后输入 wq! 强制强制退出

语法

1
2
unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>]
[.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行时显示详细的信息。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P<密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-V 保留VMS的文件版本信息。
-X 解压缩时同时回存文件原来的UID/GID。
[.zip文件] 指定.zip压缩文件。
[文件] 指定要处理.zip压缩文件中的哪些文件。
-d<目录> 指定文件解压缩后所要存储的目录。
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看压缩文件中包含的文件
unzip -l abc.zip

# 查看压缩文件目录信息,但是不解压该文件
unzip -v abc.zip

# 解压一个zip格式压缩包
unzip file1.zip

# 压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。
unzip -n test.zip -d /tmp

# #将压缩文件test.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件。
unzip -o test.zip -d /tmp

参考:

Linux unzip命令

语法

1
2
zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>]
[-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>]

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-A 调整可执行的自动解压缩文件。
-b<工作目录> 指定暂时存放文件的目录。
-c 替每个被压缩的文件加上注释。
-d 从压缩文件内删除指定的文件。
-D 压缩文件内不建立目录名称。
-f 更新现有的文件。
-F 尝试修复已损坏的压缩文件。
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-h 在线帮助。
-i<范本样式> 只压缩符合条件的文件。
-j 只保存文件名称及其内容,而不存放任何目录名称。
-J 删除压缩文件前面不必要的数据。
-k 使用MS-DOS兼容格式的文件名称。
-l 压缩文件时,把LF字符置换成LF+CR字符。
-ll 压缩文件时,把LF+CR字符置换成LF字符。
-L 显示版权信息。
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-n<字尾字符串> 不压缩具有特定字尾字符串的文件。
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-q 不显示指令执行过程。
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
-S 包含系统和隐藏文件。
-t<日期时间> 把压缩文件的日期设成指定的日期。
-T 检查备份文件内的每个文件是否正确无误。
-u 与 -f 参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 显示指令执行过程或显示版本信息。
-V 保存VMS操作系统的文件属性。
-w 在文件名称里假如版本编号,本参数仅在VMS操作系统下有效。
-x<范本样式> 压缩时排除符合条件的文件。
-X 不保存额外的文件属性。
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
-z 替压缩文件加上注释。
-$ 保存第一个被压缩文件所在磁盘的卷册名称。
-<压缩效率> 压缩效率是一个介于1-9的数值。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 将 /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip:
zip -q -r html.zip /home/html

# 如果在我们在 /home/html 目录下,可以执行以下命令:
zip -q -r html.zip *

# 从压缩文件 cp.zip 中删除文件 a.c
zip -dv cp.zip a.c

# 创建一个zip格式的压缩包
zip file1.zip file1

# 将几个文件和目录同时压缩成一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1

参考:

Linux zip命令

目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
├── dhparam.pem
├── fastcgi_params
├── logs
│ ├── access.log
│ ├── error.log
│ ├── limsweb.access.log
│ ├── limsweb.error.log
├── mime.types
├── nginx.conf
├── nginxconfig.io
│ ├── general.conf
│ ├── proxy.conf
│ └── security.conf
├── scgi_params
├── sites-enabled
│ └── limsweb.conf
├── ssl
│ ├── ilims.mylims.com.key
│ ├── ilims.mylims.com_bundle.crt
│ └── ilims.mylims.com_bundle.pem
├── uwsgi_params
└── www
└── limsweb
└── public

注意 general.conf 中需要注释掉 拦截 assets, media的配置:

1
2
3
4
# location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
# expires 7d;
# access_log off;
# }
阅读全文 »

Linux chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。

Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符。 。

chown 需要超级用户 root 的权限才能执行此命令。

只有超级用户和属于组的文件所有者才能变更文件关联组。非超级用户如需要设置关联组可能需要使用 chgrp 命令。

语法

1
chown [-cfhvR] [--help] [--version] user[:group] file...

参数 :

user : 新的文件拥有者的使用者 ID
group : 新的文件拥有者的使用者组(group)
-c : 显示更改的部分的信息
-f : 忽略错误信息
-h :修复符号链接
-v : 显示详细的处理信息
-R : 处理指定目录以及其子目录下的所有文件
–help : 显示辅助说明
–version : 显示版本

实例

把 /var/run/httpd.pid 的所有者设置 root:

1
chown root /var/run/httpd.pid

将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup :

1
chown runoob:runoobgroup file1.txt

将当前前目录下的所有文件与子目录的拥有者皆设为 runoob,群体的使用者 runoobgroup:

1
chown -R runoob:runoobgroup *

把 /home/runoob 的关联组设置为 512 (关联组ID),不改变所有者:

1
chown :512 /home/runoob

参考:

Linux chown 命令

创建对应目录

1
2
3
4
5
6
mkdir -p /opt/grafana/loki/config
mkdir -p /opt/grafana/loki/data
mkdir -p /opt/grafana/promtail/log
mkdir -p /opt/grafana/conf
mkdir -p /opt/grafana/data
mkdir -p /opt/grafana/log

创建配置文件

loki配置文件

路径:/opt/grafana/loki/config/local-config.yaml :

参考:Configuring Grafana Loki

阅读全文 »

默认网络

docker-compose.yml中创建自定义网络的时候,默认的网段为172.*.*.*

使用自定义networks定义网络,docker-compose 会随机产生子网:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3"

services:
hangfire:
image: hangfire:0.0.10
restart: always
hostname: hangfire
container_name: hangfire
ports:
- "8100:80"
networks:
- net0
volumes:
- /etc/localtime:/etc/localtime
environment:
- adminConsole=true
env_file:
- ./var.env

networks:
net0:
阅读全文 »

查看Log文件名:选择数据库,属性,查看文件。

Snipaste_2022-10-12_14-23-46.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
USE [master]
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE --简单模式
GO
USE 要清理的数据库名称
GO

-- 注意log名称,需要使用文件逻辑名称
DBCC SHRINKFILE (N'要清理的数据库名称_log' , 2, TRUNCATEONLY) --设置压缩后的日志大小为2M,可以自行指定
GO
USE [master]
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY FULL --还原为完全模式
GO

方法一

1
2
3
4
5
#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,
sudo docker ps -a|grep Exited|awk '{print $1}'

#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器
sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`

方法二

1
2
#删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)
sudo docker rm $(sudo docker ps -a -q)

方法三

1
2
#根据容器的状态,删除Exited状态的容器
sudo docker rm $(sudo docker ps -qf status=exited)

方法四

1
2
#Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。
sudo docker container prune
1
2
#删除所有镜像
sudo docker rmi $(docker images -q)

参考:

如何批量删除Docker中已停止的容器?-可以有多种方式

SASL认证简介

SASL:简单认证和安全层

SASL是一种用来扩充C/S模式验证能力的机制认证机制,全称 Simple Authentication and Security Layer

当你设定sasl时,你必须决定两件事;一是用于交换“标识信 息”(或称身份证书)的验证机制;一是决定标识信息存储方法的验证架构。

sasl验证机制规范client与server之间的应答过程以及传输内容的编码方法,sasl验证架构决定服务器本身如何存储客户端的身份证书以及如何核验客户端提供的密码。

如果客户端能成功通过验证,服务器端就能确定用户的身份, 并借此决定用户具有怎样的权限。

比较常用的机制plain:plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,可能会想要结合tls。

参考:

SASL - 简单认证和安全层

阅读全文 »

自签名证书

参考:OpenSSL生成CA,二级CA,服务器证书

Kes配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
address: 0.0.0.0:7373 # Listen on all network interfaces on port 7373

admin:
identity: disabled # We disable the admin identity since we don't need it in this guide

tls:
#key: /opt/certs/agent/key/cakey.pem # The KES server TLS private key
#cert: /opt/certs/agent/key/cacert.crt # The KES server TLS certificate
key: /opt/certs/25519/server.key # The KES server TLS private key
cert: /opt/certs/25519/server.crt # The KES server TLS certificate

policy:
my-app:
allow:
- /v1/key/create/my-key*
- /v1/key/generate/my-key*
- /v1/key/decrypt/my-key*
identities:
- 0a3b5c174894c5b782889775a6a586c1dc8c9e03f8cf1b41be099a017ec25ec4 # Use the identity of your client.crt

keystore:
vault:
endpoint: https://127.0.0.1:8200
version: v1 # The K/V engine version - either "v1" or "v2".
approle:
id: "a54e9ae2-a4e7-87bf-3fda-1fa30f65c3c5" # Your AppRole ID
secret: "47ef5ebb-ebef-0ae1-001a-80dc74c8c638" # Your AppRole Secret
retry: 15s
status:
ping: 10s
tls:
ca: /opt/certs/vault/vault.crt # Manually trust the vault certificate since we use self-signed certificates

-k 跳过证书校验。

1
kes key dek my-key-1 -k

参考:

Hashicorp Vault Keystore

查看 openssl 版本和配置文件位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ openssl version -a
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
built on: Mon Jul 4 11:20:23 2022 UTC
platform: debian-amd64
options: bn(64,64)
OPENSSLDIR: "/usr/lib/ssl" # 所在目录
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-3"
MODULESDIR: "/usr/lib/x86_64-linux-gnu/ossl-modules"
$ ls /usr/lib/ssl # 查看目录
certs misc openssl.cnf private
$ cat /usr/lib/ssl/openssl.cnf # 查看配置文件

# openssl证书版本
openssl ciphers -v | awk '{print $2}' | sort | uniq
openssl s_client -help 2>&1 > /dev/null | egrep "\-(ssl|tls)[^a-z]"

证书认证相关

1. https 单项认证:

server: server.crt + server.key
client: server_ca.crt

2. https 双向认证:

server: server.crt + server.key + client_ca.crt
client: server_ca.crt + client.crt + client.key

在使用 CA 证书进行签署证书时加入-extfile-extensions选项,具体命令如下:

1
2
openssl x509 -req  -days 365 -sha256 -extfile openssl.cnf -extensions v3_req
-in server.csr -signkey server.key -out server.crt

证书详情信息:

1
2
3
4
5
6
7
8
9
10
11
Version: 版本号
Serial Number: 证书序列号
Signature Algorithm: 签名算法
Issuer: 签发者(签发证书的CA实体)
Subject: 证书主体(证书持有者实体)
Validity: 有效期
Not Before: 开始生效时间
Not After: 证书失效时间
Subject Public Key Info: 主体公钥信息
Public Key Algorithm: 证书主题持有的公钥密钥算法
RSA Public-Key: 具体的公钥数据

一般证书的签发流程是:

申请者把自己的申请做成证书申请文件 csr(csr 中放入了申请者的公钥以及申请者的信息)
然后把 csr 发送给签发者 CA 进行证书签发,签发过程就是 CA 用自己的私钥给 csr 生成签名,然后制作为证书文件(.crt 或.pem)

nginx 判定证书的时候,是根据证书中的两个字段:Issuer 和 Subject
如果 Issuer == Subject 那么 nginx 就会认为这是一个自签名的根证书
如果 Issuer != Subject 那么 nginx 就会认为这不是一个自签名的证书,验证时需要带上签发这个证书的根证书

正式使用时,subject 中的 CN 字段需要填写使用者的域名,也就是 nginx 所在主机的域名。

证书生成

流程:自签 CA,由自签 CA 签发二级 CA,最后由二级 CA 签发网站证书。

openssl 参数参考:

1
2
3
-extensions v3_req 指定 X.509 v3版本
-extensions v3_ca 生成CA扩展名
-extfile /tmp/openssl.conf 指定特殊的配置文件
阅读全文 »

1.概述

在本文中,我们将探索Hashicorp的Vault - 一种用于在现代应用程序体系结构中安全地管理机密信息的流行工具。

我们将讨论的主要议题包括:

  • Vault试图解决什么问题
  • Vault的架构和主要概念
  • 设置一个简单的测试环境
  • 使用命令行工具与Vault交互

2.机密信息问题

在深入了解Vault之前,让我们试着了解它试图解决的问题:机密信息管理。

大多数应用程序需要访问机密数据才能正常工作。例如,电子商务应用程序可以在某处配置用户名/密码以便连接到其数据库。它还可能需要API密钥才能与其他服务提供商集成,例如支付网关,物流和其他业务合作伙伴。

数据库凭证和API密钥就是我们需要以安全的方式存储和提供给我们的应用程序的机密信息。

一个简单的解决方案是将这些信息存储在配置文件中,并在启动时读取它们。但是这种方法的问题显而易见:有权访问此文件的人共享我们的应用程序具有的数据库权限 - 通常可以完全访问所有存储的数据。

我们可以尝试通过加密这些文件来使事情变得更加困难。但是,这种方法在整体安全性方面不会增加太多。主要是因为我们的应用程序必须能够访问主密钥。当以这种方式使用时,加密仅是一种“错误”的安全感。

现代应用程序和云环境往往会增加一些额外的复杂性:分布式服务,多个数据库,消息传递系统等等,所有敏感信息都在各处传播,从而增加了安全漏洞的风险。

阅读全文 »