L B T

记 录 过 去 的 经 验

tcpdump 命令格式说明

  • option - 可选选项(参数)
  • proto - 协议类过滤器:根据协议进行过滤,可识别的关键词有: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
  • direction - 数据流向类过滤器:根据数据流向进行过滤,可识别的关键字有:src, dst,同时你可以使用逻辑运算符进行组合,比如 src or dst
  • type 类过滤器:可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数。

常用选项

选项 说明 示例
-i 目标网卡
-n
-nn
不对 IP/DOMAIN 进行解析
不对 IP/DOMAIN 及 PORT 进行解析
-w 将结果写入文件 tcpdump icmp -w icmp.pcap
阅读全文 »

常见的 SSL 证书格式主要有:

  • .DER .CER - 文件是二进制格式,只保存证书,不保存私钥。
  • .PEM - 一般是文本格式,可保存证书,可保存私钥。
  • .CRT - 可以是二进制格式,可以是文本格式,一般均为文本格式,与 .DER 格式相同,不保存私钥。
  • .PFX .P12 - 二进制格式,同时包含证书和私钥,一般有密码保护。
  • .JK - 二进制格式,同时包含证书和私钥,一般有密码保护。

证书格式说明

DER 和 CER

该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。只含有证书信息,不包含私钥

OpenSSL 查看

openssl x509 -in certificate.der -inform der -text -noout

转换为 PEM:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

PEM

Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN... 开头,以 -----END... 结尾。中间的内容是 BASE64 编码。这种格式可以保存证书和私钥,有时我们也把 PEM 格式的私钥的后缀改为 .key 以区别证书与私钥。

这种格式常用于 Apache 和 Nginx 服务器。

OpenSSL 查看:

openssl x509 -in certificate.pem -text -noout

转换为 DER:

openssl x509 -in cert.crt -outform der -out cert.der

CRT

Certificate 的简称,有可能是 PEM 编码格式,也有可能是 DER 编码格式。如何查看请参考前两种格式。

PFX

Predecessor of PKCS#12,这种格式是二进制格式,且证书和私钥存在一个 PFX 文件中。一般用于 Windows 上的 IIS 服务器。该格式的文件一般会有一个密码用于保证私钥的安全。

OpenSSL 查看:

openssl pkcs12 -in for-iis.pfx

转换为 PEM:

openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

JKS

Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。

可以到这里进行 格式转换

阅读全文 »

更新索引

$ apk update

fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v3.14.8-65-g0f3285f2cf [https://dl-cdn.alpinelinux.org/alpine/v3.14/main]
v3.14.8-66-ge9853dea68 [https://dl-cdn.alpinelinux.org/alpine/v3.14/community]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/main]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/testing]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/community]
OK: 38705 distinct packages available

从远程镜像源中更新本地镜像源索引,update 命令会从各个镜像源列表下载 APKINDEX.tar.gz 并存储到本地缓存,一般在 /var/cache/apk/ (Alpine 在该目录下)

阅读全文 »

环境信息

  • Centos7 3.10.0-1160.76.1
  • Docker Engine - Community 19.03.15

安装步骤

创建自定义网络

为了使容器互联,新版本建议将容器加入自定义的 Docker 网络 来连接多个容器,而不是使用 --link 参数。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

docker network create -d bridge docker-network-for-openldap

之后为 LDAP 创建的相关容器,都连接到此网络。

启动 openldap 容器

为 openldap 容器创建本地持久化数据目录,容器启动时将此目录以数据卷的形式挂载使用

mkdir /data/OpenLDAPData

启动容器,挂载数据卷,使用自定义网络

docker run -d -p 389:389 -p 636:636 \
-v /data/OpenLDAPData:/usr/local/ldap \
--name openldap \
--network docker-network-for-openldap \
osixia/openldap:1.3.0
阅读全文 »

本文主要记录使用 docker compose 配置 Django + Mysql 的 web 站点的过程。

环境信息

  • Centos7
  • Docker version 20.10.17

目录结构及说明

项目目录结构及简要说明如下:

.
├── compose
│ └── mysql
│ └── my.cnf
├── django_project
│ ├── db.sqlite3
│ ├── django_app
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── __init__.py
│ │ ├── migrations
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── django_project
│ │ ├── asgi.py
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── Dockerfile
│ ├── manage.py
│ └── requirements.txt
├── docker-compose.yml

  • compose : 存放应用配置文件,如 mysql 配置文件 compose/mysql/my.cnf
  • django_project : Django project 项目目录, django-admin startproject django_project 生成
  • django_project/django_app : Django project 项目下的 app 目录,django-admin startapp django_app 生成
  • docker-compose.yml : 项目的 compose 文件
阅读全文 »

gzip

解压缩

$ file test.gz 
test.gz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)

gzip -d test.gz

压缩

gzip test.txt

压缩后默认生成压缩文件 test.txt.gz

环境信息

  • Python3.10
  • Django 4.0

接收 post 中的 json 数据

示例通过 curl 命令模拟 post 请求,命令如下:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST \
-d '{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}' 127.0.0.1:8000/csapi

Django 处理程序示例:

views.py
from django.http import HttpResponse


def csapi(request):
post_body = request.body
print(f'****** POST body: {post_body}, type : {type(post_body)}')

#
data = eval(post_body)

print(f'****** data : {data} , type : {type(data)}')

return HttpResponse('ok')

Console 输出结果:

****** POST body: b'{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}', type : <class 'bytes'>
****** data : {'id': 'yTP7PSsRxz53tJ56VVG', 'type': 5} , type : <class 'dict'>

以上输出可以看到,request.body 中的类型为 bytes

使用 eval 转换后类型变为 dict

使用 json.loadsrequest.body 转换为 dict 时,可能会报以下错误:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

可能原因 参考

Centos 7 内核版本由 3.10 升级到 5.4.212-1

环境息息

  • Centos7 3.10.0-1062.9.1.el7.x86_64

升级步骤

安装 elrepo 源

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" repolist
阅读全文 »

命令格式

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

: ssh 方式进行备份,ssh 非默认端口使用选项 -e 指定端口, -e 'ssh -p 30000'

:: socket 方式进行备份,rsync 以服务方式监听,SRC/DEST 为配置中定义的模块 []

  • rsync 命令使用中,如果源参数的末尾有斜线,只会复制指定目录的内容,而不复制目录本身,没有斜线,则会复制目录本身,包括目录
  • 客户端免密登录时,需要在客户端建立密码文件: /etc/rsync.passwd,文件中只保存密码,权限为600,用选项 --password-file 指明存放密码的文件位置
阅读全文 »

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker compose [COMMAND] --help 可以查看具体某个命令的使用格式。

docker compose 命令的基本的使用格式是

docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

常用选项

  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
阅读全文 »

环境信息

  • Centos 7

vim 配置

vim 启动时会读取 /etc/vimrc(全局配置) 和 ~/.vimrc (用户配置)

常用配置如下,使用 " 注释

/etc/vimrc
" 自动缩进 
set ai
set autoindent

" 保存历史命令数量
set history=50

" 右下角显示当前鼠标位置(行列数)
set ruler

" 鼠标位置所在行显示下划线
set cursorline

" 开启语法高亮
syntax on

" 高亮搜索结果
set hlsearch

" 搜索时不区分大小写
set ignorecase

" 将 tab 转换为空格
set expandtab

" tab 转换为4个空格
set tabstop=4

" 删除时,可以一次删除4个空格
set softtabstop=4

" 显示行数
set nu
阅读全文 »

环境信息

  • Centos 7
  • iptables

Fail2ban 是 Linux 上的一个著名的入侵保护的开源框架。它通过监视相应服务的日志记录文件,匹配日志记录中的错误信息(正则式匹配),然后与系统的 iptables 联动执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),比如:当有人在试探你的 HTTPSSHSMTPFTP 密码,只要达到你预设的次数,Fail2ban 就会调用防火墙屏蔽这个 IP,并且可以发送 e-mail 通知系统管理员。

由于 Fail2ban 需要与系统的 iptablesfirewalld 等联动来达到封禁 IP 的目的, iptables 使用与 firewalld 有少许不同。

本文以 iptables 为例

安装

yum install epel-release
yum install -y fail2ban
systemctl enable fail2ban
阅读全文 »

Confluence 是一个专业的企业知识管理与协同软件,也可以用于构建企业 wiki。通过它可以实现团队成员之间的协作和知识共享。在这里,团队成员齐心协力,各擅其能,协同地编写文档和管理项目。从此打破不同团队、不同部门以及个人之间信息孤岛的僵局,Confluence 真正实现了组织资源共享。Confluence 使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论。

阅读全文 »

环境信息

  • Centos 7

系统默认的日志托管服务,部分系统服务(如 crond, 邮件系统,安全审计等)会将日志发送给 rsyslog 服务来进行日志管理。

rsyslog 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说,日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。

阅读全文 »

环境信息

  • Centos 7

常用选项

命令格式:

find   path   -option   [ -print ]   [ -exec   -ok   command ]   {} \;

常用查找选项(-option):

选项 说明 示例
-amin n
-amin +n
-amin -n
在过去 n 分钟内被读取过
更改时间超过 n
更改时间在 n 以内
-anewer file 比文件 file 更晚被读取过的文件
-atime n 在过去 n 天内被读取过的文件
-cmin n 在过去 n 分钟内被修改过
-cnewer file 比文件 file 更新的文件
-ctime n 在过去 n 天内创建的文件
-mtime n 在过去 n 天内修改过的文件
-empty 空的文件
-gid n
-group name
gid 是 n
group 名称是 name
-user u 根据用户名查找
-nouser 属主不存在
-ipath p
-path p
路径名称符合 p 的文件,ipath 会忽略大小写
-name name
-iname name
文件名称符合 name 的文件。iname 会忽略大小写
-size n
-size +n
-size -n
文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
文件大小大于 n
文件大小小于 n
-type c 文件类型是 c 的文件,c 包括:
d : 目录
c : 字符设备
b : 块设备
p : 通道设备
f : 文件
l : 链接文件
s : socker
-pid n process id 是 n 的文件
-perm 0644 权限
-maxdepth
-mindepth
查找深度
阅读全文 »

环境信息

  • Centos 7

TCP_wrappers 主要是工作在应用层的一个安全工具,使用访问控制列表(ACL)来防止主机名和主机地址的欺骗,用于过滤对 类 Unix 系统的网络访问。

在一个安全的系统中,Linux 自身具有两层安全的防火墙。第一层是通过 IP/Port 过滤机制的 iptables 来实现,第二层,也就是 TCP_wrappers 了,它主要是通过对系统中的某些服务进行开放与关闭,允许和禁止来有效保证系统安全运行。
可以简单理解为 Linux 系统访问控制的流程:

Client -> iptables -> TCP_wrappers -> Server 的访问控制

  • iptables :基于源 IP/端口、目的 IP/端口进行访问控制
  • TCP_wrappers:基于服务自身运行情况进行访问控制
  • Server:基于服务器本身行为包括文件、目录等权限进行访问控制
阅读全文 »

环境信息

  • python 3.10
  • django 4.0

Python logging 模块说明

Django 使用 Python 内置的 logging 模块处理系统日志,一份 Python logging 配置由下面四个部分组成:

  • Loggers
  • Handlers
  • Filters
  • Formatters

Loggers

logger 是日志系统的入口。每个 logger 都是命名了的 bucket, 消息写入 bucket 以便进一步处理
logger 可以配置 日志级别。日志级别描述了由该 logger 处理的消息的严重性。Python 定义了下面几种日志级别:

  • DEBUG:排查故障时使用的低级别系统信息
  • INFO:一般的系统信息
  • WARNING:描述系统发生了一些小问题的信息
  • ERROR:描述系统发生了大问题的信息
  • CRITICAL:描述系统发生严重问题的信息

每一条写入 logger 的消息都是一条 日志记录。每一条日志记录也包含 日志级别,代表对应消息的严重程度。日志记录还包含有用的元数据,来描述被记录了日志的事件细节,例如堆栈跟踪或者错误码。

logger 处理一条消息时,会将自己的 日志级别 和这条消息的 日志级别 做对比。如果消息的日志级别匹配或者高于 logger 的日志级别,它就会被进一步处理。否则这条消息就会被忽略掉。

logger 确定了一条消息需要处理之后,会把它传给 Handler

阅读全文 »